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);

Reply via email to