Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

240
557
422298


[Arm프로세서] GIC: GICD_IGROUPR<n> 레지스터 Arm: GIC

GICD_IGROUPR은 Interrupt Group Registers의 약자로 인터럽트를 인터럽트 그룹 Group 0 혹은 Group 1으로 설정하는 레지스터입니다. GICD_IGROUPR은 GICD_IGROUPR<n>으로 표기되며 n의 범위는 0~31입니다.

Arm 아키텍처에서 지정된 인터럽트를 시큐어 혹은 논시큐어 월드에서 처리하도록 설정할 수 있습니다. 이를 위해 인터럽트를 Group 1, Group 0으로 분류해 관리하며 Group 0에 속한 인터럽트를 시큐어 인터럽트, Group 1은 논 시큐어 인터럽트로 명시합니다.

GICD_IGROUPR<n> 레지스터는 1개 비트 맵으로 인터럽트의 그룹 속성을 설정하므로, 하나의 레지스터로 32개의 인터럽트의 속성을 설정할 수 있습니다. <n>의 범위가 0~31이므로 1024(1024 = 32 x 32)개의 인터럽트 속성을 설정할 수 있습니다.

GICD_IGROUPR<n> 레지스터의 비트 맵

GICD_IGROUPR<n> 레지스터의 비트 맵은 다음과 같습니다.
 
그림 16.10 GICD_IGROUPR<n> 레지스터의 비트 맵

GICD_IGROUPR<n> 레지스터의 비트 맵은 Group_status_bit<x>으로 구성돼 있습니다. 각 비트 설정은 다음과 같습니다.

   * 0b0: 지정된 인터럽트를 Group 0으로 지정합니다. 만약 GICD_CTLR 레지스터의 DS 비트가 0이면 인터럽트를 시큐어로 지정합니다. 이 경우, 시큐어 상태에서만 해당 인터럽트를 설정해 처리할 수 있습니다.

   * 0b1: 지정된 인터럽트를 Group 1으로 지정합니다. 만약 GICD_CTLR 레지스터의 DS 비트가 1이면 인터럽트는 Group 1의 논 시큐어로 설정됩니다.
 
대부분 ‘Group 0’으로 지정된 인터럽트는 시큐어 상태에서 실행되는 Trusted 커널이 받아 처리합니다.

GICD_IGROUPR<n> 레지스터에 엑세스하는 예제 코드

이번에는 XEN 하이퍼바이저에서 GICD_IGROUPR<n> 레지스터에 엑세스하는 예제 코드를 확인해 봅시다.

https://github.com/xen-project/xen/blob/stable-4.15/xen/arch/arm/gic-v3.c
01 static void __init gicv3_dist_init(void)
02 {
...
03    /*
04     * Configure SPIs as non-secure Group-1. This will only matter
05     * if the GIC only has a single security state.
06     */
07    for ( i = NR_GIC_LOCAL_IRQS; i < nr_lines; i += 32 )
08        writel_relaxed(GENMASK(31, 0), GICD + GICD_IGROUPR + (i / 32) * 4);

08번째 줄에서 GICD_IGROUPR<n> 레지스터에 인터럽트 그룹을 설정하는 루틴을 확인할 수 있습니다. 04~05번째 줄에 있는 주석을 보면 XEN 하이퍼바이저는 SPI를 논시큐어 그룹 1로 지정한다는 사실을 알 수 있습니다.


덧글

댓글 입력 영역