Explanation.
It seems to be a case of spurious line that got back into grub_elf32_load
and grub_elf64_load, nested function.
if (load_hook && load_hook (phdr, &load_addr))
return 1;
load_addr = phdr->p_paddr;
That sequence did not make sense to me, it overwrites the correct value of
load_addr from the preceding line.
Briefly -
with set debug=elf
Result -
for the bug -
..kernel/elf.c:429 Loading segment at 0x0 size 6ae0c8
fails to load kernel at 0x0 as expected.
the fix /* load_addr = phdr->p_paddr; */
..kernel/elf.c:429 Loading segment at 0x1400000 size 6ae0c8
loads kernel
----------------------
Details -
Both 32bit ibook G4 and 64bit powerpc G5 were affected, and failed to load
linux kernel.
I rechecked and got some debug results to illustrate, hand copied from boot
screen.
I used grub_dprintf("elfpxw","phdr->p_paddr=%llx,
load_addr=%x\n",phdr->p_paddr,load_addr);
In grub_elf64_load as used by my powerpc64 g5.
The debugging outputs shown as they occur in sequence with the code (approx
line umbers)
if (load_hook && load_hook (phdr, &load_addr))
return 1;
..kernel/elf.c:421 phdr->p_paddr= c000000000000000 load_addr= 1400000
/* spurious line overwrites load_addr value from load_hook*/
load_addr = phdr->p_paddr;
..kernel/elf.c:424 phdr->p_paddr= c000000000000000 load_addr= 0
grub_dprintf ("elfpxw", "Loading segment at 0x%llx, size 0x%llx\n",
(unsigned long long) load_addr,
(unsigned long long) phdr->p_memsz);
..kernel/elf.c:429 Loading segment at 0x0 size 6ae0c8
- load kernel at 0x0 fails as expected
=========
The correct result with /* load_addr = phdr->p_paddr;*/
if (load_hook && load_hook (phdr, &load_addr))
return 1;
phdr->p_paddr= c000000000000000 load_addr= 1400000
/* load_addr = phdr->p_paddr; */
phdr->p_paddr= c000000000000000 load_addr= 1400000
Loading segment at 0x1400000 size 6ae0c8
- load kernel at 0x1400000 succeeds.
=========
peter cros.
On Mon, Sep 29, 2008 at 12:46 AM, Robert Millan <[EMAIL PROTECTED]> wrote:
> On Mon, Sep 29, 2008 at 12:42:36AM +1000, peter cros wrote:
> > Hi,
> >
> > There is a bug in /kern/elf.c/ (target powerpc, platform ieee1275),
> > causing load linux to fail on my powerpc64 g5 and ibook g4 32bit.
> >
> > Here is a diff of the fix I found necessary for rev 1878 (bug has existed
> in
> > previous versions).
> >
> > It was a one liner -
> >
> > diff -pu grubsvn/kern grubtry/kern/elf.c
> > ---------------------------------------------
> > --- grubsvn/kern/elf.c 2008-09-28 17:27:56.000000000 +1000
> > +++ grubtry/kern/elf.c 2008-09-28 23:16:38.000000000 +1000
> > @@ -234,7 +234,7 @@ grub_elf32_load (grub_elf_t _elf, grub_e
> >
> > if (load_hook && load_hook (phdr, &load_addr))
> > return 1;
> > - load_addr = phdr->p_paddr;
> > +/** pxwdebug - not required - load_addr = phdr->p_paddr; **/
>
> Hi,
>
> Thanks for pointing this out. Unless someone understands your change,
> we'd need you to explain why this line isn't necessary, and why it was
> causing trouble.
>
> --
> Robert Millan
>
> The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
> how) you may access your data; but nobody's threatening your freedom: we
> still allow you to remove your data and not access it at all."
>
>
> _______________________________________________
> Grub-devel mailing list
> [email protected]
> http://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel