mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-05-31 03:15:42 +00:00
hv: vm_reset: simulate RESET_CONTROL(0xCF9) register
Add reset_control in acrn_vm. Use this reset_control to simulate RESET_CONTROL(0xCF9) register in hypervisor. Tracked-On: #8724 Signed-off-by: Yuan Lu <yuan.y.lu@intel.com> Reviewed-by: Fei Li <fei1.li@intel.com>
This commit is contained in:
parent
fcffdf8dbd
commit
dbc3ff39aa
@ -73,20 +73,13 @@ static bool handle_reset_reg_read(struct acrn_vcpu *vcpu, __unused uint16_t addr
|
|||||||
__unused size_t bytes)
|
__unused size_t bytes)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
struct acrn_vm *vm = vcpu->vm;
|
||||||
|
|
||||||
if (get_highest_severity_vm(true) == vcpu->vm) {
|
if (is_postlaunched_vm(vm)) {
|
||||||
/* Guest may read RESET_CONTROL register before cold reset or warm reset */
|
|
||||||
vcpu->req.reqs.pio_request.value = pio_read8(0xcf9U);
|
|
||||||
|
|
||||||
} else if (is_postlaunched_vm(vcpu->vm)) {
|
|
||||||
/* re-inject to DM */
|
/* re-inject to DM */
|
||||||
ret = false;
|
ret = false;
|
||||||
} else {
|
} else {
|
||||||
/*
|
vcpu->req.reqs.pio_request.value = vm->reset_control;
|
||||||
* - reset control register 0xcf9: hide this from guests whose severity is not the highest.
|
|
||||||
* - FADT reset register: the read behavior is not defined in spec, keep it simple to return all '1'.
|
|
||||||
*/
|
|
||||||
vcpu->req.reqs.pio_request.value = ~0U;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -172,6 +165,9 @@ static bool handle_kb_read(struct acrn_vcpu *vcpu, uint16_t addr, size_t bytes)
|
|||||||
*/
|
*/
|
||||||
static bool handle_cf9_write(struct acrn_vcpu *vcpu, __unused uint16_t addr, size_t bytes, uint32_t val)
|
static bool handle_cf9_write(struct acrn_vcpu *vcpu, __unused uint16_t addr, size_t bytes, uint32_t val)
|
||||||
{
|
{
|
||||||
|
struct acrn_vm *vm = vcpu->vm;
|
||||||
|
|
||||||
|
vm->reset_control = val & 0xeU;
|
||||||
return handle_common_reset_reg_write(vcpu,
|
return handle_common_reset_reg_write(vcpu,
|
||||||
((bytes == 1U) && ((val & 0x4U) == 0x4U) && ((val & 0xaU) != 0U)),
|
((bytes == 1U) && ((val & 0x4U) == 0x4U) && ((val & 0xaU) != 0U)),
|
||||||
((val & 0x8U) == 0U));
|
((val & 0x8U) == 0U));
|
||||||
|
@ -181,6 +181,7 @@ struct acrn_vm {
|
|||||||
struct acrn_vrtc vrtc;
|
struct acrn_vrtc vrtc;
|
||||||
|
|
||||||
uint64_t intr_inject_delay_delta; /* delay of intr injection */
|
uint64_t intr_inject_delay_delta; /* delay of intr injection */
|
||||||
|
uint32_t reset_control;
|
||||||
} __aligned(PAGE_SIZE);
|
} __aligned(PAGE_SIZE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user