Module Name: src Committed By: matt Date: Wed Dec 5 19:05:47 UTC 2012
Modified Files: src/sys/arch/arm/arm: process_machdep.c sig_machdep.c src/sys/arch/arm/arm32: cpu.c cpuswitch.S vm_machdep.c src/sys/arch/arm/conf: files.arm src/sys/arch/arm/include: mcontext.h ptrace.h reg.h src/sys/arch/arm/vfp: vfp_init.c Removed Files: src/sys/arch/arm/fpe-arm: armfpe.S armfpe.h armfpe_glue.S armfpe_init.c Log Message: ARMFPE hasn't compiled since NetBSD 4. Remove it. Complete support for FPU_VFP. fpregs now contains vfpreg. XXX vfpreg only has space for 16 64-bit FP registers though VFPv3 and later have 32 64-bit FP registers. To generate a diff of this commit: cvs rdiff -u -r1.23 -r1.24 src/sys/arch/arm/arm/process_machdep.c cvs rdiff -u -r1.43 -r1.44 src/sys/arch/arm/arm/sig_machdep.c cvs rdiff -u -r1.90 -r1.91 src/sys/arch/arm/arm32/cpu.c cvs rdiff -u -r1.73 -r1.74 src/sys/arch/arm/arm32/cpuswitch.S cvs rdiff -u -r1.61 -r1.62 src/sys/arch/arm/arm32/vm_machdep.c cvs rdiff -u -r1.112 -r1.113 src/sys/arch/arm/conf/files.arm cvs rdiff -u -r1.1 -r0 src/sys/arch/arm/fpe-arm/armfpe.S cvs rdiff -u -r1.7 -r0 src/sys/arch/arm/fpe-arm/armfpe.h cvs rdiff -u -r1.4 -r0 src/sys/arch/arm/fpe-arm/armfpe_glue.S cvs rdiff -u -r1.18 -r0 src/sys/arch/arm/fpe-arm/armfpe_init.c cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/include/mcontext.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/include/ptrace.h cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/include/reg.h cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/vfp/vfp_init.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/arm/arm/process_machdep.c diff -u src/sys/arch/arm/arm/process_machdep.c:1.23 src/sys/arch/arm/arm/process_machdep.c:1.24 --- src/sys/arch/arm/arm/process_machdep.c:1.23 Thu Aug 16 16:41:53 2012 +++ src/sys/arch/arm/arm/process_machdep.c Wed Dec 5 19:05:46 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: process_machdep.c,v 1.23 2012/08/16 16:41:53 matt Exp $ */ +/* $NetBSD: process_machdep.c,v 1.24 2012/12/05 19:05:46 matt Exp $ */ /* * Copyright (c) 1993 The Regents of the University of California. @@ -133,7 +133,7 @@ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.23 2012/08/16 16:41:53 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.24 2012/12/05 19:05:46 matt Exp $"); #include <sys/proc.h> #include <sys/ptrace.h> @@ -145,10 +145,6 @@ __KERNEL_RCSID(0, "$NetBSD: process_mach #include <arm/armreg.h> -#ifdef ARMFPE -#include <arm/fpe-arm/armfpe.h> -#endif - int process_read_regs(struct lwp *l, struct reg *regs) { @@ -177,14 +173,15 @@ process_read_regs(struct lwp *l, struct int process_read_fpregs(struct lwp *l, struct fpreg *regs) { -#ifdef ARMFPE - arm_fpe_getcontext(p, regs); - return(0); -#else /* ARMFPE */ - /* No hardware FP support */ - memset(regs, 0, sizeof(struct fpreg)); +#ifdef FPU_VFP + if (curcpu()->ci_vfp_id == 0) { + return EINVAL; + } + const struct pcb * const pcb = lwp_getpcb(l); + vfp_savecontext(); + regs->fpr_vfp = pcb->pcb_vfp; +#endif return(0); -#endif /* ARMFPE */ } int @@ -222,13 +219,16 @@ process_write_regs(struct lwp *l, const int process_write_fpregs(struct lwp *l, const struct fpreg *regs) { -#ifdef ARMFPE - arm_fpe_setcontext(p, regs); - return(0); -#else /* ARMFPE */ - /* No hardware FP support */ +#ifdef FPU_VFP + if (curcpu()->ci_vfp_id == 0) { + return EINVAL; + } + struct pcb * const pcb = lwp_getpcb(l); + vfp_discardcontext(); + l->l_md.md_flags |= MDLWP_VFPUSED; + pcb->pcb_vfp = regs->fpr_vfp; +#endif return(0); -#endif /* ARMFPE */ } int Index: src/sys/arch/arm/arm/sig_machdep.c diff -u src/sys/arch/arm/arm/sig_machdep.c:1.43 src/sys/arch/arm/arm/sig_machdep.c:1.44 --- src/sys/arch/arm/arm/sig_machdep.c:1.43 Thu Aug 16 16:41:53 2012 +++ src/sys/arch/arm/arm/sig_machdep.c Wed Dec 5 19:05:46 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: sig_machdep.c,v 1.43 2012/08/16 16:41:53 matt Exp $ */ +/* $NetBSD: sig_machdep.c,v 1.44 2012/12/05 19:05:46 matt Exp $ */ /* * Copyright (c) 1994-1998 Mark Brinicombe. @@ -44,7 +44,7 @@ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: sig_machdep.c,v 1.43 2012/08/16 16:41:53 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sig_machdep.c,v 1.44 2012/12/05 19:05:46 matt Exp $"); #include <sys/mount.h> /* XXX only needed by syscallargs.h */ #include <sys/proc.h> @@ -191,10 +191,8 @@ cpu_getmcontext(struct lwp *l, mcontext_ *flags |= _UC_CPU; -#ifdef ARMFPE - /* Save Floating Point Register context. */ - arm_fpe_getcontext(p, (struct fpreg *)(void *)&mcp->fpregs); - *flags |= _UC_FPU; +#ifdef FPU_VFP + vfp_getcontext(l, mcp, flags); #endif mcp->_mc_tlsbase = (uintptr_t)l->l_private; @@ -220,6 +218,11 @@ cpu_setmcontext(struct lwp *l, const mco struct proc * const p = l->l_proc; int error; +#ifdef FPU_VFP + if ((flags & _UC_FPU) && curcpu()->ci_vfp_id == 0) + return EINVAL; +#endif + if ((flags & _UC_CPU) != 0) { /* Restore General Register context. */ error = cpu_mcontext_validate(l, mcp); @@ -245,10 +248,10 @@ cpu_setmcontext(struct lwp *l, const mco tf->tf_spsr = gr[_REG_CPSR]; } -#ifdef ARMFPE +#ifdef FPU_VFP if ((flags & _UC_FPU) != 0) { /* Restore Floating Point Register context. */ - arm_fpe_setcontext(p, (struct fpreg *)(void *)&mcp->__fpregs); + vfp_setcontext(l, mcp); } #endif Index: src/sys/arch/arm/arm32/cpu.c diff -u src/sys/arch/arm/arm32/cpu.c:1.90 src/sys/arch/arm/arm32/cpu.c:1.91 --- src/sys/arch/arm/arm32/cpu.c:1.90 Fri Nov 30 08:15:45 2012 +++ src/sys/arch/arm/arm32/cpu.c Wed Dec 5 19:05:45 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.c,v 1.90 2012/11/30 08:15:45 msaitoh Exp $ */ +/* $NetBSD: cpu.c,v 1.91 2012/12/05 19:05:45 matt Exp $ */ /* * Copyright (c) 1995 Mark Brinicombe. @@ -46,7 +46,7 @@ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.90 2012/11/30 08:15:45 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.91 2012/12/05 19:05:45 matt Exp $"); #include <sys/systm.h> #include <sys/conf.h> @@ -60,11 +60,6 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.90 #include <arm/cpuconf.h> #include <arm/undefined.h> -#ifdef ARMFPE -#include <machine/bootconfig.h> /* For boot args */ -#include <arm/fpe-arm/armfpe.h> -#endif - char cpu_model[256]; #ifdef MULTIPROCESSOR @@ -209,39 +204,6 @@ cpu_attach(device_t dv, cpuid_t id) } #endif -#ifdef ARMFPE - /* - * Ok now we test for an FPA - * At this point no floating point emulator has been installed. - * This means any FP instruction will cause undefined exception. - * We install a temporay coproc 1 handler which will modify - * undefined_test if it is called. - * We then try to read the FP status register. If undefined_test - * has been decremented then the instruction was not handled by - * an FPA so we know the FPA is missing. If undefined_test is - * still 1 then we know the instruction was handled by an FPA. - * We then remove our test handler and look at the - * FP status register for identification. - */ - - /* - * Ok if ARMFPE is defined and the boot options request the - * ARM FPE then it will be installed as the FPE. - * This is just while I work on integrating the new FPE. - * It means the new FPE gets installed if compiled int (ARMFPE - * defined) and also gives me a on/off option when I boot in - * case the new FPE is causing panics. - */ - - - int usearmfpe = 1; - if (boot_args) - get_bootconf_option(boot_args, "armfpe", - BOOTOPT_TYPE_BOOLEAN, &usearmfpe); - if (usearmfpe) - initialise_arm_fpe(); -#endif - vfp_attach(); /* XXX SMP */ } Index: src/sys/arch/arm/arm32/cpuswitch.S diff -u src/sys/arch/arm/arm32/cpuswitch.S:1.73 src/sys/arch/arm/arm32/cpuswitch.S:1.74 --- src/sys/arch/arm/arm32/cpuswitch.S:1.73 Thu Nov 8 08:22:56 2012 +++ src/sys/arch/arm/arm32/cpuswitch.S Wed Dec 5 19:05:45 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuswitch.S,v 1.73 2012/11/08 08:22:56 skrll Exp $ */ +/* $NetBSD: cpuswitch.S,v 1.74 2012/12/05 19:05:45 matt Exp $ */ /* * Copyright 2003 Wasabi Systems, Inc. @@ -89,7 +89,7 @@ #include <machine/asm.h> #include <machine/cpu.h> - RCSID("$NetBSD: cpuswitch.S,v 1.73 2012/11/08 08:22:56 skrll Exp $") + RCSID("$NetBSD: cpuswitch.S,v 1.74 2012/12/05 19:05:45 matt Exp $") /* LINTSTUB: include <sys/param.h> */ @@ -277,17 +277,6 @@ ENTRY(cpu_switchto) /* rem: r6 = new lwp */ /* rem: r7 = new pcb */ -#ifdef ARMFPE - add r0, r7, #(PCB_SIZE) & 0x00ff - add r0, r0, #(PCB_SIZE) & 0xff00 - bl _C_LABEL(arm_fpe_core_changecontext) -#endif - - /* rem: r4 = old lwp */ - /* rem: r5 = new lwp's proc */ - /* rem: r6 = new lwp */ - /* rem: r7 = new PCB */ - /* * Check for restartable atomic sequences (RAS). */ Index: src/sys/arch/arm/arm32/vm_machdep.c diff -u src/sys/arch/arm/arm32/vm_machdep.c:1.61 src/sys/arch/arm/arm32/vm_machdep.c:1.62 --- src/sys/arch/arm/arm32/vm_machdep.c:1.61 Tue Oct 23 22:50:00 2012 +++ src/sys/arch/arm/arm32/vm_machdep.c Wed Dec 5 19:05:45 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_machdep.c,v 1.61 2012/10/23 22:50:00 matt Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.62 2012/12/05 19:05:45 matt Exp $ */ /* * Copyright (c) 1994-1998 Mark Brinicombe. @@ -44,7 +44,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.61 2012/10/23 22:50:00 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_machdep.c,v 1.62 2012/12/05 19:05:45 matt Exp $"); #include "opt_armfpe.h" #include "opt_pmap_debug.h" @@ -69,10 +69,6 @@ __KERNEL_RCSID(0, "$NetBSD: vm_machdep.c #include <machine/reg.h> #include <machine/vmparam.h> -#ifdef ARMFPE -#include <arm/fpe-arm/armfpe.h> -#endif - extern pv_addr_t systempage; int process_read_regs(struct proc *p, struct reg *regs); @@ -164,12 +160,6 @@ cpu_lwp_fork(struct lwp *l1, struct lwp } #endif /* PMAP_DEBUG */ -#ifdef ARMFPE - /* Initialise a new FP context for p2 and copy the context from p1 */ - arm_fpe_core_initcontext(FP_CONTEXT(l2)); - arm_fpe_copycontext(FP_CONTEXT(l1), FP_CONTEXT(l2)); -#endif /* ARMFPE */ - struct trapframe *tf = (struct trapframe *)pcb2->pcb_sp - 1; lwp_settrapframe(l2, tf); *tf = *lwp_trapframe(l1); @@ -201,23 +191,16 @@ cpu_lwp_fork(struct lwp *l1, struct lwp void cpu_lwp_free(struct lwp *l, int proc) { -#ifdef ARMFPE - /* Abort any active FP operation and deactivate the context */ - arm_fpe_core_abort(FP_CONTEXT(l), NULL, NULL); - arm_fpe_core_changecontext(0); -#endif /* ARMFPE */ - #ifdef STACKCHECKS /* Report how much stack has been used - debugging */ - if (l) { - u_char *ptr; - int loop; - - ptr = (u_char *)pcb + USPACE_SVC_STACK_BOTTOM; - for (loop = 0; loop < (USPACE_SVC_STACK_TOP - USPACE_SVC_STACK_BOTTOM) - && *ptr == 0xdd; ++loop, ++ptr) ; - log(LOG_INFO, "%d bytes of svc stack fill pattern\n", loop); - } + struct pcb * const pcb = lwp_getpcb(l); + u_char *ptr; + u_int loop; + + ptr = (u_char *)pcb + USPACE_SVC_STACK_BOTTOM; + for (loop = 0; loop < (USPACE_SVC_STACK_TOP - USPACE_SVC_STACK_BOTTOM) + && *ptr == 0xdd; ++loop, ++ptr) ; + log(LOG_INFO, "%u bytes of svc stack fill pattern\n", loop); #endif /* STACKCHECKS */ } Index: src/sys/arch/arm/conf/files.arm diff -u src/sys/arch/arm/conf/files.arm:1.112 src/sys/arch/arm/conf/files.arm:1.113 --- src/sys/arch/arm/conf/files.arm:1.112 Wed Oct 17 18:52:16 2012 +++ src/sys/arch/arm/conf/files.arm Wed Dec 5 19:05:47 2012 @@ -1,4 +1,4 @@ -# $NetBSD: files.arm,v 1.112 2012/10/17 18:52:16 matt Exp $ +# $NetBSD: files.arm,v 1.113 2012/12/05 19:05:47 matt Exp $ # temporary define to allow easy moving to ../arch/arm/arm32 defflag ARM32 @@ -48,10 +48,7 @@ defflag opt_arm_debug.h ARM_LOCK_CAS_DE defflag opt_arm_bus_space.h __BUS_SPACE_HAS_STREAM_METHODS _ARM32_NEED_BUS_DMA_BOUNCE # Floating point emulator -defflag ARMFPE -file arch/arm/fpe-arm/armfpe_glue.S armfpe -file arch/arm/fpe-arm/armfpe_init.c armfpe -file arch/arm/fpe-arm/armfpe.S armfpe +obsolete defflag ARMFPE # VFP support file arch/arm/vfp/vfp_init.c arm32 Index: src/sys/arch/arm/include/mcontext.h diff -u src/sys/arch/arm/include/mcontext.h:1.11 src/sys/arch/arm/include/mcontext.h:1.12 --- src/sys/arch/arm/include/mcontext.h:1.11 Fri Aug 3 07:59:23 2012 +++ src/sys/arch/arm/include/mcontext.h Wed Dec 5 19:05:46 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: mcontext.h,v 1.11 2012/08/03 07:59:23 matt Exp $ */ +/* $NetBSD: mcontext.h,v 1.12 2012/12/05 19:05:46 matt Exp $ */ /*- * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. @@ -126,4 +126,9 @@ __lwp_getprivate_fast(void) return _lwp_getprivate(); } +#if defined(_KERNEL) +void vfp_getcontext(struct lwp *, mcontext_t *, int *); +void vfp_setcontext(struct lwp *, const mcontext_t *); +#endif + #endif /* !_ARM_MCONTEXT_H_ */ Index: src/sys/arch/arm/include/ptrace.h diff -u src/sys/arch/arm/include/ptrace.h:1.5 src/sys/arch/arm/include/ptrace.h:1.6 --- src/sys/arch/arm/include/ptrace.h:1.5 Fri Jan 25 11:59:20 2008 +++ src/sys/arch/arm/include/ptrace.h Wed Dec 5 19:05:46 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ptrace.h,v 1.5 2008/01/25 11:59:20 skrll Exp $ */ +/* $NetBSD: ptrace.h,v 1.6 2012/12/05 19:05:46 matt Exp $ */ /* * Copyright (c) 1995 Frank Lancaster @@ -39,12 +39,15 @@ #endif #define PT_GETREGS (PT_FIRSTMACH + 1) #define PT_SETREGS (PT_FIRSTMACH + 2) -#define PT_GETFPREGS (PT_FIRSTMACH + 3) -#define PT_SETFPREGS (PT_FIRSTMACH + 4) +/* 3 and 4 are for FPE registers */ +#define PT_GETFPREGS (PT_FIRSTMACH + 5) +#define PT_SETFPREGS (PT_FIRSTMACH + 6) #define PT_MACHDEP_STRINGS \ "(unused)", \ "PT_GETREGS", \ "PT_SETREGS", \ + "old PT_GETFPREGS", \ + "old PT_SETFPREGS", \ "PT_GETFPREGS", \ "PT_SETFPREGS", Index: src/sys/arch/arm/include/reg.h diff -u src/sys/arch/arm/include/reg.h:1.2 src/sys/arch/arm/include/reg.h:1.3 --- src/sys/arch/arm/include/reg.h:1.2 Sat Mar 15 10:16:43 2008 +++ src/sys/arch/arm/include/reg.h Wed Dec 5 19:05:46 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: reg.h,v 1.2 2008/03/15 10:16:43 rearnsha Exp $ */ +/* $NetBSD: reg.h,v 1.3 2012/12/05 19:05:46 matt Exp $ */ /* * Copyright (C) 1994, 1995 Frank Lancaster @@ -46,11 +46,6 @@ struct reg { unsigned int r_cpsr; }; -struct fpreg { - unsigned int fpr_fpsr; - fp_reg_t fpr[8]; -}; - struct vfpreg { uint32_t vfp_fpexc; uint32_t vfp_fpscr; @@ -59,4 +54,9 @@ struct vfpreg { uint32_t vfp_regs[33]; /* In case we need fstmx format. */ }; +struct fpreg { + struct vfpreg fpr_vfp; +}; + + #endif /* !_ARM32_REG_H_ */ Index: src/sys/arch/arm/vfp/vfp_init.c diff -u src/sys/arch/arm/vfp/vfp_init.c:1.7 src/sys/arch/arm/vfp/vfp_init.c:1.8 --- src/sys/arch/arm/vfp/vfp_init.c:1.7 Sat Sep 22 19:45:54 2012 +++ src/sys/arch/arm/vfp/vfp_init.c Wed Dec 5 19:05:46 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: vfp_init.c,v 1.7 2012/09/22 19:45:54 matt Exp $ */ +/* $NetBSD: vfp_init.c,v 1.8 2012/12/05 19:05:46 matt Exp $ */ /* * Copyright (c) 2008 ARM Ltd @@ -39,6 +39,7 @@ #include <arm/pcb.h> #include <arm/undefined.h> #include <arm/vfpreg.h> +#include <arm/mcontext.h> /* * Use generic co-processor instructions to avoid assembly problems. @@ -365,6 +366,10 @@ vfp_state_load(lwp_t *l, bool used) switch (ci->ci_vfp_id) { case FPU_VFP10_ARM10E: case FPU_VFP11_ARM11: + case FPU_VFP_CORTEXA5: + case FPU_VFP_CORTEXA7: + case FPU_VFP_CORTEXA8: + case FPU_VFP_CORTEXA9: write_fpinst2(fregs->vfp_fpinst2); write_fpinst(fregs->vfp_fpinst); break; @@ -407,6 +412,10 @@ vfp_state_save(lwp_t *l) switch (ci->ci_vfp_id) { case FPU_VFP10_ARM10E: case FPU_VFP11_ARM11: + case FPU_VFP_CORTEXA5: + case FPU_VFP_CORTEXA7: + case FPU_VFP_CORTEXA8: + case FPU_VFP_CORTEXA9: fregs->vfp_fpinst = read_fpinst(); fregs->vfp_fpinst2 = read_fpinst2(); break; @@ -456,4 +465,28 @@ vfp_discardcontext(void) pcu_discard(&arm_vfp_ops); } +void +vfp_getcontext(struct lwp *l, mcontext_t *mcp, int *flagsp) +{ + if (l->l_md.md_flags & MDLWP_VFPUSED) { + const struct pcb * const pcb = lwp_getpcb(l); + pcu_save(&arm_vfp_ops); + mcp->__fpu.__vfpregs.__vfp_fpscr = pcb->pcb_vfp.vfp_fpscr; + memcpy(mcp->__fpu.__vfpregs.__vfp_fstmx, pcb->pcb_vfp.vfp_regs, + sizeof(mcp->__fpu.__vfpregs.__vfp_fstmx)); + *flagsp |= _UC_FPU; + } +} + +void +vfp_setcontext(struct lwp *l, const mcontext_t *mcp) +{ + pcu_discard(&arm_vfp_ops); + struct pcb * const pcb = lwp_getpcb(l); + l->l_md.md_flags |= MDLWP_VFPUSED; + pcb->pcb_vfp.vfp_fpscr = mcp->__fpu.__vfpregs.__vfp_fpscr; + memcpy(pcb->pcb_vfp.vfp_regs, mcp->__fpu.__vfpregs.__vfp_fstmx, + sizeof(mcp->__fpu.__vfpregs.__vfp_fstmx)); +} + #endif /* FPU_VFP */