# ARM64의 IRQ 스택과 컨트롤러를 연결합니다

v6.6 / arch/arm64/kernel/irq.c

범용 IRQ 자료구조가 준비된 뒤에는 아키텍처와 장치에 맞는 수신 경로가 필요합니다. ARM64의 init_IRQ는 IRQ 처리용 스택과 보호 상태를 만들고 irqchip 초기화를 연결합니다. 우선순위 기반 마스킹을 쓰는지에 따라 DAIF 처리도 달라집니다.

## init_IRQ

```c

void __init init_IRQ(void)
{
	init_irq_stacks();
	init_irq_scs();
	irqchip_init();

	if (system_uses_irq_prio_masking()) {
		/*
		 * Now that we have a stack for our IRQ handler, set
		 * the PMR/PSR pair to a consistent state.
		 */
		WARN_ON(read_sysreg(daif) & PSR_A_BIT);
		local_daif_restore(DAIF_PROCCTX_NOIRQ);
	}
}

```

### 122행

```c

void __init init_IRQ(void)

```

arm64에서 CPU별 IRQ 스택과 IRQ 컨트롤러 초기화를 연결합니다. 소프트웨어 IRQ 번호 관리가 준비된 뒤 실제 예외 처리 경로와 하드웨어를 사용할 수 있게 합니다.

### 124행

```c

	init_irq_stacks();

```

IRQ 처리에 사용할 CPU별 스택을 준비합니다.

### 125행

```c

	init_irq_scs();

```

IRQ 문맥의 반환 주소 보호용 shadow call stack을 준비합니다.

### 126행

```c

	irqchip_init();

```

DT나 ACPI 등 플랫폼 정보에 따라 인터럽트 컨트롤러 드라이버 초기화를 연결합니다.

### 128행

```c

	if (system_uses_irq_prio_masking()) {

```

CPU 예외 마스크와 별도로 IRQ 우선순위 마스킹을 쓰는 구성인지 확인합니다.

### 133행

```c

		WARN_ON(read_sysreg(daif) & PSR_A_BIT);

```

DAIF의 A 비트가 아직 설정되어 SError가 가려져 있는지 확인합니다. 앞 setup_arch가 SError를 이미 허용했다는 초기화 순서를 검증하며 일반 IRQ의 I 비트를 검사하는 줄이 아닙니다.

### 134행

```c

		local_daif_restore(DAIF_PROCCTX_NOIRQ);

```

정해 둔 D/A/I/F 예외 마스크 상태로 맞춥니다. 일반 IRQ 비트 하나만 쓰는 것으로 단순화하지 않습니다.

