From c8ea0062691ff2023cf6e6f533b70acdcedbc3b6 Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Sun, 16 Sep 2007 14:37:59 +0000 Subject: [PATCH] When outputting ELF segments in LAR, the utility will use the segment number from ELF as segment number in the file. This works nicely when there are no skips (e.g. not PT_LOAD segments, which are discarded). If one segment is skipped, we get a bump: normal/payload0/segment0 (27288 bytes, lzma compressed to 14506 bytes @0x64c0) normal/payload0/segment2 (211136 bytes, lzma compressed to 70905 bytes @0x9dc0) The LAR loader wont load segment2, and in this particular case, grub2-lb will only boot into rescue mode (segment0 contains it). Attached patch adds a counter for segment number in the LAR utility to solve this bug: normal/payload0/segment0 (27288 bytes, lzma compressed to 14506 bytes @0x64c0) normal/payload0/segment1 (211136 bytes, lzma compressed to 70905 bytes @0x9dc0) Also the eagle eyed can see that I merged in Uwe's multiple-payload patch into current stage1, which includes the segment support. And this means that grub2-lb without any hacks works when loaded from LAR segments. Signed-off-by: Alex Beregszaszi Acked-by: Ronald G. Minnich Acked-by: Uwe Hermann git-svn-id: svn://coreboot.org/repository/LinuxBIOSv3@498 f3766cd6-281f-0410-b1cd-43a5c92072e9 --- util/lar/stream.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/lar/stream.c b/util/lar/stream.c index 15d48665cc..da0b6bd7ab 100644 --- a/util/lar/stream.c +++ b/util/lar/stream.c @@ -79,6 +79,7 @@ int output_elf_segments(struct lar *lar, char *name, char *filebuf, u32 entry; int i; int size; + int segment = 0; char *header; char ename[64]; int headers; @@ -153,7 +154,7 @@ int output_elf_segments(struct lar *lar, char *name, char *filebuf, entry, phdr[i].p_paddr); } /* ok, copy it out */ - sprintf(ename, "%s/segment%d", name, i); + sprintf(ename, "%s/segment%d", name, segment++); complen = lar_compress(&header[phdr[i].p_offset], size, temp, &thisalgo); ret = lar_add_entry(lar, ename, temp, complen, size, phdr[i].p_paddr, entry, thisalgo);