Module Name:    src
Committed By:   thorpej
Date:           Sun Apr  7 05:25:56 UTC 2019

Modified Files:
        src/sys/arch/powerpc/booke: booke_machdep.c copyin.c copyout.c
        src/sys/arch/powerpc/ibm4xx: trap.c
        src/sys/arch/powerpc/include: types.h
        src/sys/arch/powerpc/include/booke: cpuvar.h
        src/sys/arch/powerpc/powerpc: trap.c

Log Message:
Detangle some of the PowerPC CPU configuration spaghetti.


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/powerpc/booke/booke_machdep.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/powerpc/booke/copyin.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/powerpc/booke/copyout.c
cvs rdiff -u -r1.69 -r1.70 src/sys/arch/powerpc/ibm4xx/trap.c
cvs rdiff -u -r1.58 -r1.59 src/sys/arch/powerpc/include/types.h
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/powerpc/include/booke/cpuvar.h
cvs rdiff -u -r1.155 -r1.156 src/sys/arch/powerpc/powerpc/trap.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/powerpc/booke/booke_machdep.c
diff -u src/sys/arch/powerpc/booke/booke_machdep.c:1.25 src/sys/arch/powerpc/booke/booke_machdep.c:1.26
--- src/sys/arch/powerpc/booke/booke_machdep.c:1.25	Tue Dec  6 07:34:22 2016
+++ src/sys/arch/powerpc/booke/booke_machdep.c	Sun Apr  7 05:25:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: booke_machdep.c,v 1.25 2016/12/06 07:34:22 rin Exp $	*/
+/*	$NetBSD: booke_machdep.c,v 1.26 2019/04/07 05:25:55 thorpej Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -38,7 +38,7 @@
 #define	_POWERPC_BUS_DMA_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: booke_machdep.c,v 1.25 2016/12/06 07:34:22 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: booke_machdep.c,v 1.26 2019/04/07 05:25:55 thorpej Exp $");
 
 #include "opt_modular.h"
 
@@ -566,8 +566,12 @@ cpu_write_1(bus_addr_t a, uint8_t v)
 void
 booke_sstep(struct trapframe *tf)
 {
+	uint32_t insn;
+
 	KASSERT(tf->tf_srr1 & PSL_DE);
-	const uint32_t insn = ufetch_32((const void *)tf->tf_srr0);
+	if (ufetch_32((const void *)tf->tf_srr0, &insn) != 0)
+		return;
+
 	register_t dbcr0 = DBCR0_IAC1 | DBCR0_IDM;
 	register_t dbcr1 = DBCR1_IAC1US_USER | DBCR1_IAC1ER_DS1;
 	if ((insn >> 28) == 4) {

Index: src/sys/arch/powerpc/booke/copyin.c
diff -u src/sys/arch/powerpc/booke/copyin.c:1.6 src/sys/arch/powerpc/booke/copyin.c:1.7
--- src/sys/arch/powerpc/booke/copyin.c:1.6	Thu Jul 24 23:27:25 2014
+++ src/sys/arch/powerpc/booke/copyin.c	Sun Apr  7 05:25:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: copyin.c,v 1.6 2014/07/24 23:27:25 joerg Exp $	*/
+/*	$NetBSD: copyin.c,v 1.7 2019/04/07 05:25:55 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
@@ -36,10 +36,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: copyin.c,v 1.6 2014/07/24 23:27:25 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copyin.c,v 1.7 2019/04/07 05:25:55 thorpej Exp $");
+
+#define	__UFETCHSTORE_PRIVATE
 
 #include <sys/param.h>
 #include <sys/lwp.h>
+#include <sys/systm.h>
 
 #include <powerpc/pcb.h>
 
@@ -60,7 +63,6 @@ copyin_byte(const uint8_t * const usaddr
 	return data;
 }
 
-#if 0
 static inline uint16_t
 copyin_halfword(const uint16_t * const usaddr16, register_t ds_msr)
 {
@@ -75,7 +77,6 @@ copyin_halfword(const uint16_t * const u
 	    : [ds_msr] "r" (ds_msr), [usaddr16] "b" (usaddr16));
 	return data;
 }
-#endif
 
 static inline uint32_t
 copyin_word(const uint32_t * const usaddr32, register_t ds_msr)
@@ -199,22 +200,58 @@ copyin_words(vaddr_t usaddr, vaddr_t kda
 	}
 }
 
-uint32_t
-ufetch_32(const void *vusaddr)
+int
+_ufetch_8(const uint8_t *vusaddr, uint8_t *valp)
+{
+	struct pcb * const pcb = lwp_getpcb(curlwp);
+	struct faultbuf env;
+
+	if (setfault(&env) != 0) {
+		pcb->pcb_onfault = NULL;
+		return EFAULT;
+	}
+
+	*valp = copyin_byte(vusaddr, mfmsr() | PSL_DS);
+
+	pcb->pcb_onfault = NULL;
+
+	return 0;
+}
+
+int
+_ufetch_16(const uint16_t *vusaddr, uint16_t *valp)
 {
 	struct pcb * const pcb = lwp_getpcb(curlwp);
 	struct faultbuf env;
 
 	if (setfault(&env) != 0) {
 		pcb->pcb_onfault = NULL;
-		return -1;
+		return EFAULT;
 	}
 
-	uint32_t rv = copyin_word(vusaddr, mfmsr() | PSL_DS);
+	*valp = copyin_halfword(vusaddr, mfmsr() | PSL_DS);
 
 	pcb->pcb_onfault = NULL;
 
-	return rv;
+	return 0;
+}
+
+int
+_ufetch_32(const uint32_t *vusaddr, uint32_t *valp)
+{
+	struct pcb * const pcb = lwp_getpcb(curlwp);
+	struct faultbuf env;
+
+	if (setfault(&env) != 0) {
+		pcb->pcb_onfault = NULL;
+		return EFAULT;
+	}
+
+	*valp = copyin_word(vusaddr, mfmsr() | PSL_DS);
+
+	pcb->pcb_onfault = NULL;
+
+	return 0;
 }
 
 int

Index: src/sys/arch/powerpc/booke/copyout.c
diff -u src/sys/arch/powerpc/booke/copyout.c:1.4 src/sys/arch/powerpc/booke/copyout.c:1.5
--- src/sys/arch/powerpc/booke/copyout.c:1.4	Thu Jul 24 23:29:02 2014
+++ src/sys/arch/powerpc/booke/copyout.c	Sun Apr  7 05:25:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: copyout.c,v 1.4 2014/07/24 23:29:02 joerg Exp $	*/
+/*	$NetBSD: copyout.c,v 1.5 2019/04/07 05:25:55 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
@@ -36,10 +36,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: copyout.c,v 1.4 2014/07/24 23:29:02 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: copyout.c,v 1.5 2019/04/07 05:25:55 thorpej Exp $");
+
+#define	__UFETCHSTORE_PRIVATE
 
 #include <sys/param.h>
 #include <sys/lwp.h>
+#include <sys/systm.h>
 
 #include <powerpc/pcb.h>
 
@@ -58,20 +61,18 @@ copyout_uint8(uint8_t *udaddr, uint8_t d
 	    : [ds_msr] "r" (ds_msr), [data] "r" (data), [udaddr] "b" (udaddr));
 }
 
-#if 0
 static inline void
-copyout_uint16(uint8_t *udaddr, uint8_t data, register_t ds_msr)
+copyout_uint16(uint16_t *udaddr, uint8_t data, register_t ds_msr)
 {
 	register_t msr;
 	__asm volatile(
 		"mfmsr	%[msr]"				/* Save MSR */
 	"\n\t"	"mtmsr	%[ds_msr]; sync; isync"		/* DS on */
-	"\n\t"	"stb	%[data],0(%[udaddr])"		/* store user byte */
+	"\n\t"	"sth	%[data],0(%[udaddr])"		/* store user half */
 	"\n\t"	"mtmsr	%[msr]; sync; isync"		/* DS off */
 	    : [msr] "=&r" (msr)
 	    : [ds_msr] "r" (ds_msr), [data] "r" (data), [udaddr] "b" (udaddr));
 }
-#endif
 
 static inline void
 copyout_uint32(uint32_t * const udaddr, uint32_t data, register_t ds_msr)
@@ -298,6 +299,60 @@ copyout_uint32s(vaddr_t ksaddr, vaddr_t 
 }
 
 int
+_ustore_8(uint8_t *vusaddr, uint8_t val)
+{
+	struct pcb * const pcb = lwp_getpcb(curlwp);
+	struct faultbuf env;
+
+	if (setfault(&env) != 0) {
+		pcb->pcb_onfault = NULL;
+		return EFAULT;
+	}
+
+	copyout_uint8(vusaddr, val, mfmsr() | PSL_DS);
+
+	pcb->pcb_onfault = NULL;
+
+	return 0;
+}
+
+int
+_ustore_16(uint16_t *vusaddr, uint16_t val)
+{
+	struct pcb * const pcb = lwp_getpcb(curlwp);
+	struct faultbuf env;
+
+	if (setfault(&env) != 0) {
+		pcb->pcb_onfault = NULL;
+		return EFAULT;
+	}
+
+	copyout_uint16(vusaddr, val, mfmsr() | PSL_DS);
+
+	pcb->pcb_onfault = NULL;
+
+	return 0;
+}
+
+int
+_ustore_32(uint32_t *vusaddr, uint32_t val)
+{
+	struct pcb * const pcb = lwp_getpcb(curlwp);
+	struct faultbuf env;
+
+	if (setfault(&env) != 0) {
+		pcb->pcb_onfault = NULL;
+		return EFAULT;
+	}
+
+	copyout_uint32(vusaddr, val, mfmsr() | PSL_DS);
+
+	pcb->pcb_onfault = NULL;
+
+	return 0;
+}
+
+int
 copyout(const void *vksaddr, void *vudaddr, size_t len)
 {
 	struct pcb * const pcb = lwp_getpcb(curlwp);

Index: src/sys/arch/powerpc/ibm4xx/trap.c
diff -u src/sys/arch/powerpc/ibm4xx/trap.c:1.69 src/sys/arch/powerpc/ibm4xx/trap.c:1.70
--- src/sys/arch/powerpc/ibm4xx/trap.c:1.69	Mon Dec 26 21:54:00 2016
+++ src/sys/arch/powerpc/ibm4xx/trap.c	Sun Apr  7 05:25:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.69 2016/12/26 21:54:00 rin Exp $	*/
+/*	$NetBSD: trap.c,v 1.70 2019/04/07 05:25:55 thorpej Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -67,12 +67,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.69 2016/12/26 21:54:00 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.70 2019/04/07 05:25:55 thorpej Exp $");
 
 #include "opt_altivec.h"
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
 
+#define	__UFETCHSTORE_PRIVATE
+
 #include <sys/param.h>
 #include <sys/proc.h>
 #include <sys/reboot.h>
@@ -677,3 +679,30 @@ fix_unaligned(struct lwp *l, struct trap
 
 	return -1;
 }
+
+/*
+ * XXX Extremely lame implementations of _ufetch_* / _ustore_*.  IBM 4xx
+ * experts should make versions that are good.
+ */
+
+#define UFETCH(sz)							\
+int									\
+_ufetch_ ## sz(const uint ## sz ## _t *uaddr, uint ## sz ## _t *valp)	\
+{									\
+	return copyin(uaddr, valp, sizeof(*valp));			\
+}
+
+UFETCH(8)
+UFETCH(16)
+UFETCH(32)
+
+#define USTORE(sz)							\
+int									\
+_ustore_ ## sz(uint ## sz ## _t *uaddr, uint ## sz ## _t val)		\
+{									\
+	return copyout(&val, uaddr, sizeof(val));			\
+}
+
+USTORE(8)
+USTORE(16)
+USTORE(32)

Index: src/sys/arch/powerpc/include/types.h
diff -u src/sys/arch/powerpc/include/types.h:1.58 src/sys/arch/powerpc/include/types.h:1.59
--- src/sys/arch/powerpc/include/types.h:1.58	Sat Apr  6 03:06:27 2019
+++ src/sys/arch/powerpc/include/types.h	Sun Apr  7 05:25:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: types.h,v 1.58 2019/04/06 03:06:27 thorpej Exp $	*/
+/*	$NetBSD: types.h,v 1.59 2019/04/07 05:25:55 thorpej Exp $	*/
 
 /*-
  * Copyright (C) 1995 Wolfgang Solfrank.
@@ -98,7 +98,9 @@ int __openfirmio_open_check_broken(void)
 
 #define	__HAVE_MM_MD_DIRECT_MAPPED_PHYS
 #define	__HAVE_MM_MD_KERNACC
+#if 0	/* XXX CPU configuration spaghetti */
 #define	__HAVE_UCAS_FULL
+#endif
 #if defined(_KERNEL)
 #define	__HAVE_RAS
 #endif

Index: src/sys/arch/powerpc/include/booke/cpuvar.h
diff -u src/sys/arch/powerpc/include/booke/cpuvar.h:1.19 src/sys/arch/powerpc/include/booke/cpuvar.h:1.20
--- src/sys/arch/powerpc/include/booke/cpuvar.h:1.19	Thu Apr 19 21:50:07 2018
+++ src/sys/arch/powerpc/include/booke/cpuvar.h	Sun Apr  7 05:25:55 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpuvar.h,v 1.19 2018/04/19 21:50:07 christos Exp $	*/
+/*	$NetBSD: cpuvar.h,v 1.20 2019/04/07 05:25:55 thorpej Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -154,8 +154,6 @@ wrtee(register_t msr)
 	return old_msr;
 }
 
-uint32_t ufetch_32(const void *);
-
 struct trapframe;
 void	booke_sstep(struct trapframe *);
 

Index: src/sys/arch/powerpc/powerpc/trap.c
diff -u src/sys/arch/powerpc/powerpc/trap.c:1.155 src/sys/arch/powerpc/powerpc/trap.c:1.156
--- src/sys/arch/powerpc/powerpc/trap.c:1.155	Sat Apr  6 03:06:27 2019
+++ src/sys/arch/powerpc/powerpc/trap.c	Sun Apr  7 05:25:56 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.155 2019/04/06 03:06:27 thorpej Exp $	*/
+/*	$NetBSD: trap.c,v 1.156 2019/04/07 05:25:56 thorpej Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.155 2019/04/06 03:06:27 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.156 2019/04/07 05:25:56 thorpej Exp $");
 
 #include "opt_altivec.h"
 #include "opt_ddb.h"
@@ -682,6 +682,7 @@ kcopy(const void *src, void *dst, size_t
 	return rv;
 }
 
+#if 0 /* XXX CPU configuration spaghetti */
 int
 _ucas_32(volatile uint32_t *uptr, uint32_t old, uint32_t new, uint32_t *ret)
 {
@@ -704,6 +705,7 @@ out:
 	curpcb->pcb_onfault = 0;
 	return rv;
 }
+#endif
 
 int
 badaddr(void *addr, size_t size)

Reply via email to