Now that clang is the default compiler on armv7 we can actually add FPU/SIMD support to this architecture. In preparation this diff changes "struct fpreg" to something a bit more sensible. Nether FreeBSD nor NetBSD provides something sane (the ARM FPU history is quite convoluted) so I went for something that follows the lead of arm64. The layout is the same as the one used by the code written by drahn@ and what's used by lldb. It contains 32 64-bit registers to support VFPv4-D32 and Advanced SIMD and the FPSCR register.
This breaks GDB; the diff patches that up as well. Ports GDB will need a similar diff. So I'm not moving ahead with this until I get an ok from the relevant ports people. ok? Index: sys/arch/arm/include/reg.h =================================================================== RCS file: /cvs/src/sys/arch/arm/include/reg.h,v retrieving revision 1.2 diff -u -p -r1.2 reg.h --- sys/arch/arm/include/reg.h 23 Mar 2011 16:54:34 -0000 1.2 +++ sys/arch/arm/include/reg.h 21 Jan 2018 14:06:25 -0000 @@ -37,8 +37,6 @@ #ifndef _ARM_REG_H_ #define _ARM_REG_H_ -#include <machine/fp.h> - struct reg { unsigned int r[13]; unsigned int r_sp; @@ -48,8 +46,8 @@ struct reg { }; struct fpreg { - unsigned int fpr_fpsr; - fp_reg_t fpr[8]; + uint64_t fp_reg[32]; + uint32_t fp_scr; }; #endif /* !_ARM_REG_H_ */ Index: gnu/usr.bin/binutils/gdb/armnbsd-nat.c =================================================================== RCS file: /cvs/src/gnu/usr.bin/binutils/gdb/armnbsd-nat.c,v retrieving revision 1.2 diff -u -p -r1.2 armnbsd-nat.c --- gnu/usr.bin/binutils/gdb/armnbsd-nat.c 26 Nov 2005 14:28:57 -0000 1.2 +++ gnu/usr.bin/binutils/gdb/armnbsd-nat.c 21 Jan 2018 14:06:26 -0000 @@ -70,10 +70,10 @@ supply_fparegset (struct fpreg *fparegse for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++) regcache_raw_supply (current_regcache, regno, - (char *) &fparegset->fpr[regno - ARM_F0_REGNUM]); + (char *) &fparegset->fp_reg[regno - ARM_F0_REGNUM]); regcache_raw_supply (current_regcache, ARM_FPS_REGNUM, - (char *) &fparegset->fpr_fpsr); + (char *) &fparegset->fp_scr); } static void @@ -164,12 +164,12 @@ fetch_fp_register (int regno) { case ARM_FPS_REGNUM: regcache_raw_supply (current_regcache, ARM_FPS_REGNUM, - (char *) &inferior_fp_registers.fpr_fpsr); + (char *) &inferior_fp_registers.fp_scr); break; default: regcache_raw_supply (current_regcache, regno, - (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); + (char *) &inferior_fp_registers.fp_reg[regno - ARM_F0_REGNUM]); break; } } @@ -352,12 +352,12 @@ store_fp_register (int regno) { case ARM_FPS_REGNUM: regcache_raw_collect (current_regcache, ARM_FPS_REGNUM, - (char *) &inferior_fp_registers.fpr_fpsr); + (char *) &inferior_fp_registers.fp_scr); break; default: regcache_raw_collect (current_regcache, regno, - (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); + (char *) &inferior_fp_registers.fp_reg[regno - ARM_F0_REGNUM]); break; } @@ -378,10 +378,10 @@ store_fp_regs (void) for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++) regcache_raw_collect (current_regcache, regno, - (char *) &inferior_fp_registers.fpr[regno - ARM_F0_REGNUM]); + (char *) &inferior_fp_registers.fp_reg[regno - ARM_F0_REGNUM]); regcache_raw_collect (current_regcache, ARM_FPS_REGNUM, - (char *) &inferior_fp_registers.fpr_fpsr); + (char *) &inferior_fp_registers.fp_scr); ret = ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), (PTRACE_TYPE_ARG3) &inferior_fp_registers, 0);