hv: reset per cpu sbuf pointers during vcpu reset

When shutting down SOS VM, the shared sbuf is released from guest OS, but
the per cpu sbuf pointers in hypervisor keep inact. This creates a problem
that after SOS is re-launched, hypervisor could write to the shared
buffer that no longer exists.

This patch implements sbuf_reset() and call it from reset_vcpu() to
reset sbuf pointers.

Tracked-On: #2700
Signed-off-by: Zide Chen <zide.chen@intel.com>
Acked-by: Anthony Xu <anthony.xu@intel.com>
This commit is contained in:
Zide Chen 2019-04-17 11:41:21 -07:00 committed by wenlingz
parent 56acaacc29
commit aee9f3c666
4 changed files with 24 additions and 0 deletions

View File

@ -582,6 +582,8 @@ void reset_vcpu(struct acrn_vcpu *vcpu)
vlapic = vcpu_vlapic(vcpu);
vlapic_reset(vlapic);
sbuf_reset(vcpu->pcpu_id);
reset_vcpu_regs(vcpu);
}

View File

@ -121,3 +121,14 @@ int32_t sbuf_share_setup(uint16_t pcpu_id, uint32_t sbuf_id, uint64_t *hva)
return 0;
}
void sbuf_reset(uint16_t pcpu_id)
{
uint32_t sbuf_id;
if (pcpu_id < get_pcpu_nums()) {
for (sbuf_id = 0U; sbuf_id < ACRN_SBUF_ID_MAX; sbuf_id++) {
per_cpu(sbuf, pcpu_id)[sbuf_id] = 0U;
}
}
}

View File

@ -65,6 +65,7 @@ struct shared_buf {
*/
uint32_t sbuf_put(struct shared_buf *sbuf, uint8_t *data);
int32_t sbuf_share_setup(uint16_t pcpu_id, uint32_t sbuf_id, uint64_t *hva);
void sbuf_reset(uint16_t pcpu_id);
uint32_t sbuf_next_ptr(uint32_t pos, uint32_t span, uint32_t scope);
#endif /* SHARED_BUFFER_H */

10
hypervisor/release/sbuf.c Normal file
View File

@ -0,0 +1,10 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <types.h>
#include <sbuf.h>
void sbuf_reset(__unused uint16_t pcpu_id) {}