Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F156930457
D5004.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D5004.diff
View Options
Index: head/sys/powerpc/fpu/fpu_emu.h
===================================================================
--- head/sys/powerpc/fpu/fpu_emu.h
+++ head/sys/powerpc/fpu/fpu_emu.h
@@ -138,7 +138,7 @@
* 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 */
Index: head/sys/powerpc/fpu/fpu_emu.c
===================================================================
--- head/sys/powerpc/fpu/fpu_emu.c
+++ head/sys/powerpc/fpu/fpu_emu.c
@@ -183,7 +183,7 @@
* (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;
Index: head/sys/powerpc/fpu/fpu_extern.h
===================================================================
--- head/sys/powerpc/fpu/fpu_extern.h
+++ head/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 */
Index: head/sys/powerpc/include/reg.h
===================================================================
--- head/sys/powerpc/include/reg.h
+++ head/sys/powerpc/include/reg.h
@@ -18,12 +18,8 @@
register_t pc;
};
-/* Must match pcb.pcb_fpu */
struct fpreg {
- union {
- double fpr;
- uint64_t vsr[2];
- } fpreg[32];
+ double fpreg[32];
double fpscr;
};
Index: head/sys/powerpc/powerpc/exec_machdep.c
===================================================================
--- head/sys/powerpc/powerpc/exec_machdep.c
+++ head/sys/powerpc/powerpc/exec_machdep.c
@@ -608,13 +608,18 @@
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 @@
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 @@
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);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, May 18, 10:52 AM (10 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33244904
Default Alt Text
D5004.diff (3 KB)
Attached To
Mode
D5004: Restore the ABI of 'struct fpreg'.
Attached
Detach File
Event Timeline
Log In to Comment