diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-17 09:23:21 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-12-17 09:23:21 +0100 |
commit | 06e6115044b91e559b22287c76207c3bc787800c (patch) | |
tree | dca8a71d29045efb8b5fe076cfdf27ca30b2ab30 | |
parent | 0e03a5f9fd033eb1f3defe58d799ec7e1dba564a (diff) |
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"
-rw-r--r-- | sys/src/9/pc/initcode.s | 23 | ||||
-rw-r--r-- | sys/src/9/pc/main.c | 72 | ||||
-rw-r--r-- | sys/src/9/pc64/main.c | 73 |
3 files changed, 58 insertions, 110 deletions
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<argc; i++) + ((char**)sp)[i] = UA(argv[i]); + ((char**)sp)[i] = nil; + + sp = UA(sp); +#undef UA sp -= BY2WD; } diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c index 20a209e77..ee67d0b52 100644 --- a/sys/src/9/pc64/main.c +++ b/sys/src/9/pc64/main.c @@ -29,7 +29,7 @@ int nconf; int delaylink; int idle_spin; -uchar *sp; /* user stack of init proc */ +char *sp; /* user stack of init proc */ extern void (*i8237alloc)(void); extern void bootscreeninit(void); @@ -330,54 +330,39 @@ mach0init(void) active.exiting = 0; } - -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; + } /* 8 byte word align stack */ - sp = (uchar*)((uintptr)sp & ~7); - - /* build argc, argv on stack */ - sp -= (ac+1)*sizeof(sp); - lsp = (uchar**)sp; - for(i = 0; i < ac; i++) - lsp[i] = av[i] + ((uintptr)(USTKTOP - BY2PG) - (uintptr)base); - lsp[i] = 0; - sp += (uintptr)(USTKTOP - BY2PG) - (uintptr)base; + sp = (char*)((uintptr)sp & ~7); + + /* build argv on stack */ + sp -= (argc+1)*BY2WD; + for(i=0; i<argc; i++) + ((char**)sp)[i] = UA(argv[i]); + ((char**)sp)[i] = nil; + + sp = UA(sp); +#undef UA sp -= BY2WD; } |