From d7ed191f811e8267a57e4c2eb03e7b33e3e90a54 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 20 Jan 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-01-20 --- gnot/segment.h | 10 +++++----- pc/fns.h | 2 ++ pc/mmu.c | 28 ++++++++++++++++++++++++++++ pc/segment.h | 14 ++++++-------- port/alloc.c | 16 ++++++++-------- port/devcons.c | 1 + port/fault.c | 2 +- port/portdat.h | 2 +- port/segment.c | 9 +-------- power/lock.c | 3 ++- power/segment.h | 8 ++++---- ss/segment.h | 2 +- 12 files changed, 60 insertions(+), 37 deletions(-) diff --git a/gnot/segment.h b/gnot/segment.h index e7efd47e66336fbeec3fe6118363d1788f4df6f6..09ba7e51b182f53270c25a3cc599327b4ec75e8e 100644 --- a/gnot/segment.h +++ b/gnot/segment.h @@ -9,11 +9,11 @@ struct Physseg char *name; /* Attach name */ ulong pa; /* Physical address */ ulong size; /* Maximum segment size in pages */ - Page *(*pgalloc)(ulong); /* Allocation if we need it */ + Page *(*pgalloc)(Segment*, ulong); /* Allocation if we need it */ void (*pgfree)(Page*); }physseg[] = { - { SG_SHARED, "lock", 0, SEGMAXSIZE, snewpage, putpage }, - { SG_SHARED, "shared", 0, SEGMAXSIZE, snewpage, putpage }, - { SG_BSS, "memory", 0, SEGMAXSIZE, snewpage, putpage }, - { 0, 0, 0, 0, 0, 0 }, + { SG_SHARED, "lock", 0, SEGMAXSIZE, 0, 0 }, + { SG_SHARED, "shared", 0, SEGMAXSIZE, 0, 0 }, + { SG_BSS, "memory", 0, SEGMAXSIZE, 0, 0 }, + { 0, 0, 0, 0, 0, 0 }, }; diff --git a/pc/fns.h b/pc/fns.h index a510d4276ad8241419408345fdbc8a906197d03f..0282f1d2913c4e44c5eccccab1ca67c26672473d 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -9,8 +9,10 @@ void clockinit(void); void config(int); int cpuspeed(int); void delay(int); +void dsegfree(Page*); void dmaend(int); long dmasetup(int, void*, long, int); +Page* dsegalloc(Segment*, ulong); #define evenaddr(x) /* 386 doesn't care */ void fault386(Ureg*); void faultinit(void); diff --git a/pc/mmu.c b/pc/mmu.c index 9f21f9cc16f7fd09ba0ef00ddf5e7d407585a41f..90b27d27689b96909a3aa66e7a0231beff949c0f 100644 --- a/pc/mmu.c +++ b/pc/mmu.c @@ -351,3 +351,31 @@ isamem(int len) unlock(&isamemalloc); return a; } + +/* + * mapping for user access to d segment (access to TARGA) + */ +Page* +dsegalloc(Segment *s, ulong va) +{ + Page *pg; + + pg = smalloc(sizeof(Page)); + memset(pg, 0, sizeof(Page)); + pg->va = va; + pg->pa = 0xd0000 + (va - s->base); + pg->ref = 1; + return pg; +} + +void +dsegfree(Page *pg) +{ + int x; + + lock(pg); + x = --pg->ref; + unlock(pg); + if(x <= 0) + free(pg); +} diff --git a/pc/segment.h b/pc/segment.h index dcd217ea16a307838794039c4d5caa4dd63d5732..28b3e935d02a60058e888028e0e26a6b94c76df1 100644 --- a/pc/segment.h +++ b/pc/segment.h @@ -2,8 +2,6 @@ * Attach segment types */ -#define PCMEM (KZERO|0xd0000) - typedef struct Physseg Physseg; struct Physseg { @@ -11,12 +9,12 @@ struct Physseg char *name; /* Attach name */ ulong pa; /* Physical address */ ulong size; /* Maximum segment size in pages */ - Page *(*pgalloc)(ulong); /* Allocation if we need it */ + Page *(*pgalloc)(Segment*, ulong); /* Allocation if we need it */ void (*pgfree)(Page*); }physseg[] = { - { SG_SHARED, "lock", 0, SEGMAXSIZE, snewpage, putpage }, - { SG_SHARED, "shared", 0, SEGMAXSIZE, snewpage, putpage }, - { SG_PHYSICAL, "pcmem", PCMEM, 64*1024, 0, 0, }, - { SG_BSS, "memory", 0, SEGMAXSIZE, snewpage, putpage }, - { 0, 0, 0, 0, 0, 0 }, + { SG_SHARED, "lock", 0, SEGMAXSIZE, 0, 0 }, + { SG_SHARED, "shared", 0, SEGMAXSIZE, 0, 0 }, + { SG_PHYSICAL, "dseg", 0xd0000, 64*1024, dsegalloc, dsegfree, }, + { SG_BSS, "memory", 0, SEGMAXSIZE, 0, 0 }, + { 0, 0, 0, 0, 0, 0 }, }; diff --git a/port/alloc.c b/port/alloc.c index 745773ede9f4b141047dd130ed1add34ed69e806..aa5ff4cda66f9fc84a8c4d6f1c86915c287d1862 100644 --- a/port/alloc.c +++ b/port/alloc.c @@ -263,7 +263,7 @@ malloc(ulong size) int pow, n; Bucket *bp, *nbp; - for(pow = 3; pow <= Maxpow; pow++) + for(pow = 3; pow < Maxpow; pow++) if(size <= (1<next = (Bucket*)next; + nbp = (Bucket*)next; nbp->size = pow; - nbp = nbp->next; + nbp->next = arena.btab[pow]; + arena.btab[pow] = nbp; } - nbp->size = pow; unlock(&arena); } else { @@ -315,7 +313,9 @@ good: if(bp == nil) return nil; + lock(&arena); arena.nbuck[pow]++; + unlock(&arena); } bp->size = pow; diff --git a/port/devcons.c b/port/devcons.c index 69bc7b041432534195490bc57c34fee66c02e9a0..6a3dfe9cf6f47f93e9e494d815c46c584bf9adbe 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -170,6 +170,7 @@ panic(char *fmt, ...) n = doprint(buf+strlen(buf), buf+sizeof(buf), fmt, (&fmt+1)) - buf; buf[n] = '\n'; putstrn(buf, n+1); + xsummary(); dumpstack(); exit(1); } diff --git a/port/fault.c b/port/fault.c index 156615de8c09add48fba4819ea0b76e2bbe6fae4..4138dcab67a6dd8d74a3c890d21ccd11dbc09c89 100644 --- a/port/fault.c +++ b/port/fault.c @@ -131,7 +131,7 @@ fixfault(Segment *s, ulong addr, int read, int doputmmu) case SG_PHYSICAL: if(*pg == 0) - *pg = (*s->pgalloc)(addr); + *pg = (*s->pgalloc)(s, addr); mmuphys = PPN((*pg)->pa) | PTEWRITE|PTEUNCACHED|PTEVALID; (*pg)->modref = PG_MOD|PG_REF; diff --git a/port/portdat.h b/port/portdat.h index 0e7d93676d6026874e4d4e66d68c268c8bf39abc..e213594213e000e24965a2b69b83df55a6b3fa2a 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -423,7 +423,7 @@ struct Segment ulong flen; /* length of segment in file */ int flushme; /* maintain consistent icache for this segment */ Image *image; /* text in file attached to this segment */ - Page *(*pgalloc)(ulong addr);/* SG_PHYSICAL page allocator */ + Page *(*pgalloc)(Segment*, ulong);/* SG_PHYSICAL page allocator */ void (*pgfree)(Page *); /* SG_PHYSICAL page free */ Pte *map[SEGMAPSIZE]; /* segment pte map */ }; diff --git a/port/segment.c b/port/segment.c index 0623191c8663b703d2cd1b40c1b486c4d9a8aae1..e9c898167ab10b4a298cf585aec772de09e2ef31 100644 --- a/port/segment.c +++ b/port/segment.c @@ -5,8 +5,7 @@ #include "fns.h" #include "../port/error.h" -Page *lkpage(ulong addr); -Page *snewpage(ulong addr); +Page *lkpage(Segment*, ulong); void lkpgfree(Page*); void imagereclaim(void); @@ -487,9 +486,3 @@ done: flushmmu(); return 0; } - -Page* -snewpage(ulong addr) -{ - return newpage(1, 0, addr); -} diff --git a/power/lock.c b/power/lock.c index 1d59d69ba24e2452d868206a9e8cedb5cd38024a..20884d7edce9122018dc1684b844131abdb2b300 100644 --- a/power/lock.c +++ b/power/lock.c @@ -48,12 +48,13 @@ lockinit(void) /* equivalent of newpage for pages of hardware locks */ Page* -lkpage(ulong va) +lkpage(Segment *s, ulong va) { uchar *p, *top; Page *pg; int i; + USED(s); lock(&semalloc.lock); if(--semalloc.ulockpg < 0) { semalloc.ulockpg++; diff --git a/power/segment.h b/power/segment.h index 7821c5b2659aa493ba5b45f3df053c726eb11637..c52324e4f068c7c3a87e93fb870dee7c24ff307e 100644 --- a/power/segment.h +++ b/power/segment.h @@ -9,11 +9,11 @@ struct Physseg char *name; /* Attach name */ ulong pa; /* Physical address */ ulong size; /* Maximum segment size in pages */ - Page *(*pgalloc)(ulong); /* Allocation if we need it */ + Page *(*pgalloc)(Segment*, ulong); /* Allocation if we need it */ void (*pgfree)(Page*); }physseg[] = { { SG_PHYSICAL, "lock", 0, 1024*BY2PG, lkpage, lkpgfree }, - { SG_SHARED, "shared", 0, SEGMAXSIZE, snewpage, putpage }, - { SG_BSS, "memory", 0, SEGMAXSIZE, snewpage, putpage }, - { 0, 0, 0, 0, 0, 0 }, + { SG_SHARED, "shared", 0, SEGMAXSIZE, 0, 0 }, + { SG_BSS, "memory", 0, SEGMAXSIZE, 0, 0 }, + { 0, 0, 0, 0, 0, 0 }, }; diff --git a/ss/segment.h b/ss/segment.h index 06b7d48889248277c7303519f9eb130d6ba89ab3..8855766b263dadef9594e41f3adb21bd6cee5dbc 100644 --- a/ss/segment.h +++ b/ss/segment.h @@ -9,7 +9,7 @@ struct Physseg char *name; /* Attach name */ ulong pa; /* Physical address */ ulong size; /* Maximum segment size in pages */ - Page *(*pgalloc)(ulong); /* Allocation if we need it */ + Page *(*pgalloc)(Segment*, ulong); /* Allocation if we need it */ void (*pgfree)(Page*); }physseg[] = { { SG_SHARED, "shared", 0, SEGMAXSIZE, 0, 0 },