Module Name: src
Committed By: bouyer
Date: Sun Jun 21 16:57:18 UTC 2020
Modified Files:
src/sys/arch/amd64/amd64: amd64_trap.S locore.S
Log Message:
On amd64, Xen PV calls syscalls and traps with events enabled.
Disable events on entry to be safe.
It should have been mostly safe for most cases, but for FPU traps
we need to reload the FPU state if we got interrupted at trap entry.
Hopefully fixes:
panic: kernel diagnostic assertion "curlwp->l_md.md_flags & MDL_FPU_IN_CPU"
failed: file "/home/source/ab/HEAD/src/sys/arch/x86/x86/fpu.c", line 524
when running tests.
To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 src/sys/arch/amd64/amd64/amd64_trap.S
cvs rdiff -u -r1.209 -r1.210 src/sys/arch/amd64/amd64/locore.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/amd64_trap.S
diff -u src/sys/arch/amd64/amd64/amd64_trap.S:1.51 src/sys/arch/amd64/amd64/amd64_trap.S:1.52
--- src/sys/arch/amd64/amd64/amd64_trap.S:1.51 Sat Dec 7 10:19:35 2019
+++ src/sys/arch/amd64/amd64/amd64_trap.S Sun Jun 21 16:57:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: amd64_trap.S,v 1.51 2019/12/07 10:19:35 maxv Exp $ */
+/* $NetBSD: amd64_trap.S,v 1.52 2020/06/21 16:57:18 bouyer Exp $ */
/*
* Copyright (c) 1998, 2007, 2008, 2017 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
*/
#ifdef XENPV
-#define PRE_TRAP movq (%rsp),%rcx ; movq 8(%rsp),%r11 ; addq $0x10,%rsp
+#define PRE_TRAP CLI(cx); movq (%rsp),%rcx ; movq 8(%rsp),%r11 ; addq $0x10,%rsp
#else
#define PRE_TRAP
#endif
@@ -231,9 +231,9 @@ IDTVEC(trap01)
movw %ds,TF_DS(%rsp)
jmp .Lalltraps_noentry
-#else
+#else /* !XENPV */
ZTRAP(T_TRCTRAP)
-#endif
+#endif /* !XENPV */
IDTVEC_END(trap01)
/*
@@ -250,7 +250,7 @@ IDTVEC_END(trap01)
IDTVEC(trap02)
#if defined(XENPV)
ZTRAP(T_NMI)
-#else
+#else /* XENPV */
ZTRAP_NJ(T_NMI)
subq $TF_REGSIZE,%rsp
INTR_SAVE_GPRS
@@ -299,7 +299,7 @@ IDTVEC(trap02)
INTR_RESTORE_GPRS
addq $TF_REGSIZE+16,%rsp
iretq
-#endif
+#endif /* XENPV */
IDTVEC_END(trap02)
IDTVEC(trap03)
@@ -361,7 +361,7 @@ IDTVEC_END(trap07)
IDTVEC(trap08)
#if defined(XENPV)
TRAP(T_DOUBLEFLT)
-#else
+#else /* XENPV */
TRAP_NJ(T_DOUBLEFLT)
subq $TF_REGSIZE,%rsp
INTR_SAVE_GPRS
@@ -396,7 +396,7 @@ IDTVEC(trap08)
INTR_RESTORE_GPRS
addq $TF_REGSIZE+16,%rsp
iretq
-#endif
+#endif /* XENPV */
IDTVEC_END(trap08)
IDTVEC(trap09)
@@ -414,7 +414,7 @@ IDTVEC_END(trap10)
* in order to copy the user segment registers into the fault frame.
*/
#define kernuser_reenter alltraps
-#endif
+#endif /* XENPV */
IDTVEC(trap11) /* #NP() Segment not present */
TRAP_NJ(T_SEGNPFLT)
@@ -448,6 +448,14 @@ IDTVEC(trap16)
ZTRAP_NJ(T_ARITHTRAP)
.Ldo_fputrap:
INTRENTRY
+#ifdef XENPV
+ /* traps are called with interrupts enabled, and we may have been
+ * interrupted just before the CLI in the trap macro.
+ * we have to check if a FPU reload is needed.
+ */
+ movq CPUVAR(CURLWP),%r14
+ HANDLE_DEFERRED_FPU
+#endif /* XENPV */
#ifdef DIAGNOSTIC
movl CPUVAR(ILEVEL),%ebx
#endif
Index: src/sys/arch/amd64/amd64/locore.S
diff -u src/sys/arch/amd64/amd64/locore.S:1.209 src/sys/arch/amd64/amd64/locore.S:1.210
--- src/sys/arch/amd64/amd64/locore.S:1.209 Wed May 27 19:33:40 2020
+++ src/sys/arch/amd64/amd64/locore.S Sun Jun 21 16:57:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.209 2020/05/27 19:33:40 ad Exp $ */
+/* $NetBSD: locore.S,v 1.210 2020/06/21 16:57:18 bouyer Exp $ */
/*
* Copyright-o-rama!
@@ -1481,7 +1481,13 @@ IDTVEC(\name)
movq $2,TF_ERR(%rsp) /* syscall instruction size */
movq $T_ASTFLT,TF_TRAPNO(%rsp)
#else
- /* Xen already switched to kernel stack */
+ /*
+ * Xen already switched to kernel stack.
+ * But it didn't disable events
+ */
+ pushq %rsi
+ CLI(si)
+ popq %rsi
addq $0x10,%rsp /* gap to match cs:rip */
pushq $2 /* error code */
pushq $T_ASTFLT
@@ -1524,6 +1530,9 @@ IDTVEC_END(syscall32)
TEXT_USER_BEGIN
IDTVEC(osyscall)
#ifdef XENPV
+ pushq %rsi
+ CLI(si)
+ popq %rsi
movq (%rsp),%rcx
movq 8(%rsp),%r11
addq $0x10,%rsp