Module Name: src
Committed By: maxv
Date: Fri May 1 09:17:58 UTC 2020
Modified Files:
src/sys/arch/i386/i386: lock_stubs.S spl.S
src/sys/arch/x86/x86: patch.c
Log Message:
Use absolute jumps, and drop the PC-relative patching. We want exact
templates.
To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/i386/i386/lock_stubs.S
cvs rdiff -u -r1.51 -r1.52 src/sys/arch/i386/i386/spl.S
cvs rdiff -u -r1.44 -r1.45 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/i386/i386/lock_stubs.S
diff -u src/sys/arch/i386/i386/lock_stubs.S:1.33 src/sys/arch/i386/i386/lock_stubs.S:1.34
--- src/sys/arch/i386/i386/lock_stubs.S:1.33 Sat Apr 25 15:26:17 2020
+++ src/sys/arch/i386/i386/lock_stubs.S Fri May 1 09:17:58 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: lock_stubs.S,v 1.33 2020/04/25 15:26:17 bouyer Exp $ */
+/* $NetBSD: lock_stubs.S,v 1.34 2020/05/01 09:17:58 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.33 2020/04/25 15:26:17 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lock_stubs.S,v 1.34 2020/05/01 09:17:58 maxv Exp $");
#include "opt_lockdebug.h"
@@ -271,13 +271,14 @@ ENTRY(mutex_spin_exit)
movl %ecx, CPUVAR(ILEVEL)
sti
1: ret
- .space 32
+ .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)
#endif /* !XENPV */
+
/*
* Patch for i686 CPUs where cli/sti is prohibitively expensive.
* Must be the same size as mutex_spin_exit().
@@ -302,9 +303,12 @@ ENTRY(i686_mutex_spin_exit)
2:
popl %ebx
movl %ecx,4(%esp)
-LABEL(i686_mutex_spin_exit_patch)
- jmp _C_LABEL(Xspllower)
- .space 16
+
+ /* The reference must be absolute, hence the indirect jump. */
+ movl $Xspllower,%eax
+ jmp *%eax
+
+ .space 16, 0xCC
.align 32
LABEL(i686_mutex_spin_exit_end)
END(i686_mutex_spin_exit)
Index: src/sys/arch/i386/i386/spl.S
diff -u src/sys/arch/i386/i386/spl.S:1.51 src/sys/arch/i386/i386/spl.S:1.52
--- src/sys/arch/i386/i386/spl.S:1.51 Sat Apr 25 15:26:17 2020
+++ src/sys/arch/i386/i386/spl.S Fri May 1 09:17:58 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: spl.S,v 1.51 2020/04/25 15:26:17 bouyer Exp $ */
+/* $NetBSD: spl.S,v 1.52 2020/05/01 09:17:58 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.51 2020/04/25 15:26:17 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.52 2020/05/01 09:17:58 maxv Exp $");
#include "opt_ddb.h"
#include "opt_spldebug.h"
@@ -147,10 +147,11 @@ ENTRY(cx8_spllower)
2:
popl %ebx
- .type _C_LABEL(cx8_spllower_patch), @function
-LABEL(cx8_spllower_patch)
- jmp _C_LABEL(Xspllower)
- .align 32
+ /* The reference must be absolute, hence the indirect jump. */
+ movl $Xspllower,%eax
+ jmp *%eax
+
+ .align 32, 0xCC
LABEL(cx8_spllower_end)
END(cx8_spllower)
Index: src/sys/arch/x86/x86/patch.c
diff -u src/sys/arch/x86/x86/patch.c:1.44 src/sys/arch/x86/x86/patch.c:1.45
--- src/sys/arch/x86/x86/patch.c:1.44 Fri May 1 08:32:50 2020
+++ src/sys/arch/x86/x86/patch.c Fri May 1 09:17:58 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: patch.c,v 1.44 2020/05/01 08:32:50 maxv Exp $ */
+/* $NetBSD: patch.c,v 1.45 2020/05/01 09:17:58 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.44 2020/05/01 08:32:50 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: patch.c,v 1.45 2020/05/01 09:17:58 maxv Exp $");
#include "opt_lockdebug.h"
#ifdef i386
@@ -62,35 +62,13 @@ void spllower(int);
void spllower_end(void);
void cx8_spllower(int);
void cx8_spllower_end(void);
-void cx8_spllower_patch(void);
void mutex_spin_exit_end(void);
void i686_mutex_spin_exit(int);
void i686_mutex_spin_exit_end(void);
-void i686_mutex_spin_exit_patch(void);
-
-#define X86_CS 0x2e
-#define X86_DS 0x3e
-#define X86_GROUP_0F 0x0f
-
-static void
-adjust_jumpoff(uint8_t *ptr, void *from_s, void *to_s)
-{
-
- /* Branch hints */
- if (ptr[0] == X86_CS || ptr[0] == X86_DS)
- ptr++;
- /* Conditional jumps */
- if (ptr[0] == X86_GROUP_0F)
- ptr++;
- /* 4-byte relative jump or call */
- *(uint32_t *)(ptr + 1 - (uintptr_t)from_s + (uintptr_t)to_s) +=
- ((uint32_t)(uintptr_t)from_s - (uint32_t)(uintptr_t)to_s);
-}
static void __unused
-patchfunc(void *from_s, void *from_e, void *to_s, void *to_e,
- void *pcrel)
+patchfunc(void *from_s, void *from_e, void *to_s, void *to_e)
{
if ((uintptr_t)from_e - (uintptr_t)from_s !=
@@ -98,8 +76,6 @@ patchfunc(void *from_s, void *from_e, vo
panic("patchfunc: sizes do not match (from=%p)", from_s);
memcpy(to_s, from_s, (uintptr_t)to_e - (uintptr_t)to_s);
- if (pcrel != NULL)
- adjust_jumpoff(pcrel, from_s, to_s);
}
static inline void __unused
@@ -233,14 +209,12 @@ x86_patch(bool early)
/* Faster splx(), mutex_spin_exit(). */
patchfunc(
cx8_spllower, cx8_spllower_end,
- spllower, spllower_end,
- cx8_spllower_patch
+ spllower, spllower_end
);
#if !defined(LOCKDEBUG)
patchfunc(
i686_mutex_spin_exit, i686_mutex_spin_exit_end,
- mutex_spin_exit, mutex_spin_exit_end,
- i686_mutex_spin_exit_patch
+ mutex_spin_exit, mutex_spin_exit_end
);
#endif /* !LOCKDEBUG */
}