From 58f1fd5a79ce9468ed1adecf2d0beed5abe72c00 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 19 Jun 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-06-19 --- pc/l.s | 61 +++++++++++++++++++++++++++++++++++--------------- port/devbit.c | 8 ++++--- port/fault.c | 19 +++++++++------- port/portfns.h | 2 +- port/sysproc.c | 2 +- 5 files changed, 61 insertions(+), 31 deletions(-) diff --git a/pc/l.s b/pc/l.s index e4e287c95144dbae4db927f821ec6068bd96e644..d657c1567dd9153011f2f7ca9cafdd6913709536 100644 --- a/pc/l.s +++ b/pc/l.s @@ -1,6 +1,6 @@ /* - * Boot first processor + * boot first processor */ TEXT start(SB),$0 @@ -9,6 +9,9 @@ TEXT start(SB),$0 /* never returns */ +/* + * trap vector, each instruction is 4 bytes long + */ TEXT traptab(SB),$0 CALL noerrcode(SB) /* divide */ @@ -270,23 +273,45 @@ TEXT traptab(SB),$0 CALL noerrcode(SB) TEXT noerrcode(SB),$0 - PUSH EAX - /* drop through */ + + PUSHL EAX + MOVL 4(ESP),EAX +/* JMP george /**/ + TEXT errcode(SB),$0 - PUSH EAX - PUSH EBX - PUSH ECX - PUSH EDX - PUSH EBP - PUSH ESI - PUSH EDI + + XCHGL (ESP),EAX + /* fall through */ + +TEXT saveregs(SB),$0 + +george: + PUSHL EBX + MOVL $noerrcode(SB),EBX /* calculate trap number */ + SUBL EAX,EBX /* ... */ + SHRL $1,EBX /* ... */ + PUSHL ECX + PUSHL EDX + PUSHL EBP + PUSHL ESI + PUSHL EDI + PUSHL EBX /* save trap number */ CALL trap(SB) - POP EDI - POP ESI - POP EBP - POP EDX - POP ECX - POP EBX - POP EAX - ADD $8,ESP /* jump over error code + return addr */ + ADDL $4,ESP /* drop trap number */ + POPL EDI + POPL ESI + POPL EBP + POPL EDX + POPL ECX + POPL EBX + POPL EAX + ADDL $4,ESP /* drop error code */ IRET + +TEXT trap(SB),$0 + + RET + +TEXT main(SB),$0 + + RET diff --git a/port/devbit.c b/port/devbit.c index e3eb10dec8182b13d598f076b39b9bdff9b06f87..42f1c986baf960d4741d206ff4199c9b8cecf181 100644 --- a/port/devbit.c +++ b/port/devbit.c @@ -1009,9 +1009,11 @@ bitwrite(Chan *c, void *va, long n, ulong offset) error(Ebadblt); pt1.x = GLONG(p+1); pt1.y = GLONG(p+5); - mouse.xy = pt1; - mouse.track = 1; - mouseclock(); + if(!eqpt(mouse.xy, pt1)){ + mouse.xy = pt1; + mouse.track = 1; + mouseclock(); + } m -= 9; p += 9; break; diff --git a/port/fault.c b/port/fault.c index 826daf112a00cadd8718a137b00ffcf2115bfe54..1cec35658293163a71d8fedd26d84bfa3ef6cfc4 100644 --- a/port/fault.c +++ b/port/fault.c @@ -264,7 +264,7 @@ validaddr(ulong addr, ulong len, int write) * &s[0] is known to be a valid address. */ void* -vmemchr(void *s, int c, int n) +vmemchr(void *s, int c, ulong n) { int m; char *t; @@ -272,18 +272,21 @@ vmemchr(void *s, int c, int n) a = (ulong)s; m = BY2PG - (a & (BY2PG-1)); - if(m < n){ - t = vmemchr(s, c, m); + while(n){ + if(n < m) + m = n; + t = memchr(s, c, m); if(t) return t; + if(n == m) + return 0; if(!(a & KZERO)) validaddr(a+m, 1, 0); - return vmemchr((void*)(a+m), c, n-m); + n -= m; + a += m; + m = BY2PG; } - /* - * All in one page - */ - return memchr(s, c, n); + return 0; } Seg* diff --git a/port/portfns.h b/port/portfns.h index 418a2906d3d56404f40f6df12eaeda19f1fcd3bc..45a6f0261246ee8ea82c12965d01739a14e3b9c7 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -187,6 +187,6 @@ void unusepage(Page*, int); void usepage(Page*, int); void userinit(void); void validaddr(ulong, ulong, int); -void* vmemchr(void*, int, int); +void* vmemchr(void*, int, ulong); void wakeme(Alarm*); void wakeup(Rendez*); diff --git a/port/sysproc.c b/port/sysproc.c index b1052d685634a988f3fccab095e94e20610b6cce..88a62eda0ccddd69b870d3561b14bc85981d0d23 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -237,7 +237,7 @@ sysexec(ulong *arg) if(((ulong)argp&(BY2PG-1)) < BY2WD) validaddr((ulong)argp, BY2WD, 0); validaddr((ulong)a, 1, 0); - nbytes += (vmemchr(a, 0, 0xFFFFFFFF) - a) + 1; + nbytes += (vmemchr(a, 0, ~0) - a) + 1; nargs++; } ssize = BY2WD*(nargs+1) + ((nbytes+(BY2WD-1)) & ~(BY2WD-1));