Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / clients / net-snk / kernel / crt0.c
diff --git a/qemu/roms/SLOF/clients/net-snk/kernel/crt0.c b/qemu/roms/SLOF/clients/net-snk/kernel/crt0.c
new file mode 100644 (file)
index 0000000..a292273
--- /dev/null
@@ -0,0 +1,78 @@
+/******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation
+ * All rights reserved.
+ * This program and the accompanying materials
+ * are made available under the terms of the BSD License
+ * which accompanies this distribution, and is available at
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ *     IBM Corporation - initial implementation
+ *****************************************************************************/
+
+#include <stdlib.h>
+#include <string.h>
+
+extern int main (int, char**);
+extern int callback (int, char **);
+
+int _start(char *arg_string, long len);
+unsigned long callback_entry(void *base, unsigned long len);
+
+
+#define MAX_ARGV 10
+static int
+gen_argv(const char *arg_string, int len, char* argv[])
+{
+  const char *str, *str_end, *arg_string_end = arg_string + len;
+  int i;
+
+  str = arg_string;
+  for (i = 0; i < MAX_ARGV; i++)
+    {
+      str_end = str;
+
+      while((*str_end++ != ' ') && (str_end <= arg_string_end));
+
+      argv[i] = malloc(str_end-str);
+
+      memcpy (argv[i], str, str_end-str-1);
+      argv[i][str_end-str-1] = '\0';
+      str = str_end-1;
+      while(*(++str) == ' ');
+      if (str >= arg_string_end)
+       break;
+    }
+  return i+1;
+}
+
+
+
+int
+_start(char * arg_string, long len)
+{
+    int rc;
+    int argc;
+    char* argv[MAX_ARGV];
+
+    argc = gen_argv(arg_string, len, argv);
+
+    rc = main(argc, argv);
+
+    return rc;
+}
+
+/*
+ * Takes a Forth representation of a string and generates an argument array,
+ * then calls callback().
+ */
+unsigned long
+callback_entry(void *base, unsigned long len) {
+       char *argv[MAX_ARGV];
+       int argc;
+
+       argc = gen_argv(base, len, argv);
+
+       return (callback(argc, argv));
+}
+