summaryrefslogtreecommitdiff
path: root/sys/arch/i386/stand/libsa/startprog.S
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/i386/stand/libsa/startprog.S')
-rw-r--r--sys/arch/i386/stand/libsa/startprog.S45
1 files changed, 45 insertions, 0 deletions
diff --git a/sys/arch/i386/stand/libsa/startprog.S b/sys/arch/i386/stand/libsa/startprog.S
new file mode 100644
index 00000000000..e1f4e267a43
--- /dev/null
+++ b/sys/arch/i386/stand/libsa/startprog.S
@@ -0,0 +1,45 @@
+/* $OpenBSD: startprog.S,v 1.1 1997/03/31 03:12:17 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
+ pushw %bx
+ pushl %ecx
+
+ # convert over the other data segs
+ movl $0x10, %ebx
+ movl %bx, %ds
+ movl %bx, %es
+
+ # convert the PC (and code seg)
+ lret
+