mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
bitkeeper revision 1.1159.179.2 (419cbedfAFJPmYd4XKno5lrw9LXJ0A)
Auto-generate assembly struct offsets. Clean up Xen-death on unhandleable traps/faults/NMIs/etc.
This commit is contained in:
1 parent
4235e53fb7
commit
50bcd2e22a
11 files changed
+244
-192
No files matched your search
@@ -606,6 +606,7 @@
|
||||
3ddb79bc-Udq7ol-NX4q9XsYnN7A2Q xen/arch/x86/time.c
|
||||
3ddb79bccYVzXZJyVaxuv5T42Z1Fsw xen/arch/x86/trampoline.S
|
||||
3ddb79bcOftONV9h4QCxXOfiT0h91w xen/arch/x86/traps.c
|
||||
419cbedeQDg8IrO3izo3o5rQNlo0kQ xen/arch/x86/x86_32/asm-offsets.c
|
||||
3e32af9aRnYGl4GMOaDKp7JdfhOGhg xen/arch/x86/x86_32/domain_page.c
|
||||
3ddb79bcecupHj56ZbTa3B0FxDowMg xen/arch/x86/x86_32/entry.S
|
||||
3ddb79bcHwuCQDjBICDTSis52hWguw xen/arch/x86/x86_32/mm.c
|
||||
|
||||
@@ -62,12 +62,14 @@ tools/misc/xen_cpuperf
|
||||
tools/web-shutdown.tap
|
||||
tools/xentrace/xentrace
|
||||
tools/xfrd/xfrd
|
||||
xen/arch/x86/asm-offsets.s
|
||||
xen/arch/x86/boot/mkelf32
|
||||
xen/drivers/pci/classlist.h
|
||||
xen/drivers/pci/devlist.h
|
||||
xen/drivers/pci/gen-devlist
|
||||
xen/figlet/figlet
|
||||
xen/include/asm
|
||||
xen/include/asm-*/asm-offsets.h
|
||||
xen/include/hypervisor-ifs/arch
|
||||
xen/include/xen/compile.h
|
||||
xen/tools/elf-reloc
|
||||
|
||||
+19
-1
@@ -34,10 +34,13 @@ clean:
|
||||
$(MAKE) -C drivers clean
|
||||
$(MAKE) -C arch/$(TARGET_ARCH) clean
|
||||
rm -f include/asm *.o $(TARGET)* *~ core include/xen/compile.h
|
||||
rm -f include/asm-*/asm-offsets.h
|
||||
|
||||
$(TARGET): delete-unfresh-files
|
||||
[ -e include/asm ] || ln -sf asm-$(TARGET_ARCH) include/asm
|
||||
$(MAKE) include/xen/compile.h
|
||||
$(MAKE) -C arch/$(TARGET_ARCH) asm-offsets.s
|
||||
$(MAKE) include/asm-$(TARGET_ARCH)/asm-offsets.h
|
||||
$(MAKE) -C common
|
||||
$(MAKE) -C drivers
|
||||
$(MAKE) -C arch/$(TARGET_ARCH)
|
||||
@@ -67,6 +70,22 @@ include/xen/compile.h:
|
||||
cd ./figlet && make && ./figlet Xen $(XEN_VERSION).$(XEN_SUBVERSION)$(XEN_EXTRAVERSION) 1>>../$@ && cd ..
|
||||
@LANG=C echo >> $@
|
||||
|
||||
include/asm-$(TARGET_ARCH)/asm-offsets.h: arch/$(TARGET_ARCH)/asm-offsets.s
|
||||
@(set -e; \
|
||||
echo "/*"; \
|
||||
echo " * DO NOT MODIFY."; \
|
||||
echo " *"; \
|
||||
echo " * This file was auto-generated from $<"; \
|
||||
echo " *"; \
|
||||
echo " */"; \
|
||||
echo ""; \
|
||||
echo "#ifndef __ASM_OFFSETS_H__"; \
|
||||
echo "#define __ASM_OFFSETS_H__"; \
|
||||
echo ""; \
|
||||
sed -ne "/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"; \
|
||||
echo ""; \
|
||||
echo "#endif") <$< >$@
|
||||
|
||||
.PHONY: default debug install dist clean delete-unfresh-files TAGS
|
||||
|
||||
SUBDIRS = arch common drivers
|
||||
@@ -77,4 +96,3 @@ TAGS:
|
||||
find $(SUBDIRS) -name '*.[ch]' ) | grep -v /SCCS/ | etags -
|
||||
MAP:
|
||||
nm $(TARGET) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
|
||||
|
||||
@@ -9,16 +9,23 @@ endif
|
||||
OBJS += $(patsubst %.S,%.o,$(wildcard $(TARGET_SUBARCH)/*.S))
|
||||
OBJS += $(patsubst %.c,%.o,$(wildcard $(TARGET_SUBARCH)/*.c))
|
||||
|
||||
OBJS := $(subst $(TARGET_SUBARCH)/asm-offsets.o,,$(OBJS))
|
||||
|
||||
default: boot/$(TARGET_SUBARCH).o $(OBJS) boot/mkelf32
|
||||
$(LD) $(LDFLAGS) -r -o arch.o $(OBJS)
|
||||
$(LD) $(LDFLAGS) -T $(TARGET_SUBARCH)/xen.lds -N \
|
||||
boot/$(TARGET_SUBARCH).o $(ALL_OBJS) -o $(TARGET)-syms
|
||||
./boot/mkelf32 $(TARGET)-syms $(TARGET) 0x100000
|
||||
|
||||
asm-offsets.s: $(TARGET_SUBARCH)/asm-offsets.c
|
||||
$(CC) $(CFLAGS) -S -o $@ $<
|
||||
|
||||
boot/mkelf32: boot/mkelf32.c
|
||||
$(HOSTCC) $(HOSTCFLAGS) -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -f *.o *~ core boot/*.o boot/*~ boot/core boot/mkelf32
|
||||
rm -f *.o *.s *~ core boot/*.o boot/*~ boot/core boot/mkelf32
|
||||
rm -f x86_32/*.o x86_32/*~ x86_32/core
|
||||
rm -f x86_64/*.o x86_64/*~ x86_64/core
|
||||
|
||||
.PHONY: default clean
|
||||
+2
-4
@@ -25,12 +25,12 @@
|
||||
#include <asm/smp.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/mpspec.h>
|
||||
#include <asm/debugger.h>
|
||||
|
||||
unsigned int nmi_watchdog = NMI_NONE;
|
||||
unsigned int watchdog_on = 0;
|
||||
static unsigned int nmi_hz = HZ;
|
||||
unsigned int nmi_perfctr_msr; /* the MSR to reset in NMI handler */
|
||||
extern void show_registers(struct xen_regs *regs);
|
||||
|
||||
extern int logical_proc_id[];
|
||||
|
||||
@@ -272,8 +272,6 @@ void touch_nmi_watchdog (void)
|
||||
|
||||
void nmi_watchdog_tick (struct xen_regs * regs)
|
||||
{
|
||||
extern void die(const char * str, struct xen_regs * regs, long err);
|
||||
|
||||
int sum, cpu = smp_processor_id();
|
||||
|
||||
sum = apic_timer_irqs[cpu];
|
||||
@@ -288,7 +286,7 @@ void nmi_watchdog_tick (struct xen_regs * regs)
|
||||
if ( alert_counter[cpu] == 5*nmi_hz )
|
||||
{
|
||||
console_force_unlock();
|
||||
die("NMI Watchdog detected LOCKUP on CPU", regs, cpu);
|
||||
fatal_trap(TRAP_nmi, regs, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
+64
-67
@@ -52,8 +52,6 @@
|
||||
#include <asm/i387.h>
|
||||
#include <asm/debugger.h>
|
||||
|
||||
extern char opt_nmi[];
|
||||
|
||||
struct guest_trap_bounce guest_trap_bounce[NR_CPUS] = { { 0 } };
|
||||
|
||||
#if defined(__i386__)
|
||||
@@ -199,19 +197,38 @@ void show_registers(struct xen_regs *regs)
|
||||
show_stack(®s->esp);
|
||||
}
|
||||
|
||||
|
||||
spinlock_t die_lock = SPIN_LOCK_UNLOCKED;
|
||||
|
||||
void die(const char *str, struct xen_regs * regs, long err)
|
||||
/*
|
||||
* This is called for faults at very unexpected times (e.g., when interrupts
|
||||
* are disabled). In such situations we can't do much that is safe. We try to
|
||||
* print out some tracing and then we just spin.
|
||||
*/
|
||||
asmlinkage void fatal_trap(int trapnr, struct xen_regs *regs, long error_code)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&die_lock, flags);
|
||||
printk("%s: %04lx,%04lx\n", str, err >> 16, err & 0xffff);
|
||||
show_registers(regs);
|
||||
spin_unlock_irqrestore(&die_lock, flags);
|
||||
panic("Fatal crash within Xen.\n");
|
||||
}
|
||||
int cpu = smp_processor_id();
|
||||
static char *trapstr[] = {
|
||||
"divide error", "debug", "nmi", "bkpt", "overflow", "bounds",
|
||||
"invalid operation", "device not available", "double fault",
|
||||
"coprocessor segment", "invalid tss", "segment not found",
|
||||
"stack error", "general protection fault", "page fault",
|
||||
"spurious interrupt", "coprocessor error", "alignment check",
|
||||
"machine check", "simd error"
|
||||
};
|
||||
|
||||
show_registers(regs);
|
||||
printk("************************************\n");
|
||||
printk("CPU%d FATAL TRAP %d (%s), ERROR_CODE %lx%s.\n",
|
||||
cpu, trapnr, trapstr[trapnr], error_code,
|
||||
(regs->eflags & X86_EFLAGS_IF) ? "" : ", IN INTERRUPT CONTEXT");
|
||||
printk("System shutting down -- need manual reset.\n");
|
||||
printk("************************************\n");
|
||||
|
||||
/* Lock up the console to prevent spurious output from other CPUs. */
|
||||
console_force_lock();
|
||||
|
||||
/* Wait for manual reset. */
|
||||
for ( ; ; )
|
||||
__asm__ __volatile__ ( "hlt" );
|
||||
}
|
||||
|
||||
static inline void do_trap(int trapnr, char *str,
|
||||
struct xen_regs *regs,
|
||||
@@ -275,7 +292,6 @@ DO_ERROR(11, "segment not present", segment_not_present)
|
||||
DO_ERROR(12, "stack segment", stack_segment)
|
||||
DO_ERROR_NOCODE(16, "fpu error", coprocessor_error)
|
||||
DO_ERROR(17, "alignment check", alignment_check)
|
||||
DO_ERROR_NOCODE(18, "machine check", machine_check)
|
||||
DO_ERROR_NOCODE(19, "simd error", simd_coprocessor_error)
|
||||
|
||||
asmlinkage void do_int3(struct xen_regs *regs, long error_code)
|
||||
@@ -328,13 +344,17 @@ asmlinkage void do_double_fault(void)
|
||||
printk("System needs manual reset.\n");
|
||||
printk("************************************\n");
|
||||
|
||||
DEBUGGER_trap_fatal(TRAP_double_fault, NULL, 0);
|
||||
|
||||
/* Lock up the console to prevent spurious output from other CPUs. */
|
||||
console_force_lock();
|
||||
|
||||
/* Wait for manual reset. */
|
||||
for ( ; ; ) ;
|
||||
for ( ; ; )
|
||||
__asm__ __volatile__ ( "hlt" );
|
||||
}
|
||||
|
||||
asmlinkage void do_machine_check(struct xen_regs *regs, long error_code)
|
||||
{
|
||||
fatal_trap(TRAP_machine_check, regs, error_code);
|
||||
}
|
||||
|
||||
asmlinkage void do_page_fault(struct xen_regs *regs, long error_code)
|
||||
@@ -509,47 +529,24 @@ asmlinkage void do_general_protection(struct xen_regs *regs, long error_code)
|
||||
|
||||
DEBUGGER_trap_fatal(TRAP_gp_fault, regs, error_code);
|
||||
|
||||
die("general protection fault", regs, error_code);
|
||||
show_registers(regs);
|
||||
panic("CPU%d GENERAL PROTECTION FAULT\n"
|
||||
"[error_code=%08x]\n", smp_processor_id(), error_code);
|
||||
}
|
||||
|
||||
asmlinkage void mem_parity_error(struct xen_regs *regs)
|
||||
{
|
||||
console_force_unlock();
|
||||
|
||||
printk("\n\n");
|
||||
|
||||
show_registers(regs);
|
||||
|
||||
printk("************************************\n");
|
||||
printk("CPU%d MEMORY ERROR -- system shutdown\n", smp_processor_id());
|
||||
printk("System needs manual reset.\n");
|
||||
printk("************************************\n");
|
||||
|
||||
/* Lock up the console to prevent spurious output from other CPUs. */
|
||||
console_force_lock();
|
||||
|
||||
/* Wait for manual reset. */
|
||||
for ( ; ; ) ;
|
||||
printk("\n\nNMI - MEMORY ERROR\n");
|
||||
fatal_trap(TRAP_nmi, regs, 0);
|
||||
}
|
||||
|
||||
asmlinkage void io_check_error(struct xen_regs *regs)
|
||||
{
|
||||
console_force_unlock();
|
||||
|
||||
printk("\n\n");
|
||||
|
||||
show_registers(regs);
|
||||
|
||||
printk("************************************\n");
|
||||
printk("CPU%d I/O ERROR -- system shutdown\n", smp_processor_id());
|
||||
printk("System needs manual reset.\n");
|
||||
printk("************************************\n");
|
||||
|
||||
/* Lock up the console to prevent spurious output from other CPUs. */
|
||||
console_force_lock();
|
||||
|
||||
/* Wait for manual reset. */
|
||||
for ( ; ; ) ;
|
||||
printk("\n\nNMI - I/O ERROR\n");
|
||||
fatal_trap(TRAP_nmi, regs, 0);
|
||||
}
|
||||
|
||||
static void unknown_nmi_error(unsigned char reason, struct xen_regs * regs)
|
||||
@@ -738,26 +735,26 @@ void __init trap_init(void)
|
||||
* saved. The page-fault handler also needs interrupts disabled until %cr2
|
||||
* has been read and saved on the stack.
|
||||
*/
|
||||
set_intr_gate(0,÷_error);
|
||||
set_intr_gate(1,&debug);
|
||||
set_intr_gate(2,&nmi);
|
||||
set_system_gate(3,&int3); /* usable from all privilege levels */
|
||||
set_system_gate(4,&overflow); /* usable from all privilege levels */
|
||||
set_intr_gate(5,&bounds);
|
||||
set_intr_gate(6,&invalid_op);
|
||||
set_intr_gate(7,&device_not_available);
|
||||
set_task_gate(8,__DOUBLEFAULT_TSS_ENTRY<<3);
|
||||
set_intr_gate(9,&coprocessor_segment_overrun);
|
||||
set_intr_gate(10,&invalid_TSS);
|
||||
set_intr_gate(11,&segment_not_present);
|
||||
set_intr_gate(12,&stack_segment);
|
||||
set_intr_gate(13,&general_protection);
|
||||
set_intr_gate(14,&page_fault);
|
||||
set_intr_gate(15,&spurious_interrupt_bug);
|
||||
set_intr_gate(16,&coprocessor_error);
|
||||
set_intr_gate(17,&alignment_check);
|
||||
set_intr_gate(18,&machine_check);
|
||||
set_intr_gate(19,&simd_coprocessor_error);
|
||||
set_intr_gate(TRAP_divide_error,÷_error);
|
||||
set_intr_gate(TRAP_debug,&debug);
|
||||
set_intr_gate(TRAP_nmi,&nmi);
|
||||
set_system_gate(TRAP_int3,&int3); /* usable from all privileges */
|
||||
set_system_gate(TRAP_overflow,&overflow); /* usable from all privileges */
|
||||
set_intr_gate(TRAP_bounds,&bounds);
|
||||
set_intr_gate(TRAP_invalid_op,&invalid_op);
|
||||
set_intr_gate(TRAP_no_device,&device_not_available);
|
||||
set_task_gate(TRAP_double_fault,__DOUBLEFAULT_TSS_ENTRY<<3);
|
||||
set_intr_gate(TRAP_copro_seg,&coprocessor_segment_overrun);
|
||||
set_intr_gate(TRAP_invalid_tss,&invalid_TSS);
|
||||
set_intr_gate(TRAP_no_segment,&segment_not_present);
|
||||
set_intr_gate(TRAP_stack_error,&stack_segment);
|
||||
set_intr_gate(TRAP_gp_fault,&general_protection);
|
||||
set_intr_gate(TRAP_page_fault,&page_fault);
|
||||
set_intr_gate(TRAP_spurious_int,&spurious_interrupt_bug);
|
||||
set_intr_gate(TRAP_copro_error,&coprocessor_error);
|
||||
set_intr_gate(TRAP_alignment_check,&alignment_check);
|
||||
set_intr_gate(TRAP_machine_check,&machine_check);
|
||||
set_intr_gate(TRAP_simd_error,&simd_coprocessor_error);
|
||||
|
||||
/* Only ring 1 can access Xen services. */
|
||||
_set_gate(idt_table+HYPERCALL_VECTOR,14,1,&hypercall);
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Generate definitions needed by assembly language modules.
|
||||
* This code generates raw asm output which is post-processed
|
||||
* to extract and format the required data.
|
||||
*/
|
||||
|
||||
#include <xen/sched.h>
|
||||
|
||||
#define DEFINE(_sym, _val) \
|
||||
__asm__ __volatile__ ( "\n->" #_sym " %0 " #_val : : "i" _val )
|
||||
#define BLANK() \
|
||||
__asm__ __volatile__ ( "\n->" : : )
|
||||
#define OFFSET(_sym, _str, _mem) \
|
||||
DEFINE(_sym, offsetof(_str, _mem));
|
||||
|
||||
void __dummy__(void)
|
||||
{
|
||||
OFFSET(XREGS_eax, struct xen_regs, eax);
|
||||
OFFSET(XREGS_ebx, struct xen_regs, ebx);
|
||||
OFFSET(XREGS_ecx, struct xen_regs, ecx);
|
||||
OFFSET(XREGS_edx, struct xen_regs, edx);
|
||||
OFFSET(XREGS_esi, struct xen_regs, esi);
|
||||
OFFSET(XREGS_edi, struct xen_regs, edi);
|
||||
OFFSET(XREGS_esp, struct xen_regs, esp);
|
||||
OFFSET(XREGS_ebp, struct xen_regs, ebp);
|
||||
OFFSET(XREGS_eip, struct xen_regs, eip);
|
||||
OFFSET(XREGS_cs, struct xen_regs, cs);
|
||||
OFFSET(XREGS_ds, struct xen_regs, ds);
|
||||
OFFSET(XREGS_es, struct xen_regs, es);
|
||||
OFFSET(XREGS_fs, struct xen_regs, fs);
|
||||
OFFSET(XREGS_gs, struct xen_regs, gs);
|
||||
OFFSET(XREGS_ss, struct xen_regs, ss);
|
||||
OFFSET(XREGS_eflags, struct xen_regs, eflags);
|
||||
OFFSET(XREGS_orig_eax, struct xen_regs, orig_eax);
|
||||
BLANK();
|
||||
|
||||
OFFSET(DOMAIN_processor, struct domain, processor);
|
||||
OFFSET(DOMAIN_shared_info, struct domain, shared_info);
|
||||
OFFSET(DOMAIN_event_sel, struct domain, event_selector);
|
||||
OFFSET(DOMAIN_event_addr, struct domain, event_address);
|
||||
OFFSET(DOMAIN_failsafe_sel, struct domain, failsafe_selector);
|
||||
OFFSET(DOMAIN_failsafe_addr, struct domain, failsafe_address);
|
||||
BLANK();
|
||||
|
||||
OFFSET(SHINFO_upcall_pending, shared_info_t,
|
||||
vcpu_data[0].evtchn_upcall_pending);
|
||||
OFFSET(SHINFO_upcall_mask, shared_info_t,
|
||||
vcpu_data[0].evtchn_upcall_mask);
|
||||
BLANK();
|
||||
|
||||
OFFSET(GTB_error_code, struct guest_trap_bounce, error_code);
|
||||
OFFSET(GTB_cr2, struct guest_trap_bounce, cr2);
|
||||
OFFSET(GTB_flags, struct guest_trap_bounce, flags);
|
||||
OFFSET(GTB_cs, struct guest_trap_bounce, cs);
|
||||
OFFSET(GTB_eip, struct guest_trap_bounce, eip);
|
||||
BLANK();
|
||||
}
|
||||
@@ -81,10 +81,8 @@ static void show_handlers(unsigned char key)
|
||||
key_table[i].desc);
|
||||
}
|
||||
|
||||
|
||||
static void dump_registers(unsigned char key, struct xen_regs *regs)
|
||||
{
|
||||
extern void show_registers(struct xen_regs *regs);
|
||||
printk("'%c' pressed -> dumping registers\n", key);
|
||||
show_registers(regs);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#ifndef __ASM_X86_PROCESSOR_H
|
||||
#define __ASM_X86_PROCESSOR_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/page.h>
|
||||
#include <asm/types.h>
|
||||
#include <asm/cpufeature.h>
|
||||
@@ -16,6 +17,81 @@
|
||||
#include <xen/config.h>
|
||||
#include <xen/spinlock.h>
|
||||
#include <public/xen.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* CPU vendor IDs
|
||||
*/
|
||||
#define X86_VENDOR_INTEL 0
|
||||
#define X86_VENDOR_CYRIX 1
|
||||
#define X86_VENDOR_AMD 2
|
||||
#define X86_VENDOR_UMC 3
|
||||
#define X86_VENDOR_NEXGEN 4
|
||||
#define X86_VENDOR_CENTAUR 5
|
||||
#define X86_VENDOR_RISE 6
|
||||
#define X86_VENDOR_TRANSMETA 7
|
||||
#define X86_VENDOR_NSC 8
|
||||
#define X86_VENDOR_SIS 9
|
||||
#define X86_VENDOR_UNKNOWN 0xff
|
||||
|
||||
/*
|
||||
* EFLAGS bits
|
||||
*/
|
||||
#define X86_EFLAGS_CF 0x00000001 /* Carry Flag */
|
||||
#define X86_EFLAGS_PF 0x00000004 /* Parity Flag */
|
||||
#define X86_EFLAGS_AF 0x00000010 /* Auxillary carry Flag */
|
||||
#define X86_EFLAGS_ZF 0x00000040 /* Zero Flag */
|
||||
#define X86_EFLAGS_SF 0x00000080 /* Sign Flag */
|
||||
#define X86_EFLAGS_TF 0x00000100 /* Trap Flag */
|
||||
#define X86_EFLAGS_IF 0x00000200 /* Interrupt Flag */
|
||||
#define X86_EFLAGS_DF 0x00000400 /* Direction Flag */
|
||||
#define X86_EFLAGS_OF 0x00000800 /* Overflow Flag */
|
||||
#define X86_EFLAGS_IOPL 0x00003000 /* IOPL mask */
|
||||
#define X86_EFLAGS_NT 0x00004000 /* Nested Task */
|
||||
#define X86_EFLAGS_RF 0x00010000 /* Resume Flag */
|
||||
#define X86_EFLAGS_VM 0x00020000 /* Virtual Mode */
|
||||
#define X86_EFLAGS_AC 0x00040000 /* Alignment Check */
|
||||
#define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */
|
||||
#define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */
|
||||
#define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag */
|
||||
|
||||
/*
|
||||
* Intel CPU flags in CR0
|
||||
*/
|
||||
#define X86_CR0_PE 0x00000001 /* Enable Protected Mode (RW) */
|
||||
#define X86_CR0_MP 0x00000002 /* Monitor Coprocessor (RW) */
|
||||
#define X86_CR0_EM 0x00000004 /* Require FPU Emulation (RO) */
|
||||
#define X86_CR0_TS 0x00000008 /* Task Switched (RW) */
|
||||
#define X86_CR0_NE 0x00000020 /* Numeric Error Reporting (RW) */
|
||||
#define X86_CR0_WP 0x00010000 /* Supervisor Write Protect (RW) */
|
||||
#define X86_CR0_AM 0x00040000 /* Alignment Checking (RW) */
|
||||
#define X86_CR0_NW 0x20000000 /* Not Write-Through (RW) */
|
||||
#define X86_CR0_CD 0x40000000 /* Cache Disable (RW) */
|
||||
#define X86_CR0_PG 0x80000000 /* Paging (RW) */
|
||||
|
||||
/*
|
||||
* Intel CPU features in CR4
|
||||
*/
|
||||
#define X86_CR4_VME 0x0001 /* enable vm86 extensions */
|
||||
#define X86_CR4_PVI 0x0002 /* virtual interrupts flag enable */
|
||||
#define X86_CR4_TSD 0x0004 /* disable time stamp at ipl 3 */
|
||||
#define X86_CR4_DE 0x0008 /* enable debugging extensions */
|
||||
#define X86_CR4_PSE 0x0010 /* enable page size extensions */
|
||||
#define X86_CR4_PAE 0x0020 /* enable physical address extensions */
|
||||
#define X86_CR4_MCE 0x0040 /* Machine check enable */
|
||||
#define X86_CR4_PGE 0x0080 /* enable global pages */
|
||||
#define X86_CR4_PCE 0x0100 /* enable performance counters at ipl 3 */
|
||||
#define X86_CR4_OSFXSR 0x0200 /* enable fast FPU save and restore */
|
||||
#define X86_CR4_OSXMMEXCPT 0x0400 /* enable unmasked SSE exceptions */
|
||||
|
||||
/*
|
||||
* 'guest_trap_bounce' flags values.
|
||||
*/
|
||||
#define GTBF_TRAP 1
|
||||
#define GTBF_TRAP_NOCODE 2
|
||||
#define GTBF_TRAP_CR2 4
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct domain;
|
||||
|
||||
@@ -49,18 +125,6 @@ struct cpuinfo_x86 {
|
||||
int x86_tlbsize; /* number of 4K pages in DTLB/ITLB combined */
|
||||
} __attribute__((__aligned__(SMP_CACHE_BYTES)));
|
||||
|
||||
#define X86_VENDOR_INTEL 0
|
||||
#define X86_VENDOR_CYRIX 1
|
||||
#define X86_VENDOR_AMD 2
|
||||
#define X86_VENDOR_UMC 3
|
||||
#define X86_VENDOR_NEXGEN 4
|
||||
#define X86_VENDOR_CENTAUR 5
|
||||
#define X86_VENDOR_RISE 6
|
||||
#define X86_VENDOR_TRANSMETA 7
|
||||
#define X86_VENDOR_NSC 8
|
||||
#define X86_VENDOR_SIS 9
|
||||
#define X86_VENDOR_UNKNOWN 0xff
|
||||
|
||||
/*
|
||||
* capabilities of CPUs
|
||||
*/
|
||||
@@ -82,27 +146,6 @@ extern void identify_cpu(struct cpuinfo_x86 *);
|
||||
extern void print_cpu_info(struct cpuinfo_x86 *);
|
||||
extern void dodgy_tsc(void);
|
||||
|
||||
/*
|
||||
* EFLAGS bits
|
||||
*/
|
||||
#define X86_EFLAGS_CF 0x00000001 /* Carry Flag */
|
||||
#define X86_EFLAGS_PF 0x00000004 /* Parity Flag */
|
||||
#define X86_EFLAGS_AF 0x00000010 /* Auxillary carry Flag */
|
||||
#define X86_EFLAGS_ZF 0x00000040 /* Zero Flag */
|
||||
#define X86_EFLAGS_SF 0x00000080 /* Sign Flag */
|
||||
#define X86_EFLAGS_TF 0x00000100 /* Trap Flag */
|
||||
#define X86_EFLAGS_IF 0x00000200 /* Interrupt Flag */
|
||||
#define X86_EFLAGS_DF 0x00000400 /* Direction Flag */
|
||||
#define X86_EFLAGS_OF 0x00000800 /* Overflow Flag */
|
||||
#define X86_EFLAGS_IOPL 0x00003000 /* IOPL mask */
|
||||
#define X86_EFLAGS_NT 0x00004000 /* Nested Task */
|
||||
#define X86_EFLAGS_RF 0x00010000 /* Resume Flag */
|
||||
#define X86_EFLAGS_VM 0x00020000 /* Virtual Mode */
|
||||
#define X86_EFLAGS_AC 0x00040000 /* Alignment Check */
|
||||
#define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */
|
||||
#define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */
|
||||
#define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag */
|
||||
|
||||
/*
|
||||
* Generic CPUID function
|
||||
*/
|
||||
@@ -161,20 +204,6 @@ static inline unsigned int cpuid_edx(unsigned int op)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Intel CPU flags in CR0
|
||||
*/
|
||||
#define X86_CR0_PE 0x00000001 /* Enable Protected Mode (RW) */
|
||||
#define X86_CR0_MP 0x00000002 /* Monitor Coprocessor (RW) */
|
||||
#define X86_CR0_EM 0x00000004 /* Require FPU Emulation (RO) */
|
||||
#define X86_CR0_TS 0x00000008 /* Task Switched (RW) */
|
||||
#define X86_CR0_NE 0x00000020 /* Numeric Error Reporting (RW) */
|
||||
#define X86_CR0_WP 0x00010000 /* Supervisor Write Protect (RW) */
|
||||
#define X86_CR0_AM 0x00040000 /* Alignment Checking (RW) */
|
||||
#define X86_CR0_NW 0x20000000 /* Not Write-Through (RW) */
|
||||
#define X86_CR0_CD 0x40000000 /* Cache Disable (RW) */
|
||||
#define X86_CR0_PG 0x80000000 /* Paging (RW) */
|
||||
|
||||
#define read_cr0() ({ \
|
||||
unsigned long __dummy; \
|
||||
__asm__( \
|
||||
@@ -187,21 +216,6 @@ static inline unsigned int cpuid_edx(unsigned int op)
|
||||
__asm__("mov"__OS" %0,%%cr0": :"r" (x));
|
||||
|
||||
|
||||
/*
|
||||
* Intel CPU features in CR4
|
||||
*/
|
||||
#define X86_CR4_VME 0x0001 /* enable vm86 extensions */
|
||||
#define X86_CR4_PVI 0x0002 /* virtual interrupts flag enable */
|
||||
#define X86_CR4_TSD 0x0004 /* disable time stamp at ipl 3 */
|
||||
#define X86_CR4_DE 0x0008 /* enable debugging extensions */
|
||||
#define X86_CR4_PSE 0x0010 /* enable page size extensions */
|
||||
#define X86_CR4_PAE 0x0020 /* enable physical address extensions */
|
||||
#define X86_CR4_MCE 0x0040 /* Machine check enable */
|
||||
#define X86_CR4_PGE 0x0080 /* enable global pages */
|
||||
#define X86_CR4_PCE 0x0100 /* enable performance counters at ipl 3 */
|
||||
#define X86_CR4_OSFXSR 0x0200 /* enable fast FPU save and restore */
|
||||
#define X86_CR4_OSXMMEXCPT 0x0400 /* enable unmasked SSE exceptions */
|
||||
|
||||
/*
|
||||
* Save the cr4 feature set we're using (ie
|
||||
* Pentium 4MB enable and PPro Global page
|
||||
@@ -344,9 +358,6 @@ long set_fast_trap(struct domain *p, int idx);
|
||||
|
||||
#endif /* __x86_64__ */
|
||||
|
||||
#define GTBF_TRAP 1
|
||||
#define GTBF_TRAP_NOCODE 2
|
||||
#define GTBF_TRAP_CR2 4
|
||||
struct guest_trap_bounce {
|
||||
unsigned long error_code; /* 0 */
|
||||
unsigned long cr2; /* 4 */
|
||||
@@ -477,4 +488,12 @@ extern inline void prefetchw(const void *x)
|
||||
|
||||
#endif
|
||||
|
||||
void show_guest_stack();
|
||||
void show_trace(unsigned long *esp);
|
||||
void show_stack(unsigned long *esp);
|
||||
void show_registers(struct xen_regs *regs);
|
||||
asmlinkage void fatal_trap(int trapnr, struct xen_regs *regs, long error_code);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_X86_PROCESSOR_H */
|
||||
@@ -116,18 +116,15 @@ static inline int __mark_dirty( struct mm_struct *m, unsigned int mfn)
|
||||
#ifndef NDEBUG
|
||||
else if ( mfn < max_page )
|
||||
{
|
||||
unsigned long *esp;
|
||||
SH_LOG("mark_dirty OOR! mfn=%x pfn=%lx max=%x (mm %p)",
|
||||
mfn, pfn, m->shadow_dirty_bitmap_size, m );
|
||||
SH_LOG("dom=%p caf=%08x taf=%08x\n",
|
||||
frame_table[mfn].u.inuse.domain,
|
||||
frame_table[mfn].count_info,
|
||||
frame_table[mfn].u.inuse.type_info );
|
||||
{
|
||||
extern void show_trace(unsigned long *esp);
|
||||
unsigned long *esp;
|
||||
__asm__ __volatile__ ("movl %%esp,%0" : "=r" (esp) : );
|
||||
show_trace(esp);
|
||||
}
|
||||
__asm__ __volatile__ ("movl %%esp,%0" : "=r" (esp) : );
|
||||
show_trace(esp);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,56 +1,14 @@
|
||||
#ifndef __ASM_DEFNS_H__
|
||||
#define __ASM_DEFNS_H__
|
||||
|
||||
/* Offsets in 'struct xen_regs' --- AUTO-GENERATE ME! */
|
||||
#define XREGS_ebx 0x00
|
||||
#define XREGS_ecx 0x04
|
||||
#define XREGS_edx 0x08
|
||||
#define XREGS_esi 0x0C
|
||||
#define XREGS_edi 0x10
|
||||
#define XREGS_ebp 0x14
|
||||
#define XREGS_eax 0x18
|
||||
#define XREGS_orig_eax 0x1C
|
||||
#define XREGS_eip 0x20
|
||||
#define XREGS_cs 0x24
|
||||
#define XREGS_eflags 0x28
|
||||
#define XREGS_esp 0x2C
|
||||
#define XREGS_ss 0x30
|
||||
#define XREGS_es 0x34
|
||||
#define XREGS_ds 0x38
|
||||
#define XREGS_fs 0x3C
|
||||
#define XREGS_gs 0x40
|
||||
|
||||
/* Offsets in 'struct domain' --- AUTO-GENERATE ME! */
|
||||
#define DOMAIN_processor 0
|
||||
#define DOMAIN_shared_info 4
|
||||
#define DOMAIN_event_sel 8
|
||||
#define DOMAIN_event_addr 12
|
||||
#define DOMAIN_failsafe_sel 16
|
||||
#define DOMAIN_failsafe_addr 20
|
||||
|
||||
/* Offsets in shared_info_t --- AUTO-GENERATE ME! */
|
||||
#define SHINFO_upcall_pending /* 0 */
|
||||
#define SHINFO_upcall_mask 1
|
||||
|
||||
/* Offsets in 'struct guest_trap_bounce' --- AUTO-GENERATE ME! */
|
||||
#define GTB_error_code 0
|
||||
#define GTB_cr2 4
|
||||
#define GTB_flags 8
|
||||
#define GTB_cs 10
|
||||
#define GTB_eip 12
|
||||
#define GTBF_TRAP 1
|
||||
#define GTBF_TRAP_NOCODE 2
|
||||
#define GTBF_TRAP_CR2 4
|
||||
|
||||
/* EFLAGS masks. */
|
||||
#define CF_MASK 0x00000001
|
||||
#define IF_MASK 0x00000200
|
||||
#define NT_MASK 0x00004000
|
||||
/* NB. Auto-generated from arch/.../asm-offsets.c */
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
#define __STR(x) #x
|
||||
#define STR(x) __STR(x)
|
||||
|
||||
/* AUTO-GENERATE the following two cases (quoted vs. unquoted). */
|
||||
/* Maybe auto-generate the following two cases (quoted vs. unquoted). */
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define __SAVE_ALL_PRE(_reg) \
|
||||
|
||||