mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
[XEN] Include CR2 and CR4 in register dumps.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
This commit is contained in:
1 parent
8b7ee4cecb
commit
9f5c2cdc38
6 files changed
+36
-9
No files matched your search
@@ -243,6 +243,7 @@ static void svm_store_cpu_guest_regs(
|
||||
{
|
||||
/* Returning the guest's regs */
|
||||
crs[0] = v->arch.hvm_svm.cpu_shadow_cr0;
|
||||
crs[2] = v->arch.hvm_svm.cpu_cr2;
|
||||
crs[3] = v->arch.hvm_svm.cpu_cr3;
|
||||
crs[4] = v->arch.hvm_svm.cpu_shadow_cr4;
|
||||
}
|
||||
|
||||
@@ -520,6 +520,7 @@ static void vmx_store_cpu_guest_regs(
|
||||
if ( crs != NULL )
|
||||
{
|
||||
__vmread(CR0_READ_SHADOW, &crs[0]);
|
||||
crs[2] = v->arch.hvm_vmx.cpu_cr2;
|
||||
__vmread(GUEST_CR3, &crs[3]);
|
||||
__vmread(CR4_READ_SHADOW, &crs[4]);
|
||||
}
|
||||
|
||||
@@ -339,7 +339,6 @@ void show_execution_state(struct cpu_user_regs *regs)
|
||||
asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
unsigned long cr2;
|
||||
static char *trapstr[] = {
|
||||
"divide error", "debug", "nmi", "bkpt", "overflow", "bounds",
|
||||
"invalid opcode", "device not available", "double fault",
|
||||
@@ -356,7 +355,7 @@ asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs)
|
||||
|
||||
if ( trapnr == TRAP_page_fault )
|
||||
{
|
||||
__asm__ __volatile__ ("mov %%cr2,%0" : "=r" (cr2) : );
|
||||
unsigned long cr2 = read_cr2();
|
||||
printk("Faulting linear address: %p\n", _p(cr2));
|
||||
show_page_walk(cr2);
|
||||
}
|
||||
@@ -911,7 +910,7 @@ asmlinkage int do_page_fault(struct cpu_user_regs *regs)
|
||||
|
||||
ASSERT(!in_irq());
|
||||
|
||||
__asm__ __volatile__ ("mov %%cr2,%0" : "=r" (addr) : );
|
||||
addr = read_cr2();
|
||||
|
||||
DEBUGGER_trap_entry(TRAP_page_fault, regs);
|
||||
|
||||
|
||||
@@ -35,20 +35,26 @@ void show_registers(struct cpu_user_regs *regs)
|
||||
}
|
||||
else
|
||||
{
|
||||
context = guest_mode(regs) ? "guest" : "hypervisor";
|
||||
|
||||
if ( !guest_mode(regs) )
|
||||
{
|
||||
context = "hypervisor";
|
||||
fault_regs.esp = (unsigned long)®s->esp;
|
||||
fault_regs.ss = read_segment_register(ss);
|
||||
fault_regs.ds = read_segment_register(ds);
|
||||
fault_regs.es = read_segment_register(es);
|
||||
fault_regs.fs = read_segment_register(fs);
|
||||
fault_regs.gs = read_segment_register(gs);
|
||||
fault_crs[2] = read_cr2();
|
||||
}
|
||||
else
|
||||
{
|
||||
context = "guest";
|
||||
fault_crs[2] = current->vcpu_info->arch.cr2;
|
||||
}
|
||||
|
||||
fault_crs[0] = read_cr0();
|
||||
fault_crs[3] = read_cr3();
|
||||
fault_crs[4] = read_cr4();
|
||||
}
|
||||
|
||||
printk("----[ Xen-%d.%d%s %s ]----\n",
|
||||
@@ -63,7 +69,8 @@ void show_registers(struct cpu_user_regs *regs)
|
||||
fault_regs.eax, fault_regs.ebx, fault_regs.ecx, fault_regs.edx);
|
||||
printk("esi: %08x edi: %08x ebp: %08x esp: %08x\n",
|
||||
fault_regs.esi, fault_regs.edi, fault_regs.ebp, fault_regs.esp);
|
||||
printk("cr0: %08lx cr3: %08lx\n", fault_crs[0], fault_crs[3]);
|
||||
printk("cr0: %08lx cr4: %08lx cr3: %08lx cr2: %08lx\n",
|
||||
fault_crs[0], fault_crs[4], fault_crs[3], fault_crs[2]);
|
||||
printk("ds: %04x es: %04x fs: %04x gs: %04x "
|
||||
"ss: %04x cs: %04x\n",
|
||||
fault_regs.ds, fault_regs.es, fault_regs.fs,
|
||||
|
||||
@@ -35,9 +35,20 @@ void show_registers(struct cpu_user_regs *regs)
|
||||
}
|
||||
else
|
||||
{
|
||||
context = guest_mode(regs) ? "guest" : "hypervisor";
|
||||
if ( guest_mode(regs) )
|
||||
{
|
||||
context = "guest";
|
||||
fault_crs[2] = current->vcpu_info->arch.cr2;
|
||||
}
|
||||
else
|
||||
{
|
||||
context = "hypervisor";
|
||||
fault_crs[2] = read_cr2();
|
||||
}
|
||||
|
||||
fault_crs[0] = read_cr0();
|
||||
fault_crs[3] = read_cr3();
|
||||
fault_crs[4] = read_cr4();
|
||||
fault_regs.ds = read_segment_register(ds);
|
||||
fault_regs.es = read_segment_register(es);
|
||||
fault_regs.fs = read_segment_register(fs);
|
||||
@@ -62,8 +73,9 @@ void show_registers(struct cpu_user_regs *regs)
|
||||
fault_regs.r9, fault_regs.r10, fault_regs.r11);
|
||||
printk("r12: %016lx r13: %016lx r14: %016lx\n",
|
||||
fault_regs.r12, fault_regs.r13, fault_regs.r14);
|
||||
printk("r15: %016lx cr0: %016lx cr3: %016lx\n",
|
||||
fault_regs.r15, fault_crs[0], fault_crs[3]);
|
||||
printk("r15: %016lx cr0: %016lx cr4: %016lx\n",
|
||||
fault_regs.r15, fault_crs[0], fault_crs[4]);
|
||||
printk("cr3: %016lx cr2: %016lx\n", fault_crs[3], fault_crs[2]);
|
||||
printk("ds: %04x es: %04x fs: %04x gs: %04x "
|
||||
"ss: %04x cs: %04x\n",
|
||||
fault_regs.ds, fault_regs.es, fault_regs.fs,
|
||||
|
||||
@@ -290,6 +290,13 @@ static inline void write_cr0(unsigned long val)
|
||||
__asm__("mov %0,%%cr0": :"r" ((unsigned long)val));
|
||||
}
|
||||
|
||||
static inline unsigned long read_cr2(void)
|
||||
{
|
||||
unsigned long __cr2;
|
||||
__asm__("mov %%cr2,%0\n\t" :"=r" (__cr2));
|
||||
return __cr2;
|
||||
}
|
||||
|
||||
static inline unsigned long read_cr4(void)
|
||||
{
|
||||
unsigned long __cr4;
|
||||
|
||||