[PATCH v2] powerpc: Add reloc_offset() to font bitmap pointer used for bootx_printf()
Christophe Leroy
christophe.leroy at csgroup.eu
Wed Nov 12 22:38:36 AEDT 2025
Le 10/11/2025 à 00:30, Finn Thain a écrit :
> Since Linux v6.7, booting using BootX on an Old World PowerMac produces
> an early crash. Stan Johnson writes, "the symptoms are that the screen
> goes blank and the backlight stays on, and the system freezes (Linux
> doesn't boot)."
>
> Further testing revealed that the failure can be avoided by disabling
> CONFIG_BOOTX_TEXT. Bisection revealed that the regression was caused by
> a change to the font bitmap pointer that's used when btext_init() begins
> painting characters on the display, early in the boot process.
>
> Christophe Leroy explains, "before kernel text is relocated to its final
> location ... data is addressed with an offset which is added to the
> Global Offset Table (GOT) entries at the start of bootx_init()
> by function reloc_got2(). But the pointers that are located inside a
> structure are not referenced in the GOT and are therefore not updated by
> reloc_got2(). It is therefore needed to apply the offset manually by using
> PTRRELOC() macro."
>
> Cc: Cedar Maxwell <cedarmaxwell at mac.com>
> Cc: Stan Johnson <userm57 at yahoo.com>
> Cc: "Dr. David Alan Gilbert" <linux at treblig.org>
> Cc: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> Cc: stable at vger.kernel.org
> Link: https://lists.debian.org/debian-powerpc/2025/10/msg00111.html
> Link: https://lore.kernel.org/linuxppc-dev/d81ddca8-c5ee-d583-d579-02b19ed95301@yahoo.com/
> Reported-by: Cedar Maxwell <cedarmaxwell at mac.com>
> Closes: https://lists.debian.org/debian-powerpc/2025/09/msg00031.html
> Bisected-by: Stan Johnson <userm57 at yahoo.com>
> Tested-by: Stan Johnson <userm57 at yahoo.com>
> Fixes: 0ebc7feae79a ("powerpc: Use shared font data")
> Suggested-by: Christophe Leroy <christophe.leroy at csgroup.eu>
> Signed-off-by: Finn Thain <fthain at linux-m68k.org>
Reviewed-by: Christophe Leroy <christophe.leroy at csgroup.eu>
> ---
> Changed since v1:
> - Improved commit log entry to better explain the need for PTRRELOC().
> ---
> arch/powerpc/kernel/btext.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/kernel/btext.c b/arch/powerpc/kernel/btext.c
> index 7f63f1cdc6c3..ca00c4824e31 100644
> --- a/arch/powerpc/kernel/btext.c
> +++ b/arch/powerpc/kernel/btext.c
> @@ -20,6 +20,7 @@
> #include <asm/io.h>
> #include <asm/processor.h>
> #include <asm/udbg.h>
> +#include <asm/setup.h>
>
> #define NO_SCROLL
>
> @@ -463,7 +464,7 @@ static noinline void draw_byte(unsigned char c, long locX, long locY)
> {
> unsigned char *base = calc_base(locX << 3, locY << 4);
> unsigned int font_index = c * 16;
> - const unsigned char *font = font_sun_8x16.data + font_index;
> + const unsigned char *font = PTRRELOC(font_sun_8x16.data) + font_index;
> int rb = dispDeviceRowBytes;
>
> rmci_maybe_on();
More information about the Linuxppc-dev
mailing list