반응형
preserve_boot_args 함수는 bootloader에서 전달한 x0 - x3 값을 boot_args에 저장하고 mmu 활성화 여부를 mmu_enabled_at_boot 변수에 저장한다.
SYM_CODE_START_LOCAL(preserve_boot_args)
mov x21, x0 // x21=FDT
adr_l x0, boot_args // record the contents of
stp x21, x1, [x0] // x0 .. x3 at kernel entry
stp x2, x3, [x0, #16]
cbnz x19, 0f // skip cache invalidation if MMU is on
dmb sy // needed before dc ivac with
// MMU off
add x1, x0, #0x20 // 4 x 8 bytes
b dcache_inval_poc // tail call
0: str_l x19, mmu_enabled_at_boot, x0
ret
SYM_CODE_END(preserve_boot_args)
x0 값을 x21에 저장한다. x0 값에는 bootloader에서 전달한 FDT 주소가 존재한다.
boot_args 주소를 x0에 저장하고, stp(store pair) 명령어로 x0, x1, x2, x3 값을 boot_args에 저장한다.
/*
* The recorded values of x0 .. x3 upon kernel entry.
*/
u64 __cacheline_aligned boot_args[4];
x19에는 record_mmu_state에서 전달한 MMU_ON 정보가 저장되어 있다. x19 가 0이 아니면 즉, MMU가 켜져있으면 0으로 분기하며, 0일 경우 x1에 x0 + 0x20을 한 후 dcache_inval_poc 함수를 호출한다. 이후 mmu_enabled_at_boot 변수에 x19 값을 저장한다.
dcache_inval_poc 함수는 주어진 메모리 범위가 캐시라인으로 정렬되어 있지 않으면 clean, invalidate 하며, 정렬되어 있다면 invalidate만 수행한다.
MMU가 꺼져 있기 때문에, boot_args에 저장된 값들이 정확한 값으로 읽히도록 보장하기 위해 cache를 invalidate 시킨다.
반응형
'ARM64 Linux Kernel > head.S' 카테고리의 다른 글
| head.S의 시작 (0) | 2025.05.18 |
|---|---|
| record_mmu_state (0) | 2025.05.18 |
| head.S (0) | 2025.04.27 |