From 01e08d2944bf8ed12eac42bf452fff79c40a367f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 31 Mar 1997 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1997-03-31 --- pc/ether8003.c | 10 +++++----- pc/fns.h | 3 ++- pc/memory.c | 40 ++++++++++++++++++++++++++++++---------- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/pc/ether8003.c b/pc/ether8003.c index 2cb54a7a5ed4bb8652739fc4bbe5271e02118660..66b03998ff6e0e1f296ce4f5076f6bedc7fd74ca 100644 --- a/pc/ether8003.c +++ b/pc/ether8003.c @@ -205,11 +205,11 @@ reset(Ether* ether) ether->size = 8*1024; /* - * Look for the interface. We read the LAN address ROM + * Look for the interface. Read the LAN address ROM * and validate the checksum - the sum of all 8 bytes * should be 0xFF. - * While we're at it, get the (possible) interface chip - * registers, we'll use them to check for aliasing later. + * At the same time, get the (possible) interface chip + * registers, they'll be used later to check for aliasing. */ port = ether->port; sum = 0; @@ -253,8 +253,8 @@ reset(Ether* ether) } dp8390setea(ether); - if(umbrmalloc(PADDR(ether->mem), ether->size, 0) == 0) - panic("ether8003: 0x%luX unavailable", PADDR(ether->mem)); + if(umbrwmalloc(PADDR(ether->mem), ether->size, 0) == 0) + print("ether8003: warning - 0x%luX unavailable", PADDR(ether->mem)); return 0; } diff --git a/pc/fns.h b/pc/fns.h index b7801433aa0be5217dc8ce8a35ca700dcba290a7..90e2d5cba880ce5f1062f579e825b09f2813dc9a 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -97,8 +97,9 @@ void touser(void*); void trapinit(void); int tas(void*); ulong umbmalloc(ulong, int, int); -ulong umbrmalloc(ulong, int, int); void umbfree(ulong, int); +ulong umbrwmalloc(ulong, int, int); +void umbrwfree(ulong, int); ulong upamalloc(ulong, int, int); void upafree(ulong, int); void vectortable(void); diff --git a/pc/memory.c b/pc/memory.c index 0c492cb21bdc3d4d4329b9ddbf27e272fe4cbf9a..2a0ada0ca7a03beb42a8acf28e3ce7e5b0287d52 100644 --- a/pc/memory.c +++ b/pc/memory.c @@ -67,11 +67,11 @@ static RMap rmapumb = { &mapumb[63], }; -static Map mapumbr[8]; -static RMap rmapumbr = { +static Map mapumbrw[8]; +static RMap rmapumbrw = { "UMB device memory", - mapumbr, - &mapumbr[7], + mapumbrw, + &mapumbrw[7], }; #define notdef @@ -85,14 +85,14 @@ dumpmembank(void) maxpa = (nvramread(0x18)<<8)|nvramread(0x17); maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30); maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15); - print("maxpa = %uX -> %uX, maxpa1 = %uXm maxpa2 = %uX\n", + print("maxpa = %uX -> %uX, maxpa1 = %uX maxpa2 = %uX\n", maxpa, MB+maxpa*KB, maxpa1, maxpa2); for(mp = rmapram.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); for(mp = rmapumb.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); - for(mp = rmapumbr.map; mp->size; mp++) + for(mp = rmapumbrw.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); for(mp = rmapupa.map; mp->size; mp++) print("%8.8uX %8.8uX %8.8uX\n", mp->addr, mp->size, mp->addr+mp->size); @@ -212,7 +212,7 @@ umbscan(void) while(p < (uchar*)KADDR(0xE0000)){ p[0] = 0xCC; p[2*KB-1] = 0xCC; - if(p[0] != 0xCC && p[2*KB-1] != 0xCC){ + if(p[0] != 0xCC || p[2*KB-1] != 0xCC){ p[0] = 0x55; p[1] = 0xAA; p[2] = 4; @@ -223,7 +223,7 @@ umbscan(void) mapfree(&rmapumb, PADDR(p), 2*KB); } else - mapfree(&rmapumbr, PADDR(p), 2*KB); + mapfree(&rmapumbrw, PADDR(p), 2*KB); p += 2*KB; } @@ -481,16 +481,36 @@ umbfree(ulong addr, int size) } ulong -umbrmalloc(ulong addr, int size, int align) +umbrwmalloc(ulong addr, int size, int align) { ulong a; + uchar *p; - if(a = mapalloc(&rmapumbr, addr, size, align)) + if(a = mapalloc(&rmapumbrw, addr, size, align)) return KZERO|a; + /* + * Perhaps the memory wasn't visible before + * the interface is initialised, so try again. + */ + if((a = umbmalloc(addr, size, align)) == 0) + return 0; + p = (uchar*)a; + p[0] = 0xCC; + p[size-1] = 0xCC; + if(p[0] == 0xCC && p[size-1] == 0xCC) + return a; + umbfree(a, size); + return 0; } +void +umbrwfree(ulong addr, int size) +{ + mapfree(&rmapumbrw, addr & ~KZERO, size); +} + ulong upamalloc(ulong addr, int size, int align) {