[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 6/7] libc: crt0.c: argv aus PPB auslesen, falls vorhanden



+ libc: Programme akzeptieren jetzt einen übergebenen PPB und lesen dann
  ihre Argumente von dort aus. Die alte Methode ohne PPB bleibt
  unterstützt, weil der Kernel keinen PPB für init bereitstellt.

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/modules/lib/crt0.c |   32 ++++++++++++++++++++++++++++----
 1 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/src/modules/lib/crt0.c b/src/modules/lib/crt0.c
index fb42271..46aa284 100644
--- a/src/modules/lib/crt0.c
+++ b/src/modules/lib/crt0.c
@@ -55,7 +55,19 @@ static void call_constructors(void)
     }
 }
 
-void __attribute__((weak)) _start(void)
+asm (
+    ".global _start\n"
+    ".weak _start\n"
+    "_start:\n"
+    "   push %ecx\n"
+    "   push %ebx\n"
+    "   push %eax\n"
+    "   call c_start\n"
+    "   ud2\n"
+);
+
+static void __attribute__((used))
+    c_start(uint32_t ppb_shm_id, void* ppb, size_t ppb_size)
 {
     char* args = NULL;
     int argc;
@@ -73,12 +85,24 @@ void __attribute__((weak)) _start(void)
     //Kommandozeilenargumente Parsen ----
     //TODO: Das ist alles noch sehr primitiv
     //Erst den String vom Kernel holen
-    args = get_cmdline();
-    argc = cmdline_get_argc(args);
+    if (ppb_shm_id) {
+        argc = ppb_get_argc(ppb, ppb_size);
+        if (argc < 0) {
+            printf("Ungueltiger PPB!\n");
+            abort();
+        }
+    } else {
+        args = get_cmdline();
+        argc = cmdline_get_argc(args);
+    }
 
     char* argv[argc + 1];
 
-    cmdline_copy_argv(args, (const char**) argv, argc);
+    if (ppb_shm_id) {
+        ppb_copy_argv(ppb, ppb_size, argv, argc);
+    } else {
+        cmdline_copy_argv(args, (const char**) argv, argc);
+    }
 
     call_constructors();
     int result = main(argc, argv);
-- 
1.6.0.2