Blame SOURCES/0223-powerpc-ieee1275-load-grub-at-4MB-not-2MB.patch

5593c8
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
5593c8
From: Daniel Axtens <dja@axtens.net>
5593c8
Date: Fri, 22 Oct 2021 09:53:15 +1100
5593c8
Subject: [PATCH] powerpc-ieee1275: load grub at 4MB, not 2MB
5593c8
5593c8
This was first reported under PFW but reproduces under SLOF.
5593c8
5593c8
 - The core.elf was 2126152 = 0x207148 bytes in size with the following
5593c8
   program headers (per readelf):
5593c8
5593c8
Entry point 0x200000
5593c8
There are 4 program headers, starting at offset 52
5593c8
5593c8
Program Headers:
5593c8
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
5593c8
  LOAD           0x000160 0x00200000 0x00200000 0x21f98 0x2971c RWE 0x8
5593c8
  GNU_STACK      0x0220f8 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4
5593c8
  LOAD           0x0220f8 0x00232000 0x00232000 0x1e4e50 0x1e4e50 RWE 0x4
5593c8
  NOTE           0x206f48 0x00000000 0x00000000 0x00200 0x00000 R   0x4
5593c8
5593c8
 - SLOF places the ELF file at 0x4000 (after the reserved space for
5593c8
   interrupt handlers etc.) upwards. The image was 2126152 = 0x207148
5593c8
   bytes in size, so it runs from 0x4000 - 0x20b148. We'll call 0x4000 the
5593c8
   load address.
5593c8
5593c8
0x0        0x4000         0x20b148
5593c8
 |----------|--------------|
5593c8
 | reserved | ELF contents |
5593c8
5593c8
 - SLOF then copies the first LOAD program header (for .text). That runs
5593c8
   for 0x21f98 bytes. It runs from
5593c8
      (load addr + 0x160) to (load addr + 0x160 + 0x21f98)
5593c8
    = 0x4160 to 0x260f8
5593c8
   and we copy it to 0x200000 to 0x221f98. This overwrites the end of the
5593c8
   image:
5593c8
5593c8
0x0       0x4000     0x200000        0x221f98
5593c8
 |----------|------------|---------------|
5593c8
 | reserved | ELF cont.. | .text section |
5593c8
5593c8
 - SLOF zeros the bss up to PhysAddr + MemSize = 0x22971c
5593c8
5593c8
0x0       0x4000      0x200000       0x221f98 0x22971c
5593c8
 |----------|------------|---------------|--------|
5593c8
 | reserved | ELF cont.. | .text section | bss 0s |
5593c8
5593c8
 - SLOF then goes to fulfil the next LOAD header (for mods), which is
5593c8
   for 0x1e4e50 bytes. We copy from
5593c8
      (load addr + 0x220f8) to (load addr + 0x220f8 + 0x1e4e50)
5593c8
    = 0x260f8 to 0x20af48
5593c8
   and we copy it to 0x232000 to 0x416e50:
5593c8
5593c8
0x0       0x4000      0x200000       0x221f98 0x22971c
5593c8
 |----------|------------|---------------|--------|
5593c8
 | reserved | ELF cont.. | .text section | bss 0s |
5593c8
               |-------------|
5593c8
               | copied area |
5593c8
            0x260f8      0x20af48
5593c8
5593c8
   This goes poorly:
5593c8
5593c8
0x0       0x4000      0x200000       0x221f98 0x22971c 0x232000 0x40bf08      0x416e50
5593c8
 |----------|------------|---------------|--------|-----|-----------|-------------|
5593c8
 | reserved | ELF cont.. | .text section | bss 0s | pad | some mods | .text start |
5593c8
5593c8
This matches the observations on the running system - 0x40bf08 was where
5593c8
the contents of memory no longer matched the contents of the ELF file.
5593c8
5593c8
This was reported as a license verification failure on SLOF as the
5593c8
last module's .module_license section fell past where the corruption
5593c8
began.
5593c8
5593c8
Signed-off-by: Daniel Axtens <dja@axtens.net>
5593c8
[rharwood@redhat.com: trim very detailed commit message]
5593c8
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
5593c8
---
5593c8
 grub-core/Makefile.core.def | 2 +-
5593c8
 include/grub/offsets.h      | 2 +-
5593c8
 2 files changed, 2 insertions(+), 2 deletions(-)
5593c8
5593c8
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
5593c8
index 3f3459b2c70..6b00eb55575 100644
5593c8
--- a/grub-core/Makefile.core.def
5593c8
+++ b/grub-core/Makefile.core.def
5593c8
@@ -89,7 +89,7 @@ kernel = {
5593c8
   i386_xen_pvh_ldflags     = '$(TARGET_IMG_BASE_LDOPT),0x100000';
5593c8
 
5593c8
   mips_loongson_ldflags    = '-Wl,-Ttext,0x80200000';
5593c8
-  powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
5593c8
+  powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x400000';
5593c8
   sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400';
5593c8
   mips_arc_ldflags    = '-Wl,-Ttext,$(TARGET_LINK_ADDR)';
5593c8
   mips_qemu_mips_ldflags    = '-Wl,-Ttext,0x80200000';
5593c8
diff --git a/include/grub/offsets.h b/include/grub/offsets.h
5593c8
index 871e1cd4c38..69211aa798b 100644
5593c8
--- a/include/grub/offsets.h
5593c8
+++ b/include/grub/offsets.h
5593c8
@@ -63,7 +63,7 @@
5593c8
 #define GRUB_KERNEL_SPARC64_IEEE1275_LINK_ADDR 0x4400
5593c8
 
5593c8
 #define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ALIGN 4
5593c8
-#define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR 0x200000
5593c8
+#define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR 0x400000
5593c8
 
5593c8
 #define GRUB_KERNEL_MIPS_LOONGSON_LINK_ADDR         0x80200000
5593c8