[OpenBIOS] [PATCHv2 09/25] x86: introduce arch_init_program() implementation

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Thu Sep 8 09:00:48 CEST 2016


And switch start_elf() over to use it.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
 arch/x86/context.c |   40 +++++++++++++++++++++++++++++++++++-----
 1 file changed, 35 insertions(+), 5 deletions(-)

diff --git a/arch/x86/context.c b/arch/x86/context.c
index de852f4..6d57bfa 100644
--- a/arch/x86/context.c
+++ b/arch/x86/context.c
@@ -10,6 +10,8 @@
 #include "kernel/kernel.h"
 #include "segment.h"
 #include "context.h"
+#include "libopenbios/bindings.h"
+#include "libopenbios/initprogram.h"
 #include "libopenbios/sys_info.h"
 #include "boot.h"
 #include "openbios.h"
@@ -93,6 +95,16 @@ init_context(uint8_t *stack, uint32_t stack_size, int num_params)
 	(stack + stack_size - (sizeof(*ctx) + num_params*sizeof(uint32_t)));
     memset(ctx, 0, sizeof(*ctx));
 
+    return ctx;
+}
+
+/* init-program */
+int
+arch_init_program(void)
+{
+    struct context volatile *ctx = __context;
+    ucell type, entry, param;
+    
     /* Fill in reasonable default for flat memory model */
     ctx->gdt_base = virt_to_phys(gdt);
     ctx->gdt_limit = GDT_LIMIT;
@@ -104,8 +116,26 @@ init_context(uint8_t *stack, uint32_t stack_size, int num_params)
     ctx->ss = FLAT_DS;
     ctx->esp = virt_to_phys(ESP_LOC(ctx));
     ctx->return_addr = virt_to_phys(__exit_context);
+    
+    /* Set param */
+    feval("load-state >ls.param @");
+    param = POP();
+    ctx->param[0] = param;
 
-    return ctx;
+    /* Only elf-boot type has a param */
+    feval("load-state >ls.file-type @");
+    type = POP();
+    if (type == 0) {
+        ctx->eax = 0xe1fb007;
+        ctx->ebx = param;
+    }
+
+    /* Set entry point */
+    feval("load-state >ls.entry @");
+    entry = POP();
+    ctx->eip = entry;
+
+    return 0;
 }
 
 /* Switch to another context. */
@@ -127,10 +157,10 @@ unsigned int start_elf(unsigned long entry_point, unsigned long param)
 {
     struct context *ctx = client_ctx;
 
-    ctx->eip = entry_point;
-    ctx->param[0] = param;
-    ctx->eax = 0xe1fb007;
-    ctx->ebx = param;
+    PUSH(param);
+    feval("load-state >ls.param !");
+
+    arch_init_program();
 
     ctx = switch_to(ctx);
     return ctx->eax;
-- 
1.7.10.4




More information about the OpenBIOS mailing list