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"
This commit is contained in:
cinap_lenrek 2014-12-17 09:23:21 +01:00
parent 0e03a5f9fd
commit 06e6115044
3 changed files with 50 additions and 102 deletions

View file

@ -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"

View file

@ -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];
char *argv[8];
int i, argc;
sp = (uchar*)base + BY2PG - sizeof(Tos);
#define UA(ka) ((char*)(ka) + ((uintptr)(USTKTOP - BY2PG) - (uintptr)base))
sp = (char*)base + BY2PG - sizeof(Tos);
ac = 0;
av[ac++] = pusharg("boot");
/* push boot command line onto the stack */
sp -= BOOTLINELEN;
sp[BOOTLINELEN-1] = '\0';
memmove(sp, BOOTLINE, BOOTLINELEN-1);
/* 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");
/* 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);
sp = (char*)((uintptr)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;
/* 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;
}

View file

@ -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];
char *argv[8];
int i, argc;
sp = (uchar*)base + BY2PG - sizeof(Tos);
#define UA(ka) ((char*)(ka) + ((uintptr)(USTKTOP - BY2PG) - (uintptr)base))
sp = (char*)base + BY2PG - sizeof(Tos);
ac = 0;
av[ac++] = pusharg("boot");
/* push boot command line onto the stack */
sp -= BOOTLINELEN;
sp[BOOTLINELEN-1] = '\0';
memmove(sp, BOOTLINE, BOOTLINELEN-1);
/* 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");
/* 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);
sp = (char*)((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;
/* 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;
}