This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos 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]

ARM vector.s -- suspicious code in return_from_exception


Hello,

In the file hal/arm/arch/current/src/vector.s (recent snapshot) I found the code
below.
Please note the line "msr     spsr,r0". While it is used in an if/else case, r0
it is alway written. Unfortunate I am not familiar enough with ecos, but would
anyone take a look at it? I would guess !1! is not intended but then again this
might be a quick fix which has to be cleaned.

Eric.

vector.s line 545
        .code   32
        //
        // Return from exception
        //
return_from_exception:

        ldr     r0,[sp,#armreg_cpsr]
!1!      msr     spsr,r0

        // return to supervisor mode is simple
        and     r1,r0,#CPSR_MODE_BITS
        cmp     r1,#CPSR_SUPERVISOR_MODE

#ifndef CYGOPT_HAL_ARM_PRESERVE_SVC_SPSR
!2!      msr     spsr,r0
        ldmeqfd sp,{r0-r14,pc}^
#else
        // we must take care of not corrupting the current (svc)
        // spsr which happens to be also the pre-exception spsr
        bne     1f
        // we are returning to svc mode thus we must restore the
        // pre-exception cpsr before returning to interrupted code
!3a!      msr     cpsr, r0
        ldmfd   sp, {r0-r14, pc}
1:
        // we are not returning to svc mode thus we can safely restore
        // svc spsr
!3b!      msr     spsr, r0
#endif


----- Original Message -----
From: "QiangHuang" <jameshq@liverpool.ac.uk>
To: "Ecos-Discuss" <ecos-discuss@sources.redhat.com>
Sent: Friday, June 20, 2003 12:24 AM
Subject: [ECOS] ARM vectors.S question. Thank you.


Hi :

   Can anyone give me some suggestion about the following code? thanks a
lot.

memory map:
    SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA)
    SECTION_rom_vectors (ram, 0x40000, LMA_EQ_VMA)
    SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA)

ARM vectors.S
................
        ldr     r1,=__exception_handlers
        // **Question 1** Is r1 = 0x40000 here ???
..........

#ifdef CYGHWR_HAL_ARM_ICE_THREAD_SUPPORT

        ldr     r2,=ice_thread_vector
        // **Question 2** by here what is value of r2 by now, is
r2=0x20+offset(ice_thread_vector to fixed_vectors) ???? Is this Correct???

        sub     r2,r2,r1        // compute fixed (low memory) address
        // **Question 3** if the above correct why this is needed??? what is
value of r2=r2-r1 ??  r2 = r2-0x40000??? what is going here, how the address
is defined??

        ldr     r3,=0x4D494345  // 'MICE'
        str     r3,[r2],#4
        ldr     r3,=hal_arm_ice_thread_handler
        str     r3,[r2],#4
        mov     r3,#1
        str     r3,[r2],#4
        ldr     r3,=0x47444220  // 'GDB '
        str     r3,[r2],#4
#endif // CYGHWR_HAL_ARM_ICE_THREAD_SUPPORT

Thanks a lot.


--
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss



-- 
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss


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