ARMv8 가상화 제어 레지스터 HCR_EL2 구조 분석

HCR_EL2(Hypervisor Configuration Register)는 ARMv8 아키텍처에서 가상화 환경을 제어하는 핵심 레지스터다. 각 비트 필드는 EL2에서 가상 머신과 호스트의 동작 방식을 결정한다. 아래 표는 주요 비트별 기능을 정리한 것이다.

비트필드설명
63:60TWEDELTWE 지연 시간. HCR_EL2.TWEDEn이 1일 때, WFE* 명령어 트랩의 최소 지연은 2^(TWEDEL + 8) 사이클.
59TWEDEnTWE 지연 지연 활성화. HCR_EL2.TWE로 인한 WFE* 명령어 지연 트랩 설정. 0: 기존 지연; 1: SCR_EL3.TWEDEL에 정의된 사이클 이상.
58TID5ID 그룹 5 트랩. 0: 트랩 없음; 1: EL1/EL0에서 ID 그룹 5 레지스터 접근 시 EL2로 트랩.
57DCT기본 캐시 가능성 태그. HCR_EL2.DC가 1단계 변환의 태그 여부 제어. 0: 미태그; 1: 태그.
56ATA태그 할당 접근 제어. EL1/EL0의 태그 할당 접근. 0: 차단 (GCR_EL1 등 접근 시 정의되지 않은 명령어 예외 발생, EL2로 트랩); 1: 허용.
55TTLBOS외부 공유 도메인 TLB 유지 명령어 트랩. EL2 활성화 시 EL1에서 TLB* 명령어 실행. 0: 트랩 없음; 1: EL2로 트랩.
54TTLBIS내부 공유 도메인 TLB 유지 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
53EnSCXTSCXTNUM_EL1/EL0 접근 활성화. 0: HCR_EL2.E2H=0 또는 TGE=0일 때, 접근 시 정의되지 않은 명령어 예외; 1: 트랩 없음.
52TOCU통일 지점(Point of Unification) 캐시 유지 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
51AMVOFFEN활동 모니터 가상 오프셋 활성화. 0: 가상화 비활성화; 1: 활성화.
50TICABICIALLUIS/IC IALLUIS 캐시 유지 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
49TID4ID 그룹 4 트랩. 0: 트랩 없음; 1: EL1/EL0 접근 시 EL2로 트랩.
48GPF그래뉼 보호 결함 보고 제어. 0: EL0/EL1에서 EL2로 라우팅 안 됨; 1: EL2로 라우팅, 그래뉼 보호 검사 예외로 보고.
47FIEN결함 주입 활성화. EL1에서 ERXPFGCDN_EL1 등 접근 결과 제어. 0: EL2로 트랩; 1: 트랩 없음.
46FWB강제 쓰기-백(Write-Back). 2단계 변환 메커니즘의 결합 캐시 속성 정의.
45NV2중첩 가상화. (NV1, NV)와 함께 시스템 레지스터 읽기/쓰기를 메모리 읽기/쓰기로 변환. 0: 영향 없음; 1: NV1/NV 활성화 시 변환 및 EL2→EL1 리디렉션.
44AT주소 변환 명령어 트랩 (ARMv8.3). EL1에서 AT S1E0R 등 명령어 실행. 0: 트랩 없음; 1: EL2로 트랩.
43NV1중첩 가상화. 0: 영향 없음; 1: NV2=1 시 EL1에서 EL2 레지스터 접근을 로드/스토어로 변환; NV2=0 시 VBAR_EL1 등 접근 시 EL2로 트랩.
42NV중첩 가상화. 0: 영향 없음; 1: NV2=0 시 지정 레지스터 접근/명령어 실행 트랩; NV2=1 시 SPSR_EL2 등으로 EL1 레지스터 재정의.
41API포인터 인증 명령어 제어. 0: EL2로 트랩; 1: 트랩 없음.
40APK포인터 인증 키 레지스터 접근 트랩. 0: EL2로 트랩; 1: 트랩 없음.
39TMEEL0/EL1에서 TSTART 등 명령어 허용. 0: 정의되지 않은 명령어; 1: 허용.
38MIOCNCE내부/외부 캐시 불일치 허용. 0: 일관성 유지; 1: 일관성 손실 가능.
37TEA동기 외부 중단(SError) 라우팅. 0: EL0/EL1에서 라우팅 안 됨; 1: EL3로 안 가면 EL2로 라우팅.
36TERR오류 기록 접근 트랩. EL1에서 RAS 오류 레지스터 읽기 시. 0: 트랩 없음; 1: EL2로 트랩.
35TLORLOR 레지스터 트랩. 비보안 EL1에서 LORSA_EL1 등 접근 시. 0: 예외 없음; 1: EL2로 트랩.
34E2HEL2 호스트 모드 활성화. 0: 비활성화; 1: 호스트 OS가 EL2에서 실행 가능.
33ID2단계 명령어 캐시 비활성화. 0: 영향 없음; 1: 보통 메모리 명령어 접근을 캐시 불가로 강제.
32CD2단계 데이터 캐시 비활성화. 0: 영향 없음; 1: 보통 메모리 데이터 접근을 캐시 불가로 강제.
31RW하위 예외 레벨 실행 상태 제어. 0: AArch32; 1: AArch64.
30TRVM가상 메모리 제어 읽기 트랩. EL1에서 읽기 시. 0: 트랩 없음; 1: EL2로 트랩.
29HCDHVC 명령어 비활성화. 0: 활성화; 1: EL1/EL2에서 정의되지 않은 명령어.
28TDZDC ZVA 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
27TGE트랩 일반 예외. 0: EL0에 영향 없음; 1: EL2 활성화 시 모든 예외를 EL2로 라우팅.
26TVM가상 메모리 제어 쓰기 트랩. 0: 트랩 없음; 1: EL2로 트랩.
25TTLBTLB 유지 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
24TPU통일 지점 캐시 유지 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
23TPCP일관성/영속성 지점 캐시 유지 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
22TSWSet/Way 기반 캐시 유지 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
21TACR보조 제어 레지스터 트랩. 0: 트랩 없음; 1: EL2로 트랩.
20TIDCP구현 정의 기능 트랩. 0: 트랩 없음; 1: EL2로 트랩.
19TSCSMC 명령어 트랩. 0: 트랩 없음; 1: EL2로 트랩.
18TID3ID 그룹 3 트랩. 0: 트랩 없음; 1: EL1/EL0 접근 시 EL2로 트랩.
17TID2ID 그룹 2 트랩. 0: 트랩 없음; 1: EL1/EL0 접근 시 EL2로 트랩.
16TID1ID 그룹 1 트랩. 0: 트랩 없음; 1: EL1/EL0 접근 시 EL2로 트랩.
15TID0ID 그룹 0 트랩. 0: 트랩 없음; 1: EL1/EL0 접근 시 EL2로 트랩.
14TWEWFE 명령어 트랩. 1: EL2 미만 레벨에서 WFE 실행 시 EL2로 트랩.
13TWIWFI 명령어 트랩. 1: EL2 미만 레벨에서 WFI 실행 시 EL2로 트랩.
12DC기본 캐시 능력. 0: 영향 없음; 1: 1단계 변환 메모리 유형을 정규 비공유, 내부/외부 쓰기-백 할당으로 설정.
11:10BSU배리어 공유 업그레이드. 최소 공유 도메인 결정. 00: 비공유; 01: 내부 공유; 10: 외부 공유; 11: 전체 공유.
9FB강제 브로드캐스트. 0: 트랩 없음; 1: EL1 실행 명령어를 내부 공유 도메인에 브로드캐스트.
8VSE가상 SError 인터럽트. 0: 보류 안 함; 1: 보류.
7VI가상 IRQ 인터럽트. 0: 보류 안 함; 1: 보류.
6VF가상 FIQ 인터럽트. 0: 보류 안 함; 1: 보류.
5AMO물리 SError 인터럽트 라우팅. 0: TGE=0 시 EL2로 라우팅, TGE=1 시 미실행; 1: EL2로 라우팅, TGE=1 시 가상 SError 활성화.
4IMO물리 IRQ 인터럽트 라우팅. 0: TGE=0 시 EL2로 라우팅, TGE=1 시 미실행; 1: EL2로 라우팅, TGE=1 시 가상 IRQ 활성화.
3FMO물리 FIQ 인터럽트 라우팅. 0: TGE=0 시 EL2로 라우팅, TGE=1 시 미실행; 1: EL2로 라우팅, TGE=1 시 가상 FIQ 활성화.
2PTW보호된 테이블 탐색. 1단계 변환 시 2단계 변환 적용. 0: 보통 비캐시 메모리; 1: 2차 권한 결함 발생.
1SWIOSet/Way 명령어 오버라이드. 0: 영향 없음; 1: 데이터 무효화 Set/Way 명령어가 데이터 정리 수행.
0VM가상화 활성화. 0: 비활성화; 1: EL1/EL0 변환에 2단계 주소 변환 활성화.

가상화 호스트 확장(VHE) 모드

VHE는 Armv8.1-A에서 도입된 기능으로, 기존 Type-2 하이퍼바이저에서 호스트 커널이 EL1에, 가상화 확장이 EL2에 상주하는 구조로 인한 컨텍스트 스위칭 오버헤드를 줄이기 위해 설계되었다. VHE 모드를 활성화하면 호스트 OS의 커널이 EL2에서 직접 실행될 수 있다.

HCR_EL2.E2H 비트를 1로 설정하면 VHE가 활성화된다. 이때 호스트 OS가 EL1 레지스터에 접근하면 하드웨어가 자동으로 해당 EL2 레지스터로 리디렉션한다. 예를 들어, EL1의 TTBR0_EL1에 접근하려는 시도는 실제로 TTBR0_EL2에 접근하게 된다.

리디렉션의 핵심은 별칭 메커니즘(alias mechanism)이다. _EL12 또는 _EL02 접미사를 사용하면 EL2에서도 실제 EL1 레지스터에 접근할 수 있다. 예를 들어, TTBR0_EL12에 대한 접근은 E2H=1 상태에서 실제 TTBR0_EL1을 조작한다.

TGE 비트의 역할

VHE가 활성화된 상태에서 HCR_EL2.TGE 비트는 현재 물리 CPU를 점유 중인 주체가 호스트인지 게스트인지 구분한다.

  • 호스트: TGE=1, 호스트가 CPU를 점유 중임을 나타냄. 인터럽트와 예외는 EL2로 라우팅되며, 페이지 테이블도 호스트 것을 사용한다. 이로 인해 호스트 앱에서 SVC 호출 시 EL2로 직접 전달된다.
  • 게스트: TGE=0, 게스트 vCPU가 CPU를 점유 중임을 나타냄. 인터럽트와 예외는 EL1로 라우팅되어 게스트가 직접 처리한다.

호스트와 게스트의 HCR_EL2 설정 예시

호스트 OS의 HCR_EL2 값은 다음과 같이 정의된다:

#define HCR_EL2_VHE_HOST_FLAGS (HCR_E2H_BIT | HCR_TGE_BIT | HCR_RW_BIT)

게스트 vCPU의 HCR_EL2 값은 다음과 같다:

#define GUEST_TRAP_MODE 0UL
#define GUEST_VHE_MODE  HCR_E2H_BIT

#define GUEST_VMEM \
    (GUEST_FEAT_VM | GUEST_FEAT_SWIO | GUEST_FEAT_PTW | \
     GUEST_FEAT_FB | GUEST_FEAT_BSU | GUEST_FEAT_CD | GUEST_FEAT_ID)

#define VHE_GUEST_EXT_FLAGS \
    (GUEST_VMEM | HCR_AMO_BIT | HCR_FMO_BIT | HCR_IMO_BIT | HCR_TSC_BIT | WFI_CONFIG)

#define HCR_EL2_VHE_GUEST_FLAGS \
    (HCR_E2H_BIT | GUEST_TRAP_MODE | HCR_RW_BIT | VHE_GUEST_EXT_FLAGS)

호스트 플래그에는 HCR_TGE_BIT가 포함되어 있지만, 게스트 플래그에는 포함되지 않는다. 또한 게스트는 HCR_TSC_BIT (SMC 트랩)과 WFI_CONFIG 같은 추가 플래그를 설정하여 특정 명령어의 트랩을 제어한다.

태그: HCR_EL2 ARMv8 VHE 가상화 EL2

7월 30일 13:19에 게시됨