Module Name: src Committed By: mrg Date: Thu Dec 27 09:55:27 UTC 2018
Modified Files: src/external/gpl3/gdb/dist/gdb: aarch64-nbsd-nat.c src/sys/arch/aarch64/aarch64: aarch64_machdep.c cpuswitch.S db_machdep.c db_trace.c genassym.cf vm_machdep.c src/sys/arch/aarch64/include: pcb.h proc.h Log Message: make savecore for arm64 basically work. - move MD lwp "md_ktf" member into struct pcb. the pcb is used by the gdb "bsd-kvm" target code to find the stack of each thread and needs to be available in a well known location. - implement aarch64_nbsd_supply_pcb() in GDB. makes basic gdb work on a crash dump. - remove '#if L_MD_KTF + 8 == L_MD_CPACR' conditional code, as there is no more L_MD_KTF. with this gdb has minimal working functionality with "target kvm", and crash can at least "ps" on a crash dump. ok skrll. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/external/gpl3/gdb/dist/gdb/aarch64-nbsd-nat.c cvs rdiff -u -r1.23 -r1.24 src/sys/arch/aarch64/aarch64/aarch64_machdep.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/aarch64/aarch64/cpuswitch.S cvs rdiff -u -r1.12 -r1.13 src/sys/arch/aarch64/aarch64/db_machdep.c cvs rdiff -u -r1.6 -r1.7 src/sys/arch/aarch64/aarch64/db_trace.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/aarch64/aarch64/genassym.cf cvs rdiff -u -r1.4 -r1.5 src/sys/arch/aarch64/aarch64/vm_machdep.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/aarch64/include/pcb.h cvs rdiff -u -r1.2 -r1.3 src/sys/arch/aarch64/include/proc.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/gpl3/gdb/dist/gdb/aarch64-nbsd-nat.c diff -u src/external/gpl3/gdb/dist/gdb/aarch64-nbsd-nat.c:1.1 src/external/gpl3/gdb/dist/gdb/aarch64-nbsd-nat.c:1.2 --- src/external/gpl3/gdb/dist/gdb/aarch64-nbsd-nat.c:1.1 Mon May 21 02:10:47 2018 +++ src/external/gpl3/gdb/dist/gdb/aarch64-nbsd-nat.c Thu Dec 27 09:55:27 2018 @@ -22,7 +22,9 @@ #include <sys/types.h> #include <sys/ptrace.h> -#include <machine/reg.h> + +#include <machine/frame.h> +#include <machine/pcb.h> #include "nbsd-nat.h" #include "aarch64-tdep.h" @@ -124,6 +126,50 @@ aarch64_nbsd_store_inferior_registers (s } } +static int +aarch64_nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) +{ + struct trapframe tf; + int i; + + /* The following is true for NetBSD/arm64: + + The pcb contains the frame pointer at the point of the context + switch in cpu_switchto(). At that point we have a stack frame as + described by `struct trapframe', which has the following layout: + + x0..x30 + sp + pc + spsr + tpidr + + This accounts for all callee-saved registers specified by the psABI. + From this information we reconstruct the register state as it would + look when we just returned from cpu_switchto(). + + For kernel core dumps, dumpsys() builds a fake trapframe for us. */ + + /* The trapframe pointer shouldn't be zero. */ + if (pcb->pcb_tf == 0) + return 0; + + /* Read the stack frame, and check its validity. */ + read_memory ((uintptr_t)pcb->pcb_tf, (gdb_byte *) &tf, sizeof tf); + + for (i = 0; i <= 30; i++) + { + regcache_raw_supply (regcache, AARCH64_X0_REGNUM + i, &tf.tf_reg[i]); + } + regcache_raw_supply (regcache, AARCH64_SP_REGNUM, &tf.tf_sp); + regcache_raw_supply (regcache, AARCH64_PC_REGNUM, &tf.tf_pc); + + regcache_raw_supply (regcache, AARCH64_FPCR_REGNUM, &pcb->pcb_fpregs.fpcr); + regcache_raw_supply (regcache, AARCH64_FPSR_REGNUM, &pcb->pcb_fpregs.fpsr); + + return 1; +} + void _initialize_aarch64_nbsd_nat (void) { @@ -133,4 +179,7 @@ _initialize_aarch64_nbsd_nat (void) t->to_fetch_registers = aarch64_nbsd_fetch_inferior_registers; t->to_store_registers = aarch64_nbsd_store_inferior_registers; nbsd_nat_add_target (t); + + /* Support debugging kernel virtual memory images. */ + bsd_kvm_add_target (aarch64_nbsd_supply_pcb); } Index: src/sys/arch/aarch64/aarch64/aarch64_machdep.c diff -u src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.23 src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.24 --- src/sys/arch/aarch64/aarch64/aarch64_machdep.c:1.23 Wed Nov 28 09:16:19 2018 +++ src/sys/arch/aarch64/aarch64/aarch64_machdep.c Thu Dec 27 09:55:27 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: aarch64_machdep.c,v 1.23 2018/11/28 09:16:19 ryo Exp $ */ +/* $NetBSD: aarch64_machdep.c,v 1.24 2018/12/27 09:55:27 mrg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.23 2018/11/28 09:16:19 ryo Exp $"); +__KERNEL_RCSID(1, "$NetBSD: aarch64_machdep.c,v 1.24 2018/12/27 09:55:27 mrg Exp $"); #include "opt_arm_debug.h" #include "opt_ddb.h" @@ -199,6 +199,7 @@ initarm_common(vaddr_t kvm_base, vsize_t extern char _end[]; extern char lwp0uspace[]; + struct pcb *pcb; struct trapframe *tf; psize_t memsize_total; vaddr_t kernstart, kernend; @@ -374,12 +375,13 @@ initarm_common(vaddr_t kvm_base, vsize_t */ uvm_lwp_setuarea(&lwp0, (vaddr_t)lwp0uspace); memset(&lwp0.l_md, 0, sizeof(lwp0.l_md)); - memset(lwp_getpcb(&lwp0), 0, sizeof(struct pcb)); + pcb = lwp_getpcb(&lwp0); + memset(pcb, 0, sizeof(struct pcb)); tf = (struct trapframe *)(lwp0uspace + USPACE) - 1; memset(tf, 0, sizeof(struct trapframe)); tf->tf_spsr = SPSR_M_EL0T; - lwp0.l_md.md_utf = lwp0.l_md.md_ktf = tf; + lwp0.l_md.md_utf = pcb->pcb_tf = tf; return (vaddr_t)tf; } Index: src/sys/arch/aarch64/aarch64/cpuswitch.S diff -u src/sys/arch/aarch64/aarch64/cpuswitch.S:1.10 src/sys/arch/aarch64/aarch64/cpuswitch.S:1.11 --- src/sys/arch/aarch64/aarch64/cpuswitch.S:1.10 Thu Dec 13 10:44:25 2018 +++ src/sys/arch/aarch64/aarch64/cpuswitch.S Thu Dec 27 09:55:27 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuswitch.S,v 1.10 2018/12/13 10:44:25 ryo Exp $ */ +/* $NetBSD: cpuswitch.S,v 1.11 2018/12/27 09:55:27 mrg 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.10 2018/12/13 10:44:25 ryo Exp $") +RCSID("$NetBSD: cpuswitch.S,v 1.11 2018/12/27 09:55:27 mrg Exp $") /* * At IPL_SCHED: @@ -66,23 +66,17 @@ ENTRY_NP(cpu_switchto) */ mov x4, sp mrs x5, cpacr_el1 -#if L_MD_KTF + 8 == L_MD_CPACR - stp x4, x5, [x0, #L_MD_KTF] -#else - str x4, [x0, #L_MD_KTF] str x5, [x0, #L_MD_CPACR] -#endif + ldr x6, [x0, #L_PCB] /* x6 = lwp_getpcb(oldlwp) */ + str x4, [x6, #PCB_TF] /* We are done with the old lwp */ .Lrestore_lwp: DISABLE_INTERRUPT -#if L_MD_KTF + 8 == L_MD_CPACR - ldp x4, x5, [x1, #L_MD_KTF] /* get trapframe ptr and cpacr_el1 */ -#else - ldr x4, [x1, #L_MD_KTF] /* get trapframe ptr (aka SP) */ + ldr x6, [x1, #L_PCB] /* x6 = lwp_getpcb(newlwp) */ + ldr x4, [x6, #PCB_TF] /* get trapframe ptr (aka SP) */ ldr x5, [x1, #L_MD_CPACR] /* get cpacr_el1 */ -#endif mov sp, x4 /* restore stack pointer */ msr cpacr_el1, x5 /* restore cpacr_el1 */ @@ -136,12 +130,9 @@ ENTRY_NP(cpu_switchto_softint) ldr x19, [x3, #CI_CURLWP] /* x19 := curcpu()->ci_curlwp */ mov x4, sp mrs x5, cpacr_el1 -#if L_MD_KTF + 8 == L_MD_CPACR - stp x4, x5, [x19, #L_MD_KTF] -#else - str x4, [x19, #L_MD_KTF] + ldr x6, [x19, #L_PCB] /* x6 = lwp_getpcb(curlwp) */ + str x4, [x6, #PCB_TF] str x5, [x19, #L_MD_CPACR] -#endif str x0, [x3, #CI_CURLWP] /* curcpu()->ci_curlwp = softlwp; */ #ifdef KASAN @@ -165,12 +156,9 @@ ENTRY_NP(cpu_switchto_softint) mrs x3, tpidr_el1 DISABLE_INTERRUPT str x19, [x3, #CI_CURLWP] /* curcpu()->ci_curlwp := x19 */ -#if L_MD_KTF + 8 == L_MD_CPACR - ldp x4, x5, [x19, #L_MD_KTF] -#else - ldr x4, [x19, #L_MD_KTF] /* x4 := pinned_lwp->l_md_ktf */ + ldr x6, [x19, #L_PCB] /* x6 = lwp_getpcb(curlwp) */ + ldr x4, [x6, #PCB_TF] /* x4 := pinned_lwp->l_addr->pcb_tf */ ldr x5, [x19, #L_MD_CPACR] /* x5 := pinned_lwp->l_md_cpacr */ -#endif mov sp, x4 /* restore pinned_lwp sp */ msr cpacr_el1, x5 /* restore pinned_lwp cpacr */ Index: src/sys/arch/aarch64/aarch64/db_machdep.c diff -u src/sys/arch/aarch64/aarch64/db_machdep.c:1.12 src/sys/arch/aarch64/aarch64/db_machdep.c:1.13 --- src/sys/arch/aarch64/aarch64/db_machdep.c:1.12 Thu Dec 13 10:44:25 2018 +++ src/sys/arch/aarch64/aarch64/db_machdep.c Thu Dec 27 09:55:27 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: db_machdep.c,v 1.12 2018/12/13 10:44:25 ryo Exp $ */ +/* $NetBSD: db_machdep.c,v 1.13 2018/12/27 09:55:27 mrg 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.12 2018/12/13 10:44:25 ryo Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_machdep.c,v 1.13 2018/12/27 09:55:27 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd32.h" @@ -303,6 +303,7 @@ db_md_lwp_cmd(db_expr_t addr, bool have_ const char *modif) { lwp_t *l; + struct pcb *pcb; if (!have_addr) { db_printf("lwp: <address>\n"); @@ -319,9 +320,10 @@ db_md_lwp_cmd(db_expr_t addr, bool have_ db_printf("\tl->l_md.md_onfault=%p\n", l->l_md.md_onfault); db_printf("\tl->l_md.md_utf =%p\n", l->l_md.md_utf); dump_trapframe(l->l_md.md_utf, db_printf); - db_printf("\tl->l_md.md_ktf =%p\n", l->l_md.md_ktf); - if (l->l_md.md_ktf != l->l_md.md_utf) - dump_trapframe(l->l_md.md_ktf, db_printf); + pcb = l->l_addr; + db_printf("\tl->l_addr.pcb_tf =%p\n", pcb->pcb_tf); + if (pcb->pcb_tf != l->l_md.md_utf) + dump_trapframe(pcb->pcb_tf, db_printf); db_printf("\tl->l_md.md_cpacr =%016" PRIx64 "\n", l->l_md.md_cpacr); db_printf("\tl->l_md.md_flags =%08x\n", l->l_md.md_flags); Index: src/sys/arch/aarch64/aarch64/db_trace.c diff -u src/sys/arch/aarch64/aarch64/db_trace.c:1.6 src/sys/arch/aarch64/aarch64/db_trace.c:1.7 --- src/sys/arch/aarch64/aarch64/db_trace.c:1.6 Sat Sep 15 19:47:48 2018 +++ src/sys/arch/aarch64/aarch64/db_trace.c Thu Dec 27 09:55:27 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: db_trace.c,v 1.6 2018/09/15 19:47:48 jakllsch Exp $ */ +/* $NetBSD: db_trace.c,v 1.7 2018/12/27 09:55:27 mrg Exp $ */ /* * Copyright (c) 2017 Ryo Shimizu <r...@nerv.org> @@ -28,7 +28,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.6 2018/09/15 19:47:48 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.7 2018/12/27 09:55:27 mrg Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -207,7 +207,9 @@ db_stack_trace_print(db_expr_t addr, boo } else #endif { - tf = l.l_md.md_ktf; + struct pcb *pcb = lwp_getpcb(&l); + + tf = pcb->pcb_tf; db_read_bytes((db_addr_t)&tf->tf_reg[29], sizeof(fp), (char *)&fp); (*pr)("trace: pid %d lid %d at tf %p\n", p.p_pid, l.l_lid, tf); Index: src/sys/arch/aarch64/aarch64/genassym.cf diff -u src/sys/arch/aarch64/aarch64/genassym.cf:1.11 src/sys/arch/aarch64/aarch64/genassym.cf:1.12 --- src/sys/arch/aarch64/aarch64/genassym.cf:1.11 Thu Dec 13 10:44:25 2018 +++ src/sys/arch/aarch64/aarch64/genassym.cf Thu Dec 27 09:55:27 2018 @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.11 2018/12/13 10:44:25 ryo Exp $ +# $NetBSD: genassym.cf,v 1.12 2018/12/27 09:55:27 mrg Exp $ #- # Copyright (c) 2014 The NetBSD Foundation, Inc. # All rights reserved. @@ -180,7 +180,6 @@ define L_CTXSWTCH offsetof(struct lwp, define L_PRIVATE offsetof(struct lwp, l_private) define L_MD_FLAGS offsetof(struct lwp, l_md.md_flags) define L_MD_UTF offsetof(struct lwp, l_md.md_utf) -define L_MD_KTF offsetof(struct lwp, l_md.md_ktf) define L_MD_CPACR offsetof(struct lwp, l_md.md_cpacr) define L_MD_ONFAULT offsetof(struct lwp, l_md.md_onfault) @@ -229,6 +228,8 @@ define VM_PMAP offsetof(struct vmspace define SIGTRAP SIGTRAP define SIGEMT SIGEMT +define PCB_TF offsetof(struct pcb, pcb_tf) + define TF_X0 offsetof(struct trapframe, tf_reg[0]) define TF_X1 offsetof(struct trapframe, tf_reg[1]) define TF_X2 offsetof(struct trapframe, tf_reg[2]) Index: src/sys/arch/aarch64/aarch64/vm_machdep.c diff -u src/sys/arch/aarch64/aarch64/vm_machdep.c:1.4 src/sys/arch/aarch64/aarch64/vm_machdep.c:1.5 --- src/sys/arch/aarch64/aarch64/vm_machdep.c:1.4 Tue Jul 17 00:36:30 2018 +++ src/sys/arch/aarch64/aarch64/vm_machdep.c Thu Dec 27 09:55:27 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_machdep.c,v 1.4 2018/07/17 00:36:30 christos Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.5 2018/12/27 09:55:27 mrg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.4 2018/07/17 00:36:30 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.5 2018/12/27 09:55:27 mrg Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -130,7 +130,7 @@ cpu_lwp_fork(struct lwp *l1, struct lwp KASSERT(reg_daif_read() == 0); ktf->tf_lr = (uintptr_t)lwp_trampoline; - l2->l_md.md_ktf = ktf; + pcb2->pcb_tf = ktf; } /* Index: src/sys/arch/aarch64/include/pcb.h diff -u src/sys/arch/aarch64/include/pcb.h:1.1 src/sys/arch/aarch64/include/pcb.h:1.2 --- src/sys/arch/aarch64/include/pcb.h:1.1 Sun Aug 10 05:47:38 2014 +++ src/sys/arch/aarch64/include/pcb.h Thu Dec 27 09:55:27 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: pcb.h,v 1.1 2014/08/10 05:47:38 matt Exp $ */ +/* $NetBSD: pcb.h,v 1.2 2018/12/27 09:55:27 mrg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -38,6 +38,7 @@ struct pcb { struct fpreg pcb_fpregs; + struct trapframe *pcb_tf; }; struct md_coredump { Index: src/sys/arch/aarch64/include/proc.h diff -u src/sys/arch/aarch64/include/proc.h:1.2 src/sys/arch/aarch64/include/proc.h:1.3 --- src/sys/arch/aarch64/include/proc.h:1.2 Sun Apr 1 04:35:03 2018 +++ src/sys/arch/aarch64/include/proc.h Thu Dec 27 09:55:27 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: proc.h,v 1.2 2018/04/01 04:35:03 ryo Exp $ */ +/* $NetBSD: proc.h,v 1.3 2018/12/27 09:55:27 mrg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -37,7 +37,6 @@ struct mdlwp { void *md_onfault; struct trapframe *md_utf; - struct trapframe *md_ktf; uint64_t md_cpacr; uint32_t md_flags; };