ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ARMv8 기초] SPSR (Saved Program Status Register)과 PSTATE (Processor State)
    하드웨어 스케치북 2020. 4. 4. 01:16
    반응형

    지난 게시글에서는 ARMv8 아키텍쳐의 가장 큰 특징인 Exception level과 execution state에 대해 설명하였다.

    이번 포스팅에서는 소개한 exception level간의 이동, security state 변경에 대해 설명하고자 한다.

     

    Exception level간 이동, Security state의 변경을 위해서는 SPSR과 PSTATE에 대한 이해가 필요한데, 

    두 편으로 나누어 먼저 SPSR과 PSTATE에 대해 알아보고 그 다음 실제 Exception level transition과 world change이 어떻게 이루어지는지 알아볼 것이다.

     

    AArch32와 AArch64 실행 상태를 변경하는 execution state 변경에 대해서는 그 다음 포스팅에서 설명할 계획.

     

    지난 포스팅 정리 및 요약

     

    1. Exception Level

    : ARMv8 architecture에서는 각각 다른 prvilege를 가지는 4개의 exception level이 존재한다.

     

    EL0: User applications. Lowest privilege level.

    EL1: An operating system kernel (e.g., Linux kernel)

    EL2: Hypervisor (e.g., KVM virtualization)

    EL3: Low-level firmware, including the Secure Monitor (e.g., baremetal assembly/C code)

     

    * Security state: Normal world의 non-secure state, Secure world의 secure state

    Non-secure state에서는 secury region에 접근할 수 없으며, trustzone feature를 이용해 system의 보안을 관리

     

    2. Execution state

    : ARMv8에서는 ARMv7 아키텍쳐와 호환성을 갖는 AArch32 state와 ARM64라고도 불리는 AArch64 state가 존재한다.


    ARMv8 Fundamental

     

    3. Changing Exception level and security state

      

     

    ARMv7 architecture에서는 ARMv8의 exception level과 대응되는 개념인 processor mode를 갖고 있으며 Exception type에 따라 해당 exception을 처리하는 mode가 define되어 있다. AArch32에서는 ARMv7과의 backward compatibility를 위해 이 개념을 그대로 사용하기도 한다.

     

      3-1. SPSR (Saved Program Status Register)과 PSTATE (Processor state)

     

    Processor State (PSTATE)

    : AArch64 (ARM64)에서는 ARMv7의 CPSR (Current Program Status Register)과 directly 연결되는 개념을 갖고 있지 않다. 그 대신 AArch64에서는 CPSR field의 각 값을 PSTATE로 정의하였다.

     

    PSTATE는 아래와 같은 정보를 포함한다.

    : ALU flags, Execution state, Exception level, and the processor branches

     

    PSTATE fields definition

     

    학교에서 컴퓨터 구조 시간에 배운 익숙한 ALU flags {N, Z, C, V}도 보인다(!)

     

    PSTATE.{N, Z, C, V} field는 EL0에서 access가 가능하며, 그 외의 PSTATE field는 EL1 혹은 더 상위 exception level에서 access가 가능하고 EL0에서는 UNDIFNED이다.

     

    또한 PSTATE의 field들은 special purpose register를 통해 access가 가능하며 MSR/MRS instruction을 통해 directly access가 가능하다.

     

    special registers

     

    Startup code나 init code를 살펴보면 위 special register를 assembly code에서 access하는 것을 볼 수 있는데 많이 사용되는 것은 CurrentEL과 DAIF이니 알아두면 code를 읽는데 도움이 된다.

     

    ex) 

    MRS X0, CurrentEL      // Read CurrentEL register into X0

     

    이렇게 읽은 값을 이용해 Exception level별로 stack을 잡아주거나 exception vector를 정의하는 등 다양한 방법으로 사용이 가능하다.

     

    DAIF의 경우 아래와 같은 operand를 이용해 사용한다.

     

    Operand

     

    ex)

    MSR DAIFClr, #0    // all interrupt mask clear

     

    위와 같은 형태로 excpetion level 이동 혹은 interrupt enable/disable을 위해 code상에 자주 등장한다.

     

     

    Saved Program Status Register (SPSR)

    : Exception이 발생했을 때의 PSTATE를 저장하기 위해 사용되며 exception 종료 후 PSTATE를 복원하는데 사용한다.

     

    AArch64에서는 exception으로부터 return할 때 ERET instruction을 사용한다. ERET 명령어를 수행하면 exception 이 발생한 exception level의 SPSR (SPSR_ELn)이 PSTATE로 복원되며 ELR_ELn (Exception Link Register)에 저장된 address로 돌아가 그 다음 instruction을 수행하게 된다.

     

    (Exception 발생 → PSTATE를 SPSR_ELn에 저장 → 현재 address를 ELR_ELn에 저장 → Exception handler로 분기 ERET → SPSR_ELn을 통한 PSATE 복원 ELR_ELn으로 PC restore → Execution)

     

    Field descriptions:

     

     

    Execution state에 따라 field가 나타내는 의미가 다름을 알 수 있다.

     

    다른 주요 field는 PSTATE를 설명하며 넘어갔으니 이번에는 M[4]와 M[3:0] field를 중점적으로 살펴보겠다.

    우선 M[4]는 Execution state (PSTATE.nRW) 를 나타낸다. 

    • M[4] = 1'b1 : AArch32 execution state
    • M[4] = 1'b0 : AArch64 execution state

     

    여기서 M[3:0]에 주목해야 하는데, AArch64와 AArch32에서 M field는 각기 다른 의미를 내포하고 있다.

     

    1) AArch64

    M[3:0]

    AArch64

    0000

    EL0t

    0100

    EL1t

    0101

    EL1h

    1000

    EL2t

    1001

    EL2h

    1100

    EL3t

    1101

    EL3h

     

    AArch64에서 M[3:0]은 위표와 같이 decoding되며, 현재 exception level과 stack pointer (SP)의 종류를 알려준다. 각 field의 attribute는 아래와 같이 정의됨을 알 수 있다.

    • M[3:2] : PSTATE.EL (CurrentEL register - 2'b00 : EL0, 2'b01: EL1, 2'b10: EL2, 2'b11: EL3)
    • M[1] : unused and always '0' for all non-reserved values

    2) AArch32

    M[3:0]

    AArch32

    0000

    User

    0001

    FIQ

    0010

    IRQ

    0011

    Supervisor

    0100

    Monitor

    0101

    Abort

    0110

    Hypervisor

    0111

    Undefined

    1000

    System

    AArch32에 대해 자세히 설명하지는 않겠지만, ARMv7에서와 같이 exception이 발생했을 때 해당 exception type에 따라 어떤 mode로 진입할 지 결정되는 형태이다.

    Supervisor mode는 ARMv8의 EL1과 대응되는 형태이며, Hypervisor mode는 ARMv8의 EL2와 대응되는 형태.

     

     


    다음 포스팅에서는 SPSR과 PSTATE에 대한 이해를 바탕으로 실제 Exception level transition과 world change가 어떻게 이루어지는지 알아볼 것이다.

     

     

    반응형

    댓글

Designed by Tistory.