From: weingart Date: Fri, 4 Apr 1997 17:23:29 +0000 (+0000) Subject: Replace exec_i386.S with these two files. Startprog.S is a X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=ac7f824a44a5d7989c41a68344a271f623bfad57;p=openbsd Replace exec_i386.S with these two files. Startprog.S is a stopgap measure, to be removed once I get locore.s done. --- diff --git a/sys/arch/i386/stand/libsa/exec_i386.c b/sys/arch/i386/stand/libsa/exec_i386.c new file mode 100644 index 00000000000..0cf8f40987a --- /dev/null +++ b/sys/arch/i386/stand/libsa/exec_i386.c @@ -0,0 +1,79 @@ + +/* $OpenBSD: exec_i386.c,v 1.4 1997/04/04 17:23:29 weingart Exp $ */ + +#include +#include +#include +#include + +#include +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 index 00000000000..b8e248f561f --- /dev/null +++ b/sys/arch/i386/stand/libsa/startprog.S @@ -0,0 +1,48 @@ +/* $OpenBSD: startprog.S,v 1.4 1997/04/04 17:23:31 weingart Exp $ */ + +#include + + +/* + * 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 +