Module Name: src Committed By: bouyer Date: Fri Apr 10 14:34:28 UTC 2020
Modified Files: src/sys/arch/x86/include: cpu.h src/sys/arch/x86/x86: cpu.c patch.c Log Message: Skip cx8_spllower patch if we're running on any form of Xen PV, we can't handle PV interrupts with a single atomic op here. Enable x86_patch() for Xen too. To generate a diff of this commit: cvs rdiff -u -r1.117 -r1.118 src/sys/arch/x86/include/cpu.h cvs rdiff -u -r1.181 -r1.182 src/sys/arch/x86/x86/cpu.c cvs rdiff -u -r1.37 -r1.38 src/sys/arch/x86/x86/patch.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/x86/include/cpu.h diff -u src/sys/arch/x86/include/cpu.h:1.117 src/sys/arch/x86/include/cpu.h:1.118 --- src/sys/arch/x86/include/cpu.h:1.117 Wed Jan 15 13:22:03 2020 +++ src/sys/arch/x86/include/cpu.h Fri Apr 10 14:34:27 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.117 2020/01/15 13:22:03 ad Exp $ */ +/* $NetBSD: cpu.h,v 1.118 2020/04/10 14:34:27 bouyer Exp $ */ /* * Copyright (c) 1990 The Regents of the University of California. @@ -505,6 +505,19 @@ typedef enum vm_guest { } vm_guest_t; extern vm_guest_t vm_guest; +static __inline bool __unused +vm_guest_is_xenpv(void) +{ + switch(vm_guest) { + case VM_GUEST_XENPV: + case VM_GUEST_XENPVH: + case VM_GUEST_XENPVHVM: + return true; + default: + return false; + } +} + /* cpu_topology.c */ void x86_cpu_topology(struct cpu_info *); Index: src/sys/arch/x86/x86/cpu.c diff -u src/sys/arch/x86/x86/cpu.c:1.181 src/sys/arch/x86/x86/cpu.c:1.182 --- src/sys/arch/x86/x86/cpu.c:1.181 Tue Jan 14 01:41:37 2020 +++ src/sys/arch/x86/x86/cpu.c Fri Apr 10 14:34:27 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.181 2020/01/14 01:41:37 pgoyette Exp $ */ +/* $NetBSD: cpu.c,v 1.182 2020/04/10 14:34:27 bouyer Exp $ */ /* * Copyright (c) 2000-2012 NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.181 2020/01/14 01:41:37 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.182 2020/04/10 14:34:27 bouyer Exp $"); #include "opt_ddb.h" #include "opt_mpbios.h" /* for MPDEBUG */ @@ -720,10 +720,8 @@ cpu_boot_secondary_processors(void) kcpuset_t *cpus; u_long i; -#ifndef XEN /* Now that we know the number of CPUs, patch the text segment. */ x86_patch(false); -#endif #if NACPICA > 0 /* Finished with NUMA info for now. */ Index: src/sys/arch/x86/x86/patch.c diff -u src/sys/arch/x86/x86/patch.c:1.37 src/sys/arch/x86/x86/patch.c:1.38 --- src/sys/arch/x86/x86/patch.c:1.37 Wed Sep 18 15:07:08 2019 +++ src/sys/arch/x86/x86/patch.c Fri Apr 10 14:34:27 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: patch.c,v 1.37 2019/09/18 15:07:08 kamil Exp $ */ +/* $NetBSD: patch.c,v 1.38 2020/04/10 14:34:27 bouyer Exp $ */ /*- * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.37 2019/09/18 15:07:08 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.38 2020/04/10 14:34:27 bouyer Exp $"); #include "opt_lockdebug.h" #ifdef i386 @@ -250,7 +250,8 @@ x86_patch(bool early) #endif /* i386 */ #if !defined(SPLDEBUG) - if (!early && (cpu_feature[0] & CPUID_CX8) != 0) { + if (!early && (cpu_feature[0] & CPUID_CX8) != 0 && + !vm_guest_is_xenpv()) { /* Faster splx(), mutex_spin_exit(). */ patchfunc( cx8_spllower, cx8_spllower_end,