# ARM64 Exception과 system call 소스 분석

v6.18.37 / arch/arm64/kernel/entry-common.c

EL0 프로그램의 시스템 호출은 일반 함수 호출보다 준비할 일이 많습니다. 하드웨어의 예외 상태 저장 다음에 Linux가 pt_regs를 만들고 C 처리 환경을 준비합니다. 이 단원은 v6.18.37의 el0_svc 전체를 읽어 원본 entry.S 분석과 C 단계가 이어지는 지점을 설명합니다.

## el0_svc

```c

static void noinstr el0_svc(struct pt_regs *regs)
{
	arm64_enter_from_user_mode(regs);
	cortex_a76_erratum_1463225_svc_handler();
	fpsimd_syscall_enter();
	local_daif_restore(DAIF_PROCCTX);
	do_el0_svc(regs);
	arm64_exit_to_user_mode(regs);
	fpsimd_syscall_exit();
}

```

### 743행

```c

static void noinstr el0_svc(struct pt_regs *regs)

```

EL0에서 온 AArch64 시스템 호출의 C 진입 함수입니다. regs에는 어셈블리에서 준비한 사용자 상태가 들어 있습니다. noinstr는 이 민감한 구간의 계측을 제한합니다.

### 745행

```c

	arm64_enter_from_user_mode(regs);

```

사용자 실행에서 커널 실행으로 들어왔음을 커널의 진입 상태 관리에 반영합니다. 원래 레지스터 값을 새로 저장하는 함수 호출로 읽지 않습니다.

### 746행

```c

	cortex_a76_erratum_1463225_svc_handler();

```

Cortex-A76의 특정 erratum을 위한 SVC 진입 보완 경로를 호출합니다. 영향을 받지 않는 시스템까지 같은 추가 동작을 한다고 가정하지 않습니다.

### 747행

```c

	fpsimd_syscall_enter();

```

시스템 호출 경계에서 FP·벡터 상태와 mode를 정리합니다. 일반 정수 인수만 전달하는 단계와 구분합니다.

### 748행

```c

	local_daif_restore(DAIF_PROCCTX);

```

프로세스 문맥에 맞는 DAIF 상태를 복원해 정상 커널 처리에 필요한 예외 허용 상태를 갖춥니다.

### 749행

```c

	do_el0_svc(regs);

```

실제 syscall 번호 해석과 공통 진입 작업을 담당하는 do_el0_svc로 넘깁니다.

### 750행

```c

	arm64_exit_to_user_mode(regs);

```

사용자 복귀 전에 처리해야 할 일을 수행합니다. 시그널이나 스케줄 작업 등으로 단순히 즉시 복귀하지 않을 수 있습니다.

### 751행

```c

	fpsimd_syscall_exit();

```

시스템 호출 종료에 필요한 FP·벡터 상태 처리를 수행합니다. 최종 ERET는 이 함수 밖의 어셈블리 복귀 경로에 있습니다.

