From 8a033334d6ecd2a26a0020298eacff755a48678c Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 15 Nov 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-11-15 --- pc/mmu.c | 4 ++++ pc/trap.c | 26 +++++++++++++------------- port/chan.c | 20 ++++++++++++++++---- port/pgrp.c | 1 - 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/pc/mmu.c b/pc/mmu.c index 21b62782402bd52c460f98b4f40371b57ec70b5a..80caa5dfc323c3f7ca28695f8f91ebe44a35d13a 100644 --- a/pc/mmu.c +++ b/pc/mmu.c @@ -106,6 +106,10 @@ taskswitch(ulong pagetbl, ulong stack) { tss.ss0 = KDSEL; tss.sp0 = stack; +tss.ss1 = KDSEL; +tss.sp1 = stack; +tss.ss2 = KDSEL; +tss.sp2 = stack; tss.cr3 = pagetbl; putcr3(pagetbl); } diff --git a/pc/trap.c b/pc/trap.c index b614ea310ebf9148d66fa9c155c23ef42143ac27..c7c4ac94ccfd73d050e6470cc432ada4a3985e1e 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -136,9 +136,9 @@ trapinit(void) sethvec(11, intr11, SEGIG, 0); sethvec(12, intr12, SEGIG, 0); sethvec(13, intr13, SEGIG, 0); - sethvec(14, intr14, SEGIG, 0); /* page fault, interrupts off */ + sethvec(14, intr14, SEGIG, 0); /* page fault */ sethvec(15, intr15, SEGIG, 0); - sethvec(16, intr16, SEGIG, 0); /* math coprocessor, interrupts off */ + sethvec(16, intr16, SEGIG, 0); /* math coprocessor */ /* * device interrupts @@ -223,7 +223,9 @@ Proc *lastup; /* - * All traps + * All trapscome here. It is slower to have all traps call trap() rather than + * directly vectoring the handler. However, this avoids a lot of code duplication + * and possible bugs. */ void trap(Ureg *ur) @@ -239,13 +241,6 @@ trap(Ureg *ur) if(user) up->dbgreg = ur; -ur->cs &= 0xffff; -ur->ds &= 0xffff; -ur->es &= 0xffff; -ur->fs &= 0xffff; -ur->gs &= 0xffff; -if(user) ur->ss &= 0xffff; - /* * tell the 8259 that we're done with the * highest level interrupt (interrupts are still @@ -313,20 +308,25 @@ lastur = ur; void dumpregs2(Ureg *ur) { + ur->cs &= 0xffff; + ur->ds &= 0xffff; + ur->es &= 0xffff; + ur->fs &= 0xffff; + ur->gs &= 0xffff; + if(up) print("registers for %s %d\n", up->text, up->pid); else print("registers for kernel\n"); - print("FLAGS=%lux TRAP=%lux ECODE=%lux CS=%lux PC=%lux", ur->flags, ur->trap, + print("FLAGS=%lux TRAP=%lux ECODE=%lux CS=%4.4lux PC=%lux", ur->flags, ur->trap, ur->ecode, ur->cs, ur->pc); - print(" SS=%lux USP=%lux\n", ur->ss, ur->usp); + print(" SS=%4.4lux USP=%lux\n", ur->ss&0xffff, ur->usp); print(" AX %8.8lux BX %8.8lux CX %8.8lux DX %8.8lux\n", ur->ax, ur->bx, ur->cx, ur->dx); print(" SI %8.8lux DI %8.8lux BP %8.8lux\n", ur->si, ur->di, ur->bp); print(" DS %4.4lux ES %4.4lux FS %4.4lux GS %4.4lux\n", ur->ds, ur->es, ur->fs, ur->gs); - } void diff --git a/port/chan.c b/port/chan.c index b90bddd682a721d1cfefacb0dcfd383580d96d60..3ce7e2a2db43a8b29595ffaab53483a72aa6ca89 100644 --- a/port/chan.c +++ b/port/chan.c @@ -168,9 +168,9 @@ int mount(Chan *new, Chan *old, int flag, char *spec) { Pgrp *pg; - int order; - Mount *nm, *f; + int order, flg; Mhead *m, **l; + Mount *nm, *f, *um, **h; if(CHDIR & (old->qid.path^new->qid.path)) error(Emount); @@ -210,7 +210,17 @@ mount(Chan *new, Chan *old, int flag, char *spec) } nm = newmount(m, new, flag, spec); - + if(new->mnt != 0) { + h = &nm->next; + for(um = new->mnt->next; um; um = um->next) { + flg = um->flag; + if(flg == 0) + flg = MAFTER; + f = newmount(m, um->to, flg, um->spec); + *h = f; + h = &f->next; + } + } if(flag & MCREATE) new->flag |= CCREATE; @@ -221,7 +231,9 @@ mount(Chan *new, Chan *old, int flag, char *spec) f->next = nm; } else { - nm->next = m->mount; + for(f = nm; f->next; f = f->next) + ; + f->next = m->mount; m->mount = nm; } diff --git a/port/pgrp.c b/port/pgrp.c index 6cef5618fa0f5f85de77c37b7a2f79b5c40e1bbc..a4a518507550b72880e6aabe033613880927b9c1 100644 --- a/port/pgrp.c +++ b/port/pgrp.c @@ -140,7 +140,6 @@ closefgrp(Fgrp *f) } } - Mount* newmount(Mhead *mh, Chan *to, int flag, char *spec) {