summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/powerpc/fpu/fpu_emu.c2
-rw-r--r--sys/powerpc/fpu/fpu_emu.h2
-rw-r--r--sys/powerpc/fpu/fpu_extern.h4
-rw-r--r--sys/powerpc/include/reg.h6
-rw-r--r--sys/powerpc/powerpc/exec_machdep.c18
5 files changed, 19 insertions, 13 deletions
diff --git a/sys/powerpc/fpu/fpu_emu.c b/sys/powerpc/fpu/fpu_emu.c
index 82074aa..9056dca 100644
--- a/sys/powerpc/fpu/fpu_emu.c
+++ b/sys/powerpc/fpu/fpu_emu.c
@@ -183,7 +183,7 @@ fpu_dumpfpn(struct fpn *fp)
* (Typically: zero, SIGFPE, SIGILL, SIGSEGV)
*/
int
-fpu_emulate(struct trapframe *frame, struct fpreg *fpf)
+fpu_emulate(struct trapframe *frame, struct fpu *fpf)
{
static union instr insn;
static struct fpemu fe;
diff --git a/sys/powerpc/fpu/fpu_emu.h b/sys/powerpc/fpu/fpu_emu.h
index 89ccc36..30e617e4 100644
--- a/sys/powerpc/fpu/fpu_emu.h
+++ b/sys/powerpc/fpu/fpu_emu.h
@@ -138,7 +138,7 @@ struct fpn {
* Emulator state.
*/
struct fpemu {
- struct fpreg *fe_fpstate; /* registers, etc */
+ struct fpu *fe_fpstate; /* registers, etc */
int fe_fpscr; /* fpscr copy (modified during op) */
int fe_cx; /* keep track of exceptions */
struct fpn fe_f1; /* operand 1 */
diff --git a/sys/powerpc/fpu/fpu_extern.h b/sys/powerpc/fpu/fpu_extern.h
index 9c24f1d..9f4b013 100644
--- a/sys/powerpc/fpu/fpu_extern.h
+++ b/sys/powerpc/fpu/fpu_extern.h
@@ -31,14 +31,14 @@
*/
struct proc;
-struct fpreg;
+struct fpu;
struct trapframe;
union instr;
struct fpemu;
struct fpn;
/* fpu.c */
-int fpu_emulate(struct trapframe *, struct fpreg *);
+int fpu_emulate(struct trapframe *, struct fpu *);
int fpu_execute(struct trapframe *, struct fpemu *, union instr *);
/* fpu_explode.c */
diff --git a/sys/powerpc/include/reg.h b/sys/powerpc/include/reg.h
index e77625a..0eff51e 100644
--- a/sys/powerpc/include/reg.h
+++ b/sys/powerpc/include/reg.h
@@ -18,12 +18,8 @@ struct reg {
register_t pc;
};
-/* Must match pcb.pcb_fpu */
struct fpreg {
- union {
- double fpr;
- uint64_t vsr[2];
- } fpreg[32];
+ double fpreg[32];
double fpscr;
};
diff --git a/sys/powerpc/powerpc/exec_machdep.c b/sys/powerpc/powerpc/exec_machdep.c
index d657244f..d8238a1 100644
--- a/sys/powerpc/powerpc/exec_machdep.c
+++ b/sys/powerpc/powerpc/exec_machdep.c
@@ -608,13 +608,18 @@ int
fill_fpregs(struct thread *td, struct fpreg *fpregs)
{
struct pcb *pcb;
+ int i;
pcb = td->td_pcb;
if ((pcb->pcb_flags & PCB_FPREGS) == 0)
memset(fpregs, 0, sizeof(struct fpreg));
- else
- memcpy(fpregs, &pcb->pcb_fpu, sizeof(struct fpreg));
+ else {
+ memcpy(&fpregs->fpscr, &pcb->pcb_fpu.fpscr, sizeof(double));
+ for (i = 0; i < 32; i++)
+ memcpy(&fpregs->fpreg[i], &pcb->pcb_fpu.fpr[i].fpr,
+ sizeof(double));
+ }
return (0);
}
@@ -641,10 +646,15 @@ int
set_fpregs(struct thread *td, struct fpreg *fpregs)
{
struct pcb *pcb;
+ int i;
pcb = td->td_pcb;
pcb->pcb_flags |= PCB_FPREGS;
- memcpy(&pcb->pcb_fpu, fpregs, sizeof(struct fpreg));
+ memcpy(&pcb->pcb_fpu.fpscr, &fpregs->fpscr, sizeof(double));
+ for (i = 0; i < 32; i++) {
+ memcpy(&pcb->pcb_fpu.fpr[i].fpr, &fpregs->fpreg[i],
+ sizeof(double));
+ }
return (0);
}
@@ -1060,7 +1070,7 @@ ppc_instr_emulate(struct trapframe *frame, struct pcb *pcb)
bzero(&pcb->pcb_fpu, sizeof(pcb->pcb_fpu));
pcb->pcb_flags |= PCB_FPREGS;
}
- sig = fpu_emulate(frame, (struct fpreg *)&pcb->pcb_fpu);
+ sig = fpu_emulate(frame, &pcb->pcb_fpu);
#endif
return (sig);
OpenPOWER on IntegriCloud