Gert Hulselmans
2010-Jun-28 01:11 UTC
[PATCH] chain.c32: pass partition number to stage2 of Grub Legacy
Grub Legacy stage2 will read the install_partition variable from memory address 0x8208. We only need to change the value at 0x820a to the correct partition number: -1: whole drive (default) 0-3: primary partitions 4-*: logical partitions Signed-off-by: Gert Hulselmans <gerth at zytor.com> --- com32/modules/chain.c | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff --git a/com32/modules/chain.c b/com32/modules/chain.c index a76d275..4f5baf1 100644 --- a/com32/modules/chain.c +++ b/com32/modules/chain.c @@ -123,11 +123,11 @@ static struct options { uint16_t seg; bool isolinux; bool cmldr; + bool grub; bool grldr; bool swap; bool hide; bool sethidden; - bool grub; } opt; struct data_area { @@ -1585,10 +1585,13 @@ int main(int argc, char *argv[]) if (opt.grub) { regs.ip = 0x200; /* jump 0x200 bytes into the loadfile */ - /* 0xffffff00 seems to be GRUB ways to record that it''s - "root" is the whole disk (and not a partition). */ - *(uint32_t *) ((unsigned char *)data[ndata].data + 0x208) - 0xffffff00ul; + /* GRUB''s stage2 wants the partition number in the install_partition + * variable, located at memory address 0x8208. + * We only need to change the value of memory address 0x820a too: + * -1: whole drive (default) + * 0-3: primary partitions + * 4-*: logical partitions */ + ((uint8_t*) data[ndata].data)[0x20a] = (uint8_t)(whichpart - 1); } ndata++; -- 1.6.3.3