mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
mem_event: Add support for MEM_EVENT_REASON_MSR
Add the new MEM_EVENT_REASON_MSR event type. Works similarly to the other register events, except event.gla always contains the MSR address (in addition to event.gfn, which holds the value). MEM_EVENT_REASON_MSR does not honour the HVMPME_onchangeonly bit, as doing so would complicate the hvm_msr_write_intercept() switch-based handling of writes for different MSR addresses, with little added benefit. Signed-off-by: Razvan Cojocaru <rzvncj@gmail.com> Acked-by: Tim Deegan <tim@xen.org> Committed-by: Tim Deegan <tim@xen.org>
This commit is contained in:
1 parent
d564b6fe9d
commit
41333c800c
4 files changed
+16
-1
No files matched your search
@@ -2934,6 +2934,8 @@ int hvm_msr_write_intercept(unsigned int msr, uint64_t msr_content)
|
||||
hvm_cpuid(1, &cpuid[0], &cpuid[1], &cpuid[2], &cpuid[3]);
|
||||
mtrr = !!(cpuid[3] & cpufeat_mask(X86_FEATURE_MTRR));
|
||||
|
||||
hvm_memory_event_msr(msr, msr_content);
|
||||
|
||||
switch ( msr )
|
||||
{
|
||||
case MSR_EFER:
|
||||
@@ -3869,6 +3871,7 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
break;
|
||||
case HVM_PARAM_MEMORY_EVENT_INT3:
|
||||
case HVM_PARAM_MEMORY_EVENT_SINGLE_STEP:
|
||||
case HVM_PARAM_MEMORY_EVENT_MSR:
|
||||
if ( d == current->domain )
|
||||
{
|
||||
rc = -EPERM;
|
||||
@@ -4492,6 +4495,14 @@ void hvm_memory_event_cr4(unsigned long value, unsigned long old)
|
||||
value, old, 0, 0);
|
||||
}
|
||||
|
||||
void hvm_memory_event_msr(unsigned long msr, unsigned long value)
|
||||
{
|
||||
hvm_memory_event_traps(current->domain->arch.hvm_domain
|
||||
.params[HVM_PARAM_MEMORY_EVENT_MSR],
|
||||
MEM_EVENT_REASON_MSR,
|
||||
value, ~value, 1, msr);
|
||||
}
|
||||
|
||||
int hvm_memory_event_int3(unsigned long gla)
|
||||
{
|
||||
uint32_t pfec = PFEC_page_present;
|
||||
|
||||
@@ -454,6 +454,7 @@ int hvm_x2apic_msr_write(struct vcpu *v, unsigned int msr, uint64_t msr_content)
|
||||
void hvm_memory_event_cr0(unsigned long value, unsigned long old);
|
||||
void hvm_memory_event_cr3(unsigned long value, unsigned long old);
|
||||
void hvm_memory_event_cr4(unsigned long value, unsigned long old);
|
||||
void hvm_memory_event_msr(unsigned long msr, unsigned long value);
|
||||
/* Called for current VCPU on int3: returns -1 if no listener */
|
||||
int hvm_memory_event_int3(unsigned long gla);
|
||||
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
#define HVM_PARAM_MEMORY_EVENT_CR4 22
|
||||
#define HVM_PARAM_MEMORY_EVENT_INT3 23
|
||||
#define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP 25
|
||||
#define HVM_PARAM_MEMORY_EVENT_MSR 30
|
||||
|
||||
#define HVMPME_MODE_MASK (3 << 0)
|
||||
#define HVMPME_mode_disabled 0
|
||||
@@ -141,6 +142,6 @@
|
||||
#define HVM_PARAM_ACCESS_RING_PFN 28
|
||||
#define HVM_PARAM_SHARING_RING_PFN 29
|
||||
|
||||
#define HVM_NR_PARAMS 30
|
||||
#define HVM_NR_PARAMS 31
|
||||
|
||||
#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
|
||||
@@ -45,6 +45,8 @@
|
||||
#define MEM_EVENT_REASON_CR4 4 /* CR4 was hit: gfn is CR4 value */
|
||||
#define MEM_EVENT_REASON_INT3 5 /* int3 was hit: gla/gfn are RIP */
|
||||
#define MEM_EVENT_REASON_SINGLESTEP 6 /* single step was invoked: gla/gfn are RIP */
|
||||
#define MEM_EVENT_REASON_MSR 7 /* MSR was hit: gfn is MSR value, gla is MSR address;
|
||||
does NOT honour HVMPME_onchangeonly */
|
||||
|
||||
typedef struct mem_event_st {
|
||||
uint32_t flags;
|
||||
|
||||