diff options
author | kettenis <kettenis@openbsd.org> | 2020-07-10 18:30:28 +0000 |
---|---|---|
committer | kettenis <kettenis@openbsd.org> | 2020-07-10 18:30:28 +0000 |
commit | 015eac4755f56ad8468a75d13ac82dd0c27dc688 (patch) | |
tree | 12a906a12705e5160b2feb6299544d2644d2ddd9 | |
parent | sync (diff) | |
download | wireguard-openbsd-015eac4755f56ad8468a75d13ac82dd0c27dc688.tar.xz wireguard-openbsd-015eac4755f56ad8468a75d13ac82dd0c27dc688.zip |
Implement process_read_regs() such that core dumps become usable.
-rw-r--r-- | sys/arch/powerpc64/powerpc64/cpu.c | 12 | ||||
-rw-r--r-- | sys/arch/powerpc64/powerpc64/process_machdep.c | 33 | ||||
-rw-r--r-- | sys/arch/powerpc64/powerpc64/trap.c | 11 |
3 files changed, 28 insertions, 28 deletions
diff --git a/sys/arch/powerpc64/powerpc64/cpu.c b/sys/arch/powerpc64/powerpc64/cpu.c index 9ffa3db077d..6dabec32aa8 100644 --- a/sys/arch/powerpc64/powerpc64/cpu.c +++ b/sys/arch/powerpc64/powerpc64/cpu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.c,v 1.8 2020/06/26 12:34:53 jsg Exp $ */ +/* $OpenBSD: cpu.c,v 1.9 2020/07/10 18:30:28 kettenis Exp $ */ /* * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org> @@ -87,9 +87,7 @@ cpu_attach(struct device *parent, struct device *dev, void *aux) { struct fdt_attach_args *faa = aux; const char *name = NULL; - uint32_t pvr; - uint32_t iline; - uint32_t dline; + uint32_t pvr, clock_freq, iline, dline; int node, level, i; printf(" pir %llx", faa->fa_reg[0].addr); @@ -113,6 +111,12 @@ cpu_attach(struct device *parent, struct device *dev, void *aux) } node = faa->fa_node; + clock_freq = OF_getpropint(node, "clock-frequency", 0); + if (clock_freq != 0) { + clock_freq /= 1000000; /* Hz to MHz */ + printf(", %u MHz", clock_freq); + } + iline = OF_getpropint(node, "i-cache-block-size", 128); dline = OF_getpropint(node, "d-cache-block-size", 128); level = 1; diff --git a/sys/arch/powerpc64/powerpc64/process_machdep.c b/sys/arch/powerpc64/powerpc64/process_machdep.c index 8709ed2f3f7..ccdc453d7ca 100644 --- a/sys/arch/powerpc64/powerpc64/process_machdep.c +++ b/sys/arch/powerpc64/powerpc64/process_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: process_machdep.c,v 1.2 2020/06/14 17:56:54 kettenis Exp $ */ +/* $OpenBSD: process_machdep.c,v 1.3 2020/07/10 18:30:28 kettenis Exp $ */ /* $NetBSD: process_machdep.c,v 1.1 1996/09/30 16:34:53 ws Exp $ */ /* @@ -45,30 +45,17 @@ int process_read_regs(struct proc *p, struct reg *regs) { -#if 0 - struct cpu_info *ci = curcpu(); - struct trapframe *tf = trapframe(p); - struct pcb *pcb = &p->p_addr->u_pcb; + struct trapframe *tf = p->p_md.md_regs; - bcopy(tf->fixreg, regs->gpr, sizeof(regs->gpr)); + memcpy(regs->r_reg, tf->fixreg, sizeof(regs->r_reg)); - if (!(pcb->pcb_flags & PCB_FPU)) { - bzero(regs->fpr, sizeof(regs->fpr)); - } else { - /* XXX What if the state is on the other cpu? */ - if (p == ci->ci_fpuproc) - save_fpu(); - bcopy(pcb->pcb_fpu.fpr, regs->fpr, sizeof(regs->fpr)); - } - - regs->pc = tf->srr0; - regs->ps = tf->srr1; /* is this the correct value for this ? */ - regs->cnd = tf->cr; - regs->lr = tf->lr; - regs->cnt = tf->ctr; - regs->xer = tf->xer; - regs->mq = 0; /* what should this really be? */ -#endif + regs->r_lr = tf->lr; + regs->r_cr = tf->cr; + regs->r_xer = tf->xer; + regs->r_ctr = tf->ctr; + regs->r_pc = tf->srr0; + regs->r_msr = tf->srr1; + regs->r_vrsave = tf->vrsave; return 0; } diff --git a/sys/arch/powerpc64/powerpc64/trap.c b/sys/arch/powerpc64/powerpc64/trap.c index b7df3082345..794d42cb86b 100644 --- a/sys/arch/powerpc64/powerpc64/trap.c +++ b/sys/arch/powerpc64/powerpc64/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.24 2020/07/05 12:24:16 kettenis Exp $ */ +/* $OpenBSD: trap.c,v 1.25 2020/07/10 18:30:28 kettenis Exp $ */ /* * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org> @@ -278,6 +278,15 @@ trap(struct trapframe *frame) frame->srr1 |= PSL_VEC; break; + case EXC_HEA|EXC_USER: + { + uint32_t heir; + + __asm volatile ("mfspr %0, 339" : "=r"(heir)); + printf("heir %x\n", heir); + } + /* FALLTHROUGH */ + default: fatal: panic("trap type %x srr1 %lx at %lx lr %lx", |