Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

11105
637
415734


[Arm프로세서] Armv8: XEN 하이퍼바이저에서 익셉션 레벨을 체크 Armv8: Exception Level(EL)

EL1에서 실행되는 리눅스 커널과 마찬가지로, EL2에서 구동되는 XEN 하이퍼바이저도 익셉션 레벨을 읽어서 제어하는 코드를 볼 수 있습니다. 이번에는 EL2에서 구동되는 XEN 하이퍼바이저에서 익셉션 레벨을 체크하는 루틴을 소개합니다.

이번에는 EL2에서 실행되는 XEN 하이퍼바이저의 check_cpu_mode 레이블의 구현부를 분석하겠습니다.

https://github.com/xen-project/xen/blob/staging-4.13/xen/arch/arm/arm64/head.S
01 check_cpu_mode:
02        PRINT("- Current EL ")
03        mrs   x5, CurrentEL
04        print_reg x5
05        PRINT(" -\r\n")
06
07        /* Are we in EL2 */
08        cmp   x5, #PSR_MODE_EL2t
09        ccmp  x5, #PSR_MODE_EL2h, #0x4, ne
10        b.ne  1f /* No */
11        ret
12 1:
13        /* OK, we're boned. */
14        PRINT("- Xen must be entered in NS EL2 mode -\r\n")
15        PRINT("- Please update the bootloader -\r\n")
16        b fail
17 ENDPROC(check_cpu_mode)

check_cpu_mode 레이블은 XEN 하이퍼바이저가 부팅될 때 실행되며, 익셉션 레벨이 EL2로 설정됐는지 체크하는 동작을 수행합니다.

이어서 어셈블리 명령어를 분석하겠습니다. 먼저 03번째 줄을 보겠습니다.

03        mrs   x5, CurrentEL

CurrentEL 시스템 레지스터에 접근해 현재 익셉션 레벨을 x5 레지스터에 로딩하는 동작입니다.

마지막으로 08~11번째 줄을 보겠습니다.

08        cmp   x5, #PSR_MODE_EL2t
09        ccmp  x5, #PSR_MODE_EL2h, #0x4, ne
10        b.ne  1f /* No */
11        ret

x5 레지스터의 값과 EL2를 나타내는 #PSR_MODE_EL2t와 비교하는 루틴입니다.
x5 레지스터의 값이 #PSR_MODE_EL2t이거나 #PSR_MODE_EL2h이면 11번째 줄에 있는 'ret' 명령어를 실행해, 함수의 실행을 마무리하고 check_cpu_mode 레이블을 호출한 주소로 분기합니다.

만약 x5 레지스터의 값이 #PSR_MODE_EL2t 혹은 #PSR_MODE_EL2h이 아니면, 다음과 같이 12~16번째 줄을 실행합니다.

12 1:
13        /* OK, we're boned. */
14        PRINT("- Xen must be entered in NS EL2 mode -\r\n")
15        PRINT("- Please update the bootloader -\r\n")
16        b fail

무엇인가 시스템 설정에 문제가 있다는 정보를 출력하는 루틴이며 fail 레이블로 브랜치합니다.

여기까지 오픈 소스로 운영되는 리눅스 커널(EL1)과 XEN(EL2) 하이퍼바이저에서 익셉션 레벨을 읽어서 제어하는 명령어를 살펴봤습니다. 이 밖에도 익셉션 레벨과 관련된 명령어를 보면 이번 장에서 배운 익셉션 레벨의 개념이 바로 머릿 속에 떠오르기를 바랍니다.

#Reference Armv8: 익셉션 레벨(ELx)


Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
* 2021년 대한민국 학술원 선정 우수도서



---




핑백

덧글

댓글 입력 영역