diff -ur grub-0.5.96.1.orig/stage2/boot.c grub-0.5.96.1/stage2/boot.c
--- grub-0.5.96.1.orig/stage2/boot.c Mon Oct 16 22:42:08 2000
+++ grub-0.5.96.1/stage2/boot.c Tue Apr 3 18:28:59 2001
@@ -29,7 +29,8 @@
static int cur_addr;
entry_func entry_addr;
static struct mod_list mll[99];
-
+unsigned int lma;
+unsigned int vma;
/*
* The next two functions, 'load_image' and 'load_module', are the building
@@ -107,7 +108,7 @@
else
entry_addr = (entry_func) (pu.elf->e_entry & 0xFFFFFF);
- if (((int) entry_addr) < 0x100000)
+ if ((entry_addr) < (entry_func)0x100000)
errnum = ERR_BELOW_1MB;
/* don't want to deal with ELF program header at some random
@@ -519,6 +520,13 @@
memsiz = phdr->p_memsz;
if (memaddr < RAW_ADDR (0x100000))
errnum = ERR_BELOW_1MB;
+ // p_addr and v_addr of the first program segment are the
+ // physical base address and
+ // virtual base address respectively
+ if (!loaded) {
+ lma = RAW_ADDR (phdr->p_paddr);
+ vma = RAW_ADDR (phdr->p_vaddr);
+ }
/* make sure we only load what we're supposed to! */
if (filesiz > memsiz)
filesiz = memsiz;
diff -ur grub-0.5.96.1.orig/stage2/builtins.c grub-0.5.96.1/stage2/builtins.c
--- grub-0.5.96.1.orig/stage2/builtins.c Fri Oct 20 03:50:00 2000
+++ grub-0.5.96.1/stage2/builtins.c Tue Apr 3 18:32:19 2001
@@ -290,7 +290,7 @@
case KERNEL_TYPE_MULTIBOOT:
/* Multiboot */
- multi_boot ((int) entry_addr, (int) &mbi);
+ multi_boot ((lma + (unsigned int)entry_addr - vma), (int) &mbi);
break;
default:
diff -ur grub-0.5.96.1.orig/stage2/shared.h grub-0.5.96.1/stage2/shared.h
--- grub-0.5.96.1.orig/stage2/shared.h Thu Oct 19 23:27:52 2000
+++ grub-0.5.96.1/stage2/shared.h Tue Apr 3 18:26:13 2001
@@ -463,6 +463,8 @@
MAX_ERR_NUM
} grub_error_t;
+extern unsigned int lma;
+extern unsigned int vma;
extern unsigned long install_partition;
extern unsigned long boot_drive;
extern unsigned long install_second_sector;
_______________________________________________
Bug-grub mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-grub