I'd like to use it for Xen support.
Signed-off-by: Ian Campbell ian.campbell@citrix.com --- Makefile | 2 +- src/biostables.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/coreboot.c | 75 ------------------------------------------------ src/util.h | 5 +++ 4 files changed, 89 insertions(+), 76 deletions(-) create mode 100644 src/biostables.c
diff --git a/Makefile b/Makefile index d17f85a..07ba2d0 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ SRC16=$(SRCBOTH) system.c disk.c font.c SRC32FLAT=$(SRCBOTH) post.c shadow.c memmap.c coreboot.c boot.c \ acpi.c smm.c mptable.c smbios.c pciinit.c optionroms.c mtrr.c \ lzmadecode.c bootsplash.c jpeg.c usb-hub.c paravirt.c dev-i440fx.c \ - pci_region.c + pci_region.c biostables.c SRC32SEG=util.c output.c pci.c pcibios.c apm.c stacks.c
cc-option = $(shell if test -z "`$(1) $(2) -S -o /dev/null -xc \ diff --git a/src/biostables.c b/src/biostables.c new file mode 100644 index 0000000..21b8573 --- /dev/null +++ b/src/biostables.c @@ -0,0 +1,83 @@ +// Coreboot interface support. +// +// Copyright (C) 2008,2009 Kevin O'Connor kevin@koconnor.net +// +// This file may be distributed under the terms of the GNU LGPLv3 license. + +#include "config.h" // CONFIG_* +#include "util.h" // dprintf +#include "pci.h" // struct pir_header +#include "acpi.h" // struct rsdp_descriptor +#include "mptable.h" // MPTABLE_SIGNATURE + +void +copy_pir(void *pos) +{ + struct pir_header *p = pos; + if (p->signature != PIR_SIGNATURE) + return; + if (PirOffset) + return; + if (p->size < sizeof(*p)) + return; + if (checksum(pos, p->size) != 0) + return; + void *newpos = malloc_fseg(p->size); + if (!newpos) { + warn_noalloc(); + return; + } + dprintf(1, "Copying PIR from %p to %p\n", pos, newpos); + memcpy(newpos, pos, p->size); + PirOffset = (u32)newpos - BUILD_BIOS_ADDR; +} + +void +copy_mptable(void *pos) +{ + struct mptable_floating_s *p = pos; + if (p->signature != MPTABLE_SIGNATURE) + return; + if (!p->physaddr) + return; + if (checksum(pos, sizeof(*p)) != 0) + return; + u32 length = p->length * 16; + u16 mpclength = ((struct mptable_config_s *)p->physaddr)->length; + struct mptable_floating_s *newpos = malloc_fseg(length + mpclength); + if (!newpos) { + warn_noalloc(); + return; + } + dprintf(1, "Copying MPTABLE from %p/%x to %p\n", pos, p->physaddr, newpos); + memcpy(newpos, pos, length); + newpos->physaddr = (u32)newpos + length; + newpos->checksum -= checksum(newpos, sizeof(*newpos)); + memcpy((void*)newpos + length, (void*)p->physaddr, mpclength); +} + +void +copy_acpi_rsdp(void *pos) +{ + if (RsdpAddr) + return; + struct rsdp_descriptor *p = pos; + if (p->signature != RSDP_SIGNATURE) + return; + u32 length = 20; + if (checksum(pos, length) != 0) + return; + if (p->revision > 1) { + length = p->length; + if (checksum(pos, length) != 0) + return; + } + void *newpos = malloc_fseg(length); + if (!newpos) { + warn_noalloc(); + return; + } + dprintf(1, "Copying ACPI RSDP from %p to %p\n", pos, newpos); + memcpy(newpos, pos, length); + RsdpAddr = newpos; +} diff --git a/src/coreboot.c b/src/coreboot.c index f627531..6e22919 100644 --- a/src/coreboot.c +++ b/src/coreboot.c @@ -6,9 +6,6 @@
#include "memmap.h" // add_e820 #include "util.h" // dprintf -#include "pci.h" // struct pir_header -#include "acpi.h" // struct rsdp_descriptor -#include "mptable.h" // MPTABLE_SIGNATURE #include "biosvar.h" // GET_EBDA #include "lzmadecode.h" // LzmaDecode #include "smbios.h" // smbios_init @@ -194,78 +191,6 @@ fail: * BIOS table copying ****************************************************************/
-static void -copy_pir(void *pos) -{ - struct pir_header *p = pos; - if (p->signature != PIR_SIGNATURE) - return; - if (PirOffset) - return; - if (p->size < sizeof(*p)) - return; - if (checksum(pos, p->size) != 0) - return; - void *newpos = malloc_fseg(p->size); - if (!newpos) { - warn_noalloc(); - return; - } - dprintf(1, "Copying PIR from %p to %p\n", pos, newpos); - memcpy(newpos, pos, p->size); - PirOffset = (u32)newpos - BUILD_BIOS_ADDR; -} - -static void -copy_mptable(void *pos) -{ - struct mptable_floating_s *p = pos; - if (p->signature != MPTABLE_SIGNATURE) - return; - if (!p->physaddr) - return; - if (checksum(pos, sizeof(*p)) != 0) - return; - u32 length = p->length * 16; - u16 mpclength = ((struct mptable_config_s *)p->physaddr)->length; - struct mptable_floating_s *newpos = malloc_fseg(length + mpclength); - if (!newpos) { - warn_noalloc(); - return; - } - dprintf(1, "Copying MPTABLE from %p/%x to %p\n", pos, p->physaddr, newpos); - memcpy(newpos, pos, length); - newpos->physaddr = (u32)newpos + length; - newpos->checksum -= checksum(newpos, sizeof(*newpos)); - memcpy((void*)newpos + length, (void*)p->physaddr, mpclength); -} - -static void -copy_acpi_rsdp(void *pos) -{ - if (RsdpAddr) - return; - struct rsdp_descriptor *p = pos; - if (p->signature != RSDP_SIGNATURE) - return; - u32 length = 20; - if (checksum(pos, length) != 0) - return; - if (p->revision > 1) { - length = p->length; - if (checksum(pos, length) != 0) - return; - } - void *newpos = malloc_fseg(length); - if (!newpos) { - warn_noalloc(); - return; - } - dprintf(1, "Copying ACPI RSDP from %p to %p\n", pos, newpos); - memcpy(newpos, pos, length); - RsdpAddr = newpos; -} - // Attempt to find (and relocate) any standard bios tables found in a // given address range. static void diff --git a/src/util.h b/src/util.h index 2160b37..cb54432 100644 --- a/src/util.h +++ b/src/util.h @@ -405,6 +405,11 @@ void coreboot_copy_biostable(void); void cbfs_payload_setup(void); void coreboot_setup(void);
+// biostable.c +void copy_pir(void *pos); +void copy_mptable(void *pos); +void copy_acpi_rsdp(void *pos); + // vgahooks.c extern int VGAbdf; void handle_155f(struct bregs *regs);