|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [mini-os master] mini-os: support HVMlite traps
commit 2d76b592882583d62ade56c8931ce4cfa1d1f9d8
Author: Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Mon Aug 22 14:08:28 2016 +0200
Commit: Wei Liu <wei.liu2@xxxxxxxxxx>
CommitDate: Wed Aug 24 11:37:05 2016 +0100
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_ */
--
generated by git-patchbot for /home/xen/git/mini-os.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |