1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
|
typedef struct BIOS32si BIOS32si;
typedef struct BIOS32ci BIOS32ci;
typedef struct Conf Conf;
typedef struct Confmem Confmem;
typedef struct FPssestate FPssestate;
typedef struct FPavxstate FPavxstate;
typedef struct FPsave FPsave;
typedef struct PFPU PFPU;
typedef struct ISAConf ISAConf;
typedef struct Label Label;
typedef struct Lock Lock;
typedef struct MMU MMU;
typedef struct Mach Mach;
typedef struct PCArch PCArch;
typedef struct Pcidev Pcidev;
typedef struct PCMmap PCMmap;
typedef struct PCMslot PCMslot;
typedef struct Page Page;
typedef struct PMMU PMMU;
typedef struct Proc Proc;
typedef struct Segdesc Segdesc;
typedef vlong Tval;
typedef struct Ureg Ureg;
typedef struct Vctl Vctl;
#pragma incomplete BIOS32si
#pragma incomplete Pcidev
#pragma incomplete Ureg
#define MAXSYSARG 5 /* for mount(fd, afd, mpt, flag, arg) */
/*
* parameters for sysproc.c
*/
#define AOUT_MAGIC (S_MAGIC)
struct Lock
{
ulong key;
ulong sr;
uintptr pc;
Proc *p;
Mach *m;
ushort isilock;
long lockcycles;
};
struct Label
{
uintptr sp;
uintptr pc;
};
struct FPssestate
{
u16int fcw; /* x87 control word */
u16int fsw; /* x87 status word */
u8int ftw; /* x87 tag word */
u8int zero; /* 0 */
u16int fop; /* last x87 opcode */
u64int rip; /* last x87 instruction pointer */
u64int rdp; /* last x87 data pointer */
u32int mxcsr; /* MMX control and status */
u32int mxcsrmask; /* supported MMX feature bits */
uchar st[128]; /* shared 64-bit media and x87 regs */
uchar xmm[256]; /* 128-bit media regs */
uchar ign[96]; /* reserved, ignored */
};
struct FPavxstate
{
FPssestate;
uchar header[64]; /* XSAVE header */
uchar ymm[256]; /* upper 128-bit regs (AVX) */
};
struct FPsave
{
FPavxstate;
};
enum
{
/* this is a state */
FPinit= 0,
FPactive= 1,
FPinactive= 2,
/*
* the following are bits that can be or'd into the state.
*
* this is biased so that FPinit, FPactive and FPinactive
* without any flags refer to user fp state in fpslot[0].
*/
FPillegal= 1<<8, /* fp forbidden in note handler */
FPpush= 2<<8, /* trap on use and initialize new fpslot */
FPnouser= 4<<8, /* fpslot[0] is kernel regs */
FPkernel= 8<<8, /* fp use in kernel (user in fpslot[0] when !FPnouser) */
FPindexs= 16,
FPindex1= 1<<FPindexs,
FPindexm= 3<<FPindexs,
};
struct PFPU
{
int fpstate;
FPsave *fpsave; /* fpslot[fpstate>>FPindexs] */
FPsave *fpslot[(FPindexm+1)>>FPindexs];
};
struct Confmem
{
uintptr base;
ulong npage;
uintptr kbase;
uintptr klimit;
};
struct Conf
{
ulong nmach; /* processors */
ulong nproc; /* processes */
ulong monitor; /* has monitor? */
Confmem mem[16]; /* physical memory */
ulong npage; /* total physical pages of memory */
ulong upages; /* user page pool */
ulong nimage; /* number of page cache image headers */
ulong nswap; /* number of swap pages */
int nswppo; /* max # of pageouts per segment pass */
ulong copymode; /* 0 is copy on write, 1 is copy on reference */
ulong ialloc; /* max interrupt time allocation in bytes */
ulong pipeqsize; /* size in bytes of pipe queues */
int nuart; /* number of uart devices */
};
struct Segdesc
{
u32int d0;
u32int d1;
};
/*
* MMU structure for PDP, PD, PT pages.
*/
struct MMU
{
MMU *next;
uintptr *page;
int index;
int level;
};
/*
* MMU stuff in proc
*/
#define NCOLOR 1
struct PMMU
{
MMU* mmuhead;
MMU* mmutail;
MMU* kmaphead;
MMU* kmaptail;
ulong kmapcount;
ulong kmapindex;
ulong mmucount;
u64int dr[8];
void *vmx;
};
#include "../port/portdat.h"
typedef struct {
u32int _0_;
u32int rsp0[2];
u32int rsp1[2];
u32int rsp2[2];
u32int _28_[2];
u32int ist[14];
u16int _92_[5];
u16int iomap;
} Tss;
struct Mach
{
int machno; /* physical id of processor */
uintptr splpc; /* pc of last caller to splhi */
Proc* proc; /* current process on this processor */
PMach;
uvlong tscticks;
ulong spuriousintr;
int lastintr;
int loopconst;
int aalcycles;
int cpumhz;
uvlong cpuhz;
int cpuidax;
int cpuidcx;
int cpuiddx;
char cpuidid[16];
char* cpuidtype;
uchar cpuidfamily;
uchar cpuidmodel;
uchar cpuidstepping;
char havetsc;
char havepge;
char havewatchpt8;
char havenx;
u64int* pml4; /* pml4 base for this processor (va) */
Tss* tss; /* tss for this processor */
Segdesc*gdt; /* gdt for this processor */
u64int dr7; /* shadow copy of dr7 */
u64int xcr0;
void* vmx;
MMU* mmufree; /* freelist for MMU structures */
ulong mmucount; /* number of MMU structures in freelist */
u64int mmumap[4]; /* bitmap of pml4 entries for zapping */
uintptr stack[1];
};
/*
* KMap the structure
*/
typedef void KMap;
#define VA(k) ((void*)k)
extern u32int MemMin;
struct
{
char machs[MAXMACH]; /* bitmap of active CPUs */
int exiting; /* shutdown */
}active;
/*
* routines for things outside the PC model, like power management
*/
struct PCArch
{
char* id;
int (*ident)(void); /* this should be in the model */
void (*reset)(void); /* this should be in the model */
void (*intrinit)(void);
int (*intrassign)(Vctl*);
int (*intrirqno)(int, int);
int (*intrvecno)(int);
int (*intrspurious)(int);
void (*introff)(void);
void (*intron)(void);
void (*clockinit)(void);
void (*clockenable)(void);
uvlong (*fastclock)(uvlong*);
void (*timerset)(uvlong);
};
/* cpuid instruction result register bits */
enum {
/* ax */
Xsaveopt = 1<<0,
Xsaves = 1<<3,
/* cx */
Monitor = 1<<3,
Xsave = 1<<26,
Avx = 1<<28,
/* dx */
Fpuonchip = 1<<0,
Vmex = 1<<1, /* virtual-mode extensions */
Pse = 1<<3, /* page size extensions */
Tsc = 1<<4, /* time-stamp counter */
Cpumsr = 1<<5, /* model-specific registers, rdmsr/wrmsr */
Pae = 1<<6, /* physical-addr extensions */
Mce = 1<<7, /* machine-check exception */
Cmpxchg8b = 1<<8,
Cpuapic = 1<<9,
Mtrr = 1<<12, /* memory-type range regs. */
Pge = 1<<13, /* page global extension */
Mca = 1<<14, /* machine-check architecture */
Pat = 1<<16, /* page attribute table */
Pse2 = 1<<17, /* more page size extensions */
Clflush = 1<<19,
Acpif = 1<<22, /* therm control msr */
Mmx = 1<<23,
Fxsr = 1<<24, /* have SSE FXSAVE/FXRSTOR */
Sse = 1<<25, /* thus sfence instr. */
Sse2 = 1<<26, /* thus mfence & lfence instr.s */
Rdrnd = 1<<30, /* RDRAND support bit */
};
enum { /* MSRs */
PerfEvtbase = 0xc0010000, /* Performance Event Select */
PerfCtrbase = 0xc0010004, /* Performance Counters */
Efer = 0xc0000080, /* Extended Feature Enable */
Star = 0xc0000081, /* Legacy Target IP and [CS]S */
Lstar = 0xc0000082, /* Long Mode Target IP */
Cstar = 0xc0000083, /* Compatibility Target IP */
Sfmask = 0xc0000084, /* SYSCALL Flags Mask */
FSbase = 0xc0000100, /* 64-bit FS Base Address */
GSbase = 0xc0000101, /* 64-bit GS Base Address */
KernelGSbase = 0xc0000102, /* SWAPGS instruction */
};
/*
* a parsed plan9.ini line
*/
#define NISAOPT 8
struct ISAConf {
char *type;
uvlong port;
int irq;
ulong dma;
ulong mem;
ulong size;
ulong freq;
int nopt;
char *opt[NISAOPT];
};
extern PCArch *arch; /* PC architecture */
Mach* machp[MAXMACH];
#define MACHP(n) (machp[n])
extern register Mach* m; /* R15 */
extern register Proc* up; /* R14 */
/*
* hardware info about a device
*/
typedef struct {
ulong port;
int size;
} Devport;
struct DevConf
{
ulong intnum; /* interrupt number */
char *type; /* card type, malloced */
int nports; /* Number of ports */
Devport *ports; /* The ports themselves */
};
typedef struct BIOS32ci { /* BIOS32 Calling Interface */
u32int eax;
u32int ebx;
u32int ecx;
u32int edx;
u32int esi;
u32int edi;
} BIOS32ci;
|