Re: [PATCH v2 2/3] sparc32: derive phys_base from the PAGE_OFFSET mapping
Sam Ravnborg <[email protected]>
| Newsgroups | gmane.linux.ports.sparc,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
Hi Magnus. On Sun, Aug 16, 2026 at 09:50:16AM +0200, Magnus Lindholm wrote: > setup_arch() computes phys_base as the base of the lowest sp_banks[] > entry, that is, where RAM starts, and assumes the kernel image was loaded > there. That holds for the traditional boot path, where SILO places the > image at physical 0x4000 and PAGE_OFFSET is mapped to physical 0. > > It stops holding once the image no longer fits there. SILO loads a kernel > between physical 0x4000 and its own text at 0x280000, a window of 2605056 > bytes; a current sparc32 kernel is roughly twice that. The loader must > then place the image elsewhere in physical memory and map PAGE_OFFSET to > it, at which point phys_base describes where RAM begins rather than what > PAGE_OFFSET maps to, and the two disagree. > > phys_base is the offset __pa() and __va() are defined in terms of, so once > it is wrong every early translation is wrong by the difference, including > the physical addresses written into page table descriptors. The > tablewalker then follows pointers into pages that hold nothing while the > same tables read back correctly through the nocache view. The failure > surfaces as a hang right after the context table pointer is installed and > the TLB flushed, with nothing on the console to explain it, since the PROM > mappings the early console depends on have become just as unreachable. > > Ask the MMU what PAGE_OFFSET actually translates to and adopt that. > __get_phys() already implements this probe for sun4m and sun4d and returns > zero elsewhere, so no new low level MMU access is introduced and machines > without an SRMMU are unaffected. > > Memory below the kernel cannot be reached through the linear map, which > runs upward from PAGE_OFFSET, so drop the banks that fall below it rather > than leave entries that __va() would translate to below PAGE_OFFSET. > > With this a 6MB kernel loaded at physical 0x03000000 boots on sun4m: the > context table lands at its true physical address, > srmmu_inherit_prom_mappings() preserves the PROM console mappings, and > srmmu.c needs no change at all, since map_kernel() already handles a > non-zero phys_base via do_large_mapping(). The patch looks good but I dislike we introduce more code that uses sp_banks. Can we somehow use memblock for this? Part of my old grand plan was to replace all uses of sp_banks with memblock. I have some old patches somewhere in case you are ready to give this a spin. The patch is: Reviewed-by: Sam Ravnborg <[email protected]> My sp_banks comment shall not hold it back. It is anyway Andreas that will handle them. Sam