|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/emul: Drop the union in x86_event had have a single data field
commit e1060c760d2be08c09353e20d90699bc07ad02a7
Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
AuthorDate: Fri Aug 14 17:17:06 2026 +0100
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Aug 18 12:50:11 2026 +0100
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>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
---
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 1f44fff12a..91f6ca669b 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 5cb4c348ec..955fc062a5 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 91c9060720..0845e9f778 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 fb9ddf70dc..5f5d903d87 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 c2a76d691e..e55c90ce7f 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 50c048adb5..2d0a915410 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 0ce7d5d783..16383e1084 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 a8823c7cfc..8560770c4a 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 (new DR6 bits 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 c863ab9d37..21a1f4b717 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 d86ed7b3e0..4539b14c15 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;
}
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |