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:
Andrew Cooper committed 2026-08-18 12:50:11 +01:00
1 parent 72b05c267e
commit e1060c760d
10 files changed
+28 -25

No files matched your search

+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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;
}
}
+1 -1
View File
@@ -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;
}
+4 -4
View File
@@ -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);
}
+1 -1
View File
@@ -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;
}
+2 -4
View File
@@ -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);
}
+1 -2
View File
@@ -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);
}
+10 -4
View File
@@ -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 */
+5 -5
View File
@@ -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);
}
}
+1 -1
View File
@@ -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;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.