Module Name: src Committed By: ryo Date: Thu Dec 13 10:44:25 UTC 2018
Modified Files: src/sys/arch/aarch64/aarch64: cpuswitch.S db_machdep.c genassym.cf locore.S process_machdep.c trap.c src/sys/arch/aarch64/include: armreg.h ptrace.h Log Message: add support PT_STEP To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/arch/aarch64/aarch64/cpuswitch.S cvs rdiff -u -r1.11 -r1.12 src/sys/arch/aarch64/aarch64/db_machdep.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/aarch64/aarch64/genassym.cf cvs rdiff -u -r1.31 -r1.32 src/sys/arch/aarch64/aarch64/locore.S cvs rdiff -u -r1.3 -r1.4 src/sys/arch/aarch64/aarch64/process_machdep.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/aarch64/aarch64/trap.c cvs rdiff -u -r1.21 -r1.22 src/sys/arch/aarch64/include/armreg.h cvs rdiff -u -r1.7 -r1.8 src/sys/arch/aarch64/include/ptrace.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/cpuswitch.S diff -u src/sys/arch/aarch64/aarch64/cpuswitch.S:1.9 src/sys/arch/aarch64/aarch64/cpuswitch.S:1.10 --- src/sys/arch/aarch64/aarch64/cpuswitch.S:1.9 Wed Dec 12 11:14:51 2018 +++ src/sys/arch/aarch64/aarch64/cpuswitch.S Thu Dec 13 10:44:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuswitch.S,v 1.9 2018/12/12 11:14:51 ryo Exp $ */ +/* $NetBSD: cpuswitch.S,v 1.10 2018/12/13 10:44:25 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ #include "opt_ddb.h" #include "opt_kasan.h" -RCSID("$NetBSD: cpuswitch.S,v 1.9 2018/12/12 11:14:51 ryo Exp $") +RCSID("$NetBSD: cpuswitch.S,v 1.10 2018/12/13 10:44:25 ryo Exp $") /* * At IPL_SCHED: @@ -341,6 +341,13 @@ ENTRY_NP(el0_trap_exit) msr spsr_el1, x1 /* exception pstate */ msr sp_el0, x2 /* restore EL0 stack */ + /* if the process is traced, enable MDSCR_EL1.SS */ + tbz x1, #SPSR_SS_SHIFT, 1f + mrs x0, mdscr_el1 + orr x0, x0, #MDSCR_SS + msr mdscr_el1, x0 +1: + unwind_x0_x2 /* leave sp at l_md.md_utf, return back to EL0 user process */ Index: src/sys/arch/aarch64/aarch64/db_machdep.c diff -u src/sys/arch/aarch64/aarch64/db_machdep.c:1.11 src/sys/arch/aarch64/aarch64/db_machdep.c:1.12 --- src/sys/arch/aarch64/aarch64/db_machdep.c:1.11 Wed Nov 28 19:13:15 2018 +++ src/sys/arch/aarch64/aarch64/db_machdep.c Thu Dec 13 10:44:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: db_machdep.c,v 1.11 2018/11/28 19:13:15 ryo Exp $ */ +/* $NetBSD: db_machdep.c,v 1.12 2018/12/13 10:44:25 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_machdep.c,v 1.11 2018/11/28 19:13:15 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_machdep.c,v 1.12 2018/12/13 10:44:25 ryo Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd32.h" @@ -616,11 +616,9 @@ db_machdep_init(void) } mdscr = reg_mdscr_el1_read(); - mdscr |= __BIT(15); - mdscr |= __BIT(13); + mdscr |= MDSCR_MDE; /* enable watchpoint and breakpoint */ reg_mdscr_el1_write(mdscr); reg_oslar_el1_write(0); - daif_enable(DAIF_D); } static void Index: src/sys/arch/aarch64/aarch64/genassym.cf diff -u src/sys/arch/aarch64/aarch64/genassym.cf:1.10 src/sys/arch/aarch64/aarch64/genassym.cf:1.11 --- src/sys/arch/aarch64/aarch64/genassym.cf:1.10 Tue Dec 11 05:46:14 2018 +++ src/sys/arch/aarch64/aarch64/genassym.cf Thu Dec 13 10:44:25 2018 @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.10 2018/12/11 05:46:14 ryo Exp $ +# $NetBSD: genassym.cf,v 1.11 2018/12/13 10:44:25 ryo Exp $ #- # Copyright (c) 2014 The NetBSD Foundation, Inc. # All rights reserved. @@ -329,6 +329,7 @@ define DAIF_SETCLR_SHIFT DAIF_SETCLR_SHI define CNTHCTL_EL1PCTEN CNTHCTL_EL1PCTEN define CNTHCTL_EL1PCEN CNTHCTL_EL1PCEN define CNTKCTL_EL0VCTEN CNTKCTL_EL0VCTEN +define SPSR_SS_SHIFT SPSR_SS_SHIFT define SPSR_F SPSR_F define SPSR_I SPSR_I define SPSR_A SPSR_A @@ -352,6 +353,11 @@ define MPIDR_AFF1 MPIDR_AFF1 define MPIDR_AFF2 MPIDR_AFF2 define MPIDR_AFF3 MPIDR_AFF3 +define MDSCR_MDE MDSCR_MDE +define MDSCR_KDE MDSCR_KDE +define MDSCR_TDCC MDSCR_TDCC +define MDSCR_SS MDSCR_SS + define MAIR_ATTR0 MAIR_ATTR0 define MAIR_ATTR1 MAIR_ATTR1 define MAIR_ATTR2 MAIR_ATTR2 Index: src/sys/arch/aarch64/aarch64/locore.S diff -u src/sys/arch/aarch64/aarch64/locore.S:1.31 src/sys/arch/aarch64/aarch64/locore.S:1.32 --- src/sys/arch/aarch64/aarch64/locore.S:1.31 Thu Nov 8 08:28:07 2018 +++ src/sys/arch/aarch64/aarch64/locore.S Thu Dec 13 10:44:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.31 2018/11/08 08:28:07 maxv Exp $ */ +/* $NetBSD: locore.S,v 1.32 2018/12/13 10:44:25 ryo Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -39,7 +39,7 @@ #include <aarch64/hypervisor.h> #include "assym.h" -RCSID("$NetBSD: locore.S,v 1.31 2018/11/08 08:28:07 maxv Exp $") +RCSID("$NetBSD: locore.S,v 1.32 2018/12/13 10:44:25 ryo Exp $") /*#define DEBUG_LOCORE /* debug print */ @@ -218,8 +218,10 @@ ASEND(clear_bss) init_sysregs: stp x0, lr, [sp, #-16]! - /* Disable debug event */ - msr mdscr_el1, xzr + /* init debug event */ + ldr x0, mdscr_setting + msr mdscr_el1, x0 + msr oslar_el1, xzr /* Clear context id register */ msr contextidr_el1, xzr @@ -1008,6 +1010,11 @@ sctlr_clear: SCTLR_A | /* Alignment check enable */ \ 0) +mdscr_setting: + .quad ( \ + MDSCR_TDCC | /* Trap Debug Communications Channel access */ \ + 0) + .L_devmap_addr: .quad VM_KERNEL_IO_ADDRESS Index: src/sys/arch/aarch64/aarch64/process_machdep.c diff -u src/sys/arch/aarch64/aarch64/process_machdep.c:1.3 src/sys/arch/aarch64/aarch64/process_machdep.c:1.4 --- src/sys/arch/aarch64/aarch64/process_machdep.c:1.3 Tue Jul 17 00:36:30 2018 +++ src/sys/arch/aarch64/aarch64/process_machdep.c Thu Dec 13 10:44:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: process_machdep.c,v 1.3 2018/07/17 00:36:30 christos Exp $ */ +/* $NetBSD: process_machdep.c,v 1.4 2018/12/13 10:44:25 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: process_machdep.c,v 1.3 2018/07/17 00:36:30 christos Exp $"); +__KERNEL_RCSID(1, "$NetBSD: process_machdep.c,v 1.4 2018/12/13 10:44:25 ryo Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -89,6 +89,17 @@ process_write_fpregs(struct lwp *l, cons } int +process_sstep(struct lwp *l, int sstep) +{ + if (sstep) + l->l_md.md_utf->tf_spsr |= SPSR_SS; + else + l->l_md.md_utf->tf_spsr &= ~SPSR_SS; + + return 0; +} + +int process_set_pc(struct lwp *l, void *addr) { Index: src/sys/arch/aarch64/aarch64/trap.c diff -u src/sys/arch/aarch64/aarch64/trap.c:1.13 src/sys/arch/aarch64/aarch64/trap.c:1.14 --- src/sys/arch/aarch64/aarch64/trap.c:1.13 Wed Dec 12 18:11:00 2018 +++ src/sys/arch/aarch64/aarch64/trap.c Thu Dec 13 10:44:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.13 2018/12/12 18:11:00 ryo Exp $ */ +/* $NetBSD: trap.c,v 1.14 2018/12/13 10:44:25 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.13 2018/12/12 18:11:00 ryo Exp $"); +__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.14 2018/12/13 10:44:25 ryo Exp $"); #include "opt_arm_intr_impl.h" #include "opt_compat_netbsd32.h" @@ -232,6 +232,8 @@ trap_el0_sync(struct trapframe *tf) const uint32_t esr = tf->tf_esr; const uint32_t eclass = __SHIFTOUT(esr, ESR_EC); /* exception class */ + /* disable trace */ + reg_mdscr_el1_write(reg_mdscr_el1_read() & ~MDSCR_SS); /* enable traps and interrupts */ daif_enable(DAIF_D|DAIF_A|DAIF_I|DAIF_F); @@ -265,11 +267,16 @@ trap_el0_sync(struct trapframe *tf) case ESR_EC_BKPT_INSN_A64: case ESR_EC_BRKPNT_EL0: - case ESR_EC_SW_STEP_EL0: case ESR_EC_WTCHPNT_EL0: do_trapsignal(l, SIGTRAP, TRAP_BRKPT, (void *)tf->tf_pc, esr); userret(l); break; + case ESR_EC_SW_STEP_EL0: + /* disable trace, and send trace trap */ + tf->tf_spsr &= ~SPSR_SS; + do_trapsignal(l, SIGTRAP, TRAP_TRACE, (void *)tf->tf_pc, esr); + userret(l); + break; default: case ESR_EC_UNKNOWN: @@ -305,6 +312,9 @@ interrupt(struct trapframe *tf) } #endif + /* disable trace */ + reg_mdscr_el1_write(reg_mdscr_el1_read() & ~MDSCR_SS); + /* enable traps */ daif_enable(DAIF_D|DAIF_A); @@ -322,6 +332,8 @@ trap_el0_32sync(struct trapframe *tf) const uint32_t esr = tf->tf_esr; const uint32_t eclass = __SHIFTOUT(esr, ESR_EC); /* exception class */ + /* disable trace */ + reg_mdscr_el1_write(reg_mdscr_el1_read() & ~MDSCR_SS); /* enable traps and interrupts */ daif_enable(DAIF_D|DAIF_A|DAIF_I|DAIF_F); Index: src/sys/arch/aarch64/include/armreg.h diff -u src/sys/arch/aarch64/include/armreg.h:1.21 src/sys/arch/aarch64/include/armreg.h:1.22 --- src/sys/arch/aarch64/include/armreg.h:1.21 Tue Nov 20 01:59:51 2018 +++ src/sys/arch/aarch64/include/armreg.h Thu Dec 13 10:44:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: armreg.h,v 1.21 2018/11/20 01:59:51 mrg Exp $ */ +/* $NetBSD: armreg.h,v 1.22 2018/12/13 10:44:25 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -596,6 +596,7 @@ AARCH64REG_WRITE_INLINE(spsr_el1) #define SPSR_A32_IT1 __BIT(23) // A32: IT[1] #define SPSR_A32_IT0 __BIT(22) // A32: IT[0] #define SPSR_SS __BIT(21) // Software Step +#define SPSR_SS_SHIFT 21 #define SPSR_IL __BIT(20) // Instruction Length #define SPSR_GE __BITS(19,16) // A32: SIMD GE #define SPSR_IT7 __BIT(15) // A32: IT[7] @@ -805,6 +806,19 @@ AARCH64REG_WRITE_INLINE(dbgwvr15_el1) AARCH64REG_READ_INLINE(mdscr_el1) // Monitor Debug System Control Register AARCH64REG_WRITE_INLINE(mdscr_el1) +#define MDSCR_RXFULL __BIT(30) // for EDSCR.RXfull +#define MDSCR_TXFULL __BIT(29) // for EDSCR.TXfull +#define MDSCR_RXO __BIT(27) // for EDSCR.RXO +#define MDSCR_TXU __BIT(26) // for EDSCR.TXU +#define MDSCR_INTDIS __BITS(32,22) // for EDSCR.INTdis +#define MDSCR_TDA __BIT(21) // for EDSCR.TDA +#define MDSCR_MDE __BIT(15) // Monitor debug events +#define MDSCR_HDE __BIT(14) // for EDSCR.HDE +#define MDSCR_KDE __BIT(13) // Local debug enable +#define MDSCR_TDCC __BIT(12) // Trap Debug CommCh access +#define MDSCR_ERR __BIT(6) // for EDSCR.ERR +#define MDSCR_SS __BIT(0) // Software step + AARCH64REG_WRITE_INLINE(oslar_el1) // OS Lock Access Register AARCH64REG_READ_INLINE(oslsr_el1) // OS Lock Status Register Index: src/sys/arch/aarch64/include/ptrace.h diff -u src/sys/arch/aarch64/include/ptrace.h:1.7 src/sys/arch/aarch64/include/ptrace.h:1.8 --- src/sys/arch/aarch64/include/ptrace.h:1.7 Sat Jul 21 18:58:05 2018 +++ src/sys/arch/aarch64/include/ptrace.h Thu Dec 13 10:44:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ptrace.h,v 1.7 2018/07/21 18:58:05 ryo Exp $ */ +/* $NetBSD: ptrace.h,v 1.8 2018/12/13 10:44:25 ryo Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -36,18 +36,23 @@ /* * AARCH64-dependent ptrace definitions. - * Note that PT_STEP is _not_ supported. */ -#define PT_GETREGS (PT_FIRSTMACH + 0) -#define PT_SETREGS (PT_FIRSTMACH + 1) -#define PT_GETFPREGS (PT_FIRSTMACH + 2) -#define PT_SETFPREGS (PT_FIRSTMACH + 3) +#define PT_GETREGS (PT_FIRSTMACH + 0) +#define PT_SETREGS (PT_FIRSTMACH + 1) +#define PT_GETFPREGS (PT_FIRSTMACH + 2) +#define PT_SETFPREGS (PT_FIRSTMACH + 3) +#define PT_STEP (PT_FIRSTMACH + 4) +#define PT_SETSTEP (PT_FIRSTMACH + 5) +#define PT_CLEARSTEP (PT_FIRSTMACH + 6) #define PT_MACHDEP_STRINGS \ "PT_GETREGS", \ "PT_SETREGS", \ "PT_GETFPREGS", \ - "PT_SETFPREGS", + "PT_SETFPREGS", \ + "PT_STEP", \ + "PT_SETSTEP", \ + "PT_CLEARSTEP", #include <machine/reg.h>