ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ARMv8 기초] Exception vector와 Exception handler
    하드웨어 스케치북 2020. 4. 5. 23:58
    반응형

    지난 포스팅에서는 Exception 이 무엇인지, exception의 type에는 어떤 종류가 있는지에 대해 알아보았다.

     

    https://gongpd.tistory.com/entry/ARMv8-%EA%B8%B0%EC%B4%88-Exception%EC%9D%B4%EB%9E%80-Exception-type-synchronous-exception-asynchronous-exception

     

    [ARMv8 기초] Exception이란? (Exception type : synchronous exception, asynchronous exception)

    지난 포스팅들에서 ARMv8 아키텍쳐의 기본이 되는 Exception level이라는 개념과 Exception level 변경을 위해 SPSR (Saved Program Status Register) 과 PSTATE (Processor State) 라는 개념을 알아보았다. 이번..

    gongpd.tistory.com

    이번 포스팅에서는 Exception이 발생했을 때 분기하는 Exception vector table과 Exception handler에 대해 설명하고자 한다.

     

    당연히 ARMv8 아키텍쳐의 AArch64 (ARM64)가 베이스이다.


    저번 게시글에서 exception에 대해서만 설명하고 exception에 관련된 register에 대한 설명을 하지 못했는데, exception과 관련된 register를 일단 알아보자.

     

    Exception Link Register (ELR_ELn)

    Exception Link Register (ELR)은 exception 종료 후 return할 address를 가지고 있다. Exception 종료 후 return할 때 PC는 ELR에 저장된 주소로 복귀된다. ELR은 exception level 별로 존재하며 아래와 같이 사용된다.

    • ELR_EL1, for exceptions taken to EL1.
    • If EL2 is implemented, ELR_EL2, for exceptions taken to EL2.
    • If EL3 is implemented, ELR_EL3, for exceptions taken to EL3.

     

    Asynchronous exception의 경우에는 어떤 instruction에서 exception이 발생했는지 특정할 수 없기 때문에 코드 흐름의 boundary에 걸쳐진 instruction이 return address로 지정되거나 IRQ/FIQ의 경우에는 interrupt가 발생한 부근의 instruction이 return address로 결정된다. 

     

    Synchronous exception의 경우에는 exception을 발생시키는 명확한 instruction이 return address로 지정이 된다. 이 때의 PC value가 나타내는 code가 문제라는 이야기.

     

    Exception Syndrome Register (ESR_ELn)

    Exception Syndrome Register (ESR)은 발생한 exception에 대한 syndrome 정보를 저장한다.

    Synchronous exception이 발생했을 때, 해당 exception에 대한 정보가 ESR_ELn로 저장된다. 

    Field descriptions:

     

    EC, bits[31:26] : Exception class. Exception에 대한 메인 정보를 알려주는데 이 field를 이용해 exception type이 data abort 인지, prefetch abort인지, System call (SVC, HVC, SMC)에 의한 것인지, SError인지 와 같안 정보를 알 수 있다.

    Exception class에 대한 정보는 ARMv8 architecture reference manual을 참고.

     

    IL, bits [25] : Instruction Length. 16-bit instruction trap인 경우 (1'b0) 를 제외하고는 '1'b1 : 32-bit instruction' 값을 갖는다.

     

    ISS, bits [24:0] : Instruction Specific Syndrome. Exception class에 따라 encoding 값이 다르게 정의되며 먼저 EC 값을 보고 ISS 값을 보면 exception에 대한 정확한 정보를 얻을 수 있다. 자세한 정보는 역시 ARMv8 ARM을 참고.

     

     

    Exception Vector와 Vector Table

    AArch64 state System에서 exception이 발생하면 exception handler를 수행해 주어야 하는데, 이 exception handler는 'exception vector' 라고 부르는 곳의 address에 위치하며 이곳으로 분기하게 된다. Exception vector는 'vector table'의 형태로 각 exception level 별로 따로 정의되어 있다.

     

    ARMv8 아키텍쳐의 경우, AArch64 state의 vector table은 128-byte (0x80) 단위로 align되어 memory에 존재하게 되며 그 시작 주소를 'vector base address'라고 한다.

     

    이 vector base address는 'Vector Base Address Register (VBAR_ELn)' 이라는 register에 저장되어 있으며 각각의 exception level에 대한 vector table의 위치를 가지고 있다.

     

    Vector Base Address Register (VBAR_ELn)

    ELn에서 일어나는 모든 exception에 대한 vector base address를 갖고 있다.

     

    아래 example을 보자.

     

    @ arm developer

    한 EL에서는 위 표에서 볼 수 있듯 16개의 vector entry를 가지고 있으며 exception type에 따라 0x80 크기로 align되어 있는 것을 알 수 있고 vector table은 아래 네 가지 exception에 대한 entry를 제공하고 있다.

     

    — Synchronous exception.
    — SError.
    — IRQ.
    — FIQ.

     

    또한 발생한 exception이 어느 exception level에서 왔는지, 어떤 execution state에서 발생 했는지와 함께 사용한 stack pointer 정보를 함께 제공한다.

     

    이 vector table을 작성한 후에, 각각의 table에 exception handler code를 작성해서 넣어 주면 된다.

     

    그리고, 이 vector table이 저장되는 entry 위치는 scatter file이나 lds file과 같은 linker script에 위치할 섹션을 지정해 줄 수 있다.

     

    ex)

     

    // Current EL with SPx

    .align 128

    b    elx_spx_synchronous

    .algin 128

    b    elx_spx_IRQ

    .

    .

    .

    elx_spx_synchronous:

        bl    do_sync

        .

        .

     

    이렇게 exception handler가 exception을 처리하고 return할 때에는 항상 같은 exception level이나 더 특권이 낮은 exception level로만 return할 수 있다. (새로운 exception level의 entry)

     

    Exception return은 ELR_ELn에 저장된 PC로 복귀함과 동시에 SPSR_ELn에 저장된 PSTATE를 회복시킨다. 이 때 사용되는 명령어는 'ERET' 이다.

     

    만약 AArch64 state에서 AArch32 state로 return하는 경우, ELR_ELn의 상위 32bit는 무시된다.

    또한 EL0에서는 exception handling이 불가능 하기 때문에 ERET 명령어는 EL0에서 UNDEFINED이다.

     

     


    이렇게 두 포스팅에 걸쳐 Exception이 무엇인지, Exception vector와 handler는 무엇이며 어떤 메커니즘으로 이루어 지는지 알아 보았다.

     

    다음 포스팅에서는 예고한 대로 Exception level간 이동 (변경)과 security state의 변경에 대해 포스팅 할 예정이다.

     

    이번 포스팅과 이전 두 포스팅을 잘 이해한다면 무리없이 이해할 수 있을 정도일 것이다.

     

    + 혹시 틀린 정보가 있거나 질문이 있다면 댓글을 남겨주세요.

    반응형

    댓글

Designed by Tistory.