Module Name:    src
Committed By:   joerg
Date:           Tue Mar 25 00:00:55 UTC 2014

Modified Files:
        src/sys/lib/libunwind: Registers.hpp unwind_registers.S

Log Message:
Save & restore FP registers.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/lib/libunwind/Registers.hpp \
    src/sys/lib/libunwind/unwind_registers.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/lib/libunwind/Registers.hpp
diff -u src/sys/lib/libunwind/Registers.hpp:1.6 src/sys/lib/libunwind/Registers.hpp:1.7
--- src/sys/lib/libunwind/Registers.hpp:1.6	Mon Mar 24 21:25:03 2014
+++ src/sys/lib/libunwind/Registers.hpp	Tue Mar 25 00:00:55 2014
@@ -377,6 +377,8 @@ enum {
   DWARF_M68K_A7 = 7,
   DWARF_M68K_D0 = 8,
   DWARF_M68K_D7 = 15,
+  DWARF_M68K_FP0 = 16,
+  DWARF_M68K_FP7 = 23,
   DWARF_M68K_PC = 24,
 
   REGNO_M68K_A0 = 0,
@@ -384,13 +386,15 @@ enum {
   REGNO_M68K_D0 = 8,
   REGNO_M68K_D7 = 15,
   REGNO_M68K_PC = 16,
+  REGNO_M68K_FP0 = 17,
+  REGNO_M68K_FP7 = 24,
 };
 
 class Registers_M68K {
 public:
   enum {
-    LAST_REGISTER = REGNO_M68K_PC,
-    LAST_RESTORE_REG = REGNO_M68K_PC,
+    LAST_REGISTER = REGNO_M68K_FP7,
+    LAST_RESTORE_REG = REGNO_M68K_FP7,
     RETURN_REG = REGNO_M68K_PC,
   };
 
@@ -401,13 +405,15 @@ public:
       return REGNO_M68K_A0 + (num - DWARF_M68K_A0);
     if (num >= DWARF_M68K_D0 && num <= DWARF_M68K_D7)
       return REGNO_M68K_D0 + (num - DWARF_M68K_D0);
+    if (num >= DWARF_M68K_FP0 && num <= DWARF_M68K_FP7)
+      return REGNO_M68K_FP0 + (num - DWARF_M68K_FP0);
     if (num == DWARF_M68K_PC)
       return REGNO_M68K_PC;
     return LAST_REGISTER + 1;
   }
 
   bool validRegister(int num) const {
-    return num >= 0 && num <= LAST_RESTORE_REG;
+    return num >= 0 && num <= REGNO_M68K_PC;
   }
 
   uint64_t getRegister(int num) const {
@@ -429,16 +435,23 @@ public:
   void setSP(uint64_t value) { reg[REGNO_M68K_A7] = value; }
 
   bool validFloatVectorRegister(int num) const {
-    return false;
+    return num >= REGNO_M68K_FP0 && num <= REGNO_M68K_FP7;
   }
 
   void copyFloatVectorRegister(int num, uint64_t addr_) {
+    assert(validFloatVectorRegister(num));
+    const void *addr = reinterpret_cast<const void *>(addr_);
+    memcpy(fpreg + (num - REGNO_M68K_FP0), addr, sizeof(fpreg[0]));
   }
 
   __dso_hidden void jumpto() const __dead;
 
 private:
+  typedef uint32_t fpreg_t[3];
+
   uint32_t reg[REGNO_M68K_PC + 1];
+  uint32_t dummy;
+  fpreg_t fpreg[8];
 };
 
 } // namespace _Unwind
Index: src/sys/lib/libunwind/unwind_registers.S
diff -u src/sys/lib/libunwind/unwind_registers.S:1.6 src/sys/lib/libunwind/unwind_registers.S:1.7
--- src/sys/lib/libunwind/unwind_registers.S:1.6	Mon Mar 24 21:25:03 2014
+++ src/sys/lib/libunwind/unwind_registers.S	Tue Mar 25 00:00:55 2014
@@ -346,6 +346,7 @@ END(_ZNK7_Unwind13Registers_vax6jumptoEv
 ENTRY(_ZN7_Unwind14Registers_M68KC1Ev)
 	move.l	4(%sp), %a0
 	movem.l	%d0-%d7/%a0-%a7, (%a0)
+	fmovem	%fp0-%fp7, 72(%a0)
 	move.l	0(%sp), %a1
 	move.l	%a1, 64(%a0)
 	addq.l	#4, 60(%a0)
@@ -358,6 +359,7 @@ ENTRY(_ZNK7_Unwind14Registers_M68K6jumpt
 	move.l	64(%a0), %a1
 	move.l	60(%a0), %a2
 	move.l	%a1, (%a2)
+	fmovem	72(%a0), %fp0-%fp7
 	movem.l	(%a0), %d0-%d7/%a0-%a7
 	rts
 END(_ZNK7_Unwind14Registers_M68K6jumptoEv)

Reply via email to