=====================================================================
                   ARMץå¸ޥ˥奢
                                  Last Modified: 2011 Mar 03 15:05:48
=====================================================================



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


ȯĶ

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


CPU㳰μ갷

㳰PCδϢ

㳰                              ⡼      ɥ쥹   PC
ꥻå             Reset          svc      0x00000000     
̤̿           Undefined      und      0x00000004    lr(ץpc-4)
SWI                  Software Int   swi      0x00000008    lr(̿)
ץեåܡ Prefetch Abort abt      0x0000000C    lr-4(Ƽ¹)
ǡܡ       Data Abort     abt      0x00000010    lr-8(Ƽ¹)
IRQ                  IRQ            irq      0x00000018    lr-4(̿)
FIQ                  FIQ            fiq      0x0000001C    lr-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
̿ᤫ黲Ȥ롥

    .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_ref_tblRAM֤ˤϡͥ㳰
ơvector_ref_tblľܥ桼ΥϥɥϿؿѰդ롥
ʤvector_ref_tblեå֤ϡΥƥॳ
ưʤΤǡդɬפǤ롥

      void x_install_exc(EXCNO excno, FP exchdr)

ǥեȤvector_ref_tblϿƤϾ˼̤Ǥ롥start
IRQ_Handlerʳϡcore_support.SƤꡤARMƥ
˽ۤʤ롥

ARMv4,ARMv5ǤϡѡХ⡼ɤ˰ܹԤơå˥
ȤѤ塤Υ⡼ɤꡤr0㳰ȯpc, r1㳰ȯ
cpsr, r2CPU㳰ϥɥֹơåȰ¸ 
target_exc_handler إפ롥

ARMv6,ARMv7Ǥϡlr()spsr(cpsr_svc)򥹡ѡХ⡼ɤ
åѤ塤r2CPU㳰ϥɥֹơåȰ¸
 target_exc_handler إפ롥


٥ݸ

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

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


㳰ե졼CPU㳰ϥɥؤΰ

FMPͥλͤǤϡCPU㳰ϥɥΰˤϡCPU㳰˴ؤ
򵭲Ƥΰ㳰ե졼ˤƬϤϤ롥ΤᡤCPU
㳰ȯΥƥȤ¸åؤΥݥ󥿤Ϥ

㳰ե졼ϡARMƥ˰ۤʤꡤARMv4/ARMv5ǤϼΤ褦
ʤ롥ΤR0,R1,R2,R3,ip˴ؤƤϡARMץå¸ꤵ
롥¾ͤϡå target_exc_handler Ǻ롥㳰
γͥ٥ޥϡPRI(int_t)γɽǤ롥

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

ARMv6/ARMv7ǤϼΤ褦ˤʤ롥ΤR0,R1,R2,R3,IP,LR_svc,㳰
PC,㳰CPSR˴ؤƤϡARMץå¸ꤵ롥¾
ͤϡå target_exc_handler Ǻ롥㳰γͥ
٥ޥϡPRI(int_t)γɽǤ롥

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

ߤμ갷

ͥ/γ

IRQ򥫡ͥ⡤FIQ򥫡ͥγߤȤ롥

CPUåե饰

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

ߥåե饰

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


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

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

ƥ

ƥ򼡤Υޥǻꤹ롥

  __TARGET_ARCH_ARM

줾Υƥꤹͤϼ̤Ǥ롥

  ARMv4 : 4
  ARMv5 : 5
  ARMv6 : 6
  ARMv7 : 7

ƥȤȽ

ͥϡ/㳰ǡͥΥѤѿ
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ϥå쥸Ǥ롥


ǥѥåѤΥץåֳߥϥɥΥХѥ

ǥѥåѤΥץåֳߤäˡߥϥɥ
ХѥơǥѥåƤӽФȤǽǤ롥ʲΥޥ
ơret_int_ipi_dispatch ƤӽФФ褤

  USE_IPI_DIS_HANDER_BYPASS

Thumb Mode ѤΥѥ

ͥ Thumb Mode Ѥ˥ѥ뤹ϡޥ 
__thumb__ 뤳ȡ

=====================================================================
                             ѹ
=====================================================================
2011/03/03
sil_dly_nse()ǥ饤󥢥֥_sil_dly_nseθƤӽФҤ
  "lr"򥯥Х쥸ȤƻꤷƤʤ

2011/03/02
_sil_dly_nse ͡षʤ褦ѹ

2010/11/02
ưƱˡѹ
  ǥХåȤ硤μ¹ԤΥ꤬ĤäƤ뤿ƱǤ
  礬äƱѤѿ򥳥˻Ʊ˽褦
  ѹ

2010/10/11
Thumb Mode Ѥsrꡦȴؿɲá

2010/07/26
VECTOR_KERNELѻߡ

2010/02/26
ARMv6/7Υݡ
  ARMv6/7ꤷϡߡ㳰νsrs/rfeѹ
  ѹȼ㳰ե졼ARMv4/5Ȥϰۤʤ빽¤Ȥʤ롥

2010/01/27
core_cfg1_out.hƤ

2009/11/20
ȥåץ롼ǥޥץåTOPPERS_MASTER_PRCID򸫤
  Ƚꤹ褦ѹ

2009/10/16
֥եʬ̿ AAPCS侩ѹ
  mov pc, xx -> bx pc

2009/09/15
ǥѥåѤΥץåֳߥϥɥΥХѥɲ

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

2009/02/03
ޥץåɲá

ʾ
