# ARMv9 가상화·플랫폼·성능 관측

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

CPU 명령 집합만으로 보조 CPU를 켤 수 있는 것은 아닙니다. Linux는 펌웨어가 제공하는 전원 인터페이스와 플랫폼 정보를 사용합니다. 아래에서는 v6.18.37의 PSCI CPU_ON 호출 함수를 읽어 Linux CPU 번호, 하드웨어 식별자, 시작 물리 주소가 만나는 지점을 설명합니다.

## cpu_psci_cpu_boot

```c

static int cpu_psci_cpu_boot(unsigned int cpu)
{
	phys_addr_t pa_secondary_entry = __pa_symbol(secondary_entry);
	int err = psci_ops.cpu_on(cpu_logical_map(cpu), pa_secondary_entry);
	if (err && err != -EPERM)
		pr_err("failed to boot CPU%d (%d)\n", cpu, err);

	return err;
}

```

### 39행

```c

static int cpu_psci_cpu_boot(unsigned int cpu)

```

논리 CPU 번호를 받아 PSCI를 통한 보조 CPU 기동을 요청하는 함수입니다.

### 41행

```c

	phys_addr_t pa_secondary_entry = __pa_symbol(secondary_entry);

```

secondary_entry 커널 기호를 펌웨어에 전달할 물리 주소로 변환합니다. 새 CPU가 아직 정상 커널 VA 환경을 갖췄다고 가정하지 않습니다.

### 42행

```c

	int err = psci_ops.cpu_on(cpu_logical_map(cpu), pa_secondary_entry);

```

논리 CPU 번호를 하드웨어 식별자로 변환하고 PSCI CPU_ON을 호출합니다. 실제 SMCCC 통로 선택과 펌웨어 처리는 PSCI 구현에 위임합니다.

### 43행

```c

	if (err && err != -EPERM)

```

오류가 있으며 그 값이 EPERM이 아닌지 검사합니다. 모든 실패를 똑같이 로그로 반복하지 않도록 구분합니다.

### 44행

```c

		pr_err("failed to boot CPU%d (%d)\n", cpu, err);

```

일반적인 기동 실패이면 CPU 번호와 오류를 기록합니다.

### 46행

```c

	return err;

```

펌웨어 요청 결과를 호출자에게 반환합니다. 성공값은 보조 CPU의 모든 Linux 초기화가 끝났다는 보장이 아닙니다.

