Module Name: src Committed By: ryo Date: Thu Aug 6 06:49:55 UTC 2020
Modified Files: src/sys/arch/aarch64/aarch64: copyinout.S cpuswitch.S fault.c fusu.S genassym.cf src/sys/arch/aarch64/include: frame.h machdep.h Log Message: revert the changes of http://mail-index.netbsd.org/source-changes/2020/08/03/msg120183.html This change is overengineered. bus_space_{peek,poke}_N does not have to be reentrant nor available for interrupt context. requested by skrll@ To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/arch/aarch64/aarch64/copyinout.S cvs rdiff -u -r1.23 -r1.24 src/sys/arch/aarch64/aarch64/cpuswitch.S cvs rdiff -u -r1.16 -r1.17 src/sys/arch/aarch64/aarch64/fault.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/aarch64/aarch64/fusu.S cvs rdiff -u -r1.28 -r1.29 src/sys/arch/aarch64/aarch64/genassym.cf cvs rdiff -u -r1.4 -r1.5 src/sys/arch/aarch64/include/frame.h cvs rdiff -u -r1.15 -r1.16 src/sys/arch/aarch64/include/machdep.h 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/aarch64/aarch64/copyinout.S diff -u src/sys/arch/aarch64/aarch64/copyinout.S:1.13 src/sys/arch/aarch64/aarch64/copyinout.S:1.14 --- src/sys/arch/aarch64/aarch64/copyinout.S:1.13 Mon Aug 3 06:29:59 2020 +++ src/sys/arch/aarch64/aarch64/copyinout.S Thu Aug 6 06:49:55 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: copyinout.S,v 1.13 2020/08/03 06:29:59 ryo Exp $ */ +/* $NetBSD: copyinout.S,v 1.14 2020/08/06 06:49:55 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -33,7 +33,7 @@ #include <aarch64/asm.h> #include "assym.h" -RCSID("$NetBSD: copyinout.S,v 1.13 2020/08/03 06:29:59 ryo Exp $"); +RCSID("$NetBSD: copyinout.S,v 1.14 2020/08/06 06:49:55 ryo Exp $"); #ifdef ARMV81_PAN #define PAN_ENABLE \ @@ -63,7 +63,7 @@ RCSID("$NetBSD: copyinout.S,v 1.13 2020/ mov x19, x0 /* x19 = arg0 */ mov x20, x1 /* x20 = arg1 */ - /* if (cpu_set_onfault(fb) != 0) return error */ + /* if (cpu_set_onfault(fb) != 0) return -1 */ sub sp, sp, #FB_T_SIZE /* allocate struct faultbuf */ mov x0, sp /* x0 = faultbuf */ stp x2, x3, [sp, #-16]! /* save x2, x3 */ @@ -79,8 +79,10 @@ RCSID("$NetBSD: copyinout.S,v 1.13 2020/ .endm .macro exit_cpu_onfault - bl cpu_unset_onfault - mov x8, xzr + /* curlwp->l_md.md_onfault = NULL */ + mrs x0, tpidr_el1 /* curcpu */ + ldr x0, [x0, #CI_CURLWP] /* x0 = curlwp */ + str xzr, [x0, #L_MD_ONFAULT] /* lwp->l_md_onfault = NULL */ 9: PAN_ENABLE /* enable PAN */ add sp, sp, #FB_T_SIZE /* pop stack */ Index: src/sys/arch/aarch64/aarch64/cpuswitch.S diff -u src/sys/arch/aarch64/aarch64/cpuswitch.S:1.23 src/sys/arch/aarch64/aarch64/cpuswitch.S:1.24 --- src/sys/arch/aarch64/aarch64/cpuswitch.S:1.23 Mon Aug 3 05:56:50 2020 +++ src/sys/arch/aarch64/aarch64/cpuswitch.S Thu Aug 6 06:49:55 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuswitch.S,v 1.23 2020/08/03 05:56:50 ryo Exp $ */ +/* $NetBSD: cpuswitch.S,v 1.24 2020/08/06 06:49:55 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -38,7 +38,7 @@ #include "opt_ddb.h" #include "opt_kasan.h" -RCSID("$NetBSD: cpuswitch.S,v 1.23 2020/08/03 05:56:50 ryo Exp $") +RCSID("$NetBSD: cpuswitch.S,v 1.24 2020/08/06 06:49:55 ryo Exp $") ARMV8_DEFINE_OPTIONS @@ -447,40 +447,22 @@ END(cpu_Debugger) */ ENTRY_NP(cpu_set_onfault) mrs x3, tpidr_el1 - ldr x2, [x3, #CI_CURLWP] /* x2 = curcpu()->ci_curlwp */ - ldr x1, [x2, #L_MD_ONFAULT] - str x1, [x0, #FB_OLD] /* fb->fb_old = curlwp->l_md.md_onfault */ - ldr w1, [x3, #CI_INTR_DEPTH] - str w1, [x0, #FB_IDEPTH] /* fb->fb_idepth = curcpu()->ci_intr_depth */ + ldr x2, [x3, #CI_CURLWP] /* curlwp = curcpu()->ci_curlwp */ str x0, [x2, #L_MD_ONFAULT] /* l_md.md_onfault = fb */ - stp x19, x20, [x0, #FB_REG_X19] - stp x21, x22, [x0, #FB_REG_X21] - stp x23, x24, [x0, #FB_REG_X23] - stp x25, x26, [x0, #FB_REG_X25] - stp x27, x28, [x0, #FB_REG_X27] - stp x29, x30, [x0, #FB_REG_X29] + stp x19, x20, [x0, #(FB_X19 * 8)] + stp x21, x22, [x0, #(FB_X21 * 8)] + stp x23, x24, [x0, #(FB_X23 * 8)] + stp x25, x26, [x0, #(FB_X25 * 8)] + stp x27, x28, [x0, #(FB_X27 * 8)] + stp x29, x30, [x0, #(FB_X29 * 8)] mov x1, sp - str x1, [x0, #FB_REG_SP] + str x1, [x0, #(FB_SP * 8)] mov x0, #0 ret END(cpu_set_onfault) /* - * void cpu_unset_onfault(void) - */ -ENTRY_NP(cpu_unset_onfault) - mrs x3, tpidr_el1 - ldr x2, [x3, #CI_CURLWP] /* curlwp = curcpu()->ci_curlwp */ - ldr x0, [x2, #L_MD_ONFAULT] /* x0 = curlwp->l_md.md_onfault */ - cbz x0, 1f - ldr x0, [x0, #FB_OLD] /* restore old faultbuf */ - str x0, [x2, #L_MD_ONFAULT] -1: - ret -END(cpu_unset_onfault) - -/* * setjmp(9) * int setjmp(label_t *label); * void longjmp(label_t *label); Index: src/sys/arch/aarch64/aarch64/fault.c diff -u src/sys/arch/aarch64/aarch64/fault.c:1.16 src/sys/arch/aarch64/aarch64/fault.c:1.17 --- src/sys/arch/aarch64/aarch64/fault.c:1.16 Mon Aug 3 05:56:50 2020 +++ src/sys/arch/aarch64/aarch64/fault.c Thu Aug 6 06:49:55 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: fault.c,v 1.16 2020/08/03 05:56:50 ryo Exp $ */ +/* $NetBSD: fault.c,v 1.17 2020/08/06 06:49:55 ryo Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.16 2020/08/03 05:56:50 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.17 2020/08/06 06:49:55 ryo Exp $"); #include "opt_compat_netbsd32.h" #include "opt_ddb.h" @@ -220,18 +220,11 @@ data_abort_handler(struct trapframe *tf, return; } + do_fault: /* faultbail path? */ - fb = l->l_md.md_onfault; - if (fb != NULL && fb->fb_idepth == curcpu()->ci_intr_depth) { - cpu_unset_onfault(); -#ifdef DEBUG_DUMP_ON_FAULTBAIL - printf("fault in failtbail[%p]: " - "fb_sp=%016lx, fb_lr=%016lx, fb_idepth=%u, fb_old=%p\n", - fb, fb->fb_reg[FB_SP], fb->fb_reg[FB_LR], - fb->fb_idepth, fb->fb_old); - dump_trapframe(tf, printf); -#endif + fb = cpu_disable_onfault(); + if (fb != NULL) { cpu_jump_onfault(tf, fb, EFAULT); return; } Index: src/sys/arch/aarch64/aarch64/fusu.S diff -u src/sys/arch/aarch64/aarch64/fusu.S:1.8 src/sys/arch/aarch64/aarch64/fusu.S:1.9 --- src/sys/arch/aarch64/aarch64/fusu.S:1.8 Mon Aug 3 05:56:50 2020 +++ src/sys/arch/aarch64/aarch64/fusu.S Thu Aug 6 06:49:55 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: fusu.S,v 1.8 2020/08/03 05:56:50 ryo Exp $ */ +/* $NetBSD: fusu.S,v 1.9 2020/08/06 06:49:55 ryo Exp $ */ /*- * Copyright (c) 2014, 2019 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #include <aarch64/asm.h> #include "assym.h" -RCSID("$NetBSD: fusu.S,v 1.8 2020/08/03 05:56:50 ryo Exp $"); +RCSID("$NetBSD: fusu.S,v 1.9 2020/08/06 06:49:55 ryo Exp $"); #ifdef ARMV81_PAN #define PAN_ENABLE \ @@ -72,8 +72,10 @@ RCSID("$NetBSD: fusu.S,v 1.8 2020/08/03 .endm .macro exit_cpu_onfault - bl cpu_unset_onfault - mov x0, xzr + /* curlwp->l_md.md_onfault = NULL */ + mrs x1, tpidr_el1 /* curcpu */ + ldr x1, [x1, #CI_CURLWP] /* x1 = curlwp */ + str xzr, [x1, #L_MD_ONFAULT] /* lwp->l_md_onfault = NULL */ 9: PAN_ENABLE /* enable PAN */ add sp, sp, #FB_T_SIZE /* pop stack */ Index: src/sys/arch/aarch64/aarch64/genassym.cf diff -u src/sys/arch/aarch64/aarch64/genassym.cf:1.28 src/sys/arch/aarch64/aarch64/genassym.cf:1.29 --- src/sys/arch/aarch64/aarch64/genassym.cf:1.28 Mon Aug 3 06:29:59 2020 +++ src/sys/arch/aarch64/aarch64/genassym.cf Thu Aug 6 06:49:55 2020 @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.28 2020/08/03 06:29:59 ryo Exp $ +# $NetBSD: genassym.cf,v 1.29 2020/08/06 06:49:55 ryo Exp $ #- # Copyright (c) 2014 The NetBSD Foundation, Inc. # All rights reserved. @@ -162,21 +162,20 @@ define L_MD_DB_USER offsetof(struct lwp define L_MD_GA_USER offsetof(struct lwp, l_md.md_ga_user) define LW_SYSTEM LW_SYSTEM -define FB_REG_X19 offsetof(struct faultbuf, fb_reg[FB_X19]) -define FB_REG_X20 offsetof(struct faultbuf, fb_reg[FB_X20]) -define FB_REG_X21 offsetof(struct faultbuf, fb_reg[FB_X21]) -define FB_REG_X22 offsetof(struct faultbuf, fb_reg[FB_X22]) -define FB_REG_X23 offsetof(struct faultbuf, fb_reg[FB_X23]) -define FB_REG_X24 offsetof(struct faultbuf, fb_reg[FB_X24]) -define FB_REG_X25 offsetof(struct faultbuf, fb_reg[FB_X25]) -define FB_REG_X26 offsetof(struct faultbuf, fb_reg[FB_X26]) -define FB_REG_X27 offsetof(struct faultbuf, fb_reg[FB_X27]) -define FB_REG_X28 offsetof(struct faultbuf, fb_reg[FB_X28]) -define FB_REG_X29 offsetof(struct faultbuf, fb_reg[FB_X29]) -define FB_REG_LR offsetof(struct faultbuf, fb_reg[FB_LR]) -define FB_REG_SP offsetof(struct faultbuf, fb_reg[FB_SP]) -define FB_OLD offsetof(struct faultbuf, fb_old) -define FB_IDEPTH offsetof(struct faultbuf, fb_idepth) +define FB_X19 FB_X19 +define FB_X20 FB_X20 +define FB_X21 FB_X21 +define FB_X22 FB_X22 +define FB_X23 FB_X23 +define FB_X24 FB_X24 +define FB_X25 FB_X25 +define FB_X26 FB_X26 +define FB_X27 FB_X27 +define FB_X28 FB_X28 +define FB_X29 FB_X29 +define FB_LR FB_LR +define FB_SP FB_SP +define FB_MAX FB_MAX define FB_T_SIZE roundup(sizeof(struct faultbuf), 16) define LBL_X19 LBL_X19 Index: src/sys/arch/aarch64/include/frame.h diff -u src/sys/arch/aarch64/include/frame.h:1.4 src/sys/arch/aarch64/include/frame.h:1.5 --- src/sys/arch/aarch64/include/frame.h:1.4 Mon Aug 3 05:56:50 2020 +++ src/sys/arch/aarch64/include/frame.h Thu Aug 6 06:49:55 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: frame.h,v 1.4 2020/08/03 05:56:50 ryo Exp $ */ +/* $NetBSD: frame.h,v 1.5 2020/08/06 06:49:55 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -70,8 +70,6 @@ __CTASSERT((sizeof(struct trapframe) & 1 #define FB_MAX 13 struct faultbuf { register_t fb_reg[FB_MAX]; - struct faultbuf *fb_old; - u_int fb_idepth; }; #define lwp_trapframe(l) ((l)->l_md.md_utf) Index: src/sys/arch/aarch64/include/machdep.h diff -u src/sys/arch/aarch64/include/machdep.h:1.15 src/sys/arch/aarch64/include/machdep.h:1.16 --- src/sys/arch/aarch64/include/machdep.h:1.15 Mon Aug 3 05:56:50 2020 +++ src/sys/arch/aarch64/include/machdep.h Thu Aug 6 06:49:55 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.h,v 1.15 2020/08/03 05:56:50 ryo Exp $ */ +/* $NetBSD: machdep.h,v 1.16 2020/08/06 06:49:55 ryo Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -113,11 +113,16 @@ void interrupt(struct trapframe *); /* cpu_onfault */ int cpu_set_onfault(struct faultbuf *) __returns_twice; -void cpu_unset_onfault(void); void cpu_jump_onfault(struct trapframe *, const struct faultbuf *, int); #if defined(_KERNEL) static inline void +cpu_unset_onfault(void) +{ + curlwp->l_md.md_onfault = NULL; +} + +static inline void cpu_enable_onfault(struct faultbuf *fb) { curlwp->l_md.md_onfault = fb;