-
[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
학교에서 컴퓨터 구조 시간에 배운 익숙한 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가 가능하다.
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를 이용해 사용한다.
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가 어떻게 이루어지는지 알아볼 것이다.
반응형'하드웨어 스케치북' 카테고리의 다른 글