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)