=====================================================================
                   ARMץå¸ޥ˥奢
                                  Last Modified: 14 Jul 2009 22:29:45
=====================================================================



ARM ˤϥƥ㡼С󤬴Ĥ¸ߤ롥ܥͥǤϡ
ARMv4 ʾΥƥ㡼򥵥ݡȤ뤳ȤȤ롥Ūˤϡ 
ARMv4 ȤƵҤƤ롥ʤ顤̤ΥƥǤ
ˡѹ뤳Ȥˤäǽޤս꤬¸ߤ롥Τ褦
ʲսˤĤƤϡ拾ѥˤäб뤳Ȥˤ롥


ȯĶ

ѥϡgccѤ롥ưǧԤäСϡCodeSourcery
ǥ꡼ƤGNU C/C++Ǥ롥


CPU㳰μ갷

㳰PCδϢ

㳰                              ⡼      ɥ쥹   PC
ꥻå             Reset          svc      0x00000000     
̤̿           Undefined      und      0x00000004    pc(ץpc-4)
SWI                  Software Int   swi      0x00000008    pc(̿)
ץեåܡ Prefetch Abort abt      0x0000000C    pc-4(Ƽ¹)
ǡܡ       Data Abort     abt      0x00000010    pc-4(Ƽ¹pc-8)
IRQ                  IRQ            irq      0x00000018    pc-4(̿)
FIQ                  FIQ            fiq      0x0000001C    pc-4(̿)

ARMϡ㳰Ϥۤʤꡤ㳰װˤʤä̿Ƽ¹Ԥ뤫
ɤˤäƤϤۤʤ롥Τᡤͥ㳰ϥɥǤϡ
PCPCꤵ뵡ǽ󶡤롥桼
CPU㳰ϥɥǤεǽѤΥɥ쥹ꤹ롥

      uint32_t x_get_exc_raddr(void *p_excinf);

      void x_set_exc_raddr(void *p_excinf, uint32_t pc);

 CPU㳰ϥɥֹ

㳰ֹĤ롥0,5֤ˤϥ桼㳰ϥɥϿǤʤ

 ꥻå             0
 ̤̿           1
 SWI                  2
 ץեåܡ 3
 ǡܡ       4
 IRQ                  5
 FIQ                  6

٥ơ֥

ARMΥ٥vector_tableˤϡARMΥ٥ɥ쥹0x00000000֤
롥vector_ref_tblϡ㳰ȯΥΥơ֥ǡvector_tble
̿ᤫ黲Ȥ롥SoCˤäƤϡ٥ɥ쥹եå
ˤꡤvector_tableϥ˥ץबͥ㳰Ѥ
ϡvector_ref_tbl񤭴ɬפ礬롥

    .section .vector,"a"
    .global vector_table
vector_table:
    ldr pc, reset_vector       /* ꥻå             */
    ldr pc, undef_vector       /* ̤̿           */
    ldr pc, swi_vector         /* եȥ   */
    ldr pc, prefech_vector     /* ץեåܡ */
    ldr pc, data_abort_vector  /* ǡܡ       */
    ldr pc, reset_vector
    ldr pc, irq_vector         /* IRQ                  */
    ldr pc, fiq_vector         /* FIQ                  */

    .align  2
    .global vector_ref_tbl
vector_ref_tbl:
reset_vector:
    .long   start
undef_vector:
    .long   undef_handler
swi_vector:
    .long   swi_handler
prefech_vector:
    .long   prefetch_handler
data_abort_vector:
    .long   data_abort_handler
irq_vector:
    .long   IRQ_Handler
fiq_vector:
    .long   fiq_handler


Τᡤͥ뼫Ȥ vector_table Ĥɤ椹롤
VECTOR_KERNEL ȤޥѰդ롥VECTOR_KERNELȡ
ͥλvector_tableͭˤʤ롥VECTOR_KERNELƤʤ
ϡCPU㳰ΥϥɥϿ˥ͥλ㳰ϥɥ
ɥ쥹˥ץδvector_ref_tblϿ롥٥
ɥ쥹ƬϤꤹVECTOR_STARTѰդ

ޤͥ㳰Ȥơvector_ref_tblľܥ桼Υϥ
ϿؿѰդ롥ʤvector_ref_tblեå
֤ϤΥƥॳưʤΤǡդɬפǤ롥

      void x_install_exc(EXCNO excno, FP exchdr)

ǥեȤvector_ref_tblϿƤϾ˼̤Ǥ롥start
IRQ_Handlerʳϡcore_support.SƤꡤ줾졤ѡ
Х⡼ɤ˰ܹԤơå˥ƥȤѤ塤Υ⡼
ɤꡤr0㳰ȯpc, r1㳰ȯcsr, r2CPU㳰ϥɥ
ֹơåȰ¸ target_exc_handler إ
롥


٥ݸ

Ҥ̤ARMΥ٥vector_tableˤϡ0x00000000 ֤ɬפ
롥̾ϤΥɥ쥹ˤROMեåԴȯΥ꤬
Ƥ뤬åȤˤäƤϡRAMޥåפ뤳Ȥǽ
롥RAM0x00000000 ֤ơ٥vector_tableˤ֤ȡ
桼ץǥ٥񤭴뤳ȤǽȤʤΤդɬפ
롥ä˥桼ץˤ롤NULLݥ󥿤ˤ륢ˤ
ǽ⤤뤿ˤϡåȰ¸Ǽ
кԤȤ侩롥

  ޥåפԤ鷺Դȯ˥٥֤
  MMUˤ٥ΰ񤭹߶ػߤȤ롥
  High VectorǽѤ٥0x00000000ʳ֤롥


㳰ե졼CPU㳰ϥɥؤΰ

FMPͥλͤǤϡCPU㳰ϥɥΰˤϡCPU㳰˴ؤ
򵭲Ƥΰ㳰ե졼ˤƬϤϤ롥ΤᡤCPU
㳰ȯΥƥȤ¸åؤΥݥ󥿤Ϥ㳰ե
ϡå target_exc_handler Ǻ롥㳰γͥ
٥ޥϡPRI(int_t)γɽǤ롥

             㳰ե졼            offset
      ------------------------------
     |  㳰Υͥȥ      |  0  <-- p_excinf
      ------------------------------
     |  㳰γͥ٥ޥ  |  1
      ------------------------------
     |        㳰CPSR          |  2
      ------------------------------
     |            R0                |  3
      ------------------------------
     |            R1                |  4
      ------------------------------
     |            R2                |  5
      ------------------------------
     |            R3                |  6
      ------------------------------
     |            IP                |  7
      ------------------------------
     |          LR_svc              |  8
      ------------------------------
     |     㳰PC()       |  9
      ------------------------------



ߤμ갷

ͥ/γ

IRQ򥫡ͥ⡤FIQ򥫡ͥγߤȤ롥

CPUåե饰

CPUåե饰Ȥơơ쥸IRQӥåȤѤ롥ʤ
CPUå֤ǤϡIRQӥåȤ򥻥åȤͥγߤػ
CPUå֤ǤϡIRQӥåȤ򥯥ꥢ롥

ߥåե饰

ߥåե饰ȤƤϡCPSRFIQӥåȤIRQӥåȤѤ롥
ߥå֤ǤϡIRQӥåȤFIQӥåȤ򥻥åȤ롥


=====================================================================
                åȰ¸ȯԸξ
=====================================================================
ȥåץ롼ˤĤ

ARMץå¸ѰդƤ륹åץ롼start.SˤǤϡ
sta_ker()ƤӽФѿѤƱԤäƤ롥åȤˤ
Ƥϡưͭʥ꤬ʤμˡѤ뤳ȤǤʤ礬
롥ξϡåȰ¸̤μˡѤȥå
롼Ѱդ뤳ȡ

ƥȤȽ

ͥϡ/㳰ǡͥΥѤѿ
excpt_nest_countˤ򥫥ȥåפиǥȥ󤹤롥Τ
ᡤexcpt_nest_count 0ξϥƥȡ1ʾξ
ƥȤȽǤ롥


㳰ȥ

㳰Υȥװ˥ͥǸ̤˻ġJSPǤϥ롼
ͭƤ롼ͭȡ㳰ȯ塤Ū˥쥸
򤵤뤿˰ΰѤɬפ뤿ᡤ̤˻Ĥ褦ѹ


㳰ΥȥǤϰʲνԤ

 ưΥ⡼ɤ˰ܹԡʥåڤؤ
 r0-r3,ip,lr,pc¸PCϥߡ
 Υ⡼ɤ
 r0lrr1spsrr2CPU㳰ϥɥֹ
 target_exc_handlerإ

target_exc_handler ϥåѰդ롥åѰդ
ϡҤ㳰ե졼㳰γͥ٥ޥޤޤƤꡤ
ͥ٥ޥΰå˰ۤʤ뤿Ǥ롥

target_exc_handler ǤϡҤ㳰ե졼ΥեޥåȤ˽ä㳰
ե졼ơƬϤˤơбCPU㳰ϥɥ
ƤӽФ

FIQΥȥfiq_handlerˤˤĤƤϡåȰ¸¦Ѱդ
ˤϡ줾졤ʲΥޥСARM¸¦Υȥ
̵Ȥʤ롥

     TARGET_FIQ_HANDLER


ɥ

¹Ԥ٤ʤϡǥѥå㡼ǳߤĤơ
ߤԤġdispatcher_2ˡARM¸ΥɤǤϡΤ褦ˤʤäƤ
롥

       ߤ
       nop
       ߶ػ

åȰ¸ǡ嵭νˡϥ⡼˰ܹԤ
ҤˤϡåȰ¸ǡOMIT_DEFAUL_IDLE
˼¹Ԥ asm_target_idle Ȥ֥ޥȤƵҤ
롥ʤasm_target_idle εҤˤäƤϡΥ쥸ϻѤǤ


       r0, r1, r2, r3, sp 

֥ޥC쵭Ÿȥ顼Ȥʤ롥pr_support.S 
ϡTOPPERS_ASM_MACRO ȤޥƤ뤿ᡤåȰ¸
 asm_target_idle ֥ޥݤˤϡTOPPERS_ASM_MACRO 
拾ѥξȤѤ뤳ȡ


CPSR˾˥åȤ

CPSRѹ˥åȤѥ CPSR_ALWAYS_SET Ȥơ
åȰ¸ǽǤ롥


ARMȥ֥åΥλ

ץåδǤ롤ARMȥ֥åΥ
ǽǤ롥ϡåȰ¸Υѥ2Υƥץ졼ȥե
ǰʲ̾ϢǥץåIDINDEXȤƻꤹ롥

  PRC_SECTION_ACCB[]


ץåؤΥǡ¤ؤΥޥ

åȰ¸ǤϡץåIDˤץåȽ̵ǽѤơ
ץåΥǡ¤ؤΥ¸륢֥ѤΥޥ
target_asm.inc ⤷Ϥ饤󥯥롼ɤեѰդɬ
פ롥

my_core_index rx
 
ץåѤΥץåINDEXؤΥޥrx˼ץå
ץåID֤롥

my_pcb rx, ry
 
ץåѤPCBؤΥޥrx˼ץåPCBؤΥݥ
֤롤ryϥå쥸Ǥ롥

my_istkpt rx, ry

ץåѤISTKPTؤΥޥrx˼ץåISTKPTؤ
ݥ󥿤֤롤ryϥå쥸Ǥ롥

my_accb rx, ry

ץåѤACCBؤΥޥrx˼ץåACCBؤΥݥ
󥿤֤롤ryϥå쥸Ǥ롥


=====================================================================
                             ѹ
=====================================================================
2009/07/14
CPU㳰ֹפʤϡ㳰ֹפCPU㳰ϥɥֹפ졥
㳰ե졼㳰γͥ٥ޥͤ򥿡åȰ¸
  ͤ鳰ɽѹ

2009-02-03
ޥץåɲá

ʾ
