mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/emul: Drop the union in x86_event had have a single data field
FRED has formalised the event_data field. It already has more uses than given (e.g. the NMI Source Bitmap), and further uses are expected in the future. Collapse the union into a single field called 'data' as the struct has event in it's name, as well as 'event' being the common name for the variable. Refer to the FRED spec rather than keeping an out-of-date list of uses. Adjust all users of the old names. No functional change. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
72b05c267e
commit
e1060c760d
10 files changed
+28
-25
No files matched your search
@@ -315,7 +315,7 @@ static int inject_event(struct domain *d,
|
||||
v->arch.hvm.inject_event.type = data->type;
|
||||
v->arch.hvm.inject_event.insn_len = data->insn_len;
|
||||
v->arch.hvm.inject_event.error_code = data->error_code;
|
||||
v->arch.hvm.inject_event.cr2 = data->cr2;
|
||||
v->arch.hvm.inject_event.data = data->cr2;
|
||||
smp_wmb();
|
||||
v->arch.hvm.inject_event.vector = data->vector;
|
||||
|
||||
|
||||
@@ -513,7 +513,7 @@ void hvm_migrate_pirqs(struct vcpu *v)
|
||||
|
||||
static bool hvm_get_pending_event(struct vcpu *v, struct x86_event *info)
|
||||
{
|
||||
info->cr2 = v->arch.hvm.guest_cr[2];
|
||||
info->data = v->arch.hvm.guest_cr[2];
|
||||
|
||||
return alternative_call(hvm_funcs.get_pending_event, v, info);
|
||||
}
|
||||
@@ -555,7 +555,7 @@ void hvm_do_resume(struct vcpu *v)
|
||||
if ( hvm_get_pending_event(v, &info) )
|
||||
{
|
||||
hvm_monitor_interrupt(info.vector, info.type, info.error_code,
|
||||
info.cr2);
|
||||
info.data);
|
||||
v->arch.monitor.next_interrupt_enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -775,7 +775,7 @@ int cf_check nsvm_vcpu_vmexit_event(
|
||||
ASSERT(vcpu_nestedhvm(v).nv_vvmcx != NULL);
|
||||
|
||||
nestedsvm_vmexit_defer(v, VMEXIT_EXCEPTION_DE + event->vector,
|
||||
event->error_code, event->cr2);
|
||||
event->error_code, event->data);
|
||||
return NESTEDHVM_VMEXIT_DONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -1177,7 +1177,7 @@ static void svm_emul_swint_injection(struct x86_event *event)
|
||||
{
|
||||
fault = X86_EXC_PF;
|
||||
ec = pfinfo.ec;
|
||||
event->cr2 = pfinfo.linear;
|
||||
event->data = pfinfo.linear;
|
||||
}
|
||||
|
||||
goto raise_exception;
|
||||
@@ -1270,8 +1270,8 @@ static void cf_check svm_inject_event(const struct x86_event *event)
|
||||
|
||||
case X86_EXC_PF:
|
||||
ASSERT(_event.type == X86_ET_HW_EXC);
|
||||
curr->arch.hvm.guest_cr[2] = _event.cr2;
|
||||
vmcb_set_cr2(vmcb, _event.cr2);
|
||||
curr->arch.hvm.guest_cr[2] = _event.data;
|
||||
vmcb_set_cr2(vmcb, _event.data);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1354,7 +1354,7 @@ static void cf_check svm_inject_event(const struct x86_event *event)
|
||||
|
||||
if ( _event.vector == X86_EXC_PF && _event.type == X86_ET_HW_EXC )
|
||||
TRACE(TRC_HVM_PF_INJECT64, _event.error_code,
|
||||
_event.cr2, _event.cr2 >> 32);
|
||||
_event.data, _event.data >> 32);
|
||||
else
|
||||
TRACE(TRC_HVM_INJ_EXC, _event.vector, _event.error_code);
|
||||
}
|
||||
|
||||
@@ -2106,7 +2106,7 @@ static void cf_check vmx_inject_event(const struct x86_event *event)
|
||||
|
||||
case X86_EXC_PF:
|
||||
ASSERT(_event.type == X86_ET_HW_EXC);
|
||||
curr->arch.hvm.guest_cr[2] = _event.cr2;
|
||||
curr->arch.hvm.guest_cr[2] = _event.data;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -747,10 +747,9 @@ static inline void pv_inject_DB(unsigned long pending_dbg)
|
||||
.vector = X86_EXC_DB,
|
||||
.type = X86_ET_HW_EXC,
|
||||
.error_code = X86_EVENT_NO_EC,
|
||||
.data = pending_dbg,
|
||||
};
|
||||
|
||||
event.pending_dbg = pending_dbg;
|
||||
|
||||
pv_inject_event(&event);
|
||||
}
|
||||
|
||||
@@ -760,10 +759,9 @@ static inline void pv_inject_page_fault(int errcode, unsigned long cr2)
|
||||
.vector = X86_EXC_PF,
|
||||
.type = X86_ET_HW_EXC,
|
||||
.error_code = errcode,
|
||||
.data = cr2,
|
||||
};
|
||||
|
||||
event.cr2 = cr2;
|
||||
|
||||
pv_inject_event(&event);
|
||||
}
|
||||
|
||||
|
||||
@@ -569,10 +569,9 @@ static inline void hvm_inject_page_fault(int errcode, unsigned long cr2)
|
||||
.vector = X86_EXC_PF,
|
||||
.type = X86_ET_HW_EXC,
|
||||
.error_code = errcode,
|
||||
.data = cr2,
|
||||
};
|
||||
|
||||
event.cr2 = cr2;
|
||||
|
||||
hvm_inject_event(&event);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,10 +22,16 @@ struct x86_event {
|
||||
uint8_t type; /* X86_ET_* */
|
||||
uint8_t insn_len; /* Instruction length */
|
||||
int32_t error_code; /* X86_EVENT_NO_EC if n/a */
|
||||
union {
|
||||
unsigned long cr2; /* #PF */
|
||||
unsigned long pending_dbg; /* #DB (new DR6 bits, positive polarity) */
|
||||
};
|
||||
|
||||
/*
|
||||
* As per the FRED spec.
|
||||
*
|
||||
* A subset of uses occur in IDT mode as well:
|
||||
* - #PF: CR2
|
||||
* - #DB: PENDING_DBG (new DR6 bits with positive polarity)
|
||||
* - #NM: XFD_ERR (AMX)
|
||||
*/
|
||||
unsigned long data;
|
||||
};
|
||||
|
||||
#endif /* X86_X86_EVENT_H */
|
||||
@@ -58,20 +58,20 @@ void pv_inject_event(const struct x86_event *event)
|
||||
switch ( vector | -(event->type == X86_ET_SW_INT) )
|
||||
{
|
||||
case X86_EXC_PF:
|
||||
curr->arch.pv.ctrlreg[2] = event->cr2;
|
||||
arch_set_cr2(curr, event->cr2);
|
||||
curr->arch.pv.ctrlreg[2] = event->data;
|
||||
arch_set_cr2(curr, event->data);
|
||||
|
||||
/* Re-set error_code.user flag appropriately for the guest. */
|
||||
error_code &= ~PFEC_user_mode;
|
||||
if ( !guest_kernel_mode(curr, regs) )
|
||||
error_code |= PFEC_user_mode;
|
||||
|
||||
trace_pv_page_fault(event->cr2, error_code);
|
||||
trace_pv_page_fault(event->data, error_code);
|
||||
break;
|
||||
|
||||
case X86_EXC_DB:
|
||||
curr->arch.dr6 = x86_merge_dr6(curr->domain->arch.cpu_policy,
|
||||
curr->arch.dr6, event->pending_dbg);
|
||||
curr->arch.dr6, event->data);
|
||||
fallthrough;
|
||||
default:
|
||||
trace_pv_trap(vector, regs->rip, use_error_code, error_code);
|
||||
@@ -94,7 +94,7 @@ void pv_inject_event(const struct x86_event *event)
|
||||
vector, vector_name(vector), error_code);
|
||||
|
||||
if ( vector == X86_EXC_PF )
|
||||
show_page_walk(event->cr2);
|
||||
show_page_walk(event->data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -758,7 +758,7 @@ static inline void x86_emul_pagefault(
|
||||
ctxt->event.vector = X86_EXC_PF;
|
||||
ctxt->event.type = X86_ET_HW_EXC;
|
||||
ctxt->event.error_code = error_code;
|
||||
ctxt->event.cr2 = cr2;
|
||||
ctxt->event.data = cr2;
|
||||
|
||||
ctxt->event_pending = true;
|
||||
}
|
||||
|
||||