Browse Source

[libcpu]am335x edit vector

vector_undef and vector_dabt
陈豪 11 years ago
parent
commit
fd6ef4b235
2 changed files with 40 additions and 2 deletions
  1. 22 2
      libcpu/arm/am335x/start_gcc.S
  2. 18 0
      libcpu/arm/am335x/trap.c

+ 22 - 2
libcpu/arm/am335x/start_gcc.S

@@ -33,7 +33,7 @@
 .equ I_Bit,           0x80            @ when I bit is set, IRQ is disabled
 .equ F_Bit,           0x40            @ when F bit is set, FIQ is disabled
 
-.equ UND_Stack_Size,  0x00000000
+.equ UND_Stack_Size,  0x00000200
 .equ SVC_Stack_Size,  0x00000100
 .equ ABT_Stack_Size,  0x00000000
 .equ FIQ_Stack_Size,  0x00000000
@@ -135,7 +135,15 @@ vector_undef:
     sub     sp, sp, #72
     stmia   sp, {r0 - r12}          @/* Calling r0-r12                  */
     add     r8, sp, #60
-    stmdb   r8, {sp, lr}            @/* Calling SP, LR                  */
+
+    mrs     r1, cpsr
+    mrs     r2, spsr
+    orr     r2,r2, #I_Bit|F_Bit
+    msr     cpsr_c, r2
+    mov     r0, r0
+    stmdb   r8, {sp, lr}           @/* Calling SP, LR                  */
+    msr     cpsr_c, r1             @/* return to Undefined Instruction mode  */
+
     str     lr, [r8, #0]            @/* Save calling PC                 */
     mrs     r6, spsr
     str     r6, [r8, #4]            @/* Save CPSR                       */
@@ -144,6 +152,12 @@ vector_undef:
 
     bl      rt_hw_trap_udef
 
+    ldmia    sp, {r0 - r12}         @/* Calling r0 - r2  */
+    mov      r0, r0
+    ldr      lr, [sp, #60]          @/* Get PC   */
+    add      sp, sp, #72
+    movs     pc, lr                 @/* return & move spsr_svc into cpsr */
+
     .align  5
 .globl vector_swi
 vector_swi:
@@ -169,6 +183,12 @@ vector_dabt:
 
     bl      rt_hw_trap_dabt
 
+    ldmia    sp, {r0 - r12}         @/* Calling r0 - r2  */
+    mov      r0, r0
+    ldr      lr, [sp, #60]          @/* Get PC   */
+    add      sp, sp, #72
+    movs     pc, lr                 @/* return & move spsr_svc into cpsr */
+
     .align 5
 .globl vector_resv
 vector_resv:

+ 18 - 0
libcpu/arm/am335x/trap.c

@@ -18,6 +18,10 @@
 #include "am33xx.h"
 #include "interrupt.h"
 
+#ifdef RT_USING_GDB
+#include "gdb_stub.h"
+#endif
+
 /**
  * @addtogroup AM33XX
  */
@@ -55,6 +59,13 @@ void rt_hw_show_register (struct rt_hw_register *regs)
  */
 void rt_hw_trap_udef(struct rt_hw_register *regs)
 {
+
+#ifdef RT_USING_GDB
+    regs->pc -= 4; //lr in undef is pc + 4
+    if (gdb_undef_hook(regs))
+        return;
+#endif
+
 	rt_hw_show_register(regs);
 
 	rt_kprintf("undefined instruction\n");
@@ -114,6 +125,13 @@ void rt_hw_trap_pabt(struct rt_hw_register *regs)
  */
 void rt_hw_trap_dabt(struct rt_hw_register *regs)
 {
+
+#ifdef RT_USING_GDB
+    if (gdb_mem_fault_handler) {
+        regs->pc = (unsigned long)gdb_mem_fault_handler; 
+        return;
+    }
+#endif
 	rt_hw_show_register(regs);
 
 	rt_kprintf("data abort\n");