summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/cbfs.h3
-rw-r--r--src/lib/hardwaremain.c12
-rw-r--r--src/lib/selfboot.c18
3 files changed, 22 insertions, 11 deletions
diff --git a/src/include/cbfs.h b/src/include/cbfs.h
index ac249aabf5..c0098eacdb 100644
--- a/src/include/cbfs.h
+++ b/src/include/cbfs.h
@@ -78,7 +78,8 @@ int run_address(void *f);
/* Defined in src/lib/selfboot.c */
struct lb_memory;
-int selfboot(struct lb_memory *mem, struct cbfs_payload *payload);
+void *selfload(struct lb_memory *mem, struct cbfs_payload *payload);
+void selfboot(void *entry);
/* Defined in individual arch / board implementation. */
int init_default_cbfs_media(struct cbfs_media *media);
diff --git a/src/lib/hardwaremain.c b/src/lib/hardwaremain.c
index adee3ca709..ed2a516372 100644
--- a/src/lib/hardwaremain.c
+++ b/src/lib/hardwaremain.c
@@ -198,6 +198,7 @@ static boot_state_t bs_write_tables(void *arg)
static boot_state_t bs_payload_load(void *arg)
{
void *payload;
+ void *entry;
timestamp_add_now(TS_LOAD_PAYLOAD);
@@ -206,15 +207,20 @@ static boot_state_t bs_payload_load(void *arg)
if (! payload)
die("Could not find a payload\n");
+ entry = selfload(get_lb_mem(), payload);
+
+ if (! entry)
+ die("Could not load payload\n");
+
/* Pass the payload to the next state. */
- boot_states[BS_PAYLOAD_BOOT].arg = payload;
+ boot_states[BS_PAYLOAD_BOOT].arg = entry;
return BS_PAYLOAD_BOOT;
}
-static boot_state_t bs_payload_boot(void *payload)
+static boot_state_t bs_payload_boot(void *entry)
{
- selfboot(get_lb_mem(), payload);
+ selfboot(entry);
printk(BIOS_EMERG, "Boot failed");
/* Returning from this state will fail because the following signals
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index 324d43e838..4ebe10935d 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -512,7 +512,7 @@ static int load_self_segments(
return 1;
}
-int selfboot(struct lb_memory *mem, struct cbfs_payload *payload)
+void *selfload(struct lb_memory *mem, struct cbfs_payload *payload)
{
u32 entry=0;
struct segment head;
@@ -527,10 +527,18 @@ int selfboot(struct lb_memory *mem, struct cbfs_payload *payload)
printk(BIOS_SPEW, "Loaded segments\n");
+ return (void *)entry;
+
+out:
+ return NULL;
+}
+
+void selfboot(void *entry)
+{
/* Reset to booting from this image as late as possible */
boot_successful();
- printk(BIOS_DEBUG, "Jumping to boot code at %x\n", entry);
+ printk(BIOS_DEBUG, "Jumping to boot code at %p\n", entry);
post_code(POST_ENTER_ELF_BOOT);
#if CONFIG_COLLECT_TIMESTAMPS
@@ -543,9 +551,5 @@ int selfboot(struct lb_memory *mem, struct cbfs_payload *payload)
checkstack(_estack, 0);
/* Jump to kernel */
- jmp_to_elf_entry((void*)entry, bounce_buffer, bounce_size);
- return 1;
-
-out:
- return 0;
+ jmp_to_elf_entry(entry, bounce_buffer, bounce_size);
}