Bon une fois n'est pas coutume je pose une question au lieu d'y répondre:
Y'a t-il des developpeurs assembleur ARM 7, j'ai besoin d'info sur les exceptions sur ARM (et des pointeurs sur de la doc asm ARM digne de ce nom):
Je fais un stub GDB (un bout de prog qui permet a GDB de fonctionner en remote), branché sur les exception aborts et undefined. Donc je dois sauver tout les regs dans un tableau et les restaurer a la sortie. L'entrée se passe bien, mais pas la sortie:
_undef_ex:
/* Ajust return address to faulty instr */
sub r14, r14, #4
/* Load gdb_register struct addr into R13 (saved) */
ldr r13, =_gdb_registers
/* Save R0 -> R12 */
stmia r13, {r0-r12}
/* Save old PC (R14) */
str r14, [r13, #OFFSET_PC]
/* Get and save status reg */
mrs r0, spsr
str r0, [r13, #OFFSET_PS]
mov r1, r13
/* Save banked regs R13 R14 (go into system mode) */
ldr r0, =(ARM_PSR_MODE_SYSTEM32 + ARM_PSR_I_BIT + ARM_PSR_F_BIT) /* no interrupts */
msr cpsr_c, r0 /* enter System mode, Interrupt disabled */
str r13, [r1, #OFFSET_SP]
str r14, [r1, #OFFSET_LR]
/* Return in undef mode */
ldr r0, =(ARM_PSR_MODE_UNDEF32 + ARM_PSR_I_BIT + ARM_PSR_F_BIT) /* no interrupts */
msr cpsr_c, r0 /* enter UNDEF mode */
/* Set signal */
mov r0, #SIGTRAP
/* Branch to gdb stub */
bl _gdb_stub
/* Restore R13 R14 */
ldr r1, =_gdb_registers
ldr r0, [r1, #OFFSET_PS]
msr spsr, r0
/* Save banked regs R13 R14 (go into system mode) */
ldr r0, =(ARM_PSR_MODE_SYSTEM32 + ARM_PSR_I_BIT + ARM_PSR_F_BIT) /* no interrupts */
msr cpsr_c, r0 /* enter System mode, Interrupt disabled */
ldr r13, [r1, #OFFSET_SP]
ldr r14, [r1, #OFFSET_LR]
/* Return in undef mode */
ldr r0, =(ARM_PSR_MODE_UNDEF32 + ARM_PSR_I_BIT + ARM_PSR_F_BIT) /* no interrupts */
msr cpsr_c, r0 /* enter UNDEF mode */
mov r13, r1
/* Restore other registers */
ldmia r13, {r0-r12}
/* Resume execution */
ldr r14, [r13, #OFFSET_PC]
movs pc, r14