Hi
I use ULINK2 to debug S3C2440. I notice that the start-up code provided by Keil S3C2440.s, it change the cpu mode one by one to setup the stack, and finally enter the user mode then jump to the C code:
; Setup Stack for each mode ---------------------------------------------------- LDR R0, =Stack_Top MOV SP, R0 ; Enter Undefined Instruction Mode and set its Stack Pointer MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #UND_Stack_Size ; Enter Abort Mode and set its Stack Pointer MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #ABT_Stack_Size ; Enter FIQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #FIQ_Stack_Size ; Enter IRQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #IRQ_Stack_Size ; Enter Supervisor Mode and set its Stack Pointer MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #SVC_Stack_Size ; Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR MOV SP, R0 SUB SL, SP, #USR_Stack_Size ; Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR IF :DEF:__MICROLIB EXPORT __initial_sp ELSE MOV SP, R0 SUB SL, SP, #USR_Stack_Size ENDIF ; Enter the C code ------------------------------------------------------------- IMPORT __main LDR R0, =__main BX R0
but in my application i don't want to enter the user-mode before jump to the C code becase i need to do some MMU operation in the main() function. so i modified the S3C2440.s as follow:
; Enter Supervisor Mode and set its Stack Pointer MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #SVC_Stack_Size ;----------------------------------------------------------- ; Not Enter User Mode and set its Stack Pointer ; MSR CPSR_c, #Mode_USR ; MOV SP, R0 ; SUB SL, SP, #USR_Stack_Size ;----------------------------------------------------------- ; Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR IF :DEF:__MICROLIB EXPORT __initial_sp ELSE MOV SP, R0 SUB SL, SP, #USR_Stack_Size ENDIF ; Enter the C code ------------------------------------------------------------- IMPORT __main LDR R0, =__main BX R0
My program works well, but when i debug the code, it seems that the "Step-Out" function provided by the Keil IDE do not work, the program did not stop in the next instruction after one function return, it just continue running until i press the "Stop" button or insert a new breakpoint. But this did not happen in the original version of S3C2440.s without my modification.
Is there anything wrong in my code?
Any suggestion will be appreciated!
Eric
StepOut works fine when the debugger can calculate the address a function returns to. This works when the debug information contains frame descriptions - this is the case with C and C++ but not necessarily for assembly language routines. If the unwind chain is broken, StepOut and stack unwinding are disabled. The call into the runtime library 'LDR R0, =__main' seems to cause this behaviour...