Browse Source

Plan 9 from Bell Labs 2010-07-14

David du Colombier 13 years ago
parent
commit
8abec448bd
6 changed files with 28 additions and 41 deletions
  1. 7 5
      sys/src/9/pc/apic.c
  2. 7 17
      sys/src/9/pc/mp.c
  3. 3 1
      sys/src/9/pc/mp.h
  4. 10 6
      sys/src/9/port/devuart.c
  5. 1 1
      sys/src/boot/pc/conf.c
  6. 0 11
      sys/src/libc/9sys/run

+ 7 - 5
sys/src/9/pc/apic.c

@@ -163,15 +163,17 @@ lapictimerinit(void)
 void
 lapicinit(Apic* apic)
 {
-	ulong r, lvt;
+	ulong lvt;
+//	ulong r;
 
 	if(lapicbase == 0)
 		lapicbase = apic->addr;
 
-	lapicw(LapicDFR, 0xFFFFFFFF);
-	r = (lapicr(LapicID)>>24) & 0xFF;
-	lapicw(LapicLDR, (1<<r)<<24);
-	lapicw(LapicTPR, 0xFF);
+	lapicw(LapicDFR, 0xf0000000);
+//	r = (lapicr(LapicID)>>24) & 0xFF;
+//	lapicw(LapicLDR, (1<<r)<<24);
+	lapicw(LapicLDR, 0xff000000);
+	lapicw(LapicTPR, 0xff);
 	lapicw(LapicSVR, LapicENABLE|(VectorPIC+IrqSPURIOUS));
 
 	lapictimerinit();

+ 7 - 17
sys/src/9/pc/mp.c

@@ -17,8 +17,7 @@ static int mpeisabus = -1;
 extern int i8259elcr;			/* mask of level-triggered interrupts */
 static Apic mpapic[MaxAPICNO+1];
 static int machno2apicno[MaxAPICNO+1];	/* inverse map: machno -> APIC ID */
-static Lock mprdthilock;
-static int mprdthi;
+static u32int mprdthi = ~0;
 static Ref mpvnoref;			/* unique vector assignment */
 static int mpmachno = 1;
 
@@ -49,7 +48,7 @@ mkprocessor(PCMPprocessor* p)
 {
 	Apic *apic;
 
-	if(!(p->flags & PcmpEN) || p->apicno > MaxAPICNO)
+	if(!(p->flags & PcmpEN)/* || p->apicno > MaxAPICNO*/)
 		return 0;
 
 	apic = &mpapic[p->apicno];
@@ -140,7 +139,7 @@ mkioapic(PCMPioapic* p)
 	Apic *apic;
 	void *va;
 
-	if(!(p->flags & PcmpEN) || p->apicno > MaxAPICNO)
+	if(!(p->flags & PcmpEN)/* || p->apicno > MaxAPICNO*/)
 		return 0;
 
 	/*
@@ -386,9 +385,7 @@ squidboy(Apic* apic)
 	cpuidprint();
 	checkmtrr();
 
-	lock(&mprdthilock);
-	mprdthi |= (1<<apic->apicno)<<24;
-	unlock(&mprdthilock);
+	apic->online = 1;
 
 	lapicinit(apic);
 	lapiconline();
@@ -475,12 +472,8 @@ mpstartap(Apic* apic)
 	nvramwrite(0x0F, 0x0A);
 	lapicstartap(apic, PADDR(APBOOTSTRAP));
 	for(i = 0; i < 1000; i++){
-		lock(&mprdthilock);
-		if(mprdthi & ((1<<apic->apicno)<<24)){
-			unlock(&mprdthilock);
+		if(apic->online)
 			break;
-		}
-		unlock(&mprdthilock);
 		delay(10);
 	}
 	nvramwrite(0x0F, 0x00);
@@ -577,9 +570,6 @@ mpinit(void)
 		return;
 
 	lapicinit(bpapic);
-	lock(&mprdthilock);
-	mprdthi |= (1<<bpapic->apicno)<<24;
-	unlock(&mprdthilock);
 
 	/*
 	 * These interrupts are local to the processor
@@ -743,9 +733,9 @@ mpintrenablex(Vctl* v, int tbdf)
 		lo |= ApicLOGICAL;
 
 		if((apic->flags & PcmpEN) && apic->type == PcmpIOAPIC){
-			lock(&mprdthilock);
+			//lock(&mprdthilock);
  			ioapicrdtw(apic, aintr->intr->intin, mprdthi, lo);
-			unlock(&mprdthilock);
+			//unlock(&mprdthilock);
 		}
 		//else
 		//	print("lo not enabled 0x%uX %d\n",

+ 3 - 1
sys/src/9/pc/mp.h

@@ -165,10 +165,12 @@ typedef struct Apic {
 
 	int	lintr[2];		/* Local APIC */
 	int	machno;
+
+	int	online;
 } Apic;
 
 enum {
-	MaxAPICNO	= 31,
+	MaxAPICNO	= 255,
 };
 
 enum {					/* I/O APIC registers */

+ 10 - 6
sys/src/9/port/devuart.c

@@ -80,7 +80,11 @@ uartenable(Uart *p)
 		uartctl(p, "b9600");
 	(*p->phys->enable)(p, 1);
 
-	lock(&uartalloc);
+	/*
+	 * use ilock because uartclock can otherwise interrupt here
+	 * and would hang on an attempt to lock uartalloc.
+	 */
+	ilock(&uartalloc);
 	for(l = &uartalloc.elist; *l; l = &(*l)->elist){
 		if(*l == p)
 			break;
@@ -90,7 +94,7 @@ uartenable(Uart *p)
 		uartalloc.elist = p;
 	}
 	p->enabled = 1;
-	unlock(&uartalloc);
+	iunlock(&uartalloc);
 
 	return p;
 }
@@ -102,7 +106,7 @@ uartdisable(Uart *p)
 
 	(*p->phys->disable)(p);
 
-	lock(&uartalloc);
+	ilock(&uartalloc);
 	for(l = &uartalloc.elist; *l; l = &(*l)->elist){
 		if(*l == p){
 			*l = p->elist;
@@ -110,7 +114,7 @@ uartdisable(Uart *p)
 		}
 	}
 	p->enabled = 0;
-	unlock(&uartalloc);
+	iunlock(&uartalloc);
 }
 
 void
@@ -707,7 +711,7 @@ uartclock(void)
 {
 	Uart *p;
 
-	lock(&uartalloc);
+	ilock(&uartalloc);
 	for(p = uartalloc.elist; p; p = p->elist){
 
 		/* this hopefully amortizes cost of qproduce to many chars */
@@ -734,7 +738,7 @@ uartclock(void)
 			iunlock(&p->tlock);
 		}
 	}
-	unlock(&uartalloc);
+	iunlock(&uartalloc);
 }
 
 /*

+ 1 - 1
sys/src/boot/pc/conf.c

@@ -270,7 +270,7 @@ char*
 getconf(char *name)
 {
 	int i, n, nmatch;
-	char buf[20];
+	char buf[120];
 
 	nmatch = 0;
 	for(i = 0; i < nconf; i++)

+ 0 - 11
sys/src/libc/9sys/run

@@ -1,11 +0,0 @@
-#!/bin/rc
-fn f{
-	echo $1
-	cd $1
-	/sys/src/libc/9sys/v.out
-}
-vc ngetwd.c
-vl ngetwd.v pwd.v
-f /n/bootesother/andrew
-#f /bin
-#f /usr/andrew