diff options
Diffstat (limited to 'sys/arch/i386/stand/libsa/startprog.S')
-rw-r--r-- | sys/arch/i386/stand/libsa/startprog.S | 45 |
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 + |