Module Name: src Committed By: martin Date: Mon Oct 14 16:58:20 UTC 2024
Modified Files: src/external/cddl/osnet/dev/dtrace/amd64 [netbsd-10]: dtrace_asm.S dtrace_subr.c src/external/cddl/osnet/dev/dtrace/i386 [netbsd-10]: dtrace_asm.S dtrace_subr.c Log Message: Apply patch, requested by chs in ticket #975: external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S (apply patch) external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c (apply patch) external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S (apply patch) external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c (apply patch) dtrace: add support for SMAP. This is the equivalvent of external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S 1.9 external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S 1.8 sys/arch/amd64/amd64/cpufunc.S 1.67 sys/arch/i386/i386/cpufunc.S 1.51 adapted to the netbsd-10 branch. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.8.12.1 \ src/external/cddl/osnet/dev/dtrace/amd64/dtrace_asm.S cvs rdiff -u -r1.15 -r1.15.6.1 \ src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c cvs rdiff -u -r1.7 -r1.7.12.1 \ src/external/cddl/osnet/dev/dtrace/i386/dtrace_asm.S cvs rdiff -u -r1.14 -r1.14.2.1 \ src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c 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.8.12.1 --- 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 Mon Oct 14 16:58:20 2024 @@ -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.8.12.1 2024/10/14 16:58:20 martin 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/amd64/dtrace_subr.c diff -u src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c:1.15 src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c:1.15.6.1 --- src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c:1.15 Tue Apr 6 12:48:59 2021 +++ src/external/cddl/osnet/dev/dtrace/amd64/dtrace_subr.c Mon Oct 14 16:58:20 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: dtrace_subr.c,v 1.15 2021/04/06 12:48:59 simonb Exp $ */ +/* $NetBSD: dtrace_subr.c,v 1.15.6.1 2024/10/14 16:58:20 martin Exp $ */ /* * CDDL HEADER START @@ -47,6 +47,7 @@ #include <machine/frame.h> #include <machine/cpu_counter.h> #include <machine/cpufunc.h> +#include <machine/cpuvar.h> int dtrace_invop(uintptr_t, struct trapframe *, uintptr_t); @@ -60,6 +61,9 @@ dtrace_invop_hdlr_t *dtrace_invop_hdlr; void dtrace_gethrtime_init(void *); void dtrace_getnanotime(struct timespec *); +void dtrace_smap_disable(void); +void dtrace_smap_enable(void); + int dtrace_invop(uintptr_t addr, struct trapframe *frame, uintptr_t eax) { @@ -455,3 +459,21 @@ dtrace_trap(struct trapframe *frame, u_i /* Handle the trap in the usual way. */ return (0); } + +void +dtrace_smap_disable(void) +{ + + if (cpu_feature[5] & CPUID_SEF_SMAP) { + __asm volatile("stac"); + } +} + +void +dtrace_smap_enable(void) +{ + + if (cpu_feature[5] & CPUID_SEF_SMAP) { + __asm volatile ("clac"); + } +} 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.7.12.1 --- 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 Mon Oct 14 16:58:20 2024 @@ -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.7.12.1 2024/10/14 16:58:20 martin 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/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c diff -u src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c:1.14 src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c:1.14.2.1 --- src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c:1.14 Sun Aug 21 18:58:45 2022 +++ src/external/cddl/osnet/dev/dtrace/i386/dtrace_subr.c Mon Oct 14 16:58:20 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: dtrace_subr.c,v 1.14 2022/08/21 18:58:45 riastradh Exp $ */ +/* $NetBSD: dtrace_subr.c,v 1.14.2.1 2024/10/14 16:58:20 martin Exp $ */ /* * CDDL HEADER START @@ -46,6 +46,7 @@ #include <sys/dtrace_bsd.h> #include <machine/cpu.h> #include <machine/cpufunc.h> +#include <machine/cpuvar.h> #include <machine/clock.h> #include <machine/frame.h> #include <uvm/uvm_pglist.h> @@ -69,6 +70,9 @@ dtrace_invop_hdlr_t *dtrace_invop_hdlr; void dtrace_gethrtime_init(void *arg); +void dtrace_smap_disable(void); +void dtrace_smap_enable(void); + int dtrace_invop(uintptr_t addr, struct trapframe *frame, uintptr_t eax) { @@ -465,3 +469,21 @@ dtrace_trap(struct trapframe *frame, u_i /* Handle the trap in the usual way. */ return (0); } + +void +dtrace_smap_disable(void) +{ + + if (cpu_feature[5] & CPUID_SEF_SMAP) { + __asm volatile("stac"); + } +} + +void +dtrace_smap_enable(void) +{ + + if (cpu_feature[5] & CPUID_SEF_SMAP) { + __asm volatile ("clac"); + } +}