Module Name:    src
Committed By:   christos
Date:           Fri Dec 30 18:30:19 UTC 2016

Modified Files:
        src/sys/arch/sparc64/include: reg.h
        src/sys/arch/sparc64/sparc64: process_machdep.c

Log Message:
- make fpreg{32,64} actually members of fsstate{32,64}.
- allocate fpstate if we did not have one and we need to write it.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/sparc64/include/reg.h
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/sparc64/sparc64/process_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/sparc64/include/reg.h
diff -u src/sys/arch/sparc64/include/reg.h:1.14 src/sys/arch/sparc64/include/reg.h:1.15
--- src/sys/arch/sparc64/include/reg.h:1.14	Tue Jul 12 03:51:34 2011
+++ src/sys/arch/sparc64/include/reg.h	Fri Dec 30 13:30:19 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: reg.h,v 1.14 2011/07/12 07:51:34 mrg Exp $ */
+/*	$NetBSD: reg.h,v 1.15 2016/12/30 18:30:19 christos Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -178,24 +178,6 @@ struct fp_qentry {
 	int	fq_instr;		/* the instruction itself */
 };
 
-struct fpstate64 {
-	u_int	fs_regs[64];		/* our view is 64 32-bit registers */
-	int64_t	fs_fsr;			/* %fsr */
-	int	fs_gsr;			/* graphics state reg */
-	int	fs_qsize;		/* actual queue depth */
-	struct	fp_qentry fs_queue[FP_QSIZE];	/* queue contents */
-};
-
-/* 
- * For 32-bit emulations.
- */
-struct fpstate32 {
-	u_int	fs_regs[32];		/* our view is 32 32-bit registers */
-	int	fs_fsr;			/* %fsr */
-	int	fs_qsize;		/* actual queue depth */
-	struct	fp_qentry fs_queue[FP_QSIZE];	/* queue contents */
-};
-
 /*
  * The actual FP registers are made accessible (c.f. ptrace(2)) through
  * a `struct fpreg'; <arch/sparc64/sparc64/process_machdep.c> relies on the
@@ -207,6 +189,15 @@ struct fpreg64 {
 	int	fr_gsr;			/* graphics state reg */
 };
 
+struct fpstate64 {
+	struct fpreg64 fs_reg;
+#define fs_regs fs_reg.fr_regs
+#define fs_fsr fs_reg.fr_fsr
+#define fs_gsr fs_reg.fr_gsr
+	int	fs_qsize;		/* actual queue depth */
+	struct	fp_qentry fs_queue[FP_QSIZE];	/* queue contents */
+};
+
 /*
  * 32-bit fpreg used by 32-bit sparc CPUs
  */
@@ -215,6 +206,15 @@ struct fpreg32 {
 	int	fr_fsr;			/* %fsr */
 };
 
+/* 
+ * For 32-bit emulations.
+ */
+struct fpstate32 {
+	struct fpreg32 fs_reg;
+	int	fs_qsize;		/* actual queue depth */
+	struct	fp_qentry fs_queue[FP_QSIZE];	/* queue contents */
+};
+
 #if defined(__arch64__)
 /* Here we gotta do naughty things to let gdb work on 32-bit binaries */
 #define reg		reg64

Index: src/sys/arch/sparc64/sparc64/process_machdep.c
diff -u src/sys/arch/sparc64/sparc64/process_machdep.c:1.24 src/sys/arch/sparc64/sparc64/process_machdep.c:1.25
--- src/sys/arch/sparc64/sparc64/process_machdep.c:1.24	Fri Jan  3 19:10:03 2014
+++ src/sys/arch/sparc64/sparc64/process_machdep.c	Fri Dec 30 13:30:19 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.24 2014/01/04 00:10:03 dsl Exp $ */
+/*	$NetBSD: process_machdep.c,v 1.25 2016/12/30 18:30:19 christos Exp $ */
 
 /*
  * Copyright (c) 1993 The Regents of the University of California.
@@ -95,7 +95,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.24 2014/01/04 00:10:03 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.25 2016/12/30 18:30:19 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -198,28 +198,29 @@ process_set_pc(struct lwp *l, void *addr
 	return (0);
 }
 
+extern const struct fpstate64 initfpstate;
+
 int
 process_read_fpregs(struct lwp *l, struct fpreg *regs, size_t *sz)
 {
-	extern const struct fpstate64 initfpstate;
-	const struct fpstate64	*statep = &initfpstate;
-	struct fpreg32		*regp = (struct fpreg32 *)regs;
-	int i;
+	const struct fpstate64 *fs;
 
-	if (l->l_md.md_fpstate)
-		statep = l->l_md.md_fpstate;
+	if ((fs = l->l_md.md_fpstate) == NULL)
+		fs = &initfpstate;
 #ifdef __arch64__
 	if (!(curproc->p_flag & PK_32)) {
 		/* 64-bit mode -- copy out fregs */
-		/* NOTE: struct fpreg == struct fpstate */
-		memcpy(regs, statep, sizeof(struct fpreg64));
+		*regs = fs->fs_reg;
 		return 0;
 	}
 #endif
+
+	struct fpreg32 *regp = (struct fpreg32 *)regs;
+
 	/* 32-bit mode -- copy out & convert 32-bit fregs */
-	for (i = 0; i < 32; i++)
-		regp->fr_regs[i] = statep->fs_regs[i];
-	regp->fr_fsr = statep->fs_fsr;
+	for (size_t i = 0; i < __arraycount(regp->fr_regs); i++)
+		regp->fr_regs[i] = fs->fs_regs[i];
+	regp->fr_fsr = fs->fs_fsr;
 
 	return 0;
 }
@@ -227,28 +228,27 @@ process_read_fpregs(struct lwp *l, struc
 int
 process_write_fpregs(struct lwp *l, const struct fpreg *regs, size_t sz)
 {
-	struct fpstate64	*statep;
-	const struct fpreg32	*regp = (const struct fpreg32 *)regs;
-	int i;
+	struct fpstate64	*fs;
 
-	statep = l->l_md.md_fpstate;
-	if (statep == NULL)
-		return EINVAL;
+	if ((fs = l->l_md.md_fpstate) == NULL) {
+		fs = kmem_zalloc(sizeof(*fs), KM_SLEEP);
+		l->l_md.md_fpstate = fs;
+	} else
+		fs->fs_qsize = 0;
 
 #ifdef __arch64__
 	if (!(curproc->p_flag & PK_32)) {
 		/* 64-bit mode -- copy in fregs */
-		/* NOTE: struct fpreg == struct fpstate */
-		memcpy(statep, regs, sizeof(struct fpreg64));
-		statep->fs_qsize = 0;
+		fs->fs_reg = *regs;
 		return 0;
 	}
 #endif
+	const struct fpreg32 *regp = (const struct fpreg32 *)regs;
+
 	/* 32-bit mode -- copy in & convert 32-bit fregs */
-	for (i = 0; i < 32; i++)
-		statep->fs_regs[i] = regp->fr_regs[i];
-	statep->fs_fsr = regp->fr_fsr;
-	statep->fs_qsize = 0;
+	for (size_t i = 0; i < __arraycount(regp->fr_regs); i++)
+		fs->fs_regs[i] = regp->fr_regs[i];
+	fs->fs_fsr = regp->fr_fsr;
 
 	return 0;
 }

Reply via email to