Replace exec_i386.S with these two files. Startprog.S is a
authorweingart <weingart@openbsd.org>
Fri, 4 Apr 1997 17:23:29 +0000 (17:23 +0000)
committerweingart <weingart@openbsd.org>
Fri, 4 Apr 1997 17:23:29 +0000 (17:23 +0000)
stopgap measure, to be removed once I get locore.s done.

sys/arch/i386/stand/libsa/exec_i386.c [new file with mode: 0644]
sys/arch/i386/stand/libsa/startprog.S [new file with mode: 0644]

diff --git a/sys/arch/i386/stand/libsa/exec_i386.c b/sys/arch/i386/stand/libsa/exec_i386.c
new file mode 100644 (file)
index 0000000..0cf8f40
--- /dev/null
@@ -0,0 +1,79 @@
+
+/* $OpenBSD: exec_i386.c,v 1.4 1997/04/04 17:23:29 weingart Exp $ */
+
+#include <sys/param.h>
+#include <sys/exec.h>
+#include <sys/reboot.h>
+#include <libsa.h>
+
+#include <biosdev.h>
+int startprog(void *, void *);
+static int bootdev;
+
+void
+machdep_start(startaddr, howto, loadaddr, ssym, esym)
+       char *startaddr, *loadaddr, *ssym, *esym;
+       int howto;
+{
+       static int argv[9];
+       struct exec *x;
+
+
+#ifdef DEBUG
+       x = (void *)loadaddr;
+       printf("exec {\n");
+       printf("  a_midmag = %lx\n", x->a_midmag);
+       printf("  a_text = %lx\n", x->a_text);
+       printf("  a_data = %lx\n", x->a_data);
+       printf("  a_bss = %lx\n", x->a_bss);
+       printf("  a_syms = %lx\n", x->a_syms);
+       printf("  a_entry = %lx\n", x->a_entry);
+       printf("  a_trsize = %lx\n", x->a_trsize);
+       printf("  a_drsize = %lx\n", x->a_drsize);
+       printf("}\n");
+
+       getchar();
+#endif
+
+       (int)startaddr &= 0xffffff;
+
+       /*
+        *  We now pass the various bootstrap parameters to the loaded
+        *  image via the argument list
+        *
+        *  arg0 = 8 (magic)
+        *  arg1 = boot flags
+        *  arg2 = boot device
+        *  arg3 = start of symbol table (0 if not loaded)
+        *  arg4 = end of symbol table (0 if not loaded)
+        *  arg5 = transfer address from image
+        *  arg6 = transfer address for next image pointer
+        *  arg7 = conventional memory size (640)
+        *  arg8 = extended memory size (8196)
+        */
+       argv[0] = 8;
+       argv[1] = howto;
+       argv[2] = bootdev;
+       argv[3] = (int)ssym;
+       argv[4] = (int)esym;
+       argv[5] = (int)startaddr;
+       argv[6] = 0;
+       argv[7] = biosmem(0);
+       argv[8] = biosmem(1);
+
+#ifdef DEBUG
+       { int i;
+               for(i = 0; i <= argv[0]; i++)
+                       printf("argv[%d] = %x\n", i, argv[i]);
+
+               getchar();
+       }
+#endif
+
+       /****************************************************************/
+       /* copy that first page and overwrite any BIOS variables        */
+       /****************************************************************/
+       printf("entry point at 0x%x\n", (int)startaddr);
+       startprog(startaddr, argv);
+}
+
diff --git a/sys/arch/i386/stand/libsa/startprog.S b/sys/arch/i386/stand/libsa/startprog.S
new file mode 100644 (file)
index 0000000..b8e248f
--- /dev/null
@@ -0,0 +1,48 @@
+/*     $OpenBSD: startprog.S,v 1.4 1997/04/04 17:23:31 weingart Exp $  */
+
+#include <machine/asm.h>
+
+
+/*
+ * startprog(phyaddr, argv)
+ *     start the program on protected mode where phyaddr is the entry point
+ */
+ENTRY(startprog)
+       pushl   %ebp
+       movl    %esp, %ebp
+
+       # get things we need into registers
+       movl    8(%ebp), %ecx           # entry offset 
+       movl    12(%ebp), %eax          # &argv
+
+       # make a new stack at 0:0x90000 (big segs)
+       movl    $0x10, %ebx
+       movw    %bx, %ss
+       movl    $0x90000, %ebx
+       movl    %ebx, %esp
+
+       # push some number of args onto the stack
+       pushl   28(%eax)                # argv[7] = cnvmem
+       pushl   32(%eax)                # argv[8] = extmem
+       pushl   16(%eax)                # argv[4] = esym
+       pushl   12(%eax)                # argv[3] = cyl offset
+       pushl   8(%eax)                 # argv[2] = bootdev
+       pushl   4(%eax)                 # argv[1] = howto
+       pushl   $0                      # dummy 'return' address
+
+       # push on our entry address
+       movl    $0x8, %ebx              # segment
+       pushl   %ebx
+       pushl   %ecx
+
+       # convert over the other data segs
+       movl    $0x10, %ebx
+       movl    %bx, %ds
+       movl    %bx, %es
+       movl    %bx, %ss
+       movl    %bx, %fs
+       movl    %bx, %gs
+
+       # convert the PC (and code seg)
+       lret
+