Added Linux bzImage and initrd support.
This commit is contained in:
parent
d72f916818
commit
6658d7314d
1 changed files with 40 additions and 8 deletions
|
@ -181,12 +181,20 @@ load_image(void)
|
|||
<= LINUX_SETUP_MAXLEN)
|
||||
&& ((text_len
|
||||
= (((long)*((unsigned short *)
|
||||
(buffer+LINUX_KERNEL_LEN_OFFSET))) << 4))
|
||||
<= LINUX_KERNEL_MAXLEN)
|
||||
&& (data_len+text_len+SECTOR_SIZE) <= ((filemax+15)&0xFFFFFFF0))
|
||||
(buffer+LINUX_KERNEL_LEN_OFFSET))) << 4)),
|
||||
(data_len+text_len+SECTOR_SIZE) <= ((filemax+15)&0xFFFFFFF0)))
|
||||
{
|
||||
printf(" Loading: [format=Linux-piggyback, setup=0x%x, size=0x%x]\n",
|
||||
data_len, text_len);
|
||||
int big_linux = buffer[LINUX_SETUP_LOAD_FLAGS] & LINUX_FLAG_BIG_KERNEL;
|
||||
buffer[LINUX_SETUP_LOADER] = 0x70;
|
||||
if (!big_linux && text_len > LINUX_KERNEL_MAXLEN)
|
||||
{
|
||||
printf(" linux 'zImage' kernel too big, try 'make bzImage'\n");
|
||||
errnum = ERR_WONT_FIT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf(" [Linux-%s, setup=0x%x, size=0x%x]\n",
|
||||
(big_linux ? "bzImage" : "zImage"), data_len, text_len);
|
||||
|
||||
if (mbi.mem_lower >= 608)
|
||||
{
|
||||
|
@ -217,8 +225,9 @@ load_image(void)
|
|||
/* offset into file */
|
||||
filepos = data_len+SECTOR_SIZE;
|
||||
|
||||
cur_addr = LINUX_STAGING_AREA + text_len;
|
||||
if (read(LINUX_STAGING_AREA, text_len) >= (text_len-16))
|
||||
return 'l';
|
||||
return (big_linux ? 'L' : 'l');
|
||||
else if (!errnum)
|
||||
errnum = ERR_EXEC_FORMAT;
|
||||
}
|
||||
|
@ -243,7 +252,7 @@ load_image(void)
|
|||
mbi.syms.a.addr = 0;
|
||||
mbi.syms.a.pad = 0;
|
||||
|
||||
printf(" Loading: [format=%s-%s", str2, str);
|
||||
printf(" [%s-%s", str2, str);
|
||||
|
||||
str = "";
|
||||
|
||||
|
@ -387,7 +396,7 @@ load_image(void)
|
|||
errnum = ERR_EXEC_FORMAT;
|
||||
else
|
||||
{
|
||||
/* XXX load symbols */
|
||||
/* XXX load ELF symbols */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -414,6 +423,8 @@ load_module(void)
|
|||
if (!open(cur_cmdline) || !(len = read(cur_addr, -1)))
|
||||
return 0;
|
||||
|
||||
printf(" [Multiboot-module @ 0x%x, 0x%x bytes]\n", cur_addr, len);
|
||||
|
||||
/* these two simply need to be set if any modules are loaded at all */
|
||||
mbi.flags |= MB_INFO_MODS;
|
||||
mbi.mods_addr = (int)mll;
|
||||
|
@ -430,6 +441,27 @@ load_module(void)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
load_initrd(void)
|
||||
{
|
||||
int len;
|
||||
long *ramdisk, moveto;
|
||||
|
||||
if (!open(cur_cmdline) || !(len = read(cur_addr, -1)))
|
||||
return 0;
|
||||
|
||||
moveto = ((mbi.mem_upper+0x400)*0x400 - len) & 0xfffff000;
|
||||
bcopy((void*)cur_addr, (void*)moveto, len);
|
||||
|
||||
printf(" [Linux-initrd @ 0x%x, 0x%x bytes]\n", moveto, len);
|
||||
|
||||
ramdisk = (long*)(LINUX_SETUP+LINUX_SETUP_INITRD);
|
||||
ramdisk[0] = moveto;
|
||||
ramdisk[1] = len;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* All "*_boot" commands depend on the images being loaded into memory
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue