ref: c6f6396faaf06122e2c242ca0006165fe0c59977
parent: 3f9d92c1a83d6b0fdb49d3986ef5a4cd2a892a57
parent: ebeb501cff090f028c23dcfea7505b64ff6642fa
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Feb 15 01:19:25 EST 2014
merge
--- a/sys/src/9/pc/ether79c970.c
+++ b/sys/src/9/pc/ether79c970.c
@@ -83,9 +83,10 @@
ulong addr;
ulong md1; /* status|bcnt */
ulong md2; /* rcc|rpc|mcnt */
- Block* bp;
+ ulong aux;
};
+
enum { /* md1 */
Enp = 0x01000000, /* end of packet */
Stp = 0x02000000, /* start of packet */
@@ -120,9 +121,11 @@
int init; /* initialisation in progress */
Iblock iblock;
+ Block** rb;
Dre* rdr; /* receive descriptor ring */
int rdrx;
+ Block** tb;
Dre* tdr; /* transmit descriptor ring */
int tdrh; /* host index into tdr */
int tdri; /* interface index into tdr */
@@ -227,7 +230,9 @@
static void
ringinit(Ctlr* ctlr)
{
+ Block *bp;
Dre *dre;
+ int i;
/*
* Initialise the receive and transmit buffer rings.
@@ -235,19 +240,26 @@
*
* This routine is protected by ctlr->init.
*/
+ if(ctlr->rb == nil)
+ ctlr->rb = malloc(Nrdre*sizeof(Block*));
if(ctlr->rdr == 0){
ctlr->rdr = xspanalloc(Nrdre*sizeof(Dre), 0x10, 0);
- for(dre = ctlr->rdr; dre < &ctlr->rdr[Nrdre]; dre++){
- dre->bp = iallocb(Rbsize);
- if(dre->bp == nil)
+ for(i=0; i<Nrdre; i++){
+ bp = iallocb(Rbsize);
+ if(bp == nil)
panic("can't allocate ethernet receive ring");
- dre->addr = PADDR(dre->bp->rp);
+ ctlr->rb[i] = bp;
+ dre = &ctlr->rdr[i];
+ dre->addr = PADDR(bp->rp);
dre->md2 = 0;
dre->md1 = Own|(-Rbsize & 0xFFFF);
+ dre->aux = 0;
}
}
ctlr->rdrx = 0;
+ if(ctlr->tb == nil)
+ ctlr->tb = malloc(Ntdre*sizeof(Block*));
if(ctlr->tdr == 0)
ctlr->tdr = xspanalloc(Ntdre*sizeof(Dre), 0x10, 0);
memset(ctlr->tdr, 0, Ntdre*sizeof(Dre));
@@ -312,6 +324,7 @@
Ctlr *ctlr;
Block *bp;
Dre *dre;
+ int i;
ctlr = ether->ctlr;
@@ -330,8 +343,11 @@
* There's no need to pad to ETHERMINTU
* here as ApadXmt is set in CSR4.
*/
- dre = &ctlr->tdr[ctlr->tdrh];
- dre->bp = bp;
+ i = ctlr->tdrh;
+ if(ctlr->tb[i] != nil)
+ break;
+ dre = &ctlr->tdr[i];
+ ctlr->tb[i] = bp;
dre->addr = PADDR(bp->rp);
dre->md2 = 0;
dre->md1 = Own|Stp|Enp|(-BLEN(bp) & 0xFFFF);
@@ -357,9 +373,9 @@
{
Ctlr *ctlr;
Ether *ether;
- int csr0, len;
+ int csr0, len, i;
Dre *dre;
- Block *bp;
+ Block *bp, *bb;
ether = arg;
ctlr = ether->ctlr;
@@ -388,7 +404,8 @@
* until a descriptor is encountered still owned by the chip.
*/
if(csr0 & Rint){
- dre = &ctlr->rdr[ctlr->rdrx];
+ i = ctlr->rdrx;
+ dre = &ctlr->rdr[i];
while(!(dre->md1 & Own)){
if(dre->md1 & RxErr){
if(dre->md1 & RxBuff)
@@ -401,10 +418,13 @@
ctlr->fram++;
}
else if(bp = iallocb(Rbsize)){
- len = (dre->md2 & 0x0FFF)-4;
- dre->bp->wp = dre->bp->rp+len;
- etheriq(ether, dre->bp, 1);
- dre->bp = bp;
+ bb = ctlr->rb[i];
+ ctlr->rb[i] = bp;
+ if(bb != nil){
+ len = (dre->md2 & 0x0FFF)-4;
+ bb->wp = bb->rp+len;
+ etheriq(ether, bb, 1);
+ }
dre->addr = PADDR(bp->rp);
}
@@ -426,7 +446,8 @@
if(csr0 & Tint){
lock(ctlr);
while(ctlr->ntq){
- dre = &ctlr->tdr[ctlr->tdri];
+ i = ctlr->tdri;
+ dre = &ctlr->tdr[i];
if(dre->md1 & Own)
break;
@@ -443,8 +464,11 @@
ctlr->txbuff++;
ether->oerrs++;
}
-
- freeb(dre->bp);
+ bp = ctlr->tb[i];
+ if(bp != nil){
+ ctlr->tb[i] = nil;
+ freeb(bp);
+ }
ctlr->ntq--;
ctlr->tdri = NEXT(ctlr->tdri, Ntdre);
--- a/sys/src/9/pc64/l.s
+++ b/sys/src/9/pc64/l.s
@@ -86,11 +86,18 @@
MOVL DX, PML4O(KZERO)(AX) /* PML4E for KZERO */
ADDL $PTSZ, AX /* PDP at PML4 + PTSZ */
- ADDL $PTSZ, DX /* PD at PML4 + 2*PTSZ */
+ ADDL $PTSZ, DX /* PD0 at PML4 + 2*PTSZ */
MOVL DX, PDPO(0)(AX) /* PDPE for double-map */
MOVL DX, PDPO(KZERO)(AX) /* PDPE for KZERO */
- ADDL $PTSZ, AX /* PD at PML4 + 2*PTSZ */
+ /*
+ * add PDPE for KZERO+1GB early as Vmware
+ * hangs when modifying kernel PDP
+ */
+ ADDL $PTSZ, DX /* PD1 */
+ MOVL DX, PDPO(KZERO+GiB)(AX)
+
+ ADDL $PTSZ, AX /* PD0 at PML4 + 2*PTSZ */
MOVL $(PTESIZE|PTEGLOBAL|PTEWRITE|PTEVALID), DX
MOVL DX, PDO(0)(AX) /* PDE for double-map */
--- a/sys/src/9/pc64/mem.h
+++ b/sys/src/9/pc64/mem.h
@@ -52,13 +52,13 @@
/*
* Address spaces. Kernel, sorted by address.
*/
-#define KZERO (0xffffffff80000000ull) /* 2GB identity map of lower 2GB ram */
+#define KZERO (0xffffffff80000000ull)
#define KTZERO (KZERO+1*MiB+64*KiB)
-#define VMAP (0xffffffff00000000ull) /* 2GB identity map of upper 2GB ram */
-#define VMAPSIZE (2*GiB)
+#define VMAP (0xffffff0000000000ull)
+#define VMAPSIZE (512*GiB)
-#define KMAP (0xffffff7f00000000ull) /* 2MB for per process temporary kernel mappings */
+#define KMAP (0xfffffe8000000000ull)
#define KMAPSIZE (2*MiB)
/*
@@ -68,8 +68,14 @@
#define APBOOTSTRAP (KZERO+0x3000ull) /* AP bootstrap code */
#define IDTADDR (KZERO+0x10000ull) /* idt */
#define REBOOTADDR (0x11000) /* reboot code - physical address */
+
#define CPU0PML4 (KZERO+0x13000ull)
+#define CPU0PDP (KZERO+0x14000ull)
+#define CPU0PD0 (KZERO+0x15000ull) /* KZERO */
+#define CPU0PD1 (KZERO+0x16000ull) /* KZERO+1GB */
+
#define CPU0GDT (KZERO+0x17000ull) /* bootstrap processor GDT */
+
#define CPU0MACH (KZERO+0x18000ull) /* Mach for bootstrap processor */
#define CPU0END (CPU0MACH+MACHSIZE)
--- a/sys/src/9/pc64/mmu.c
+++ b/sys/src/9/pc64/mmu.c
@@ -82,8 +82,8 @@
didmmuinit = 1;
/* zap double map done by l.s */
- m->pml4[0] = 0;
m->pml4[512] = 0;
+ m->pml4[0] = 0;
m->tss = mallocz(sizeof(Tss), 1);
if(m->tss == nil)
@@ -157,7 +157,7 @@
if(va >= KZERO)
return va-KZERO;
if(va >= VMAP)
- return va-(VMAP-(-KZERO));
+ return va-VMAP;
panic("paddr: va=%#p pc=%#p", va, getcallerpc(&v));
return 0;
}
@@ -505,12 +505,7 @@
uintptr va;
int o;
- if(size <= 0 || pa >= -VMAP)
- panic("vmap: pa=%#p size=%d pc=%#p", pa, size, getcallerpc(&pa));
- if(cankaddr(pa) >= size)
- va = pa+KZERO;
- else
- va = pa+(VMAP-(-KZERO));
+ va = pa+VMAP;
/*
* might be asking for less than a page.
*/
--- a/sys/src/9/pc64/pc64
+++ b/sys/src/9/pc64/pc64
@@ -44,7 +44,7 @@
# ether2000 ether8390
# ether2114x pci
# ether589 etherelnk3
-# ether79c970 pci
+ ether79c970 pci
# ether8003 ether8390
# ether8139 pci
# ether8169 pci ethermii
--- a/sys/src/9/pc64/pccpu64
+++ b/sys/src/9/pc64/pccpu64
@@ -44,7 +44,7 @@
# ether2000 ether8390
# ether2114x pci
# ether589 etherelnk3
-# ether79c970 pci
+ ether79c970 pci
# ether8003 ether8390
# ether8139 pci
# ether8169 pci ethermii
--- a/sys/src/9/pc64/squidboy.c
+++ b/sys/src/9/pc64/squidboy.c
@@ -73,6 +73,7 @@
* PDP between processors.
*/
pml4[PTLX(KZERO, 3)] = MACHP(0)->pml4[PTLX(KZERO, 3)];
+ pml4[PTLX(VMAP, 3)] = MACHP(0)->pml4[PTLX(VMAP, 3)];
/* double map */
pml4[0] = PADDR(pdp0) | PTEWRITE|PTEVALID;