SPSR 레지스터는 Saved Program Status Register의 약자로 PSTATE 정보를 백업하는 용도로 사용됩니다. 따라서 SPSR 레지스터의 비트 맵은 PSTATE와 같습니다. 그렇다면 PSTATE는 SPSR 레지스터로 언제 백업될까요?  
 
    "바로 익셉션이 유발될 때입니다."
 

 

SPSR은 익셉션이 발생했을 때의 PSTATE의 정보를 저장하는 용도로 사용되며, 익셉션을 처리한 후 익셉션이 발생한 시점의 익셉션 레벨로 복귀하기 위해 사용됩니다. 즉, 익셉션과 관련된 처리를 하기 위해 사용됩니다.
 
Arm 아키텍처 문서나 어셈블리 명령어를 분석하면 SPSR 보다는 SPSR_EL1 혹은 SPSR_EL0과 같은 규칙으로 SPSR 레지스터를 명시합니다. SPSR은 익셉션 레벨을 스위칭하기 전의 정보를 저장하므로 익셉션 레벨마다 존재합니다. SP 레지스터와 같은 방식(SP_EL0, SP_EL1)으로 표기되는데요. 익셉션 레벨 별로 사용되는 SPSR 레지스터는 다음과 같습니다.
 
   * EL0: SPSR_EL0
   * EL1: SPSR_EL1
   * EL2: SPSR_EL2
   * EL3: SPSR_EL3
 
SPSR_EL0은 EL0에서 익셉션이 유발될 때의 PSTATE를 저장하고 있어 EL0로 복귀할 때 사용됩니다. 마찬가지로 SPSR_EL1은 EL1에서 익셉션이 유발될 때의 PSTATE를 저장하고 있어 EL1로 복귀할 때 사용됩니다. SPSR_EL2와 SPSR_EL3도 같은 목적으로 활용할 수 있습니다.
 
이번 절의 도입부에서 SPSR_ELx 레지스터는 PSTATE를 백업하는 용도로 사용된다고 설명했습니다. 익셉션이 유발될 때 PSTATE와 SPSR_ELx가 Arm 코어 내부에서 어떻게 업데이트되는지는 어떻게 알 수 있을까요?  다음 슈도 코드에서 확인할 수 있습니다.
 
[익셉션을 유발하는 과정]
   01 SPSR_ELx = PSTATE;
   02 branchToAddress(Exception_vector_address);  // 익셉션 벡터 주소로 점프
 
[익셉션 이전 상태로 복귀]
   03 PSTATE = SPSR_ELx;
   04 PC = ELR_ELx;
 
[정보]
위 코드는 Arm 코어가 하드웨어적으로 처리하는 동작입니다. 이 점을 염두에 둡시다.
 
 
슈도 코드에서 01번째 줄은 PSTATE를 SPSR_ELx 레지스터에 저장하는 동작입니다. 02번째는 익셉션의 종류에 따라 오프셋을 적용해 익셉션 벡터 주소로 프로그램 카운터를 브랜치하는 동작을 나타냅니다. 
 
02번 슈도 코드가 실행되면 익셉션과 관련된 처리를 하는데요. 익셉션에 대한 처리를 마무리 한 후 익셉션이 유발된 시점의 주소로 복귀해야 하는 상황에서는 03~04번째 줄와 같은 동작을 실행합니다. 
 
[중요]
03~04번째 슈도 코드가 실행되려면 eret(Exception Return) 명령어가 실행돼야 합니다.
 
 
03번째 줄은 SPSR_ELx 에 저장된 값을 PSTATE에 저장하는 동작입니다. 이를 통해 익셉션이 유발된 익셉션 레벨로 복귀합니다. 04번째 줄은 ELR_ELx에 저장된 값을 PC에 넣어주는 동작입니다.
<강의 영상>

 

.

+ Recent posts