fault.ed - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
fault.ed (1625B)
---
1 1i
2 #define WANT_M
3
4 .
5 ,s/lock(lkp)/lock(\&lkp->lk)/g
6 ,s/s->ref/s->ref.ref/g
7 /^fault/ s/^//
8 /if(s == 0)/a
9 iprint("%ld %s fault %#x no segment\n", up->pid, up->text, addr);
10 { Segment **s, **et, *n;
11
12 et = &up->seg[NSEG];
13 for(s = up->seg; s < et; s++) {
14 n = *s;
15 if(n == 0)
16 continue;
17 print("segment %#lux %#lux\n", n->base, n->top);
18 }
19 }
20 .
21 /qunlock(&s->lk)/a
22 iprint("%ld %s fault %#x write in read-only\n", up->pid, up->text, addr);
23 .
24 /done:/ s/$/;/
25 +1;/^}/-1d
26 /^okaddr/-1c
27 void*
28 .
29 /^{/+1a
30 ulong addr0;
31
32 addr0 = addr;
33 .
34 /s = seg/ s/0/1/
35 /if(s == 0/;+1 c
36 if(s == 0)
37 break;
38 if(write && (s->type&SG_RONLY)){
39 qunlock(&s->lk);
40 break;
41 }
42 .
43 /continue/i
44 qunlock(&s->lk);
45 .
46 /return/c
47 qunlock(&s->lk);
48 return up->pmmu.uzero+addr0;
49 .
50 /^validaddr/-1;/^}/ c
51 void*
52 uvalidaddr(ulong addr, ulong len, int write)
53 {
54 void *v;
55
56 v = okaddr(addr, len, write);
57 if(v == nil)
58 pexit("Suicide", 0);
59
60 // This is a valid address, but the host kernel
61 // might not know that. In case we're going
62 // to pass the address to the host kernel in a
63 // system call, fault in the pages.
64 volatile char *a = v;
65 ulong i;
66 for(i=0; i<len; i+=BY2PG){
67 if(write)
68 a[i] = a[i];
69 else
70 (void)a[i];
71 }
72 if(len > 0){
73 if(write)
74 a[len-1] = a[len-1];
75 else
76 (void)a[len-1];
77 }
78 return v;
79 }
80 .
81 /^vmemchr/ s/^//
82 /int m/ s/m/m_/
83 /ulong a/ s/ulong /uchar */
84 /a = (ulong)s/;/while/c
85 a = s;
86 while(PGROUND((ulong)a) != PGROUND((ulong)a+n-1)){
87 .
88 /m =/ s/m/m_/
89 s/a/(ulong)a/
90 /memchr/ s/m)/m_)/
91 s/(void\*)a/a/
92 /m;/ s/m/m_/
93 /m;/ s/m/m_/
94 /KZERO/ s/(.*)/(isuaddr(a))/
95 +1 s/validaddr(.*)/uvalidaddr(a-up->pmmu.uzero, 1, 0)/