file : (TOPDIR)/cpu/s5pc11x/start.S

⊙ ARM process의 power on(reset)후 actions

.....



⊙ ENTRY POINT (_start)
Supervisor mode,arm state,pc 값이 0x0이므로 Linker script file의 entry point에서 선언된 ‘_start’부터 프로그램 코드가 실행된다.

.globl _start              @ flash start
_start: b   reset         @ offset jump이므로 dram으로 이동하지 않는다.
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq

.global _start
Linker에게 ‘_start’ symbol 처리할 수 있도록 export한다.

_start의 첫번째 instruction은 ‘b reset’이므로 reset 함수로 branch하여
reset으로 제어가 옮겨진다.

나머지는 ARM에서 발생할 수 있는 exception으로 상황에 대한 처리 routine들로 exception이 발생하면 해당하는 핸들러로 branch할 것이다.
 _undefined_instruction
 _software_interrupt
 _prefetch_abort
 _data_abort
 _not_used
 _irq
 _fiq


⊙ reset :
[1] mode setting 및 interrupt disable

/*
 * the actual reset code
 */

reset:
    /*  
     * set the cpu to SVC32 mode and IRQ & FIQ disable
     */  
    @;mrs   r0,cpsr          @ cpsr값을 r0레지스터로 옮긴다.
    @;bic   r0,r0,#0x1f       @ Mode bit을 clear한다.
    @;orr   r0,r0,#0xd3       @ interrupt 을 disable,supervisor mode
    @;msr   cpsr,r0           @ r0값으로 cpsr값을 바꾼다.
    msr cpsr_c, #0xd3       @ I & F disable, Mode: 0x13 - SVC


cpu_init_crit
중요한 registers 및 memory timing 등을 setup한다.

cpu_init_crit:

#ifndef CONFIG_EVT1
#if 0  
    bl  v7_flush_dcache_all
#else
    bl  disable_l2cache

    mov r0, #0x0    @
    mov r1, #0x0    @ i
    mov r3, #0x0
    mov r4, #0x0
lp1:
    mov r2, #0x0    @ j
lp2:
    mov r3, r1, LSL #29     @ r3 = r1(i) <<29
    mov r4, r2, LSL #6      @ r4 = r2(j) <<6
    orr r4, r4, #0x2        @ r3 = (i<<29)|(j<<6)|(1<<1)
    orr r3, r3, r4
    mov r0, r3          @ r0 = r3
    bl  CoInvalidateDCacheIndex
    add r2, #0x1        @ r2(j)++
    cmp r2, #1024       @ r2 < 1024
    bne lp2         @ jump to lp2
    add r1, #0x1        @ r1(i)++
    cmp r1, #8          @ r1(i) < 8
    bne lp1         @ jump to lp1

    bl  set_l2cache_auxctrl

    bl  enable_l2cache
#endif
#endif

    bl  disable_l2cache

    bl  set_l2cache_auxctrl_cycle

    bl  enable_l2cache

       /*
        * Invalidate L1 I/D
        */
        mov r0, #0                  @ set up for MCR
        mcr p15, 0, r0, c8, c7, 0   @ invalidate TLBs
        mcr p15, 0, r0, c7, c5, 0   @ invalidate icache

       /*
        * disable MMU stuff and caches
        */
        mrc p15, 0, r0, c1, c0, 0
        bic r0, r0, #0x00002000     @ clear bits 13 (--V-)
        bic r0, r0, #0x00000007     @ clear bits 2:0 (-CAM)
        orr r0, r0, #0x00000002     @ set bit 1 (--A-) Align
        orr r0, r0, #0x00000800     @ set bit 12 (Z---) BTB
        mcr     p15, 0, r0, c1, c0, 0


        /* Read booting information */
        ldr r0, =PRO_ID_BASE
        ldr r1, [r0,#OMR_OFFSET]

        bic r2, r1, #0xffffffc1

#ifdef CONFIG_VOGUES
    /* PS_HOLD(GPH0_0) set to output high */
    ldr r0, =ELFIN_GPIO_BASE
    ldr r1, =0x00000001
    str r1, [r0, #GPH0CON_OFFSET]

    ldr r1, =0x5500
    str r1, [r0, #GPH0PUD_OFFSET]

    ldr r1, =0x01
    str r1, [r0, #GPH0DAT_OFFSET]
#endif

Posted by eoseontaek