Module Name: src Committed By: joerg Date: Tue Oct 29 16:18:23 UTC 2019
Modified Files: src/sys/arch/arm/arm32: cpuswitch.S src/sys/arch/arm/include: armreg.h src/sys/arch/arm/vfp: vfp_init.c Log Message: Explicitly annotate FPU requirements for LLVM MC. When using GCC, this annotations change the global state, but there is no push/pop functionality for .fpu to avoid this problem. The state is local to each inline assembler block with LLVM MC. To generate a diff of this commit: cvs rdiff -u -r1.94 -r1.95 src/sys/arch/arm/arm32/cpuswitch.S cvs rdiff -u -r1.128 -r1.129 src/sys/arch/arm/include/armreg.h cvs rdiff -u -r1.63 -r1.64 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/arm32/cpuswitch.S diff -u src/sys/arch/arm/arm32/cpuswitch.S:1.94 src/sys/arch/arm/arm32/cpuswitch.S:1.95 --- src/sys/arch/arm/arm32/cpuswitch.S:1.94 Fri Sep 13 06:30:10 2019 +++ src/sys/arch/arm/arm32/cpuswitch.S Tue Oct 29 16:18:23 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuswitch.S,v 1.94 2019/09/13 06:30:10 skrll Exp $ */ +/* $NetBSD: cpuswitch.S,v 1.95 2019/10/29 16:18:23 joerg Exp $ */ /* * Copyright 2003 Wasabi Systems, Inc. @@ -87,10 +87,14 @@ #include <arm/asm.h> #include <arm/locore.h> - RCSID("$NetBSD: cpuswitch.S,v 1.94 2019/09/13 06:30:10 skrll Exp $") + RCSID("$NetBSD: cpuswitch.S,v 1.95 2019/10/29 16:18:23 joerg Exp $") /* LINTSTUB: include <sys/param.h> */ +#ifdef FPU_VFP + .fpu vfpv2 +#endif + #undef IRQdisable #undef IRQenable Index: src/sys/arch/arm/include/armreg.h diff -u src/sys/arch/arm/include/armreg.h:1.128 src/sys/arch/arm/include/armreg.h:1.129 --- src/sys/arch/arm/include/armreg.h:1.128 Mon Aug 12 23:31:48 2019 +++ src/sys/arch/arm/include/armreg.h Tue Oct 29 16:18:23 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: armreg.h,v 1.128 2019/08/12 23:31:48 jmcneill Exp $ */ +/* $NetBSD: armreg.h,v 1.129 2019/10/29 16:18:23 joerg Exp $ */ /* * Copyright (c) 1998, 2001 Ben Harris @@ -745,17 +745,17 @@ static inline void armreg_##name##_write } /* cp10 registers */ -ARMREG_READ_INLINE2(fpsid, "vmrs\t%0, fpsid") /* VFP System ID */ -ARMREG_READ_INLINE2(fpscr, "vmrs\t%0, fpscr") /* VFP Status/Control Register */ -ARMREG_WRITE_INLINE2(fpscr, "vmsr\tfpscr, %0") /* VFP Status/Control Register */ -ARMREG_READ_INLINE2(mvfr1, "vmrs\t%0, mvfr1") /* Media and VFP Feature Register 1 */ -ARMREG_READ_INLINE2(mvfr0, "vmrs\t%0, mvfr0") /* Media and VFP Feature Register 0 */ -ARMREG_READ_INLINE2(fpexc, "vmrs\t%0, fpexc") /* VFP Exception Register */ -ARMREG_WRITE_INLINE2(fpexc, "vmsr\tfpexc, %0") /* VFP Exception Register */ -ARMREG_READ_INLINE2(fpinst, "fmrx\t%0, fpinst") /* VFP Exception Instruction */ -ARMREG_WRITE_INLINE2(fpinst, "fmxr\tfpinst, %0") /* VFP Exception Instruction */ -ARMREG_READ_INLINE2(fpinst2, "fmrx\t%0, fpinst2") /* VFP Exception Instruction 2 */ -ARMREG_WRITE_INLINE2(fpinst2, "fmxr\tfpinst2, %0") /* VFP Exception Instruction 2 */ +ARMREG_READ_INLINE2(fpsid, ".fpu vfp\n vmrs\t%0, fpsid") /* VFP System ID */ +ARMREG_READ_INLINE2(fpscr, ".fpu vfp\n vmrs\t%0, fpscr") /* VFP Status/Control Register */ +ARMREG_WRITE_INLINE2(fpscr, ".fpu vfp\n vmsr\tfpscr, %0") /* VFP Status/Control Register */ +ARMREG_READ_INLINE2(mvfr1, ".fpu vfp\n vmrs\t%0, mvfr1") /* Media and VFP Feature Register 1 */ +ARMREG_READ_INLINE2(mvfr0, ".fpu vfp\n vmrs\t%0, mvfr0") /* Media and VFP Feature Register 0 */ +ARMREG_READ_INLINE2(fpexc, ".fpu vfp\n vmrs\t%0, fpexc") /* VFP Exception Register */ +ARMREG_WRITE_INLINE2(fpexc, ".fpu vfp\n vmsr\tfpexc, %0") /* VFP Exception Register */ +ARMREG_READ_INLINE2(fpinst, ".fpu vfp\n fmrx\t%0, fpinst") /* VFP Exception Instruction */ +ARMREG_WRITE_INLINE2(fpinst, ".fpu vfp\n vmsr\tfpinst, %0") /* VFP Exception Instruction */ +ARMREG_READ_INLINE2(fpinst2, ".fpu vfp\n fmrx\t%0, fpinst2") /* VFP Exception Instruction 2 */ +ARMREG_WRITE_INLINE2(fpinst2, ".fpu vfp\n fmxr\tfpinst2, %0") /* VFP Exception Instruction 2 */ /* cp15 c0 registers */ ARMREG_READ_INLINE(midr, "p15,0,%0,c0,c0,0") /* Main ID Register */ Index: src/sys/arch/arm/vfp/vfp_init.c diff -u src/sys/arch/arm/vfp/vfp_init.c:1.63 src/sys/arch/arm/vfp/vfp_init.c:1.64 --- src/sys/arch/arm/vfp/vfp_init.c:1.63 Sat Sep 7 19:42:42 2019 +++ src/sys/arch/arm/vfp/vfp_init.c Tue Oct 29 16:18:23 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vfp_init.c,v 1.63 2019/09/07 19:42:42 tnn Exp $ */ +/* $NetBSD: vfp_init.c,v 1.64 2019/10/29 16:18:23 joerg Exp $ */ /* * Copyright (c) 2008 ARM Ltd @@ -32,7 +32,7 @@ #include "opt_cputypes.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfp_init.c,v 1.63 2019/09/07 19:42:42 tnn Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfp_init.c,v 1.64 2019/10/29 16:18:23 joerg Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -63,7 +63,7 @@ static inline void load_vfpregs_lo(const uint64_t *p) { SETFPU; - __asm __volatile("vldmia\t%0, {d0-d15}" :: "r" (p) : "memory"); + __asm __volatile(".fpu vfp\n vldmia\t%0, {d0-d15}" :: "r" (p) : "memory"); } /* FSTMD <X>, {d0-d15} */ @@ -71,7 +71,7 @@ static inline void save_vfpregs_lo(uint64_t *p) { SETFPU; - __asm __volatile("vstmia\t%0, {d0-d15}" :: "r" (p) : "memory"); + __asm __volatile(".fpu vfp\n vstmia\t%0, {d0-d15}" :: "r" (p) : "memory"); } #ifdef CPU_CORTEX @@ -80,7 +80,7 @@ static inline void load_vfpregs_hi(const uint64_t *p) { SETFPU; - __asm __volatile("vldmia\t%0, {d16-d31}" :: "r" (&p[16]) : "memory"); + __asm __volatile(".fpu neon-vfpv4\n vldmia\t%0, {d16-d31}" :: "r" (&p[16]) : "memory"); } /* FLDMD <X>, {d16-d31} */ @@ -88,7 +88,7 @@ static inline void save_vfpregs_hi(uint64_t *p) { SETFPU; - __asm __volatile("vstmia\t%0, {d16-d31}" :: "r" (&p[16]) : "memory"); + __asm __volatile(".fpu neon-vfpv4\nvstmia\t%0, {d16-d31}" :: "r" (&p[16]) : "memory"); } #endif