From 06e6115044b91e559b22287c76207c3bc787800c Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 17 Dec 2014 09:23:21 +0100 Subject: pc, pc64: remove old B.COM command line parsing and just pass tokenized BOOTLINE to /boot/boot as argv[] this change allows command line passing to /boot/boot from qemu like: qemu -kernel 9pcf -append "-u glenda tcp" --- sys/src/9/pc/initcode.s | 23 ---------------- sys/src/9/pc/main.c | 72 ++++++++++++++++++++---------------------------- sys/src/9/pc64/main.c | 73 ++++++++++++++++++++----------------------------- 3 files changed, 58 insertions(+), 110 deletions(-) delete mode 100644 sys/src/9/pc/initcode.s diff --git a/sys/src/9/pc/initcode.s b/sys/src/9/pc/initcode.s deleted file mode 100644 index 55018f9ee..000000000 --- a/sys/src/9/pc/initcode.s +++ /dev/null @@ -1,23 +0,0 @@ -#include "/sys/src/libc/9syscall/sys.h" - -TEXT main(SB),$0 - - /* - * exec("/boot", bootv) - */ - LEAL 4(SP),AX - PUSHL AX - LEAL boot(SB),AX - PUSHL AX - PUSHL $0 - MOVL $EXEC,AX - INT $64 - - /* - * should never get here - */ -here: - JMP here - -GLOBL boot+0(SB),$6 -DATA boot+0(SB)/5,$"/boot" diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c index b82a6db9e..d2233530b 100644 --- a/sys/src/9/pc/main.c +++ b/sys/src/9/pc/main.c @@ -29,7 +29,7 @@ Conf conf; char *confname[MAXCONF]; char *confval[MAXCONF]; int nconf; -uchar *sp; /* user stack of init proc */ +char *sp; /* user stack of init proc */ int delaylink; int idle_spin; @@ -321,53 +321,39 @@ userinit(void) ready(p); } -uchar * -pusharg(char *p) -{ - int n; - - n = strlen(p)+1; - sp -= n; - memmove(sp, p, n); - return sp; -} - void bootargs(void *base) { - int i, ac; - uchar *av[32]; - uchar **lsp; - char *cp = BOOTLINE; - char buf[64]; - - sp = (uchar*)base + BY2PG - sizeof(Tos); - - ac = 0; - av[ac++] = pusharg("boot"); - - /* when boot is changed to only use rc, this code can go away */ - cp[BOOTLINELEN-1] = 0; - buf[0] = 0; - if(strncmp(cp, "fd", 2) == 0){ - sprint(buf, "local!#f/fd%lddisk", strtol(cp+2, 0, 0)); - av[ac++] = pusharg(buf); - } else if(strncmp(cp, "sd", 2) == 0){ - sprint(buf, "local!#S/sd%c%c/fs", *(cp+2), *(cp+3)); - av[ac++] = pusharg(buf); - } else if(strncmp(cp, "ether", 5) == 0) - av[ac++] = pusharg("-n"); + char *argv[8]; + int i, argc; + +#define UA(ka) ((char*)(ka) + ((uintptr)(USTKTOP - BY2PG) - (uintptr)base)) + sp = (char*)base + BY2PG - sizeof(Tos); + + /* push boot command line onto the stack */ + sp -= BOOTLINELEN; + sp[BOOTLINELEN-1] = '\0'; + memmove(sp, BOOTLINE, BOOTLINELEN-1); + + /* parse boot command line */ + argc = tokenize(sp, argv, nelem(argv)); + if(argc < 1){ + strcpy(sp, "boot"); + argc = 0; + argv[argc++] = sp; + } /* 4 byte word align stack */ - sp = (uchar*)((ulong)sp & ~3); - - /* build argc, argv on stack */ - sp -= (ac+1)*sizeof(sp); - lsp = (uchar**)sp; - for(i = 0; i < ac; i++) - lsp[i] = av[i] + ((USTKTOP - BY2PG) - (ulong)base); - lsp[i] = 0; - sp += (USTKTOP - BY2PG) - (ulong)base; + sp = (char*)((uintptr)sp & ~3); + + /* build argv on stack */ + sp -= (argc+1)*BY2WD; + for(i=0; i