Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch Switch the rest of i386 to the x86_hotpatch mechanism.



details:   https://anonhg.NetBSD.org/src/rev/b18c11a1648b
branches:  trunk
changeset: 971682:b18c11a1648b
user:      maxv <maxv%NetBSD.org@localhost>
date:      Fri May 01 09:40:47 2020 +0000

description:
Switch the rest of i386 to the x86_hotpatch mechanism.

diffstat:

 sys/arch/i386/i386/lock_stubs.S  |  10 ++++----
 sys/arch/i386/i386/spl.S         |  20 +++++++++---------
 sys/arch/i386/include/frameasm.h |   4 ++-
 sys/arch/x86/x86/patch.c         |  44 +++++++++++----------------------------
 4 files changed, 31 insertions(+), 47 deletions(-)

diffs (195 lines):

diff -r 5662192d8f45 -r b18c11a1648b sys/arch/i386/i386/lock_stubs.S
--- a/sys/arch/i386/i386/lock_stubs.S   Fri May 01 09:23:43 2020 +0000
+++ b/sys/arch/i386/i386/lock_stubs.S   Fri May 01 09:40:47 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: lock_stubs.S,v 1.34 2020/05/01 09:17:58 maxv Exp $     */
+/*     $NetBSD: lock_stubs.S,v 1.35 2020/05/01 09:40:47 maxv Exp $     */
 
 /*-
  * Copyright (c) 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: lock_stubs.S,v 1.34 2020/05/01 09:17:58 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lock_stubs.S,v 1.35 2020/05/01 09:40:47 maxv Exp $");
 
 #include "opt_lockdebug.h"
 
@@ -255,9 +255,10 @@
 
 #ifndef XENPV
 /*
- * Release a spin mutex and post a store fence.
+ * Release a spin mutex and post a store fence. Must occupy 96 bytes.
  */
 ENTRY(mutex_spin_exit)
+       HOTPATCH(HP_NAME_MUTEX_EXIT, 96)
        movl    4(%esp), %edx
        movl    CPUVAR(MTX_OLDSPL), %ecx
        incl    CPUVAR(MTX_COUNT)
@@ -273,7 +274,6 @@
 1:     ret
        .space  32, 0xCC
        .align  32
-LABEL(mutex_spin_exit_end)
 END(mutex_spin_exit)
 #else  /* XENPV */
 STRONG_ALIAS(mutex_spin_exit, i686_mutex_spin_exit)
@@ -281,7 +281,7 @@
 
 /*
  * Patch for i686 CPUs where cli/sti is prohibitively expensive.
- * Must be the same size as mutex_spin_exit().
+ * Must be the same size as mutex_spin_exit(), that is, 96 bytes.
  */
 ENTRY(i686_mutex_spin_exit)
        mov     4(%esp),%edx
diff -r 5662192d8f45 -r b18c11a1648b sys/arch/i386/i386/spl.S
--- a/sys/arch/i386/i386/spl.S  Fri May 01 09:23:43 2020 +0000
+++ b/sys/arch/i386/i386/spl.S  Fri May 01 09:40:47 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: spl.S,v 1.53 2020/05/01 09:23:43 maxv Exp $    */
+/*     $NetBSD: spl.S,v 1.54 2020/05/01 09:40:47 maxv 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.53 2020/05/01 09:23:43 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.54 2020/05/01 09:40:47 maxv Exp $");
 
 #include "opt_ddb.h"
 #include "opt_spldebug.h"
@@ -71,11 +71,12 @@
 /*
  * void spllower(int s);
  *
- * spllower() for i486 and Pentium.  Must be the same size as
- * cx8_spllower().  This must use pushf/cli/popf as it is used
- * early in boot where interrupts are disabled via eflags/IE.
+ * spllower() for i486 and Pentium. Must be the same size as cx8_spllower(),
+ * that is, 64 bytes. This must use pushf/cli/popf as it is used early in boot
+ * where interrupts are disabled via eflags/IE.
  */
 ENTRY(spllower)
+       HOTPATCH(HP_NAME_SPLLOWER, 64)
 #ifdef SPLDEBUG
        movl    4(%esp),%ecx
        pushl   %ebp
@@ -101,7 +102,6 @@
        popf
        jmp     _C_LABEL(Xspllower)
        .align  32
-LABEL(spllower_end)
 END(spllower)
 #else  /* XENPV */
 STRONG_ALIAS(spllower, cx8_spllower)
@@ -110,10 +110,10 @@
 /*
  * void        cx8_spllower(int s);
  *
- * spllower() optimized for Pentium Pro and later, which have long
- * pipelines that will be stalled by pushf/cli/popf.  Must be the
- * same size as spllower().  Does not need to restore eflags/IE as
- * is patched in once autoconf is underway.
+ * spllower() optimized for Pentium Pro and later, which have long pipelines
+ * that will be stalled by pushf/cli/popf.  Must be the same size as
+ * spllower(), ie 64 bytes.  Does not need to restore eflags/IE as is patched
+ * in once autoconf is underway.
  *
  * For cmpxchg8b, edx/ecx are the high words and eax/ebx the low.
  *
diff -r 5662192d8f45 -r b18c11a1648b sys/arch/i386/include/frameasm.h
--- a/sys/arch/i386/include/frameasm.h  Fri May 01 09:23:43 2020 +0000
+++ b/sys/arch/i386/include/frameasm.h  Fri May 01 09:40:47 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: frameasm.h,v 1.32 2020/05/01 08:32:50 maxv Exp $       */
+/*     $NetBSD: frameasm.h,v 1.33 2020/05/01 09:40:47 maxv Exp $       */
 
 #ifndef _I386_FRAMEASM_H_
 #define _I386_FRAMEASM_H_
@@ -51,6 +51,8 @@
 #define HP_NAME_SSE2_LFENCE    5
 #define HP_NAME_SSE2_MFENCE    6
 #define HP_NAME_CAS_64         7
+#define HP_NAME_SPLLOWER       8
+#define HP_NAME_MUTEX_EXIT     9
 
 #define HOTPATCH(name, size) \
 123:                                           ; \
diff -r 5662192d8f45 -r b18c11a1648b sys/arch/x86/x86/patch.c
--- a/sys/arch/x86/x86/patch.c  Fri May 01 09:23:43 2020 +0000
+++ b/sys/arch/x86/x86/patch.c  Fri May 01 09:40:47 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: patch.c,v 1.45 2020/05/01 09:17:58 maxv Exp $  */
+/*     $NetBSD: patch.c,v 1.46 2020/05/01 09:40:47 maxv 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.45 2020/05/01 09:17:58 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.46 2020/05/01 09:40:47 maxv Exp $");
 
 #include "opt_lockdebug.h"
 #ifdef i386
@@ -58,26 +58,6 @@
        void *addr;
 } __packed;
 
-void   spllower(int);
-void   spllower_end(void);
-void   cx8_spllower(int);
-void   cx8_spllower_end(void);
-
-void   mutex_spin_exit_end(void);
-void   i686_mutex_spin_exit(int);
-void   i686_mutex_spin_exit_end(void);
-
-static void __unused
-patchfunc(void *from_s, void *from_e, void *to_s, void *to_e)
-{
-
-       if ((uintptr_t)from_e - (uintptr_t)from_s !=
-           (uintptr_t)to_e - (uintptr_t)to_s)
-               panic("patchfunc: sizes do not match (from=%p)", from_s);
-
-       memcpy(to_s, from_s, (uintptr_t)to_e - (uintptr_t)to_s);
-}
-
 static inline void __unused
 patchbytes(void *addr, const uint8_t *bytes, size_t size)
 {
@@ -207,16 +187,18 @@
 #if !defined(SPLDEBUG)
        if (!early && (cpu_feature[0] & CPUID_CX8) != 0) {
                /* Faster splx(), mutex_spin_exit(). */
-               patchfunc(
-                   cx8_spllower, cx8_spllower_end,
-                   spllower, spllower_end
-               );
+               extern uint8_t cx8_spllower, cx8_spllower_end;
+               extern uint8_t i686_mutex_spin_exit, i686_mutex_spin_exit_end;
+
+               bytes = &cx8_spllower;
+               size = (size_t)&cx8_spllower_end - (size_t)&cx8_spllower;
+               x86_hotpatch(HP_NAME_SPLLOWER, bytes, size);
+
 #if !defined(LOCKDEBUG)
-               patchfunc(
-                   i686_mutex_spin_exit, i686_mutex_spin_exit_end,
-                   mutex_spin_exit, mutex_spin_exit_end
-               );
-#endif /* !LOCKDEBUG */
+               bytes = &i686_mutex_spin_exit;
+               size = (size_t)&i686_mutex_spin_exit_end - (size_t)&i686_mutex_spin_exit;
+               x86_hotpatch(HP_NAME_MUTEX_EXIT, bytes, size);
+#endif
        }
 #endif /* !SPLDEBUG */
 #endif /* i386 */



Home | Main Index | Thread Index | Old Index