[ IRQ 처리 ]

리눅스커널 2009. 10. 2. 14:51
CP15 c1, Control Register 의  V bit 에 의해 hign vector 를 사용하도록 설정된다.
arch/arm/mm/proc-v6.S
__v6_setup 에서 Control Register 를 읽고 v6_crval 값에 지정된 것으로 clear 후 set 한다.
여서기 V bit 가 설정됨으로 high vector 가 사용된다.

Control Register 를 저장 하지 않지만.. 나중에 __enable_mmu -> __turn_mmu_on 에서 저장함
__v6_setup:
:
adr r5, v6_crval
ldmia   r5, {r5, r6}
mrc p15, 0, r0, c1, c0, 0       @ read control register
bic r0, r0, r5          @ clear bits them
orr r0, r0, r6          @ set them
mov pc, lr              @ return to head.S:__ret
:
v6_crval:
    crval   clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c
:
 
arch/arm/kernel/entry-armv.S
 vector table 과 handler 가 정의되어 있다.
  
devicemaps_init
 high vector(0xffff0000) 페이지 테이블 생성
trap_init
 high vector(0xffff0000) 로 복사
 
init_IRQ
 kernel IRQ 스택 초기화
 
s3c_init_irq
 CPU 인터럽터 컨트롤러 초기화
 
동작은
arch/arm/kernel/entry-armv.S  의 vector table , handler 에서 처리후
asm_do_IRQ  호출한다.
Posted by blee
,