Module Name:    src
Committed By:   bouyer
Date:           Sun Jun 12 11:36:43 UTC 2022

Modified Files:
        src/sys/arch/amd64/amd64: genassym.cf locore.S
        src/sys/arch/i386/i386: genassym.cf locore.S

Log Message:
XenPV: in cpu_switchto(), reset ci_xen_clockf_usermode/ci_xen_clockf_pc,
in case a clock interrupt is deffered while we're switching lwp.
Fix a (rare) panic:
panic: kernel diagnostic assertion "p != NULL" failed: file 
"/usr/src/sys/kern/kern_clock.c", line 438
seen when xen_timer_handler() is called from the splx() at the end of
mi_switch()


To generate a diff of this commit:
cvs rdiff -u -r1.86 -r1.87 src/sys/arch/amd64/amd64/genassym.cf
cvs rdiff -u -r1.212 -r1.213 src/sys/arch/amd64/amd64/locore.S
cvs rdiff -u -r1.123 -r1.124 src/sys/arch/i386/i386/genassym.cf
cvs rdiff -u -r1.188 -r1.189 src/sys/arch/i386/i386/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/genassym.cf
diff -u src/sys/arch/amd64/amd64/genassym.cf:1.86 src/sys/arch/amd64/amd64/genassym.cf:1.87
--- src/sys/arch/amd64/amd64/genassym.cf:1.86	Tue May 24 15:55:19 2022
+++ src/sys/arch/amd64/amd64/genassym.cf	Sun Jun 12 11:36:42 2022
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.86 2022/05/24 15:55:19 bouyer Exp $
+#	$NetBSD: genassym.cf,v 1.87 2022/06/12 11:36:42 bouyer Exp $
 
 #
 # Copyright (c) 1998, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -376,6 +376,8 @@ ifdef XENPV
 define XEN_PT_BASE		offsetof(struct start_info, pt_base)    
 define XEN_NR_PT_FRAMES		offsetof(struct start_info, nr_pt_frames)
 define __HYPERVISOR_iret	__HYPERVISOR_iret
+define CPU_INFO_XEN_CLOCKF_USERMODE offsetof(struct cpu_info, ci_xen_clockf_usermode)
+define CPU_INFO_XEN_CLOCKF_PC	offsetof(struct cpu_info, ci_xen_clockf_pc)
 endif /* XENPV */
 endif /* XEN */
 

Index: src/sys/arch/amd64/amd64/locore.S
diff -u src/sys/arch/amd64/amd64/locore.S:1.212 src/sys/arch/amd64/amd64/locore.S:1.213
--- src/sys/arch/amd64/amd64/locore.S:1.212	Wed Nov 10 15:59:07 2021
+++ src/sys/arch/amd64/amd64/locore.S	Sun Jun 12 11:36:42 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.212 2021/11/10 15:59:07 msaitoh Exp $	*/
+/*	$NetBSD: locore.S,v 1.213 2022/06/12 11:36:42 bouyer Exp $	*/
 
 /*
  * Copyright-o-rama!
@@ -1183,6 +1183,16 @@ ENTRY(cpu_switchto)
 	movq	%r12,%rcx
 	xchgq	%rcx,CPUVAR(CURLWP)
 
+#ifdef XENPV
+	/* if we are there, we're obviously not in user context.
+	 * reset ci_xen_clockf_* in case the splx() at the end of mi_switch()
+	 * triggers a deffered call do xen_timer_handler()
+	 */
+	movb    $0, CPUVAR(XEN_CLOCKF_USERMODE)
+	movq    $_C_LABEL(cpu_switchto), CPUVAR(XEN_CLOCKF_PC)
+#endif
+
+
 	/* Skip the rest if returning to a pinned LWP. */
 	testb	%dl,%dl		/* returning = true ? */
 	jnz	.Lswitch_return

Index: src/sys/arch/i386/i386/genassym.cf
diff -u src/sys/arch/i386/i386/genassym.cf:1.123 src/sys/arch/i386/i386/genassym.cf:1.124
--- src/sys/arch/i386/i386/genassym.cf:1.123	Tue May 24 15:55:19 2022
+++ src/sys/arch/i386/i386/genassym.cf	Sun Jun 12 11:36:42 2022
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.123 2022/05/24 15:55:19 bouyer Exp $
+#	$NetBSD: genassym.cf,v 1.124 2022/06/12 11:36:42 bouyer Exp $
 
 #
 # Copyright (c) 1998, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -392,3 +392,8 @@ define EVTCHN_UPCALL_MASK	offsetof(struc
 define HYPERVISOR_sched_op	__HYPERVISOR_sched_op
 define SCHEDOP_yield		SCHEDOP_yield
 endif /* XEN */
+
+ifdef XENPV
+define CPU_INFO_XEN_CLOCKF_USERMODE offsetof(struct cpu_info, ci_xen_clockf_usermode)
+define CPU_INFO_XEN_CLOCKF_PC	offsetof(struct cpu_info, ci_xen_clockf_pc)
+endif /* XENPV */

Index: src/sys/arch/i386/i386/locore.S
diff -u src/sys/arch/i386/i386/locore.S:1.188 src/sys/arch/i386/i386/locore.S:1.189
--- src/sys/arch/i386/i386/locore.S:1.188	Tue May 31 18:04:11 2022
+++ src/sys/arch/i386/i386/locore.S	Sun Jun 12 11:36:42 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.188 2022/05/31 18:04:11 bouyer Exp $	*/
+/*	$NetBSD: locore.S,v 1.189 2022/06/12 11:36:42 bouyer Exp $	*/
 
 /*
  * Copyright-o-rama!
@@ -128,7 +128,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.188 2022/05/31 18:04:11 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore.S,v 1.189 2022/06/12 11:36:42 bouyer Exp $");
 
 #include "opt_copy_symtab.h"
 #include "opt_ddb.h"
@@ -1407,6 +1407,15 @@ ENTRY(cpu_switchto)
 	movl	%edi,%ecx
 	xchgl	%ecx,CPUVAR(CURLWP)
 
+#ifdef XENPV
+	/* if we are there, we're obviously not in user context.
+	 * reset ci_xen_clockf_* in case the splx() at the end of mi_switch()
+	 * triggers a deffered call do xen_timer_handler()
+	 */
+	movb	$0, CPUVAR(XEN_CLOCKF_USERMODE)
+	movl	$_C_LABEL(cpu_switchto), CPUVAR(XEN_CLOCKF_PC)
+#endif
+
 	/* Skip the rest if returning to a pinned LWP. */
 	testl	%edx,%edx
 	jnz	switch_return

Reply via email to