Index: aarch64/aarch64_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/aarch64_machdep.c,v retrieving revision 1.23 diff -p -u -u -r1.23 aarch64_machdep.c --- aarch64/aarch64_machdep.c 28 Nov 2018 09:16:19 -0000 1.23 +++ aarch64/aarch64_machdep.c 21 Dec 2018 11:09:38 -0000 @@ -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: aarch64/cpuswitch.S =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/cpuswitch.S,v retrieving revision 1.10 diff -p -u -u -r1.10 cpuswitch.S --- aarch64/cpuswitch.S 13 Dec 2018 10:44:25 -0000 1.10 +++ aarch64/cpuswitch.S 21 Dec 2018 11:09:38 -0000 @@ -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: aarch64/db_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/db_machdep.c,v retrieving revision 1.12 diff -p -u -u -r1.12 db_machdep.c --- aarch64/db_machdep.c 13 Dec 2018 10:44:25 -0000 1.12 +++ aarch64/db_machdep.c 21 Dec 2018 11:09:38 -0000 @@ -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:
\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: aarch64/db_trace.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/db_trace.c,v retrieving revision 1.6 diff -p -u -u -r1.6 db_trace.c --- aarch64/db_trace.c 15 Sep 2018 19:47:48 -0000 1.6 +++ aarch64/db_trace.c 21 Dec 2018 11:09:38 -0000 @@ -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: aarch64/genassym.cf =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/genassym.cf,v retrieving revision 1.11 diff -p -u -u -r1.11 genassym.cf --- aarch64/genassym.cf 13 Dec 2018 10:44:25 -0000 1.11 +++ aarch64/genassym.cf 21 Dec 2018 11:09:38 -0000 @@ -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: aarch64/vm_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/aarch64/vm_machdep.c,v retrieving revision 1.4 diff -p -u -u -r1.4 vm_machdep.c --- aarch64/vm_machdep.c 17 Jul 2018 00:36:30 -0000 1.4 +++ aarch64/vm_machdep.c 21 Dec 2018 11:09:38 -0000 @@ -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: include/pcb.h =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/include/pcb.h,v retrieving revision 1.1 diff -p -u -u -r1.1 pcb.h --- include/pcb.h 10 Aug 2014 05:47:38 -0000 1.1 +++ include/pcb.h 21 Dec 2018 11:09:38 -0000 @@ -38,6 +38,7 @@ struct pcb { struct fpreg pcb_fpregs; + struct trapframe *pcb_tf; }; struct md_coredump { Index: include/proc.h =================================================================== RCS file: /cvsroot/src/sys/arch/aarch64/include/proc.h,v retrieving revision 1.2 diff -p -u -u -r1.2 proc.h --- include/proc.h 1 Apr 2018 04:35:03 -0000 1.2 +++ include/proc.h 21 Dec 2018 11:09:38 -0000 @@ -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; };