pci.c: remove redundant varargck etherif.h: remove redundant (and conflicting) definition of tbdf io.h: add defnition of strtotbdf, and define Pciconf like nix arch.c, conf.c: move configuration to conf.c, and use pause in delay() l64v.s: sync with nix fns.h: update wuth pause, options; also sort properly. Reference: /n/atom/patch/applied2013/fsoptions Date: Sun Sep 15 05:32:00 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/fs/amd64/pci.c Sun Sep 15 05:31:05 2013 +++ /sys/src/fs/amd64/pci.c Sun Sep 15 05:31:07 2013 @@ -331,8 +331,6 @@ uchar checksum; }; -#pragma varargck type "T" int - static int Tfmt(Fmt* fmt) { --- /sys/src/fs/amd64/etherif.h Sun Sep 15 05:31:09 2013 +++ /sys/src/fs/amd64/etherif.h Sun Sep 15 05:31:10 2013 @@ -7,7 +7,6 @@ int ctlrno; char iname[NAMELEN]; char oname[NAMELEN]; - int tbdf; /* type+busno+devno+funcno */ int mbps; /* Mbps */ uchar ea[Easize]; --- /sys/src/fs/amd64/io.h Sun Sep 15 05:31:14 2013 +++ /sys/src/fs/amd64/io.h Sun Sep 15 05:31:16 2013 @@ -296,6 +296,7 @@ void pcireset(void); void pcisetbme(Pcidev*); void pciclrbme(Pcidev*); +int strtotbdf(char*, char**, int); enum { Npciopt = 10, @@ -304,13 +305,16 @@ typedef struct Pciconf Pciconf; struct Pciconf { - char type[NAMELEN]; + char *type; uintmem port; + uintmem mem; int irq; + int tbdf; int nopt; - char opt[Npciopt][Pcioptlen]; + char optbuf[128]; + char *opt[8]; }; extern int pciconfig(char*, int, Pciconf*); --- /sys/src/fs/amd64/arch.c Sun Sep 15 05:31:19 2013 +++ /sys/src/fs/amd64/arch.c Sun Sep 15 05:31:21 2013 @@ -27,25 +27,23 @@ static Arch aarch; void -delay(int ms) +microdelay(int µs) { u64int r, t; - if(ms <= 0) - ms = 1; r = rdtsc(); - for(t = r + m->cpumhz*1000ull*ms; r < t; r = rdtsc()) - ; + for(t = r + m->cpumhz*µs; r < t; r = rdtsc()) + pause(); } void -microdelay(int µs) +delay(int ms) { u64int r, t; r = rdtsc(); - for(t = r + m->cpumhz*µs; r < t; r = rdtsc()) - ; + for(t = r + m->cpumhz*1000ull*ms; r < t; r = rdtsc()) + pause(); } static char* @@ -220,86 +218,6 @@ printcpufreq(); } -/* - * Where configuration info is left for the loaded programme. - * This will turn into a structure as more is done by the boot loader - * (e.g. why parse the .ini file twice?). - * There are 1024 bytes available at CONFADDR. - */ -#define CONFADDR ((char*)KADDR(0x1200)) /* info passed from boot loader */ -#define BOOTLINE CONFADDR -#define BOOTLINELEN 64 -#define BOOTARGS ((CONFADDR+BOOTLINELEN)) -#define BOOTARGSLEN (1024-BOOTLINELEN) -#define MAXCONF 32 - -char bootdisk[NAMELEN]; -char *confname[MAXCONF]; -char *confval[MAXCONF]; -int nconf; - -int -getcfields(char* lp, char** fields, int n, char* sep) -{ - int i; - - for(i = 0; lp && *lp && i < n; i++){ - while(*lp && strchr(sep, *lp) != 0) - *lp++ = 0; - if(*lp == 0) - break; - fields[i] = lp; - while(*lp && strchr(sep, *lp) == 0){ - if(*lp == '\\' && *(lp+1) == '\n') - *lp++ = ' '; - lp++; - } - } - - return i; -} - -static void -options(void) -{ - long i, n; - char *cp, *line[MAXCONF], *p, *q; - - /* - * parse configuration args from dos file plan9.ini - */ - cp = BOOTARGS; /* where b.com leaves its config */ - cp[BOOTARGSLEN-1] = 0; - - /* - * Strip out '\r', change '\t' -> ' '. - */ - p = cp; - for(q = cp; *q; q++){ - if(*q == '\r') - continue; - if(*q == '\t') - *q = ' '; - *p++ = *q; - } - *p = 0; - - n = getcfields(cp, line, MAXCONF, "\n"); - for(i = 0; i < n; i++){ - if(*line[i] == '#') - continue; - cp = strchr(line[i], '='); - if(cp == 0) - continue; - *cp++ = 0; - if(cp - line[i] >= NAMELEN+1) - *(line[i]+NAMELEN-1) = 0; - confname[nconf] = line[i]; - confval[nconf] = cp; - nconf++; - } -} - typedef struct { u64int base; u64int lim; @@ -357,33 +275,6 @@ } static void -e820(void) -{ - char *s, *f[32*3]; - uint i, n, bank; - Emap *e; - - s = getconf("*e820"); - if(s == nil) - panic("*e820 scan fails"); - n = getfields(s, f, nelem(f), 0, " "); - n -= n%3; - - bank = 0; - for(i = 0; i < n; i += 3){ - e = emap + ne820; - e->type = strtoull(f[i+0], 0, 0); - e->base = strtoull(f[i+1], 0, 0); - e->lim = strtoull(f[i+2], 0, 0); - ne820++; - bank |= e->type == 1 && e->base != 0; - } - if(bank == 0) - panic("*e820 scan fails"); - cmd_install("e820", "-- print e820 scan results", cmd_e820); -} - -static void addbank(Emap *e) { uintmem base; @@ -410,18 +301,34 @@ mconf.nbank++; } -void -bankinit(void) +static void +e820(void) { - uint i; + char *s, *f[nelem(emap)*3]; + uint i, n, bank; Emap *e; - for(i = 0; i < ne820; i++){ - e = emap + i; - if(e->type != 1 || e->base == 0) - continue; - addbank(e); + s = getconf("*e820"); + if(s == nil) + panic("*e820 scan fails"); + n = getfields(s, f, nelem(f), 0, " "); + n -= n%3; + + bank = 0; + for(i = 0; i < n; i += 3){ + e = emap + ne820; + e->type = strtoull(f[i+0], 0, 0); + e->base = strtoull(f[i+1], 0, 0); + e->lim = strtoull(f[i+2], 0, 0); + ne820++; + if(e->type == 1 && e->base > 0){ + addbank(e); + bank = 1; + } } + if(bank == 0) + panic("*e820 scan fails"); + cmd_install("e820", "-- print e820 scan results", cmd_e820); } extern void cmd_vec(int, char**); @@ -432,7 +339,6 @@ { options(); e820(); - bankinit(); mmuinit(); pcireset(); trapinit(); @@ -449,17 +355,6 @@ cmd_install("machvec", "-- vectors cnt", cmd_machvec); /* move to trap.c */ } -char* -getconf(char *name) -{ - int i; - - for(i = 0; i < nconf; i++) - if(cistrcmp(confname[i], name) == 0) - return confval[i]; - return 0; -} - void lockinit(void) { @@ -645,54 +540,6 @@ void consreset(void) { -} - -int -pciconfig(char *class, int ctlrno, Pciconf *pci) -{ - char cc[NAMELEN], *p, *q, *r; - int n; - - snprint(cc, sizeof cc, "%s%d", class, ctlrno); - for(n = 0; n < nconf; n++){ - if(cistrncmp(confname[n], cc, NAMELEN)) - continue; - pci->nopt = 0; - p = confval[n]; - while(*p){ - while(*p == ' ' || *p == '\t') - p++; - if(*p == '\0') - break; - if(cistrncmp(p, "type=", 5) == 0){ - p += 5; - for(q = pci->type; q < &pci->type[NAMELEN-1]; q++){ - if(*p == '\0' || *p == ' ' || *p == '\t') - break; - *q = *p++; - } - *q = '\0'; - } - else if(cistrncmp(p, "port=", 5) == 0) - pci->port = strtoul(p+5, &p, 0); - else if(cistrncmp(p, "irq=", 4) == 0) - pci->irq = strtoul(p+4, &p, 0); - else if(pci->nopt < Npciopt){ - r = pci->opt[pci->nopt]; - while(*p && *p != ' ' && *p != '\t'){ - *r++ = *p++; - if(r-pci->opt[pci->nopt] >= Pcioptlen-1) - break; - } - *r = '\0'; - pci->nopt++; - } - while(*p && *p != ' ' && *p != '\t') - p++; - } - return 1; - } - return 0; } void --- /sys/src/fs/amd64/options.c Sun Sep 15 05:31:23 2013 +++ /sys/src/fs/amd64/options.c Sun Sep 15 05:31:24 2013 @@ -1,8 +1,4 @@ -#include "u.h" -#include "../port/lib.h" -#include "dat.h" -#include "fns.h" -#include "adr.h" +#include "all.h" #include "io.h" /* @@ -82,7 +78,7 @@ while(o = *++argv[0]){ if(!(o >= 'A' && o <= 'Z') && !(o >= 'a' && o <= 'z')) continue; - n = strtol(argv[0]+1, &p, 0); + n = strtoul(argv[0]+1, &p, 0); if(p == argv[0]+1 || n < 1 || n > 127) n = 1; argv[0] = p-1; @@ -91,51 +87,12 @@ } } -static int typemap[] = { - Anone, - Amemory, - Areserved, - Aacpireclaim, - Aacpinvs, - Aunusable, - Adisable, -}; - -static void -e820(void) -{ - char *p, *s; - uvlong base, len, type; - - p = getconf("*e820"); - if(p == nil) - return; - for(s = p;;){ - if(*s == 0) - break; - type = strtoull(s, &s, 16); - if(*s != ' ') - break; - base = strtoull(s, &s, 16); - if(*s != ' ') - break; - len = strtoull(s, &s, 16) - base; - if(*s != ' ' && *s != 0 || len == 0) - break; - if(type >= nelem(typemap)) - continue; - adrmapinit(base, len, typemap[type], Mfree); - } -} - void options(void) { parseoptions(); - e820(); cmdline(); } - char* getconf(char *name) --- /sys/src/fs/amd64/l64v.s Sun Sep 15 05:31:27 2013 +++ /sys/src/fs/amd64/l64v.s Sun Sep 15 05:31:29 2013 @@ -255,6 +255,9 @@ JNZ _spllo JMP _splhi +TEXT spldone(SB), 1, $-4 + RET + TEXT islo(SB), 1, $-4 PUSHFQ POPQ AX @@ -357,6 +360,10 @@ MOVL $0, AX /* return 0 */ RET +TEXT pause(SB), 1, $-4 + PAUSE + RET + TEXT hardhalt(SB), 1, $-4 STI HLT @@ -366,40 +373,34 @@ HLT RET -TEXT _monitor(SB), 1, $-4 /* void monitor(void*); */ - MOVQ RARG, AX /* linear address to monitor */ - XORQ CX, CX /* no optional extensions yet */ - XORQ DX, DX /* no optional hints yet */ - BYTE $0x0f; BYTE $0x01; BYTE $0xc8 /* MONITOR */ - RET - -TEXT _mwait(SB), 1, $-4 /* void mwait(u32int); */ - MOVLQZX RARG, CX /* optional extensions */ - BYTE $0x0f; BYTE $0x01; BYTE $0xc9 /* MWAIT */ - RET - -TEXT k10mwait+0(SB),0,$16 -k10mwloop: - MOVQ RARG, CX - MOVQ val+8(FP), DX - MOVQ (CX), AX - CMPQ AX, DX - JNE k10mwdone - MOVQ RARG, AX /* linear address to monitor */ - XORQ CX, CX /* no optional extensions yet */ - XORQ DX, DX /* no optional hints yet */ - BYTE $0x0f; BYTE $0x01; BYTE $0xc8 /* MONITOR */ - MOVQ RARG, CX - MOVQ (CX),AX - MOVQ val+8(FP), DX - CMPQ AX, DX - JNE k10mwdone - XORQ DX, DX - XORQ CX, CX /* optional extensions */ - BYTE $0x0f; BYTE $0x01; BYTE $0xc9 /* MWAIT */ - JMP k10mwloop -k10mwdone: - RET , +#define MONITOR BYTE $0x0f; BYTE $0x01; BYTE $0xc8 +#define MWAIT BYTE $0x0f; BYTE $0x01; BYTE $0xc9 + +/* + * uintptr monmwait(void*, uintptr) + */ +TEXT monmwait(SB), 1, $0 + MOVQ val+8(FP), BX + +_mmstart: + CMPQ (BP), BX /* changed yet? */ + JNE _mmdone + + MOVQ BP, AX /* linear address to monitor */ + XORQ CX, CX /* extensions */ + XORQ DX, DX /* hints */ + MONITOR + + CMPQ (BP), BX /* changed yet? */ + JNE _mmdone + + /*XORQ CX, CX*/ /* extensions (different from monitor) */ + XORQ AX, AX /* hints */ + MWAIT + /* questionable: pop out on irq */ +_mmdone: + MOVQ (BP), AX + RET TEXT mul64fract(SB), 1, $-4 MOVQ a+8(FP), AX --- /sys/src/fs/amd64/fns.h Sun Sep 15 05:31:31 2013 +++ /sys/src/fs/amd64/fns.h Sun Sep 15 05:31:33 2013 @@ -33,8 +33,8 @@ void idtput(int, u64int); int inb(int); u32int inl(int); -void insb(int, void*, int); ushort ins(int); +void insb(int, void*, int); void insl(int, void*, int); void inss(int, void*, int); int islo(void); @@ -50,18 +50,21 @@ void mmuinit(void); uintmem mmuphysaddr(uintptr); int mmuwalk(PTE*, uintptr, int, PTE**, uintmem (*)(usize)); +uintptr monmwait(void*, uintptr); void mpsinit(int); void ndnr(void); uchar nvramread(int); void nvramwrite(int, uchar); +void options(void); void outb(int, int); void outl(int, u32int); -void outsb(int, void*, int); void outs(int, u16int); +void outsb(int, void*, int); void outsl(int, void*, int); void outss(int, void*, int); #define PADDR(va) paddr(va) uintmem paddr(void*); +void pause(void); #define perfticks() rdtsc() void printcpufreq(void); void putcr3(u64int); @@ -74,8 +77,8 @@ Mpl splhi(void); Mpl spllo(void); void splx(Mpl); -int tas32(u32int*); #define tas(l) tas32((u32int*)l) +int tas32(u32int*); void trapenable(int, void (*)(Ureg*, void*), void*, char*); void trapinit(void); void trput(u64int); @@ -83,9 +86,9 @@ void uartputc(int); void uartputs(char*, int); void uartspecial(int, void (*)(int), int (*)(void), int); +void* vmap(uintmem, usize); void* vmappat(uintmem, usize, uint); int vmapsync(uintptr); -void* vmap(uintmem, usize); void vsvminit(int); void vunmap(void*, usize); void wave(int); --- /sys/src/fs/ivey/mkfile Sun Sep 15 05:31:36 2013 +++ /sys/src/fs/ivey/mkfile Sun Sep 15 05:31:37 2013 @@ -48,6 +48,7 @@ iobuf.$O\ lrand.$O\ main.$O\ + options.$O\ print.$O\ proc.$O\ rawcopy.$O\