M pc/l.s => pc/l.s +43 -18
@@ 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
M port/devbit.c => port/devbit.c +5 -3
@@ 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;
M port/fault.c => port/fault.c +11 -8
@@ 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*
M port/portfns.h => port/portfns.h +1 -1
@@ 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*);
M port/sysproc.c => port/sysproc.c +1 -1
@@ 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));