This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Fwd: Modes, stack setup for "no-OS" ARM app]


>>>>> Toralf Lund writes:

> Actually, the libgloss redboot-crt0.S doesn't set up more than one sp, 
> either - but perhaps there is additional setup within RedBoot itself?

redboot-crt0.s assumes that the program is being run on top of RedBoot
where RedBoot handles low-level exceptions, etc.

RedBoot operates almost entirely in supervisor mode on the ARM. Minimal
mode-specific stacks are used by exception handlers to save a small
amount of state before switching to supervisor mode. For instance:

 undefined_instruction:
        ldr     sp,.__undef_exception_stack     // get good stack
        stmfd   sp!,{r0-r5}                     // save some supervisor regs
        mrs     r1,spsr
        tst     r1,#CPSR_THUMB_ENABLE
        subeq   r0,lr,#4                // PC at time of interrupt (ARM)
        subne   r0,lr,#2                // PC at time of interrupt (thumb)
        mov     r2,#CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION
        mov     r3,sp
        b       call_exception_handler

And the first insns in call_exception handler are:

        mrs     r4,cpsr                 // switch to Supervisor Mode
        bic     r4,r4,#CPSR_MODE_BITS
        orr     r4,r4,#CPSR_SUPERVISOR_MODE
        msr     cpsr,r4


The __undef_exception stack is simply 32 words of bss:

        .section ".bss"
        .rept   32
        .long   0
        .endr
  __undef_exception_stack:


--Mark



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]