mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
VMX: dump further control state
A few relevant control state fields did not get dumped so far; in particular, VM_ENTRY_INSTRUCTION_LEN got printed twice (instead of also printing VM_EXIT_INSTRUCTION_LEN). Where suitable (to reduce the amount of output) make some of the dumping conditional upon guest settings (this isn't required for correctness as vmr() already uses __vmread_safe(), i.e. it is fine to access non-existing fields). Also drop casts. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Kevin Tian <kevin.tian@intel.com>
This commit is contained in:
1 parent
954b961b79
commit
e9e32a0bf8
2 files changed
+35
-22
No files matched your search
+32
-22
@@ -1520,31 +1520,35 @@ void vmcs_dump_vcpu(struct vcpu *v)
|
||||
|
||||
printk("*** Control State ***\n");
|
||||
printk("PinBased=%08x CPUBased=%08x SecondaryExec=%08x\n",
|
||||
(uint32_t)vmr(PIN_BASED_VM_EXEC_CONTROL),
|
||||
(uint32_t)vmr(CPU_BASED_VM_EXEC_CONTROL),
|
||||
(uint32_t)vmr(SECONDARY_VM_EXEC_CONTROL));
|
||||
vmr32(PIN_BASED_VM_EXEC_CONTROL),
|
||||
vmr32(CPU_BASED_VM_EXEC_CONTROL),
|
||||
vmr32(SECONDARY_VM_EXEC_CONTROL));
|
||||
printk("EntryControls=%08x ExitControls=%08x\n", vmentry_ctl, vmexit_ctl);
|
||||
printk("ExceptionBitmap=%08x\n",
|
||||
(uint32_t)vmr(EXCEPTION_BITMAP));
|
||||
printk("ExceptionBitmap=%08x PFECmask=%08x PFECmatch=%08x\n",
|
||||
vmr32(EXCEPTION_BITMAP),
|
||||
vmr32(PAGE_FAULT_ERROR_CODE_MASK),
|
||||
vmr32(PAGE_FAULT_ERROR_CODE_MATCH));
|
||||
printk("VMEntry: intr_info=%08x errcode=%08x ilen=%08x\n",
|
||||
(uint32_t)vmr(VM_ENTRY_INTR_INFO),
|
||||
(uint32_t)vmr(VM_ENTRY_EXCEPTION_ERROR_CODE),
|
||||
(uint32_t)vmr(VM_ENTRY_INSTRUCTION_LEN));
|
||||
vmr32(VM_ENTRY_INTR_INFO),
|
||||
vmr32(VM_ENTRY_EXCEPTION_ERROR_CODE),
|
||||
vmr32(VM_ENTRY_INSTRUCTION_LEN));
|
||||
printk("VMExit: intr_info=%08x errcode=%08x ilen=%08x\n",
|
||||
(uint32_t)vmr(VM_EXIT_INTR_INFO),
|
||||
(uint32_t)vmr(VM_EXIT_INTR_ERROR_CODE),
|
||||
(uint32_t)vmr(VM_ENTRY_INSTRUCTION_LEN));
|
||||
printk(" reason=%08x qualification=%08x\n",
|
||||
(uint32_t)vmr(VM_EXIT_REASON),
|
||||
(uint32_t)vmr(EXIT_QUALIFICATION));
|
||||
vmr32(VM_EXIT_INTR_INFO),
|
||||
vmr32(VM_EXIT_INTR_ERROR_CODE),
|
||||
vmr32(VM_EXIT_INSTRUCTION_LEN));
|
||||
printk(" reason=%08x qualification=%016lx\n",
|
||||
vmr32(VM_EXIT_REASON), vmr(EXIT_QUALIFICATION));
|
||||
printk("IDTVectoring: info=%08x errcode=%08x\n",
|
||||
(uint32_t)vmr(IDT_VECTORING_INFO),
|
||||
(uint32_t)vmr(IDT_VECTORING_ERROR_CODE));
|
||||
printk("TPR Threshold = 0x%02x\n",
|
||||
(uint32_t)vmr(TPR_THRESHOLD));
|
||||
vmr32(IDT_VECTORING_INFO), vmr32(IDT_VECTORING_ERROR_CODE));
|
||||
printk("TSC Offset = 0x%016lx\n", vmr(TSC_OFFSET));
|
||||
printk("EPT pointer = 0x%08x%08x\n",
|
||||
(uint32_t)vmr(EPT_POINTER_HIGH), (uint32_t)vmr(EPT_POINTER));
|
||||
if ( (v->arch.hvm_vmx.exec_control & CPU_BASED_TPR_SHADOW) ||
|
||||
(vmx_pin_based_exec_control & PIN_BASED_POSTED_INTERRUPT) )
|
||||
printk("TPR Threshold = 0x%02x PostedIntrVec = 0x%02x\n",
|
||||
vmr32(TPR_THRESHOLD), vmr16(POSTED_INTR_NOTIFICATION_VECTOR));
|
||||
if ( (v->arch.hvm_vmx.secondary_exec_control &
|
||||
SECONDARY_EXEC_ENABLE_EPT) )
|
||||
printk("EPT pointer = 0x%016lx EPTP index = 0x%04x\n",
|
||||
vmr(EPT_POINTER), vmr16(EPTP_INDEX));
|
||||
n = vmr32(CR3_TARGET_COUNT);
|
||||
for ( i = 0; i + 1 < n; i += 2 )
|
||||
printk("CR3 target%u=%016lx target%u=%016lx\n",
|
||||
@@ -1552,8 +1556,14 @@ void vmcs_dump_vcpu(struct vcpu *v)
|
||||
i + 1, vmr(CR3_TARGET_VALUE(i + 1)));
|
||||
if ( i < n )
|
||||
printk("CR3 target%u=%016lx\n", i, vmr(CR3_TARGET_VALUE(i)));
|
||||
printk("Virtual processor ID = 0x%04x\n",
|
||||
(uint32_t)vmr(VIRTUAL_PROCESSOR_ID));
|
||||
if ( v->arch.hvm_vmx.secondary_exec_control &
|
||||
SECONDARY_EXEC_PAUSE_LOOP_EXITING )
|
||||
printk("PLE Gap=%08x Window=%08x\n",
|
||||
vmr32(PLE_GAP), vmr32(PLE_WINDOW));
|
||||
if ( v->arch.hvm_vmx.secondary_exec_control &
|
||||
(SECONDARY_EXEC_ENABLE_VPID | SECONDARY_EXEC_ENABLE_VMFUNC) )
|
||||
printk("Virtual processor ID = 0x%04x VMfunc controls = %016lx\n",
|
||||
vmr16(VIRTUAL_PROCESSOR_ID), vmr(VMFUNC_CONTROL));
|
||||
|
||||
vmx_vmcs_exit(v);
|
||||
}
|
||||
|
||||
@@ -213,6 +213,7 @@ extern u32 vmx_vmentry_control;
|
||||
#define SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY 0x00000200
|
||||
#define SECONDARY_EXEC_PAUSE_LOOP_EXITING 0x00000400
|
||||
#define SECONDARY_EXEC_ENABLE_INVPCID 0x00001000
|
||||
#define SECONDARY_EXEC_ENABLE_VMFUNC 0x00002000
|
||||
#define SECONDARY_EXEC_ENABLE_VMCS_SHADOWING 0x00004000
|
||||
extern u32 vmx_secondary_exec_control;
|
||||
|
||||
@@ -306,6 +307,7 @@ extern u64 vmx_basic_msr;
|
||||
enum vmcs_field {
|
||||
VIRTUAL_PROCESSOR_ID = 0x00000000,
|
||||
POSTED_INTR_NOTIFICATION_VECTOR = 0x00000002,
|
||||
EPTP_INDEX = 0x00000004,
|
||||
GUEST_ES_SELECTOR = 0x00000800,
|
||||
GUEST_CS_SELECTOR = 0x00000802,
|
||||
GUEST_SS_SELECTOR = 0x00000804,
|
||||
@@ -342,6 +344,7 @@ enum vmcs_field {
|
||||
APIC_ACCESS_ADDR_HIGH = 0x00002015,
|
||||
PI_DESC_ADDR = 0x00002016,
|
||||
PI_DESC_ADDR_HIGH = 0x00002017,
|
||||
VMFUNC_CONTROL = 0x00002018,
|
||||
EPT_POINTER = 0x0000201a,
|
||||
EPT_POINTER_HIGH = 0x0000201b,
|
||||
EOI_EXIT_BITMAP0 = 0x0000201c,
|
||||
|
||||