# ARM Realm·CCA와 Linux RSI 소스 분석

v6.18.37 / arch/arm64/kernel/rsi.c

Linux가 Realm 안에서 실행되는지는 CPU 제품명만 보고 정하지 않습니다. 호출 통로와 RSI ABI를 확인하고 보호·공유 메모리 처리를 설치한 뒤 활성화합니다. v6.18.37의 arm64_rsi_init 전체를 한 줄씩 읽으며 게스트 지원의 실제 초기화 조건을 확인합니다.

## arm64_rsi_init

```c

void __init arm64_rsi_init(void)
{
	if (arm_smccc_1_1_get_conduit() != SMCCC_CONDUIT_SMC)
		return;
	if (!rsi_version_matches())
		return;
	if (WARN_ON(rsi_get_realm_config(&config)))
		return;
	prot_ns_shared = __phys_to_pte_val(BIT(config.ipa_bits - 1));

	if (arm64_ioremap_prot_hook_register(realm_ioremap_hook))
		return;

	if (realm_register_memory_enc_ops())
		return;

	arm64_rsi_setup_memory();

	static_branch_enable(&rsi_present);
}

```

### 142행

```c

void __init arm64_rsi_init(void)

```

Realm 게스트의 RSI 초기화 함수이며 부팅 후 회수 가능한 __init 코드입니다.

### 144행

```c

	if (arm_smccc_1_1_get_conduit() != SMCCC_CONDUIT_SMC)

```

SMCCC 호출 통로가 SMC인지 확인합니다. 이 구현이 요구하는 통로가 아니면 RSI 초기화를 진행하지 않습니다.

### 145행

```c

		return;

```

조건이 맞지 않으면 일반 실행 환경을 유지하며 반환합니다.

### 146행

```c

	if (!rsi_version_matches())

```

RSI 존재 및 ABI 버전이 이 커널과 맞는지 확인합니다.

### 147행

```c

		return;

```

사용 가능한 버전을 협상하지 못하면 이 기능을 활성화하지 않습니다.

### 148행

```c

	if (WARN_ON(rsi_get_realm_config(&config)))

```

Realm 설정을 가져오며 실패하면 경고를 남깁니다. 아래에서는 그 설정의 IPA 폭을 사용합니다.

### 149행

```c

		return;

```

설정을 얻지 못했으면 미초기화 값을 쓰지 않고 끝냅니다.

### 150행

```c

	prot_ns_shared = __phys_to_pte_val(BIT(config.ipa_bits - 1));

```

IPA 폭의 최상위 비트를 공유 표현에 사용할 PTE 형식으로 변환해 보관합니다. 특정 고정 비트 번호를 모든 플랫폼에 가정하지 않습니다.

### 152행

```c

	if (arm64_ioremap_prot_hook_register(realm_ioremap_hook))

```

ioremap이 보호·공유 범위에 맞는 속성을 선택하도록 hook을 등록합니다.

### 153행

```c

		return;

```

hook 등록이 실패하면 준비가 끝난 것으로 취급하지 않고 반환합니다.

### 155행

```c

	if (realm_register_memory_enc_ops())

```

Realm 메모리 보호·공유 전환에 사용할 연산을 등록합니다.

### 156행

```c

		return;

```

연산 등록 실패 시 활성화 표시까지 진행하지 않습니다.

### 158행

```c

	arm64_rsi_setup_memory();

```

사용 가능한 메모리 범위를 보호 상태로 준비합니다. 이 helper의 실패 정책은 원문에서 panic으로 이어질 수 있습니다.

### 160행

```c

	static_branch_enable(&rsi_present);

```

앞선 초기화가 완료된 뒤 RSI 존재 static key를 켭니다. 이후 코드가 기능 사용 가능을 판단하는 표식입니다.

