Module Name: src
Committed By: chs
Date: Fri Nov 3 09:07:57 UTC 2023
Modified Files:
src/external/cddl/osnet/dev/dtrace/amd64: dtrace_asm.S
src/external/cddl/osnet/dev/dtrace/i386: dtrace_asm.S
src/sys/arch/amd64/amd64: cpufunc.S
src/sys/arch/i386/i386: cpufunc.S
Log Message:
dtrace: add support for SMAP
Add support in dtrace for SMAP, so that actions like copyinstr() work.
It would be better if dtrace could use the SMAP_* hotpatch macros directly,
but the hotpatching code does not currently operate on kernel modules,
so we'll use some tiny functions in the base kernel for now.
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 \
src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S
cvs rdiff -u -r1.7 -r1.8 src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S
cvs rdiff -u -r1.66 -r1.67 src/sys/arch/amd64/amd64/cpufunc.S
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/i386/i386/cpufunc.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S
diff -u src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S:1.8 src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S:1.9
--- src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S:1.8 Mon May 28 21:05:03 2018
+++ src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S Fri Nov 3 09:07:56 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_asm.S,v 1.8 2018/05/28 21:05:03 chs Exp $ */
+/* $NetBSD: dtrace_asm.S,v 1.9 2023/11/03 09:07:56 chs Exp $ */
/*
* CDDL HEADER START
@@ -39,6 +39,11 @@
#include "assym.h"
+#define DTRACE_SMAP_DISABLE \
+ call dtrace_smap_disable
+#define DTRACE_SMAP_ENABLE \
+ call dtrace_smap_enable
+
#define INTR_POP \
MEXITCOUNT; \
movq TF_RDI(%rsp),%rdi; \
@@ -217,8 +222,10 @@ dtrace_copy(uintptr_t src, uintptr_t des
xchgq %rdi, %rsi /* make %rsi source, %rdi dest */
movq %rdx, %rcx /* load count */
+ DTRACE_SMAP_DISABLE
repz /* repeat for count ... */
smovb /* move from %ds:rsi to %ed:rdi */
+ DTRACE_SMAP_ENABLE
leave
ret
END(dtrace_copy)
@@ -231,6 +238,7 @@ dtrace_copystr(uintptr_t uaddr, uintptr_
ENTRY(dtrace_copystr)
pushq %rbp
movq %rsp, %rbp
+ DTRACE_SMAP_DISABLE
0:
movb (%rdi), %al /* load from source */
@@ -248,6 +256,7 @@ dtrace_copystr(uintptr_t uaddr, uintptr_
cmpq $0, %rdx
jne 0b
2:
+ DTRACE_SMAP_ENABLE
leave
ret
@@ -258,7 +267,9 @@ uintptr_t
dtrace_fulword(void *addr)
*/
ENTRY(dtrace_fulword)
+ DTRACE_SMAP_DISABLE
movq (%rdi), %rax
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fulword)
@@ -268,7 +279,9 @@ dtrace_fuword8_nocheck(void *addr)
*/
ENTRY(dtrace_fuword8_nocheck)
xorq %rax, %rax
+ DTRACE_SMAP_DISABLE
movb (%rdi), %al
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fuword8_nocheck)
@@ -278,7 +291,9 @@ dtrace_fuword16_nocheck(void *addr)
*/
ENTRY(dtrace_fuword16_nocheck)
xorq %rax, %rax
+ DTRACE_SMAP_DISABLE
movw (%rdi), %ax
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fuword16_nocheck)
@@ -288,7 +303,9 @@ dtrace_fuword32_nocheck(void *addr)
*/
ENTRY(dtrace_fuword32_nocheck)
xorq %rax, %rax
+ DTRACE_SMAP_DISABLE
movl (%rdi), %eax
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fuword32_nocheck)
@@ -297,7 +314,9 @@ uint64_t
dtrace_fuword64_nocheck(void *addr)
*/
ENTRY(dtrace_fuword64_nocheck)
+ DTRACE_SMAP_DISABLE
movq (%rdi), %rax
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fuword64_nocheck)
Index: src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S
diff -u src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S:1.7 src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S:1.8
--- src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S:1.7 Mon May 28 21:05:03 2018
+++ src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S Fri Nov 3 09:07:57 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: dtrace_asm.S,v 1.7 2018/05/28 21:05:03 chs Exp $ */
+/* $NetBSD: dtrace_asm.S,v 1.8 2023/11/03 09:07:57 chs Exp $ */
/*
* CDDL HEADER START
@@ -38,6 +38,11 @@
#include <machine/frameasm.h>
#include <machine/trap.h>
+#define DTRACE_SMAP_DISABLE \
+ call dtrace_smap_disable
+#define DTRACE_SMAP_ENABLE \
+ call dtrace_smap_enable
+
#define INTR_POP \
addl $16, %esp; \
popl %edi; \
@@ -225,8 +230,10 @@ void dtrace_copy(uintptr_t src, uintptr_
movl 8(%ebp), %esi /* Load source address */
movl 12(%ebp), %edi /* Load destination address */
movl 16(%ebp), %ecx /* Load count */
+ DTRACE_SMAP_DISABLE
repz /* Repeat for count... */
smovb /* move from %ds:si to %es:di */
+ DTRACE_SMAP_ENABLE
popl %edi
popl %esi
@@ -248,6 +255,7 @@ void dtrace_copystr(uintptr_t uaddr, uin
movl 8(%ebp), %ebx /* Load source address */
movl 12(%ebp), %edx /* Load destination address */
movl 16(%ebp), %ecx /* Load count */
+ DTRACE_SMAP_DISABLE
0:
movb (%ebx), %al /* Load from source */
@@ -261,6 +269,7 @@ void dtrace_copystr(uintptr_t uaddr, uin
jne 0b
1:
+ DTRACE_SMAP_ENABLE
popl %ebx
movl %ebp, %esp
popl %ebp
@@ -275,7 +284,9 @@ uintptr_t dtrace_fulword(void *addr)
ENTRY(dtrace_fulword)
movl 4(%esp), %ecx
xorl %eax, %eax
+ DTRACE_SMAP_DISABLE
movl (%ecx), %eax
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fulword)
@@ -286,7 +297,9 @@ uint8_t dtrace_fuword8_nocheck(void *add
ENTRY(dtrace_fuword8_nocheck)
movl 4(%esp), %ecx
xorl %eax, %eax
+ DTRACE_SMAP_DISABLE
movzbl (%ecx), %eax
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fuword8_nocheck)
@@ -297,7 +310,9 @@ uint16_t dtrace_fuword16_nocheck(void *a
ENTRY(dtrace_fuword16_nocheck)
movl 4(%esp), %ecx
xorl %eax, %eax
+ DTRACE_SMAP_DISABLE
movzwl (%ecx), %eax
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fuword16_nocheck)
@@ -308,7 +323,9 @@ uint32_t dtrace_fuword32_nocheck(void *a
ENTRY(dtrace_fuword32_nocheck)
movl 4(%esp), %ecx
xorl %eax, %eax
+ DTRACE_SMAP_DISABLE
movl (%ecx), %eax
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fuword32_nocheck)
@@ -320,8 +337,10 @@ uint64_t dtrace_fuword64_nocheck(void *a
movl 4(%esp), %ecx
xorl %eax, %eax
xorl %edx, %edx
+ DTRACE_SMAP_DISABLE
movl (%ecx), %eax
movl 4(%ecx), %edx
+ DTRACE_SMAP_ENABLE
ret
END(dtrace_fuword64_nocheck)
Index: src/sys/arch/amd64/amd64/cpufunc.S
diff -u src/sys/arch/amd64/amd64/cpufunc.S:1.66 src/sys/arch/amd64/amd64/cpufunc.S:1.67
--- src/sys/arch/amd64/amd64/cpufunc.S:1.66 Wed Oct 4 20:28:05 2023
+++ src/sys/arch/amd64/amd64/cpufunc.S Fri Nov 3 09:07:56 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.S,v 1.66 2023/10/04 20:28:05 ad Exp $ */
+/* $NetBSD: cpufunc.S,v 1.67 2023/11/03 09:07:56 chs Exp $ */
/*
* Copyright (c) 1998, 2007, 2008, 2020, 2023 The NetBSD Foundation, Inc.
@@ -36,6 +36,7 @@
#include <machine/specialreg.h>
#include <machine/segments.h>
+#include "opt_dtrace.h"
#include "opt_xen.h"
#include "opt_svs.h"
@@ -177,6 +178,18 @@ ENTRY(smap_disable)
ret
END(smap_disable)
+#ifdef KDTRACE_HOOKS
+ENTRY(dtrace_smap_enable)
+ SMAP_ENABLE
+ ret
+END(dtrace_smap_enable)
+
+ENTRY(dtrace_smap_disable)
+ SMAP_DISABLE
+ ret
+END(dtrace_smap_disable)
+#endif
+
/*
* %rdi = name
* %rsi = sel
Index: src/sys/arch/i386/i386/cpufunc.S
diff -u src/sys/arch/i386/i386/cpufunc.S:1.50 src/sys/arch/i386/i386/cpufunc.S:1.51
--- src/sys/arch/i386/i386/cpufunc.S:1.50 Wed Oct 4 20:28:05 2023
+++ src/sys/arch/i386/i386/cpufunc.S Fri Nov 3 09:07:56 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.S,v 1.50 2023/10/04 20:28:05 ad Exp $ */
+/* $NetBSD: cpufunc.S,v 1.51 2023/11/03 09:07:56 chs Exp $ */
/*-
* Copyright (c) 1998, 2007, 2020, 2023 The NetBSD Foundation, Inc.
@@ -38,8 +38,10 @@
#include <sys/errno.h>
#include <machine/asm.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.50 2023/10/04 20:28:05 ad Exp $");
+#include <machine/frameasm.h>
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.51 2023/11/03 09:07:56 chs Exp $");
+#include "opt_dtrace.h"
#include "opt_xen.h"
#include <machine/specialreg.h>
@@ -72,6 +74,18 @@ ENTRY(lidt)
ret
END(lidt)
+#ifdef KDTRACE_HOOKS
+ENTRY(dtrace_smap_enable)
+ SMAP_ENABLE
+ ret
+END(dtrace_smap_enable)
+
+ENTRY(dtrace_smap_disable)
+ SMAP_DISABLE
+ ret
+END(dtrace_smap_disable)
+#endif
+
ENTRY(x86_hotpatch)
/* save EFLAGS, and disable intrs */
pushfl