aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorBrandon Bergren <bdragon@FreeBSD.org>2020-12-03 01:39:59 +0000
committerBrandon Bergren <bdragon@FreeBSD.org>2020-12-03 01:39:59 +0000
commit3de50be851fefcfbca7a2cdecb1e86305cc2531d (patch)
tree7cc353eeaaac50317b8286650c5f8a7dd40388c7 /sys
parent3921dc1304ee6eea27463fbb0e2acc31ea881403 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/powerpc/include/pcb.h10
-rw-r--r--sys/powerpc/powerpc/fpu.c4
2 files changed, 12 insertions, 2 deletions
diff --git a/sys/powerpc/include/pcb.h b/sys/powerpc/include/pcb.h
index 386c7e2a26e3..bff58cfa7bb3 100644
--- a/sys/powerpc/include/pcb.h
+++ b/sys/powerpc/include/pcb.h
@@ -37,6 +37,8 @@
#ifndef _MACHINE_PCB_H_
#define _MACHINE_PCB_H_
+#include <sys/endian.h>
+
#include <machine/setjmp.h>
#ifndef _STANDALONE
@@ -62,8 +64,16 @@ struct pcb {
#define PCB_CFSCR 0x40 /* Process had FSCR updated */
struct fpu {
union {
+#if _BYTE_ORDER == _BIG_ENDIAN
double fpr;
uint32_t vsr[4];
+#else
+ uint32_t vsr[4];
+ struct {
+ double padding;
+ double fpr;
+ };
+#endif
} fpr[32];
double fpscr; /* FPSCR stored as double for easier access */
} pcb_fpu; /* Floating point processor */
diff --git a/sys/powerpc/powerpc/fpu.c b/sys/powerpc/powerpc/fpu.c
index 1bb9f3de07b5..59d3d218f84c 100644
--- a/sys/powerpc/powerpc/fpu.c
+++ b/sys/powerpc/powerpc/fpu.c
@@ -79,7 +79,7 @@ save_fpu_int(struct thread *td)
#undef SFP
} else {
#define SFP(n) __asm ("stfd " #n ", 0(%0)" \
- :: "b"(&pcb->pcb_fpu.fpr[n]));
+ :: "b"(&pcb->pcb_fpu.fpr[n].fpr));
SFP(0); SFP(1); SFP(2); SFP(3);
SFP(4); SFP(5); SFP(6); SFP(7);
SFP(8); SFP(9); SFP(10); SFP(11);
@@ -164,7 +164,7 @@ enable_fpu(struct thread *td)
#undef LFP
} else {
#define LFP(n) __asm ("lfd " #n ", 0(%0)" \
- :: "b"(&pcb->pcb_fpu.fpr[n]));
+ :: "b"(&pcb->pcb_fpu.fpr[n].fpr));
LFP(0); LFP(1); LFP(2); LFP(3);
LFP(4); LFP(5); LFP(6); LFP(7);
LFP(8); LFP(9); LFP(10); LFP(11);