This wraps up re-adding linuxbios table support in a limited form.

Remaining to be done: 
PIRQ table
MP table
ACPI table
relocate the GDT reload to a sensible place -- or figure out if we even
need to bother; we're back to execute in place and the GDT is in flash
rom ==> we can leave it until we boot the payload I think. 

At this point, however, we've got the basic bits to sensibly create
tables. 

This has been tested and works on bochs. 

It is working to a point, but still failing on qemu for reasons we don't
quite understand. 

Elfboot
Found ELF candidate at offset 0
New segment addr 0x100000 size 0x21310 offset 0xc0 filesize 0x7348
(cleaned up) New segment addr 0x100000 size 0x7348 offset 0xc0
set 00100000 to 0 for 0 bytes
Copy to 00100000 from fffc3f24 for 29512 bytes
New segment addr 0x121320 size 0x48 offset 0x7420 filesize 0x48
(cleaned up) New segment addr 0x121320 size 0x48 offset 0x7420
set 00121320 to 0 for 0 bytes
Copy to 00121320 from fffcb284 for 72 bytes
Dropping non PT_LOAD segment
Dropping non PT_LOAD segment
Jumping to boot code at 0x1047c0
FILO version 0.5 (rminnich@q.ccstar.lanl.gov) Sun Feb 25 10:19:16 MST
2007
collect_sys_info: boot eax = 0xfe
collect_sys_info: boot ebx = 0xffffd4ca
collect_sys_info: boot arg = 0x1047c0
collect_linuxbios_info: NOT Searching for LinuxBIOS tables...
Can't get memory map from firmware. Using hardcoded default.
collect_sys_info: 0000000000000000-00000000000a0000
collect_sys_info: 0000000000100000-0000000002000000
collect_sys_info: RAM 32 MB
relocate: Current location: 0x1000c7-0x12142e
relocate: Relocating to 0x1fdec90-0x1fffff7... ok
Press <Enter> for default boot, or <Esc> for boot prompt...  
boot: hdc1:/phase1 root=/dev/hdc1  console=ttyS0,115200
malloc_check: invalid head->prev_size: 0x0

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Acked-by: Ronald G. Minnich <rminnich@gmail.com>
Acked-by: Stefan Reinauer <stepan@coresystems.de>



git-svn-id: svn://coreboot.org/repository/LinuxBIOSv3@133 f3766cd6-281f-0410-b1cd-43a5c92072e9
This commit is contained in:
Ronald G. Minnich 2007-02-26 14:54:21 +00:00
parent 6b86ee6c96
commit 7514f6507c
5 changed files with 28 additions and 26 deletions

View file

@ -41,6 +41,7 @@ struct gdtarg {
unsigned int base;
} __attribute__((packed));
#if 0
// Copy GDT to new location and reload it
// 2003-07 by SONE Takeshi
// Ported from Etherboot to LinuxBIOS 2005-08 by Steve Magnani
@ -56,10 +57,15 @@ void move_gdt(unsigned long newgdt)
__asm__ __volatile__ ("lgdt %0\n\t" : : "m" (gdtarg));
printk(BIOS_DEBUG,"ok\n");
}
struct lb_memory *write_tables(void)
#endif
struct lb_memory *arch_write_tables(void)
{
unsigned long low_table_start, low_table_end, new_low_table_end;
#if 0
#if HAVE_MP_TABLE==1
unsigned long new_low_table_end;
#endif
#endif
unsigned long low_table_start, low_table_end;
unsigned long rom_table_start, rom_table_end;
rom_table_start = 0xf0000;
@ -123,10 +129,12 @@ struct lb_memory *write_tables(void)
low_table_end = 0x500;
}
#warning "Move the move_gdt to somewhere else ... not table writing!"
#if 0
// Relocate the GDT to reserved memory, so it won't get clobbered
move_gdt(low_table_end);
low_table_end += &gdt_end - &gdt;
#endif
/* The linuxbios table must be in 0-4K or 960K-1M */
write_linuxbios_table(
low_table_start, low_table_end,

View file

@ -28,6 +28,7 @@
//#include <arch/pirq_routing.h>
//#include <arch/smp/mpspec.h>
//#include <arch/acpi.h>
#include <device/device.h>
#include <tables.h>
@ -149,7 +150,7 @@ void lb_strings(struct lb_header *header)
u32 tag;
const u8 *string;
} strings[] = {
{ LB_TAG_VERSION, "3 -- FIXME", },
{ LB_TAG_VERSION, (u8 *) "3 -- FIXME", },
/*
{ LB_TAG_VERSION, linuxbios_version, },
{ LB_TAG_EXTRA_VERSION, linuxbios_extra_version, },
@ -168,7 +169,7 @@ void lb_strings(struct lb_header *header)
struct lb_string *rec;
size_t len;
rec = (struct lb_string *)lb_new_record(header);
len = strlen(strings[i].string);
len = strlen((char *)strings[i].string);
rec->tag = strings[i].tag;
rec->size = (sizeof(*rec) + len + 1 + 3) & ~3;
memcpy(rec->string, strings[i].string, len+1);
@ -382,7 +383,6 @@ unsigned long write_linuxbios_table(
unsigned long low_table_start, unsigned long low_table_end,
unsigned long rom_table_start, unsigned long rom_table_end)
{
unsigned long table_size;
struct lb_header *head;
struct lb_memory *mem;

View file

@ -234,6 +234,7 @@ struct cmos_checksum {
#define CHECKSUM_PCBIOS 1
};
struct lb_memory *arch_write_tables(void);
unsigned long write_linuxbios_table(
unsigned long low_table_start, unsigned long low_table_end,
unsigned long rom_table_start, unsigned long rom_table_end);

View file

@ -31,6 +31,15 @@ void memcpy(void *dest, const void *src, int len)
*d++ = *s++;
}
/* seperate function in case we decide to use the built-in -- not sure yet. */
void memmove(void *dest, const void *src, int len)
{
unsigned char *d = dest;
const unsigned char *s = src;
while (len--)
*d++ = *s++;
}
void memset(void *v, unsigned char a, int len)
{
unsigned char *cp = v;

View file

@ -20,28 +20,12 @@
*/
#include <console/console.h>
#include <cpu.h>
//#include <cpu.h>
#include <tables.h>
#include <tables.h>
#include <boot/linuxbios_tables.h>
struct lb_memory *
write_tables(void)
{
unsigned long low_table_start, low_table_end;
unsigned long rom_table_start, rom_table_end;
rom_table_start = 0xf0000;
rom_table_end = 0xf0000;
/* Start low addr at 16 bytes instead of 0 because of a buglet
* in the generic linux unzip code, as it tests for the a20 line.
*/
low_table_start = 0;
low_table_end = 16;
/* The linuxbios table must be in 0-4K or 960K-1M */
write_linuxbios_table(
low_table_start, low_table_end,
rom_table_start, rom_table_end);
return get_lb_mem();
return arch_write_tables();
}