--- /sys/include/libc.h Fri Jun 29 20:22:31 2012 +++ /sys/include/libc.h Fri Apr 12 22:13:19 2013 @@ -45,6 +45,8 @@ Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ Runeself = 0x80, /* rune and UTF sequences are the same (<) */ Runeerror = 0xFFFD, /* decoding error in UTF */ + Runemax = 0xFFFF, /* largest 16-bit character */ + Runemask = 0xFFFF, /* bits used by runes (see grep) */ }; /* --- /sys/lib/newuser Thu Dec 2 23:37:20 2010 +++ /sys/lib/newuser Sat Apr 13 01:28:29 2013 @@ -8,7 +8,7 @@ } cd $home x='$' -mkdir bin bin/rc bin/mips bin/386 bin/power bin/arm +mkdir bin bin/rc bin/mips bin/386 bin/power bin/arm bin/amd64 mkdir lib tmp chmod +t tmp bind -c $home/tmp /tmp --- /sys/src/9/kw/syscall.c Wed Apr 3 01:22:15 2013 +++ /sys/src/9/kw/syscall.c Tue Apr 9 23:55:59 2013 @@ -78,6 +78,7 @@ nf->arg0 = &nf->ureg; nf->ip = 0; cur->sp = PTR2UINT(nf); + cur->r0 = PTR2UINT(nf->arg0); break; default: pprint("unknown noted arg %#p\n", arg0); --- /sys/src/9/omap/syscall.c Wed Apr 3 01:22:15 2013 +++ /sys/src/9/omap/syscall.c Tue Apr 9 23:55:59 2013 @@ -78,6 +78,7 @@ nf->arg0 = &nf->ureg; nf->ip = 0; cur->sp = PTR2UINT(nf); + cur->r0 = PTR2UINT(nf->arg0); break; default: pprint("unknown noted arg %#p\n", arg0); --- /sys/src/9/pc/ether82563.c Thu Mar 14 00:55:15 2013 +++ /sys/src/9/pc/ether82563.c Fri Apr 12 22:30:46 2013 @@ -320,14 +320,18 @@ Fpd = 0x80000000, /* Flush partial Descriptor Block */ }; -typedef struct Rd { /* Receive Descriptor */ +typedef struct Ctlr Ctlr; +typedef struct Rd Rd; +typedef struct Td Td; + +struct Rd { /* Receive Descriptor */ u32int addr[2]; u16int length; u16int checksum; u8int status; u8int errors; u16int special; -} Rd; +}; enum { /* Rd status */ Rdd = 0x01, /* Descriptor Done */ @@ -349,11 +353,11 @@ Rxe = 0x80, /* RX Data Error */ }; -typedef struct { /* Transmit Descriptor */ +struct Td { /* Transmit Descriptor */ u32int addr[2]; /* Data */ u32int control; u32int status; -} Td; +}; enum { /* Tdesc control */ LenMASK = 0x000FFFFF, /* Data/Packet Length Field */ @@ -384,7 +388,8 @@ typedef struct { u16int *reg; u32int *reg32; - int sz; + u16int base; + u16int lim; } Flash; enum { @@ -459,7 +464,6 @@ "i82579", }; -typedef struct Ctlr Ctlr; struct Ctlr { int port; Pcidev *pcidev; @@ -473,7 +477,7 @@ int attached; int nrd; int ntd; - int nrb; /* how many this Ctlr has in the pool */ + int nrb; /* # bufs this Ctlr has in the pool */ unsigned rbsz; /* unsigned for % and / by 1024 */ int *nic; @@ -501,7 +505,7 @@ Rendez rrendez; int rim; - int rdfree; + int rdfree; /* rx descriptors awaiting packets */ Rd *rdba; /* receive descriptor base address */ Block **rb; /* receive buffers */ int rdh; /* receive descriptor head */ @@ -511,7 +515,6 @@ Rendez trendez; QLock tlock; - int tbusy; Td *tdba; /* transmit descriptor base address */ Block **tb; /* transmit buffers */ int tdh; /* transmit descriptor head */ @@ -939,7 +942,7 @@ while(Next(rdt, m) != ctlr->rdh){ rd = &ctlr->rdba[rdt]; if(ctlr->rb[rdt] != nil){ - iprint("82563: tx overrun\n"); + iprint("#l%d: 82563: rx overrun\n", ctlr->edev->ctlrno); break; } bp = i82563rballoc(); @@ -1123,10 +1126,15 @@ } ctlr->rb[rdh] = nil; + /* rd needs to be replenished to accept another pkt */ rd->status = 0; ctlr->rdfree--; ctlr->rdh = rdh = Next(rdh, m); - if(ctlr->nrd-ctlr->rdfree >= 32 || (rim & Rxdmt0)) + /* + * if number of rds ready for packets is too low, + * set up the unready ones. + */ + if(ctlr->rdfree <= ctlr->nrd - 32 || (rim & Rxdmt0)) i82563replenish(ctlr); } } @@ -1519,11 +1527,11 @@ if(f.reg == nil) return -1; f.reg32 = (void*)f.reg; - f.sz = f.reg32[Bfpr]; - r = f.sz & 0x1fff; + f.base = f.reg32[Bfpr] & FMASK(0, 13); + f.lim = (f.reg32[Bfpr]>>16) & FMASK(0, 13); if(csr32r(c, Eec) & (1<<22)) - r += c->type == i82579? 16 : 1; - r <<= 12; + f.base += (f.lim + 1 - f.base) >> 1; + r = f.base << 12; sum = 0; for (adr = 0; adr < 0x40; adr++) { --- /sys/src/9/pc/ether82598.c Fri Jan 11 20:30:20 2013 +++ /sys/src/9/pc/ether82598.c Wed Apr 10 21:34:50 2013 @@ -202,6 +202,10 @@ Lmsmask = 7, }; +typedef struct Ctlr Ctlr; +typedef struct Rd Rd; +typedef struct Td Td; + typedef struct { uint reg; char *name; @@ -257,14 +261,14 @@ Rdd = 1<<0, /* descriptor done */ }; -typedef struct { +struct Rd { /* Receive Descriptor */ u32int addr[2]; ushort length; ushort cksum; uchar status; uchar errors; ushort vlan; -} Rd; +}; enum { /* Td cmd */ @@ -277,7 +281,7 @@ Tdd = 1<<0, /* descriptor done */ }; -typedef struct { +struct Td { /* Transmit Descriptor */ u32int addr[2]; ushort length; uchar cso; @@ -285,9 +289,9 @@ uchar status; uchar css; ushort vlan; -} Td; +}; -typedef struct { +struct Ctlr { Pcidev *p; Ether *edev; int type; @@ -303,7 +307,7 @@ uchar flag; int nrd; int ntd; - int nrb; + int nrb; /* # bufs this Ctlr has in the pool */ uint rbsz; int procsrunning; int attached; @@ -315,27 +319,27 @@ Rendez trendez; Rendez rrendez; - uint im; + uint im; /* interrupt mask */ uint lim; uint rim; uint tim; Lock imlock; - Rd *rdba; - Block **rb; - uint rdt; - uint rdfree; - - Td *tdba; - uint tdh; - uint tdt; - Block **tb; + Rd* rdba; /* receive descriptor base address */ + Block** rb; /* receive buffers */ + int rdt; /* receive descriptor tail */ + int rdfree; /* rx descriptors awaiting packets */ + + Td* tdba; /* transmit descriptor base address */ + int tdh; /* transmit descriptor head */ + int tdt; /* transmit descriptor tail */ + Block** tb; /* transmit buffers */ - uchar ra[Eaddrlen]; - uchar mta[128]; + uchar ra[Eaddrlen]; /* receive address */ + uchar mta[128]; /* multicast table array */ ulong stats[nelem(stattab)]; uint speeds[3]; -} Ctlr; +}; enum { I82598 = 1, @@ -539,7 +543,7 @@ e = v; c = e->ctlr; for (;;) { - sleep(&c->trendez, tim, c); /* transmit kicks us */ + sleep(&c->trendez, tim, c); /* transmit interrupt kicks us */ c->tim = 0; transmit(e); } --- /sys/src/9/pc/etherigbe.c Thu Mar 28 20:51:20 2013 +++ /sys/src/9/pc/etherigbe.c Tue Apr 9 22:19:39 2013 @@ -450,7 +450,7 @@ }; typedef struct Ctlr Ctlr; -typedef struct Ctlr { +struct Ctlr { int port; Pcidev* pcidev; Ctlr* next; @@ -465,7 +465,7 @@ void* alloc; /* receive/transmit descriptors */ int nrd; int ntd; - int nrb; /* how many this Ctlr has in the pool */ + int nrb; /* # bufs this Ctlr has in the pool */ int* nic; Lock imlock; @@ -494,7 +494,7 @@ Rendez rrendez; int rim; - int rdfree; + int rdfree; /* rx descriptors awaiting packets */ Rd* rdba; /* receive descriptor base address */ Block** rb; /* receive buffers */ int rdh; /* receive descriptor head */ @@ -502,7 +502,6 @@ int rdtr; /* receive delay timer ring value */ Lock tlock; - int tbusy; int tdfree; Td* tdba; /* transmit descriptor base address */ Block** tb; /* transmit buffers */ @@ -512,7 +511,7 @@ int txcw; int fcrtl; int fcrth; -} Ctlr; +}; #define csr32r(c, r) (*((c)->nic+((r)/4))) #define csr32w(c, r, v) (*((c)->nic+((r)/4)) = (v)) --- /sys/src/9/pc/pci.c Fri Mar 29 20:07:16 2013 +++ /sys/src/9/pc/pci.c Fri Apr 12 22:19:37 2013 @@ -668,6 +668,7 @@ { 0x8086, 0x3a48, pIIxget, pIIxset }, /* Intel 82801JI */ { 0x8086, 0x2916, pIIxget, pIIxset }, /* Intel 82801? */ { 0x8086, 0x1c02, pIIxget, pIIxset }, /* Intel 6 Series/C200 */ + { 0x8086, 0x1e53, pIIxget, pIIxset }, /* Intel 7 Series/C216 */ { 0x1106, 0x0586, viaget, viaset }, /* Viatech 82C586 */ { 0x1106, 0x0596, viaget, viaset }, /* Viatech 82C596 */ { 0x1106, 0x0686, viaget, viaset }, /* Viatech 82C686 */ --- /sys/src/9/pc/sdiahci.c Thu Mar 7 23:13:50 2013 +++ /sys/src/9/pc/sdiahci.c Tue Apr 9 16:20:30 2013 @@ -43,7 +43,7 @@ * if we get more than this many interrupts per tick for a drive, * either the hardware is broken or we've got a bug in this driver. */ - Maxintrspertick = 1000, + Maxintrspertick = 2000, /* was 1000 */ }; /* pci space configuration */ @@ -1963,8 +1963,10 @@ } break; } - if(p->ccrb == Pcibcstore && p->ccru == Pciscsata && p->ccrp == 1) + if(p->ccrb == Pcibcstore && p->ccru == Pciscsata && p->ccrp == 1){ + print("ahci: Tunk: VID %#4.4ux DID %#4.4ux\n", p->vid, p->did); return Tunk; + } return -1; } --- /sys/src/9/teg2/syscall.c Wed Apr 3 01:22:15 2013 +++ /sys/src/9/teg2/syscall.c Tue Apr 9 23:55:59 2013 @@ -84,6 +84,7 @@ nf->arg0 = &nf->ureg; nf->ip = 0; cur->sp = PTR2UINT(nf); + cur->r0 = PTR2UINT(nf->arg0); break; default: pprint("unknown noted arg %#p\n", arg0); --- /sys/src/cmd/9nfs/fns.h Wed Apr 26 16:19:08 2006 +++ /sys/src/cmd/9nfs/fns.h Tue Apr 9 22:36:08 2013 @@ -39,7 +39,7 @@ void srvinit(int, char*, char*); char* strfind(char*); int string2S(void*, String*); -int strparse(void*, int, char**); +int strparse(char*, int, char**); void strprint(int); char* strstore(char*); Waitmsg *system(char*, char**); --- /sys/src/cmd/9nfs/mkfile Mon Dec 15 15:28:38 2003 +++ /sys/src/cmd/9nfs/mkfile Tue Apr 9 22:36:09 2013 @@ -1,5 +1,4 @@ cap == nil){ + if(ai == nil || ai->cap == nil || *ai->cap == 0){ werrstr("no capability"); return -1; } --- /sys/src/libc/9syscall/mkfile Mon Sep 24 21:14:59 2012 +++ /sys/src/libc/9syscall/mkfile Tue Apr 9 16:21:15 2013 @@ -61,7 +61,13 @@ echo TEXT _seek'(SB)', 1, '$0' if not echo TEXT $i'(SB)', 1, '$0' - echo MOVQ RARG, 'a0+0(FP)' + # + # For architectures which pass the first argument + # in a register, if the system call takes no arguments + # there will be no 'a0+0(FP)' reserved on the stack. + # + if(! ~ $i asystemcallwithnoarguments) + echo MOVQ RARG, 'a0+0(FP)' echo MOVQ '$'$n, RARG echo SYSCALL echo RET --- /sys/src/libstdio/dtoa.c Fri Oct 13 19:23:30 2000 +++ /sys/src/libstdio/dtoa.c Fri Apr 12 22:15:33 2013 @@ -13,16 +13,17 @@ static Lock _dtoalk[2]; #define ACQUIRE_DTOA_LOCK(n) lock(&_dtoalk[n]) #define FREE_DTOA_LOCK(n) unlock(&_dtoalk[n]) + #define PRIVATE_mem ((2000+sizeof(double)-1)/sizeof(double)) static double private_mem[PRIVATE_mem], *pmem_next = private_mem; + #define FLT_ROUNDS 1 #define DBL_DIG 15 #define DBL_MAX_10_EXP 308 #define DBL_MAX_EXP 1024 #define FLT_RADIX 2 #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) -#define fpword0(x) ((FPdbleword*)&x)->hi -#define fpword1(x) ((FPdbleword*)&x)->lo + /* Ten_pmax = floor(P*log(2)/log(5)) */ /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ @@ -62,21 +63,46 @@ #define FFFFFFFF 0xffffffffUL -#undef ULint - #define Kmax 15 -struct -Bigint { - struct Bigint *next; +typedef struct Bigint Bigint; +typedef struct Ulongs Ulongs; + +struct Bigint { + Bigint *next; int k, maxwds, sign, wds; - unsigned int x[1]; + unsigned x[1]; }; -typedef struct Bigint Bigint; +struct Ulongs { + ulong hi; + ulong lo; +}; static Bigint *freelist[Kmax+1]; +Ulongs +double2ulongs(double d) +{ + FPdbleword dw; + Ulongs uls; + + dw.x = d; + uls.hi = dw.hi; + uls.lo = dw.lo; + return uls; +} + +double +ulongs2double(Ulongs uls) +{ + FPdbleword dw; + + dw.hi = uls.hi; + dw.lo = uls.lo; + return dw.x; +} + static Bigint * Balloc(int k) { @@ -485,23 +511,18 @@ static double ulp(double x) { - register int L; - double a; + register ulong L; - L = (fpword0(x) & Exp_mask) - (P - 1) * Exp_msk1; - fpword0(a) = L; - fpword1(a) = 0; - return a; + L = (double2ulongs(x).hi & Exp_mask) - (P - 1) * Exp_msk1; + return ulongs2double((Ulongs){L, 0}); } static double b2d(Bigint *a, int *e) { - unsigned int * xa, *xa0, w, y, z; + unsigned *xa, *xa0, w, y, z; int k; - double d; -#define d0 fpword0(d) -#define d1 fpword1(d) + ulong d0, d1; xa0 = a->x; xa = xa0 + a->wds; @@ -509,10 +530,9 @@ k = hi0bits(y); *e = 32 - k; if (k < Ebits) { - d0 = Exp_1 | y >> Ebits - k; w = xa > xa0 ? *--xa : 0; d1 = y << (32 - Ebits) + k | w >> Ebits - k; - goto ret_d; + return ulongs2double((Ulongs){Exp_1 | y >> Ebits - k, d1}); } z = xa > xa0 ? *--xa : 0; if (k -= Ebits) { @@ -523,10 +543,7 @@ d0 = Exp_1 | y; d1 = z; } -ret_d: -#undef d0 -#undef d1 - return d; + return ulongs2double((Ulongs){d0, d1}); } static Bigint * @@ -534,18 +551,18 @@ { Bigint * b; int de, i, k; - unsigned int * x, y, z; -#define d0 fpword0(d) -#define d1 fpword1(d) + unsigned *x, y, z; + Ulongs uls; b = Balloc(1); x = b->x; - z = d0 & Frac_mask; - d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ - de = (int)(d0 >> Exp_shift); + uls = double2ulongs(d); + z = uls.hi & Frac_mask; + uls.hi &= 0x7fffffff; /* clear sign bit, which we ignore */ + de = (int)(uls.hi >> Exp_shift); z |= Exp_msk11; - if (y = d1) { + if (y = uls.lo) { /* assignment = */ if (k = lo0bits(&y)) { x[0] = y | z << 32 - k; z >>= k; @@ -558,28 +575,31 @@ i = b->wds = 1; k += 32; } + USED(i); *e = de - Bias - (P - 1) + k; *bits = P - k; return b; } -#undef d0 -#undef d1 - static double ratio(Bigint *a, Bigint *b) { double da, db; int k, ka, kb; + Ulongs uls; da = b2d(a, &ka); db = b2d(b, &kb); k = ka - kb + 32 * (a->wds - b->wds); - if (k > 0) - fpword0(da) += k * Exp_msk1; - else { + if (k > 0) { + uls = double2ulongs(da); + uls.hi += k * Exp_msk1; + da = ulongs2double(uls); + } else { k = -k; - fpword0(db) += k * Exp_msk1; + uls = double2ulongs(db); + uls.hi += k * Exp_msk1; + db = ulongs2double(uls); } return da / db; } @@ -664,10 +684,8 @@ x[0] = (x[0] << 4) | (x[1] >> 28); x[1] = (x[1] << 4) | c; } - if ((x[0] &= 0xfffff) || x[1]) { - fpword0(*rvp) = Exp_mask | x[0]; - fpword1(*rvp) = x[1]; - } + if ((x[0] &= 0xfffff) || x[1]) + *rvp = ulongs2double((Ulongs){Exp_mask | x[0], x[1]}); } static int @@ -850,37 +868,42 @@ */ int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, - j, j1, k, k0, k_check, leftright, m2, m5, s2, s5, - spec_case, try_quick; - int L; + j, j1, k, k0, k_check, L, leftright, m2, m5, s2, s5, + spec_case, try_quick; Bigint * b, *b1, *delta, *mlo=nil, *mhi, *S; double d2, ds, eps; char *s, *s0; + Ulongs ulsd, ulsd2; - if (fpword0(d) & Sign_bit) { + ulsd = double2ulongs(d); + if (ulsd.hi & Sign_bit) { /* set sign for everything, including 0's and NaNs */ *sign = 1; - fpword0(d) &= ~Sign_bit; /* clear sign bit */ + ulsd.hi &= ~Sign_bit; /* clear sign bit */ } else *sign = 0; - if ((fpword0(d) & Exp_mask) == Exp_mask) { + if ((ulsd.hi & Exp_mask) == Exp_mask) { /* Infinity or NaN */ *decpt = 9999; - if (!fpword1(d) && !(fpword0(d) & 0xfffff)) + if (!ulsd.lo && !(ulsd.hi & 0xfffff)) return nrv_alloc("Infinity", rve, 8); return nrv_alloc("NaN", rve, 3); } + d = ulongs2double(ulsd); + if (!d) { *decpt = 1; return nrv_alloc("0", rve, 1); } b = d2b(d, &be, &bbits); - i = (int)(fpword0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)); - d2 = d; - fpword0(d2) &= Frac_mask1; - fpword0(d2) |= Exp_11; + i = (int)(ulsd.hi >> Exp_shift1 & (Exp_mask >> Exp_shift1)); + + ulsd2 = ulsd; + ulsd2.hi &= Frac_mask1; + ulsd2.lo |= Exp_11; + d2 = ulongs2double(ulsd2); /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 * log10(x) = log(x) / log(10) @@ -943,6 +966,7 @@ switch (mode) { case 0: case 1: + default: ilim = ilim1 = -1; i = 18; ndigits = 0; @@ -1008,7 +1032,11 @@ ieps++; } eps = ieps * d + 7.; - fpword0(eps) -= (P - 1) * Exp_msk1; + + ulsd = double2ulongs(eps); + ulsd.hi -= (P - 1) * Exp_msk1; + eps = ulongs2double(ulsd); + if (ilim == 0) { S = mhi = 0; d -= 5.; @@ -1130,8 +1158,8 @@ spec_case = 0; if (mode < 2) { - if (!fpword1(d) && !(fpword0(d) & Bndry_mask) - ) { + ulsd = double2ulongs(d); + if (!ulsd.lo && !(ulsd.hi & Bndry_mask)) { /* The special case */ b2 += Log2P; s2 += Log2P; @@ -1208,7 +1236,8 @@ delta = diff(S, mhi); j1 = delta->sign ? 1 : cmp(b, delta); Bfree(delta); - if (j1 == 0 && !mode && !(fpword1(d) & 1)) { + ulsd = double2ulongs(d); + if (j1 == 0 && !mode && !(ulsd.lo & 1)) { if (dig == '9') goto round_9_up; if (j > 0) @@ -1216,9 +1245,7 @@ *s++ = dig; goto ret; } - if (j < 0 || j == 0 && !mode - && !(fpword1(d) & 1) - ) { + if (j < 0 || j == 0 && !mode && !(ulsd.lo & 1)) { if (j1 > 0) { b = lshift(b, 1); j1 = cmp(b, S); @@ -1290,4 +1317,3 @@ *rve = s; return s0; } -