Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Apr 2003 16:36:34 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 29649 for review
Message-ID:  <200304242336.h3ONaY62057830@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=29649

Change 29649 by peter@peter_daintree on 2003/04/24 16:36:15

	argh.  implement fill_fpregs_xmm and friends.  I still cannot convince
	myself that I've done this right, or that I have the src and dsts
	the right way around.

Affected files ...

.. //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#78 edit

Differences ...

==== //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#78 (text+ko) ====

@@ -1349,60 +1349,66 @@
 	return (0);
 }
 
+/* XXX check all this stuff! */
+/* externalize from sv_xmm */
 static void
 fill_fpregs_xmm(struct savefpu *sv_xmm, struct fpreg *fpregs)
 {
-#if 0
-	register struct env87 *penv_87 = &fpregs->sv_env;
-	register struct envxmm *penv_xmm = &sv_xmm->sv_env;
+	struct envxmm *penv_fpreg = (struct envxmm *)&fpregs->fpr_env;
+	struct envxmm *penv_xmm = &sv_xmm->sv_env;
 	int i;
 
 	/* pcb -> fpregs */
 	bzero(fpregs, sizeof(*fpregs));
 
 	/* FPU control/status */
-	penv_87->en_cw = penv_xmm->en_cw;
-	penv_87->en_sw = penv_xmm->en_sw;
-	penv_87->en_tw = penv_xmm->en_tw;
-	penv_87->en_fip = penv_xmm->en_fip;
-	penv_87->en_fcs = penv_xmm->en_fcs;
-	penv_87->en_opcode = penv_xmm->en_opcode;
-	penv_87->en_foo = penv_xmm->en_foo;
-	penv_87->en_fos = penv_xmm->en_fos;
+	penv_fpreg->en_cw = penv_xmm->en_cw;
+	penv_fpreg->en_sw = penv_xmm->en_sw;
+	penv_fpreg->en_tw = penv_xmm->en_tw;
+	penv_fpreg->en_opcode = penv_xmm->en_opcode;
+	penv_fpreg->en_rip = penv_xmm->en_rip;
+	penv_fpreg->en_rdp = penv_xmm->en_rdp;
+	penv_fpreg->en_mxcsr = penv_xmm->en_mxcsr;
+	penv_fpreg->en_mxcsr_mask = penv_xmm->en_mxcsr_mask;
 
 	/* FPU registers */
 	for (i = 0; i < 8; ++i)
-		sv_87->sv_ac[i] = sv_xmm->sv_fp[i].fp_acc;
-#endif
-	printf("implement fill_fpregs_xmm\n");
+		bcopy(sv_xmm->sv_fp[i].fp_acc.fp_bytes, fpregs->fpr_acc[i], 10);
+
+	/* SSE registers */
+	for (i = 0; i < 16; ++i)
+		bcopy(sv_xmm->sv_xmm[i].xmm_bytes, fpregs->fpr_xacc[i], 16);
 }
 
+/* internalize from fpregs into sv_xmm */
 static void
 set_fpregs_xmm(struct fpreg *fpregs, struct savefpu *sv_xmm)
 {
-#if 0
-	register struct env87 *penv_87 = &fpregs->sv_env;
-	register struct envxmm *penv_xmm = &sv_xmm->sv_env;
+	struct envxmm *penv_xmm = &sv_xmm->sv_env;
+	struct envxmm *penv_fpreg = (struct envxmm *)&fpregs->fpr_env;
 	int i;
 
 	/* fpregs -> pcb */
 	/* FPU control/status */
-	penv_xmm->en_cw = penv_87->en_cw;
-	penv_xmm->en_sw = penv_87->en_sw;
-	penv_xmm->en_tw = penv_87->en_tw;
-	penv_xmm->en_fip = penv_87->en_fip;
-	penv_xmm->en_fcs = penv_87->en_fcs;
-	penv_xmm->en_opcode = penv_87->en_opcode;
-	penv_xmm->en_foo = penv_87->en_foo;
-	penv_xmm->en_fos = penv_87->en_fos;
+	penv_xmm->en_cw = penv_fpreg->en_cw;
+	penv_xmm->en_sw = penv_fpreg->en_sw;
+	penv_xmm->en_tw = penv_fpreg->en_tw;
+	penv_xmm->en_opcode = penv_fpreg->en_opcode;
+	penv_xmm->en_rip = penv_fpreg->en_rip;
+	penv_xmm->en_rdp = penv_fpreg->en_rdp;
+	penv_xmm->en_mxcsr = penv_fpreg->en_mxcsr;
+	penv_xmm->en_mxcsr_mask = penv_fpreg->en_mxcsr_mask;
 
 	/* FPU registers */
 	for (i = 0; i < 8; ++i)
-		sv_xmm->sv_fp[i].fp_acc = sv_87->sv_ac[i];
-#endif
-	printf("implement set_fpregs_xmm\n");
+		bcopy(fpregs->fpr_acc[i], sv_xmm->sv_fp[i].fp_acc.fp_bytes, 10);
+
+	/* SSE registers */
+	for (i = 0; i < 16; ++i)
+		bcopy(fpregs->fpr_xacc[i], sv_xmm->sv_xmm[i].xmm_bytes, 16);
 }
 
+/* externalize from td->pcb */
 int
 fill_fpregs(struct thread *td, struct fpreg *fpregs)
 {
@@ -1411,6 +1417,7 @@
 	return (0);
 }
 
+/* internalize to td->pcb */
 int
 set_fpregs(struct thread *td, struct fpreg *fpregs)
 {



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