Skip to content

Commit

Permalink
Clean up <machine/signal.h>, moving the trapframe struct into
Browse files Browse the repository at this point in the history
<machine/frame.h>.
  • Loading branch information
kettenis committed Jul 13, 2020
1 parent 48ad8d0 commit 5e649a8
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 42 deletions.
25 changes: 24 additions & 1 deletion sys/arch/powerpc64/include/frame.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $OpenBSD: frame.h,v 1.4 2020/06/24 20:49:11 kettenis Exp $ */
/* $OpenBSD: frame.h,v 1.5 2020/07/13 22:37:37 kettenis Exp $ */

/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
Expand Down Expand Up @@ -34,6 +34,29 @@
#ifndef _MACHDEP_FRAME_H
#define _MACHDEP_FRAME_H

/*
* We have to save all registers on every trap, because
* 1. user could attach this process every time
* 2. we must be able to restore all user registers in case of fork
* Actually, we do not save the fp registers on trap, since
* these are not used by the kernel. They are saved only when switching
* between processes using the FPU.
*
*/
struct trapframe {
__register_t fixreg[32];
__register_t lr;
__register_t cr;
__register_t xer;
__register_t ctr;
__register_t srr0;
__register_t srr1;
__register_t vrsave;
__register_t dar; /* dar & dsisr are only filled on a DSI trap */
__register_t dsisr;
__register_t exc;
};

/*
* This is to ensure alignment of the stackpointer
*/
Expand Down
36 changes: 11 additions & 25 deletions sys/arch/powerpc64/include/signal.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $OpenBSD: signal.h,v 1.4 2020/07/06 17:43:23 kettenis Exp $ */
/* $OpenBSD: signal.h,v 1.5 2020/07/13 22:37:37 kettenis Exp $ */

/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
Expand Down Expand Up @@ -42,38 +42,24 @@ typedef int sig_atomic_t;

#include <machine/_types.h>

/*
* We have to save all registers on every trap, because
* 1. user could attach this process every time
* 2. we must be able to restore all user registers in case of fork
* Actually, we do not save the fp registers on trap, since
* these are not used by the kernel. They are saved only when switching
* between processes using the FPU.
*
*/
struct trapframe {
__register_t fixreg[32];
__register_t lr;
__register_t cr;
__register_t xer;
__register_t ctr;
__register_t srr0;
__register_t srr1;
__register_t vrsave;
__register_t dar; /* dar & dsisr are only filled on a DSI trap */
__register_t dsisr;
__register_t exc;
};

struct sigcontext {
long sc_cookie;
int sc_mask; /* saved signal mask */
struct trapframe sc_frame; /* saved registers */
__register_t sc_reg[32]; /* saved registers */
__register_t sc_lr;
__register_t sc_cr;
__register_t sc_xer;
__register_t sc_ctr;
__register_t sc_pc;
__register_t sc_ps;
__register_t sc_vrsave;
__uint128_t sc_vsx[64];
__uint64_t sc_fpscr;
__uint64_t sc_vscr;
};

#define sc_sp sc_reg[1]

#endif /* __BSD_VISIBLE || __XPG_VISIBLE >= 420 */

#endif /* _MACHDEP_SIGNAL_H_ */
34 changes: 18 additions & 16 deletions sys/arch/powerpc64/powerpc64/machdep.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* $OpenBSD: machdep.c,v 1.49 2020/07/11 11:43:57 kettenis Exp $ */
/* $OpenBSD: machdep.c,v 1.50 2020/07/13 22:37:37 kettenis Exp $ */

/*
* Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
Expand Down Expand Up @@ -755,13 +755,14 @@ sendsig(sig_t catcher, int sig, sigset_t mask, const siginfo_t *ksip)

/* Save register context. */
for (i = 0; i < 32; i++)
frame.sf_sc.sc_frame.fixreg[i] = tf->fixreg[i];
frame.sf_sc.sc_frame.lr = tf->lr;
frame.sf_sc.sc_frame.cr = tf->cr;
frame.sf_sc.sc_frame.xer = tf->xer;
frame.sf_sc.sc_frame.ctr = tf->ctr;
frame.sf_sc.sc_frame.srr0 = tf->srr0;
frame.sf_sc.sc_frame.srr1 = tf->srr1;
frame.sf_sc.sc_reg[i] = tf->fixreg[i];
frame.sf_sc.sc_lr = tf->lr;
frame.sf_sc.sc_cr = tf->cr;
frame.sf_sc.sc_xer = tf->xer;
frame.sf_sc.sc_ctr = tf->ctr;
frame.sf_sc.sc_pc = tf->srr0;
frame.sf_sc.sc_ps = tf->srr1;
frame.sf_sc.sc_vrsave = tf->vrsave;

/* Copy the saved FPU state into the frame if necessary. */
if (pcb->pcb_flags & (PCB_FP|PCB_VEC|PCB_VSX)) {
Expand Down Expand Up @@ -826,18 +827,19 @@ sys_sigreturn(struct proc *p, void *v, register_t *retval)
offsetof(struct sigcontext, sc_cookie), sizeof (ksc.sc_cookie));

/* Make sure the processor mode has not been tampered with. */
if (ksc.sc_frame.srr1 != PSL_USER)
if (ksc.sc_ps != PSL_USER)
return EINVAL;

/* Restore register context. */
for (i = 0; i < 32; i++)
tf->fixreg[i] = ksc.sc_frame.fixreg[i];
tf->lr = ksc.sc_frame.lr;
tf->cr = ksc.sc_frame.cr;
tf->xer = ksc.sc_frame.xer;
tf->ctr = ksc.sc_frame.ctr;
tf->srr0 = ksc.sc_frame.srr0;
tf->srr1 = ksc.sc_frame.srr1;
tf->fixreg[i] = ksc.sc_reg[i];
tf->lr = ksc.sc_lr;
tf->cr = ksc.sc_cr;
tf->xer = ksc.sc_xer;
tf->ctr = ksc.sc_ctr;
tf->srr0 = ksc.sc_pc;
tf->srr1 = ksc.sc_ps;
tf->vrsave = ksc.sc_vrsave;

/* Write saved FPU state back to PCB if necessary. */
if (pcb->pcb_flags & (PCB_FP|PCB_VEC|PCB_VSX)) {
Expand Down

0 comments on commit 5e649a8

Please sign in to comment.