ARM64 Linux Kernel/head.S

preserve_boot_args

ukjin 2025. 5. 18. 17:12
반응형

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