Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Feb 2016 23:12:05 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r295132 - in head/sys/powerpc: fpu include powerpc
Message-ID:  <201602012312.u11NC5JF064828@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Mon Feb  1 23:12:04 2016
New Revision: 295132
URL: https://svnweb.freebsd.org/changeset/base/295132

Log:
  Restore the ABI of 'struct fpreg' on powerpc.
  
  The PT_{GET,SET}FPREGS requests use 'struct fpreg' and the NT_FPREGSET
  core note stores a copy of 'struct fpreg'.  As with x86 and the floating
  point state there compared to the extended state in XSAVE, struct fpreg
  on powerpc now only holds the 'base' FP state, and setting it via
  PT_SETFPREGS leaves the extended vector state in a thread unchanged.
  
  Reviewed by:	jhibbits
  Differential Revision:	https://reviews.freebsd.org/D5004

Modified:
  head/sys/powerpc/fpu/fpu_emu.c
  head/sys/powerpc/fpu/fpu_emu.h
  head/sys/powerpc/fpu/fpu_extern.h
  head/sys/powerpc/include/reg.h
  head/sys/powerpc/powerpc/exec_machdep.c

Modified: head/sys/powerpc/fpu/fpu_emu.c
==============================================================================
--- head/sys/powerpc/fpu/fpu_emu.c	Mon Feb  1 23:07:31 2016	(r295131)
+++ head/sys/powerpc/fpu/fpu_emu.c	Mon Feb  1 23:12:04 2016	(r295132)
@@ -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;

Modified: head/sys/powerpc/fpu/fpu_emu.h
==============================================================================
--- head/sys/powerpc/fpu/fpu_emu.h	Mon Feb  1 23:07:31 2016	(r295131)
+++ head/sys/powerpc/fpu/fpu_emu.h	Mon Feb  1 23:12:04 2016	(r295132)
@@ -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 */

Modified: head/sys/powerpc/fpu/fpu_extern.h
==============================================================================
--- head/sys/powerpc/fpu/fpu_extern.h	Mon Feb  1 23:07:31 2016	(r295131)
+++ head/sys/powerpc/fpu/fpu_extern.h	Mon Feb  1 23:12:04 2016	(r295132)
@@ -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 */

Modified: head/sys/powerpc/include/reg.h
==============================================================================
--- head/sys/powerpc/include/reg.h	Mon Feb  1 23:07:31 2016	(r295131)
+++ head/sys/powerpc/include/reg.h	Mon Feb  1 23:12:04 2016	(r295132)
@@ -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;
 };
 

Modified: head/sys/powerpc/powerpc/exec_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/exec_machdep.c	Mon Feb  1 23:07:31 2016	(r295131)
+++ head/sys/powerpc/powerpc/exec_machdep.c	Mon Feb  1 23:12:04 2016	(r295132)
@@ -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 *fram
 		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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201602012312.u11NC5JF064828>