Module Name:    src
Committed By:   bouyer
Date:           Sat Apr 11 10:11:31 UTC 2020

Modified Files:
        src/sys/arch/amd64/amd64 [bouyer-xenpvh]: genassym.cf spl.S
        src/sys/arch/amd64/include [bouyer-xenpvh]: frameasm.h
        src/sys/arch/i386/i386 [bouyer-xenpvh]: genassym.cf spl.S
        src/sys/arch/i386/include [bouyer-xenpvh]: frameasm.h
        src/sys/arch/x86/include [bouyer-xenpvh]: cpu.h
        src/sys/arch/xen/x86 [bouyer-xenpvh]: xen_intr.c

Log Message:
Include ci_isources[] for XenPV too.
Adjust spllower() to XenPV needs, and switch XenPV to the native spllower().
Remove xen_spllower().


To generate a diff of this commit:
cvs rdiff -u -r1.82.4.1 -r1.82.4.2 src/sys/arch/amd64/amd64/genassym.cf
cvs rdiff -u -r1.43.4.3 -r1.43.4.4 src/sys/arch/amd64/amd64/spl.S
cvs rdiff -u -r1.47 -r1.47.6.1 src/sys/arch/amd64/include/frameasm.h
cvs rdiff -u -r1.119.4.1 -r1.119.4.2 src/sys/arch/i386/i386/genassym.cf
cvs rdiff -u -r1.50.4.1 -r1.50.4.2 src/sys/arch/i386/i386/spl.S
cvs rdiff -u -r1.29 -r1.29.6.1 src/sys/arch/i386/include/frameasm.h
cvs rdiff -u -r1.117.4.2 -r1.117.4.3 src/sys/arch/x86/include/cpu.h
cvs rdiff -u -r1.21 -r1.21.2.1 src/sys/arch/xen/x86/xen_intr.c

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.82.4.1 src/sys/arch/amd64/amd64/genassym.cf:1.82.4.2
--- src/sys/arch/amd64/amd64/genassym.cf:1.82.4.1	Wed Apr  8 17:59:16 2020
+++ src/sys/arch/amd64/amd64/genassym.cf	Sat Apr 11 10:11:30 2020
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.82.4.1 2020/04/08 17:59:16 bouyer Exp $
+#	$NetBSD: genassym.cf,v 1.82.4.2 2020/04/11 10:11:30 bouyer Exp $
 
 #
 # Copyright (c) 1998, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -246,13 +246,11 @@ define	CPU_INFO_CURPRIORITY	offsetof(str
 define	CPU_INFO_GDT		offsetof(struct cpu_info, ci_gdt)
 define	CPU_INFO_ILEVEL		offsetof(struct cpu_info, ci_ilevel)
 define	CPU_INFO_IDEPTH		offsetof(struct cpu_info, ci_idepth)
-if !defined(XENPV)
 define	CPU_INFO_IPENDING	offsetof(struct cpu_info, ci_ipending)
 define	CPU_INFO_IMASKED	offsetof(struct cpu_info, ci_imasked)
 define	CPU_INFO_IMASK		offsetof(struct cpu_info, ci_imask)
 define	CPU_INFO_IUNMASK	offsetof(struct cpu_info, ci_iunmask)
 define	CPU_INFO_ISOURCES	offsetof(struct cpu_info, ci_isources)
-endif
 define	CPU_INFO_MTX_COUNT	offsetof(struct cpu_info, ci_mtx_count)
 define	CPU_INFO_MTX_OLDSPL	offsetof(struct cpu_info, ci_mtx_oldspl)
 define  CPU_INFO_CPUID		offsetof(struct cpu_info, ci_cpuid)

Index: src/sys/arch/amd64/amd64/spl.S
diff -u src/sys/arch/amd64/amd64/spl.S:1.43.4.3 src/sys/arch/amd64/amd64/spl.S:1.43.4.4
--- src/sys/arch/amd64/amd64/spl.S:1.43.4.3	Fri Apr 10 14:41:59 2020
+++ src/sys/arch/amd64/amd64/spl.S	Sat Apr 11 10:11:30 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: spl.S,v 1.43.4.3 2020/04/10 14:41:59 bouyer Exp $	*/
+/*	$NetBSD: spl.S,v 1.43.4.4 2020/04/11 10:11:30 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -226,7 +226,6 @@ IDTVEC(resume_preempt)
 IDTVEC_END(resume_preempt)
 #endif /* XEN */
 
-#ifndef XENPV
 /*
  * void spllower(int s);
  *
@@ -238,8 +237,8 @@ ENTRY(spllower)
 	cmpl	CPUVAR(ILEVEL),%edi
 	jae	1f
 	movl	CPUVAR(IUNMASK)(,%rdi,4),%edx
-	pushf
-	cli
+	PUSHF(ax)
+	CLI(ax)
 	testl	CPUVAR(IPENDING),%edx
 	jnz	2f
 #if defined(XEN)
@@ -248,12 +247,20 @@ ENTRY(spllower)
 	jnz	2f
 #endif
 	movl	%edi,CPUVAR(ILEVEL)
-	popf
+	POPF	/* clobbers %rdi */
 1:
 	ret
 	ret
 2:
+#ifdef XENPV
+	/*
+	 * no need to call stipending, we're going to CLI again
+	 * just drop the saved value on stack
+	 */
+	addq	$8,%rsp
+#else
 	popf
+#endif
 	jmp	_C_LABEL(Xspllower)
 3:
 	.space 16
@@ -261,6 +268,7 @@ ENTRY(spllower)
 END(spllower)
 LABEL(spllower_end)
 
+#ifndef XENPV
 /*
  * void	cx8_spllower(int s);
  *

Index: src/sys/arch/amd64/include/frameasm.h
diff -u src/sys/arch/amd64/include/frameasm.h:1.47 src/sys/arch/amd64/include/frameasm.h:1.47.6.1
--- src/sys/arch/amd64/include/frameasm.h:1.47	Sun Nov 17 14:07:00 2019
+++ src/sys/arch/amd64/include/frameasm.h	Sat Apr 11 10:11:30 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: frameasm.h,v 1.47 2019/11/17 14:07:00 maxv Exp $	*/
+/*	$NetBSD: frameasm.h,v 1.47.6.1 2020/04/11 10:11:30 bouyer Exp $	*/
 
 #ifndef _AMD64_MACHINE_FRAMEASM_H
 #define _AMD64_MACHINE_FRAMEASM_H
@@ -31,11 +31,23 @@
  	movq CPUVAR(VCPU),%r ## temp_reg ;			\
 	movb $0,EVTCHN_UPCALL_MASK(%r ## temp_reg);
 
+#define PUSHF(temp_reg) \
+ 	movq CPUVAR(VCPU),%r ## temp_reg ;			\
+	movzbl EVTCHN_UPCALL_MASK(%r ## temp_reg), %e ## temp_reg; \
+	pushq %r ## temp_reg
+
+#define POPF \
+	popq %rdi; \
+	call _C_LABEL(xen_write_psl)
+	
+
 #else /* XENPV */
 #define	XEN_ONLY2(x,y)
 #define	NOT_XEN(x)	x
 #define CLI(temp_reg) cli
 #define STI(temp_reg) sti
+#define PUSHF(temp_reg) pushf
+#define POPL popl
 #endif	/* XEN */
 
 #define HP_NAME_CLAC		1

Index: src/sys/arch/i386/i386/genassym.cf
diff -u src/sys/arch/i386/i386/genassym.cf:1.119.4.1 src/sys/arch/i386/i386/genassym.cf:1.119.4.2
--- src/sys/arch/i386/i386/genassym.cf:1.119.4.1	Wed Apr  8 17:59:16 2020
+++ src/sys/arch/i386/i386/genassym.cf	Sat Apr 11 10:11:31 2020
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.119.4.1 2020/04/08 17:59:16 bouyer Exp $
+#	$NetBSD: genassym.cf,v 1.119.4.2 2020/04/11 10:11:31 bouyer Exp $
 
 #
 # Copyright (c) 1998, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -268,13 +268,11 @@ define	CPU_INFO_VENDOR		offsetof(struct 
 define	CPU_INFO_SIGNATURE	offsetof(struct cpu_info, ci_signature)
 
 define	CPU_INFO_GDT		offsetof(struct cpu_info, ci_gdt)
-if !defined(XENPV)
 define	CPU_INFO_IPENDING	offsetof(struct cpu_info, ci_ipending)
 define	CPU_INFO_IMASKED	offsetof(struct cpu_info, ci_imasked)
 define	CPU_INFO_IMASK		offsetof(struct cpu_info, ci_imask)
 define	CPU_INFO_ISOURCES	offsetof(struct cpu_info, ci_isources)
 define	CPU_INFO_IUNMASK	offsetof(struct cpu_info, ci_iunmask)
-endif
 define	CPU_INFO_ILEVEL		offsetof(struct cpu_info, ci_ilevel)
 define	CPU_INFO_IDEPTH		offsetof(struct cpu_info, ci_idepth)
 define	CPU_INFO_MTX_COUNT	offsetof(struct cpu_info, ci_mtx_count)

Index: src/sys/arch/i386/i386/spl.S
diff -u src/sys/arch/i386/i386/spl.S:1.50.4.1 src/sys/arch/i386/i386/spl.S:1.50.4.2
--- src/sys/arch/i386/i386/spl.S:1.50.4.1	Fri Apr 10 14:42:00 2020
+++ src/sys/arch/i386/i386/spl.S	Sat Apr 11 10:11:31 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: spl.S,v 1.50.4.1 2020/04/10 14:42:00 bouyer Exp $	*/
+/*	$NetBSD: spl.S,v 1.50.4.2 2020/04/11 10:11:31 bouyer Exp $	*/
 
 /*
  * Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.50.4.1 2020/04/10 14:42:00 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.50.4.2 2020/04/11 10:11:31 bouyer Exp $");
 
 #include "opt_ddb.h"
 #include "opt_spldebug.h"
@@ -67,8 +67,6 @@ ENTRY(splraise)
 	ret
 END(splraise)
 
-#ifndef XENPV
-
 /*
  * void spllower(int s);
  *
@@ -90,8 +88,8 @@ ENTRY(spllower)
 	cmpl	CPUVAR(ILEVEL),%ecx
 	jae	1f
 	movl	CPUVAR(IUNMASK)(,%ecx,4),%edx
-	pushf
-	cli
+	PUSHF(%eax)
+	CLI(%eax)
 	testl	CPUVAR(IPENDING),%edx
 	jnz	2f
 #if defined(XEN)
@@ -100,16 +98,25 @@ ENTRY(spllower)
 	jnz	2f
 #endif
 	movl	%ecx,CPUVAR(ILEVEL)
-	popf
+	POPF(%eax)
 1:
 	ret
 2:
+#ifdef XENPV
+	/*
+	 * no need to call stipending, we're going to CLI again
+	 * just drop the saved value on stack
+	 */
+	addl	$4,%esp
+#else
 	popf
+#endif
 	jmp	_C_LABEL(Xspllower)
 	.align	32
 LABEL(spllower_end)
 END(spllower)
 
+#ifndef XENPV
 /*
  * void	cx8_spllower(int s);
  *

Index: src/sys/arch/i386/include/frameasm.h
diff -u src/sys/arch/i386/include/frameasm.h:1.29 src/sys/arch/i386/include/frameasm.h:1.29.6.1
--- src/sys/arch/i386/include/frameasm.h:1.29	Sat Oct 12 06:31:03 2019
+++ src/sys/arch/i386/include/frameasm.h	Sat Apr 11 10:11:31 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: frameasm.h,v 1.29 2019/10/12 06:31:03 maxv Exp $	*/
+/*	$NetBSD: frameasm.h,v 1.29.6.1 2020/04/11 10:11:31 bouyer Exp $	*/
 
 #ifndef _I386_FRAMEASM_H_
 #define _I386_FRAMEASM_H_
@@ -25,9 +25,16 @@
 #define STIC(reg)	movl	CPUVAR(VCPU),reg ;  \
 			XEN_UNBLOCK_EVENTS(reg)  ; \
 			testb	$0xff,EVTCHN_UPCALL_PENDING(reg)
+#define PUSHF(reg) 	movl	CPUVAR(VCPU),reg ;  \
+			movzbl	EVTCHN_UPCALL_MASK(reg), reg; \
+			pushl	reg
+#define POPF(reg)	call _C_LABEL(xen_write_psl); \
+			addl    $4,%esp
 #else
 #define CLI(reg)	cli
 #define STI(reg)	sti
+#define PUSHF(reg)	pushf
+#define POPF(reg)	popf
 #ifdef XENPVHVM
 #define STIC(reg)	sti ; \
 			movl	CPUVAR(VCPU),reg ; \

Index: src/sys/arch/x86/include/cpu.h
diff -u src/sys/arch/x86/include/cpu.h:1.117.4.2 src/sys/arch/x86/include/cpu.h:1.117.4.3
--- src/sys/arch/x86/include/cpu.h:1.117.4.2	Fri Apr 10 14:37:54 2020
+++ src/sys/arch/x86/include/cpu.h	Sat Apr 11 10:11:31 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.117.4.2 2020/04/10 14:37:54 bouyer Exp $	*/
+/*	$NetBSD: cpu.h,v 1.117.4.3 2020/04/11 10:11:31 bouyer Exp $	*/
 
 /*
  * Copyright (c) 1990 The Regents of the University of California.
@@ -132,9 +132,7 @@ struct cpu_info {
 
 	int ci_kfpu_spl;
 
-#ifndef XENPV
 	struct intrsource *ci_isources[MAX_INTR_SOURCES];
-#endif
 #if defined(XEN)
 	struct intrsource *ci_xsources[NIPL];
 	uint32_t	ci_xmask[NIPL];

Index: src/sys/arch/xen/x86/xen_intr.c
diff -u src/sys/arch/xen/x86/xen_intr.c:1.21 src/sys/arch/xen/x86/xen_intr.c:1.21.2.1
--- src/sys/arch/xen/x86/xen_intr.c:1.21	Mon Apr  6 19:26:00 2020
+++ src/sys/arch/xen/x86/xen_intr.c	Sat Apr 11 10:11:31 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: xen_intr.c,v 1.21 2020/04/06 19:26:00 jdolecek Exp $	*/
+/*	$NetBSD: xen_intr.c,v 1.21.2.1 2020/04/11 10:11:31 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_intr.c,v 1.21 2020/04/06 19:26:00 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_intr.c,v 1.21.2.1 2020/04/11 10:11:31 bouyer Exp $");
 
 #include "opt_multiprocessor.h"
 
@@ -73,38 +73,6 @@ __KERNEL_RCSID(0, "$NetBSD: xen_intr.c,v
 static const char *xen_ipi_names[XEN_NIPIS] = XEN_IPI_NAMES;
 #endif
 
-/*
- * Restore a value to cpl (unmasking interrupts).  If any unmasked
- * interrupts are pending, call Xspllower() to process them.
- */
-void xen_spllower(int nlevel);
-
-void
-xen_spllower(int nlevel)
-{
-	struct cpu_info *ci = curcpu();
-	uint32_t xmask;
-	u_long psl;
-
-	if (ci->ci_ilevel <= nlevel)
-		return;
-
-	__insn_barrier();
-
-	xmask = XUNMASK(ci, nlevel);
-	psl = xen_read_psl();
-	x86_disable_intr();
-	if (ci->ci_xpending & xmask) {
-		KASSERT(psl == 0);
-		Xspllower(nlevel);
-		/* Xspllower does enable_intr() */
-	} else {
-		ci->ci_ilevel = nlevel;
-		xen_write_psl(psl);
-	}
-}
-
-
 #if !defined(XENPVHVM)
 void
 x86_disable_intr(void)

Reply via email to