summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2020-07-10 18:30:28 +0000
committerkettenis <kettenis@openbsd.org>2020-07-10 18:30:28 +0000
commit015eac4755f56ad8468a75d13ac82dd0c27dc688 (patch)
tree12a906a12705e5160b2feb6299544d2644d2ddd9
parentsync (diff)
downloadwireguard-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.c12
-rw-r--r--sys/arch/powerpc64/powerpc64/process_machdep.c33
-rw-r--r--sys/arch/powerpc64/powerpc64/trap.c11
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",