Files
LithosAnanake/kernel/linker/starkernel-native-rpi5.ld
T
rajamesandClaude Opus 5.5 0e2c60dac3 fix(raspi): the Pi 5's native path turns the MMU and caches on before any C; bounded mailbox; framebuffer address from dma-ranges
boards/BRINGUP.md R2/R3, FABRIC-3 SXXXIX.  The entry stub cleans the cache
over the image, builds an identity map (the image's GiB Normal, the rest
Device) and enables MMU and caches at EL2 (or EL1); rpi5_mmu.c makes the
devicetree's RAM Normal and the framebuffer uncached.  Mailbox waits give
up after one second; the buffer is cleaned around the exchange; the
framebuffer address goes through dma-ranges, not a Pi 4 mask.

New rpi5-rehearsal target runs the native image on QEMU virt at EL2.  It
found three more that would each have stopped the board: the PL011 shift
(mine, c9519173; the host test asserted it), the GIC address not carried
through /soc's ranges (new fdt_reg_address(), checked against the real
Pi 5 DTB), and no timer IRQ at EL2 (HCR_EL2.IMO/FMO/AMO).

Rehearsal: POST 1052 passed, same parity hash as UEFI.  Standard acceptance
on three ISAs: POST 1052, hash 0x82f4ae7cb2e2d424.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:58:35 -04:00

78 lines
2.1 KiB
Plaintext

/* Linker script for the Raspberry Pi 5 native (non-UEFI) kernel image.
*
* Linked from the same objects as the aarch64 kernel ELF, entered at
* rpi5_native_start (arch/aarch64/native_rpi5_entry.S, section
* .text.entry -- placed first so it sits at the load address), then
* flattened with `objcopy -O binary` into kernel_2712.img.
*
* Load address 0x80000 must match boards/raspi/config.txt's
* kernel_address=0x80000: Pi 5 firmware's own default for
* kernel_2712.img is 0x200000, so the address is pinned on both sides
* rather than left to the firmware default.
*
* __kernel_start/__kernel_end span the whole image including .bss so
* pmm_init() reserves every page the image occupies (aarch64 boot.S's
* zero-length substitutes are only correct for the UEFI loader path,
* where UEFI owns the image pages). __bss_start/__bss_end are 16-byte
* aligned for the entry stub's zeroing loop: firmware does not clear
* memory past the end of the file it loads.
*/
OUTPUT_FORMAT("elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(rpi5_native_start)
SECTIONS
{
/* RPI5_NATIVE_BASE comes from kernel/Makefile (--defsym): 0x80000 on
* the Pi 5; 0x40080000 for the QEMU virt rehearsal only, whose RAM
* starts at 0x40000000 and which loads a raw image 0x80000 into it. */
. = RPI5_NATIVE_BASE;
__kernel_start = .;
.text : {
__text_start = .;
KEEP(*(.text.entry))
*(.text .text.*)
__text_end = .;
}
.rodata : ALIGN(4K) {
__rodata_start = .;
*(.rodata .rodata.*)
__rodata_end = .;
}
.data : ALIGN(4K) {
__data_start = .;
*(.data .data.*)
*(.got .got.*)
__data_end = .;
}
.rela.dyn : ALIGN(8) {
*(.rela .rela.*)
}
.bss (NOLOAD) : ALIGN(4K) {
__bss_start = .;
*(.bss .bss.*)
*(COMMON)
. = ALIGN(16);
__bss_end = .;
}
. = ALIGN(4K);
__kernel_end = .;
/DISCARD/ : {
*(.comment)
*(.note*)
*(.eh_frame)
*(.dynamic)
*(.dynsym)
*(.interp)
}
}