Stefan Reinauer (stefan.reinauer@coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/424
-gerrit
commit 8a703fb508b048380007cccc0d24fd2ae629bae7 Author: Stefan Reinauer reinauer@chromium.org Date: Mon Nov 7 12:43:03 2011 -0800
selfboot: cleanup
- move cbfs_load_payload to the end so we can drop the prototype - move lb_start and lb_end to the beginning so they can be used in other functions. - drop two unused function declarations - break a 80+ characters line - fix a comment
Change-Id: I460aa1e2ccf9d95ac12233af001076f73ab0268e Signed-off-by: Stefan Reinauer reinauer@google.com --- src/boot/selfboot.c | 69 +++++++++++++++++++++----------------------------- 1 files changed, 29 insertions(+), 40 deletions(-)
diff --git a/src/boot/selfboot.c b/src/boot/selfboot.c index cdb1fa1..573dd5e 100644 --- a/src/boot/selfboot.c +++ b/src/boot/selfboot.c @@ -31,15 +31,18 @@ #include <cbfs.h> #include <lib.h>
-/* Maximum physical address we can use for the coreboot bounce buffer. - */ +/* Maximum physical address we can use for the coreboot bounce buffer. */ #ifndef MAX_ADDR #define MAX_ADDR -1UL #endif
+/* from coreboot_ram.ld: */ extern unsigned char _ram_seg; extern unsigned char _eram_seg;
+static const unsigned long lb_start = (unsigned long)&_ram_seg; +static const unsigned long lb_end = (unsigned long)&_eram_seg; + struct segment { struct segment *next; struct segment *prev; @@ -52,36 +55,6 @@ struct segment { int compression; };
-struct verify_callback { - struct verify_callback *next; - int (*callback)(struct verify_callback *vcb, - Elf_ehdr *ehdr, Elf_phdr *phdr, struct segment *head); - unsigned long desc_offset; - unsigned long desc_addr; -}; - -struct ip_checksum_vcb { - struct verify_callback data; - unsigned short ip_checksum; -}; - -static int selfboot(struct lb_memory *mem, struct cbfs_payload *payload); - -void * cbfs_load_payload(struct lb_memory *lb_mem, const char *name) -{ - struct cbfs_payload *payload; - - payload = (struct cbfs_payload *)cbfs_find_file(name, CBFS_TYPE_PAYLOAD); - if (payload == NULL) - return (void *) -1; - printk(BIOS_DEBUG, "Got a payload\n"); - - selfboot(lb_mem, payload); - printk(BIOS_EMERG, "SELFBOOT RETURNED!\n"); - - return (void *) -1; -} - /* The problem: * Static executables all want to share the same addresses * in memory because only a few addresses are reliably present on @@ -100,7 +73,6 @@ void * cbfs_load_payload(struct lb_memory *lb_mem, const char *name) * - Coreboot is preserved, so it can be returned to. * - The implementation is still relatively simple, * and much simpler than the general case implemented in kexec. - * */
static unsigned long bounce_size, bounce_buffer; @@ -111,10 +83,12 @@ static void get_bounce_buffer(struct lb_memory *mem, unsigned long req_size) unsigned long mem_entries; unsigned long buffer; int i; - lb_size = (unsigned long)(&_eram_seg - &_ram_seg); - /* Double coreboot size so I have somewhere to place a copy to return to */ + lb_size = lb_end - lb_start; + /* Plus coreboot size so I have somewhere + * to place a copy to return to. + */ lb_size = req_size + lb_size; - mem_entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]); + mem_entries = (mem->size - sizeof(*mem)) / sizeof(mem->map[0]); buffer = 0; for(i = 0; i < mem_entries; i++) { unsigned long mstart, mend; @@ -149,7 +123,8 @@ static int valid_area(struct lb_memory *mem, unsigned long buffer, */ int i; unsigned long end = start + len; - unsigned long mem_entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]); + unsigned long mem_entries = (mem->size - sizeof(*mem)) / + sizeof(mem->map[0]);
/* See if I conflict with the bounce buffer */ if (end >= buffer) { @@ -194,8 +169,6 @@ static int valid_area(struct lb_memory *mem, unsigned long buffer, return 1; }
-static const unsigned long lb_start = (unsigned long)&_ram_seg; -static const unsigned long lb_end = (unsigned long)&_eram_seg;
static int overlaps_coreboot(struct segment *seg) { @@ -211,7 +184,8 @@ static int relocate_segment(unsigned long buffer, struct segment *seg) * to load onto the bounce buffer instead. */ /* ret: 1 : A new segment is inserted before the seg. - * 0 : A new segment is inserted after the seg, or no new one. */ + * 0 : A new segment is inserted after the seg, or no new one. + */ unsigned long start, middle, end, ret = 0;
printk(BIOS_SPEW, "lb: [0x%016lx, 0x%016lx)\n", @@ -559,3 +533,18 @@ static int selfboot(struct lb_memory *mem, struct cbfs_payload *payload) return 0; }
+void *cbfs_load_payload(struct lb_memory *lb_mem, const char *name) +{ + struct cbfs_payload *payload; + + payload = (struct cbfs_payload *)cbfs_find_file(name, CBFS_TYPE_PAYLOAD); + if (payload == NULL) + return (void *) -1; + printk(BIOS_DEBUG, "Got a payload\n"); + + selfboot(lb_mem, payload); + printk(BIOS_EMERG, "SELFBOOT RETURNED!\n"); + + return (void *) -1; +} +