[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v2 09/22] mini-os: support HVMlite traps



Trap handling in HVMlite domain is different from pv one.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
---
 arch/x86/traps.c  |  2 --
 arch/x86/x86_32.S | 19 ++++++++++++++--
 arch/x86/x86_64.S | 22 +++++++++++++++++-
 include/x86/os.h  | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 4 files changed, 101 insertions(+), 9 deletions(-)

diff --git a/arch/x86/traps.c b/arch/x86/traps.c
index 3b1fffb..0b3d85b 100644
--- a/arch/x86/traps.c
+++ b/arch/x86/traps.c
@@ -191,8 +191,6 @@ static void dump_mem(unsigned long addr)
     }
     printk("\n");
 }
-#define read_cr2() \
-        (HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].arch.cr2)
 
 static int handling_pg_fault = 0;
 
diff --git a/arch/x86/x86_32.S b/arch/x86/x86_32.S
index 6f38708..9241418 100644
--- a/arch/x86/x86_32.S
+++ b/arch/x86/x86_32.S
@@ -8,6 +8,9 @@
 #include <xen/arch-x86_32.h>
 
 #ifdef CONFIG_PARAVIRT
+
+#define KERNEL_DS __KERNEL_DS
+
 ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz "Mini-OS")
 ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic")
 ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, _WORD hypercall_page)
@@ -21,6 +24,8 @@ _start:
         lss stack_start,%esp
 #else
 
+#define KERNEL_DS __KERN_DS
+
 #include "x86_hvm.S"
         movl stack_start,%esp
 
@@ -61,7 +66,7 @@ CS            = 0x2C
        pushl %edx; \
        pushl %ecx; \
        pushl %ebx; \
-       movl $(__KERNEL_DS),%edx; \
+       movl $(KERNEL_DS),%edx; \
        movl %edx,%ds; \
        movl %edx,%es;
 
@@ -98,7 +103,7 @@ do_exception:
        movl ORIG_EAX(%esp), %edx       # get the error code
        movl %eax, ORIG_EAX(%esp)
        movl %ecx, ES(%esp)
-       movl $(__KERNEL_DS), %ecx
+       movl $(KERNEL_DS), %ecx
        movl %ecx, %ds
        movl %ecx, %es
        movl %esp,%eax                  # pt_regs pointer
@@ -112,6 +117,7 @@ ret_from_exception:
     addl $8,%esp
     RESTORE_ALL
 
+#ifdef CONFIG_PARAVIRT
 # A note on the "critical region" in our callback handler.
 # We want to avoid stacking callback handlers due to events occurring
 # during handling of the last event. To do this, we keep events disabled
@@ -189,6 +195,15 @@ critical_fixup_table:
         .byte 0x28                            # iret
         .byte 0x00,0x00,0x00,0x00             # movb $1,1(%esi)
         .byte 0x00,0x00                       # jmp  11b
+
+#else
+
+ENTRY(hypervisor_callback)
+       pushl $0
+       pushl $do_hypervisor_callback
+       jmp do_exception
+
+#endif
        
 # Hypervisor uses this for application faults while it executes.
 ENTRY(failsafe_callback)
diff --git a/arch/x86/x86_64.S b/arch/x86/x86_64.S
index e725c63..17a9ead 100644
--- a/arch/x86/x86_64.S
+++ b/arch/x86/x86_64.S
@@ -78,9 +78,11 @@ KERNEL_CS_MASK = 0xfc
 
 /* Macros */
 .macro zeroentry sym
+#ifdef CONFIG_PARAVIRT
        movq (%rsp),%rcx
        movq 8(%rsp),%r11
        addq $0x10,%rsp /* skip rcx and r11 */
+#endif
        pushq $0        /* push error code/oldrax */
        pushq %rax      /* push real oldrax to the rdi slot */
        leaq  \sym(%rip),%rax
@@ -88,9 +90,11 @@ KERNEL_CS_MASK = 0xfc
 .endm
 
 .macro errorentry sym
+#ifdef CONFIG_PARAVIRT
        movq (%rsp),%rcx
        movq 8(%rsp),%r11
        addq $0x10,%rsp /* rsp points to the error code */
+#endif
        pushq %rax
        leaq  \sym(%rip),%rax
        jmp error_entry
@@ -133,11 +137,11 @@ KERNEL_CS_MASK = 0xfc
 #ifdef CONFIG_PARAVIRT
        testl $NMI_MASK,2*8(%rsp)
        jnz   2f
-#endif
 
        /* Direct iret to kernel space. Correct CS and SS. */
        orb   $3,1*8(%rsp)
        orb   $3,4*8(%rsp)
+#endif
        iretq
 
 #ifdef CONFIG_PARAVIRT
@@ -182,6 +186,7 @@ error_call_handler:
        jmp error_exit
 
 
+#ifdef CONFIG_PARAVIRT
 /*
  * Xen event (virtual interrupt) entry point.
  */
@@ -285,11 +290,26 @@ critical_region_fixup:
        andb $KERNEL_CS_MASK,CS(%rsp)      # CS might have changed
        jmp  11b
 
+#else
+error_exit:
+       RESTORE_REST
+       RESTORE_ALL
+       HYPERVISOR_IRET 0
 
+/*
+ * Xen event (virtual interrupt) entry point.
+ */
+ENTRY(hypervisor_callback)
+       zeroentry do_hypervisor_callback
+
+
+#endif
 
 ENTRY(failsafe_callback)
+#ifdef CONFIG_PARAVIRT
         popq  %rcx
         popq  %r11
+#endif
         iretq
 
 
diff --git a/include/x86/os.h b/include/x86/os.h
index db1389a..8ccff21 100644
--- a/include/x86/os.h
+++ b/include/x86/os.h
@@ -31,6 +31,8 @@
 #define X86_CR4_PAE       0x00000020    /* enable physical address extensions 
*/
 #define X86_CR4_OSFXSR    0x00000200    /* enable fast FPU save and restore */
 
+#define X86_EFLAGS_IF     0x00000200
+
 #define __KERNEL_CS  FLAT_KERNEL_CS
 #define __KERNEL_DS  FLAT_KERNEL_DS
 #define __KERNEL_SS  FLAT_KERNEL_SS
@@ -70,7 +72,7 @@ void arch_fini(void);
 
 
 
-
+#ifdef CONFIG_PARAVIRT
 
 /* 
  * The use of 'barrier' in the following reflects their use as local-lock
@@ -129,15 +131,57 @@ do {                                                      
                \
        barrier();                                                      \
 } while (0)
 
+#define irqs_disabled()                        \
+    HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].evtchn_upcall_mask
+
+#else
+
+#if defined(__i386__)
+#define __SZ "l"
+#define __REG "e"
+#else
+#define __SZ "q"
+#define __REG "r"
+#endif
+
+#define __cli() asm volatile ( "cli" : : : "memory" )
+#define __sti() asm volatile ( "sti" : : : "memory" )
+
+#define __save_flags(x)                                                 \
+do {                                                                    \
+    unsigned long __f;                                                  \
+    asm volatile ( "pushf" __SZ " ; pop" __SZ " %0" : "=g" (__f));      \
+    x = (__f & X86_EFLAGS_IF) ? 1 : 0;                                  \
+} while (0)
+
+#define __restore_flags(x)                                              \
+do {                                                                    \
+    if (x) __sti();                                                     \
+    else __cli();                                                       \
+} while (0)
+
+#define __save_and_cli(x)                                               \
+do {                                                                    \
+    __save_flags(x);                                                    \
+    __cli();                                                            \
+} while (0)
+
+static inline int irqs_disabled(void)
+{
+    int flag;
+
+    __save_flags(flag);
+    return !flag;
+}
+
+#endif
+
 #define local_irq_save(x)      __save_and_cli(x)
 #define local_irq_restore(x)   __restore_flags(x)
 #define local_save_flags(x)    __save_flags(x)
 #define local_irq_disable()    __cli()
 #define local_irq_enable()     __sti()
 
-#define irqs_disabled()                        \
-    HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].evtchn_upcall_mask
-
 /* This is a barrier for the compiler only, NOT the processor! */
 #define barrier() __asm__ __volatile__("": : :"memory")
 
@@ -586,5 +630,20 @@ static inline void cpuid(uint32_t leaf,
 
 #undef ADDR
 
+#ifdef CONFIG_PARAVIRT
+static inline unsigned long read_cr2(void)
+{
+    return HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].arch.cr2;
+}
+#else
+static inline unsigned long read_cr2(void)
+{
+    unsigned long cr2;
+
+    asm volatile ( "mov %%cr2,%0\n\t" : "=r" (cr2) );
+    return cr2;
+}
+#endif
+
 #endif /* not assembly */
 #endif /* _OS_H_ */
-- 
2.6.6


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.