2 #include "../port/lib.h"
6 #include "../port/error.h"
11 * A = accessed (for code/data)
12 * E = expand down (for data)
13 * W = writable (for data)
14 * R = readable (for code)
15 * C = conforming (for code)
16 * G = limit granularity in pages (for code/data)
17 * D = 32 bit operand size (for code)
18 * B = 32 bit stack pointer (for data)
19 * Y = busy (for tss and tss16)
20 * U = available for use by system software
27 "data", "--------AWE01--P----U.BG--------",
28 "code", "--------ARC11--P----U.DG--------",
29 "tss16", "--------1Y000--P----U..G--------",
30 "ldt", "--------01000--P----U..G--------",
31 "callg16", "--------00100--P----U..G--------",
32 "taskg", "--------10100--P----U..G--------",
33 "intrg16", "--------01100--P----U..G--------",
34 "trapg16", "--------11100--P----U..G--------",
35 "tss", "--------1Y010--P----U..G--------",
36 "callg", "--------00110--P----U..G--------",
37 "intrg", "--------01110--P----U..G--------",
38 "trapg", "--------11110--P----U..G--------",
43 * idx[4] type[8] flags[8] dpl[1] base[8] limit[5]\n
48 RECLEN = 4+1 + 8+1 + 8+1 + 1+1 + 8+1 + 5+1,
52 descwrite(Proc *proc, int local, void *v, long n, vlong)
56 char c, *p, *s, *e, *f[6];
73 for(p = s; p < e && *p != '\n'; p++);
77 memmove(buf, s, p - s);
81 if(getfields(buf, f, nelem(f), 1, " ") != nelem(f))
84 i = strtoul(f[0], nil, 16);
86 for(t=0; t<nelem(descrtypes); t++)
87 if(strcmp(descrtypes[t].name, f[1]) == 0)
89 if(t == nelem(descrtypes))
93 base = strtoul(f[4], nil, 16);
94 limit = strtoul(f[5], nil, 16);
96 d.d0 = ((base & 0xFFFF)<<16) | (limit & 0xFFFF);
97 d.d1 = (base & 0xFF000000) | (limit & 0xF0000) | ((dpl & 3)<<13) | ((base & 0xFF0000)>>16);
99 for(j=0; c = descrtypes[t].flags[j]; j++){
102 if(strchr(f[2], c) == nil){
117 /* dont allow system segments */
118 if((d.d1 & SEGP) && ((dpl != 3) || !(d.d1 & (1<<12))))
125 if(i < 0 || i >= 8192)
127 if(i >= (c = ((old = proc->ldt) ? proc->nldt : 0))){
128 if((new = malloc(sizeof(Segdesc) * (i+1))) == nil)
131 memmove(new, old, sizeof(Segdesc) * c);
132 memset(new + c, 0, sizeof(Segdesc) * ((i+1) - c));
139 if(i < PROCSEG0 || i >= PROCSEG0 + NPROCSEG)
141 proc->gdt[i - PROCSEG0] = d;
153 descread(Proc *proc, int local, void *v, long n, vlong o)
167 if(proc->ldt == nil || i >= proc->nldt)
173 if(i >= PROCSEG0 + NPROCSEG)
175 d = proc->gdt[i - PROCSEG0];
183 if(s + RECLEN+1 >= (char*)v + n)
186 for(t=0; t<nelem(descrtypes); t++){
187 for(j=0; descrtypes[t].flags[j]; j++){
188 if(descrtypes[t].flags[j]=='0' && (d.d1 & (1<<j)) != 0)
190 if(descrtypes[t].flags[j]=='1' && (d.d1 & (1<<j)) == 0)
193 if(descrtypes[t].flags[j] == 0)
196 if(t == nelem(descrtypes))
199 s += sprint(s, "%.4lux ", (ulong)i);
200 s += sprint(s, "%-8s ", descrtypes[t].name);
203 for(j=0; descrtypes[t].flags[j]; j++){
204 switch(descrtypes[t].flags[j]){
212 s[k++] = descrtypes[t].flags[j];
220 dpl = (d.d1 & 0x6000)>>13;
221 base = ((d.d0 & 0xFFFF0000)>>16) | ((d.d1 & 0xFF)<<16) | (d.d1 & 0xFF000000);
222 limit = (d.d1 & 0xF0000) | (d.d0 & 0xFFFF);
224 s += sprint(s, "%.1d ", dpl);
225 s += sprint(s, "%.8lux ", base);
226 s += sprint(s, "%.5lux\n", limit);
233 gdtread(Chan*, void *v, long n, vlong o)
235 return descread(up, 0, v, n, o);
239 gdtwrite(Chan*, void *v, long n, vlong o)
241 return descwrite(up, 0, v, n, o);
245 ldtread(Chan*, void *v, long n, vlong o)
247 return descread(up, 1, v, n, o);
251 ldtwrite(Chan*, void *v, long n, vlong o)
253 return descwrite(up, 1, v, n, o);
259 addarchfile("gdt", 0666, gdtread, gdtwrite);
260 addarchfile("ldt", 0666, ldtread, ldtwrite);