|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 3/3] 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@xxxxxxxxxx>
---
CC: Jan Beulich <jbeulich@xxxxxxxx>
CC: Roger Pau Monné <roger@xxxxxxxxxxxxxx>
CC: Teddy Astie <teddy.astie@xxxxxxxxxx>
---
xen/arch/x86/hvm/dm.c | 2 +-
xen/arch/x86/hvm/hvm.c | 4 ++--
xen/arch/x86/hvm/svm/nestedsvm.c | 2 +-
xen/arch/x86/hvm/svm/svm.c | 8 ++++----
xen/arch/x86/hvm/vmx/vmx.c | 2 +-
xen/arch/x86/include/asm/domain.h | 6 ++----
xen/arch/x86/include/asm/hvm/hvm.h | 3 +--
xen/arch/x86/include/asm/x86-event.h | 14 ++++++++++----
xen/arch/x86/pv/traps.c | 10 +++++-----
xen/arch/x86/x86_emulate/x86_emulate.h | 2 +-
10 files changed, 28 insertions(+), 25 deletions(-)
diff --git a/xen/arch/x86/hvm/dm.c b/xen/arch/x86/hvm/dm.c
index 1f44fff12a21..91f6ca669b2b 100644
--- a/xen/arch/x86/hvm/dm.c
+++ b/xen/arch/x86/hvm/dm.c
@@ -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;
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index b7d5ba126b1e..64845e210b6c 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -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;
}
}
diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c
index 91c906072001..0845e9f77879 100644
--- a/xen/arch/x86/hvm/svm/nestedsvm.c
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c
@@ -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;
}
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index eab8c735cf25..2219f9c4911e 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -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);
}
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index b0d5ad6981b3..6ff4aeb70d41 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -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;
}
diff --git a/xen/arch/x86/include/asm/domain.h
b/xen/arch/x86/include/asm/domain.h
index 50c048adb5ad..2d0a91541034 100644
--- a/xen/arch/x86/include/asm/domain.h
+++ b/xen/arch/x86/include/asm/domain.h
@@ -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);
}
diff --git a/xen/arch/x86/include/asm/hvm/hvm.h
b/xen/arch/x86/include/asm/hvm/hvm.h
index 0ce7d5d78350..16383e1084ee 100644
--- a/xen/arch/x86/include/asm/hvm/hvm.h
+++ b/xen/arch/x86/include/asm/hvm/hvm.h
@@ -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);
}
diff --git a/xen/arch/x86/include/asm/x86-event.h
b/xen/arch/x86/include/asm/x86-event.h
index a8823c7cfc31..b0543c9e3715 100644
--- a/xen/arch/x86/include/asm/x86-event.h
+++ b/xen/arch/x86/include/asm/x86-event.h
@@ -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 (DR6 with positive polarity)
+ * - #NM: XFD_ERR (AMX)
+ */
+ unsigned long data;
};
#endif /* X86_X86_EVENT_H */
diff --git a/xen/arch/x86/pv/traps.c b/xen/arch/x86/pv/traps.c
index c863ab9d372a..21a1f4b7174a 100644
--- a/xen/arch/x86/pv/traps.c
+++ b/xen/arch/x86/pv/traps.c
@@ -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);
}
}
diff --git a/xen/arch/x86/x86_emulate/x86_emulate.h
b/xen/arch/x86/x86_emulate/x86_emulate.h
index 534b1c46fad3..da1051a0f9e7 100644
--- a/xen/arch/x86/x86_emulate/x86_emulate.h
+++ b/xen/arch/x86/x86_emulate/x86_emulate.h
@@ -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;
}
--
2.39.5
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |