|
|
1.1 root 1: /*
2: * Memory and machine-specific definitions. Used in C and assembler.
3: */
4:
5: /*
6: * Sizes
7: */
8: #define BI2BY 8 /* bits per byte */
9: #define BI2WD 32 /* bits per word */
10: #define BY2WD 4 /* bytes per word */
11: #define BY2PG 4096 /* bytes per page */
12: #define WD2PG (BY2PG/BY2WD) /* words per page */
13: #define PGSHIFT 12 /* log(BY2PG) */
14: #define ROUND(s, sz) (((s)+(sz-1))&~(sz-1))
15: #define PGROUND(s) ROUND(s, BY2PG)
16:
17: #define MAXMACH 1 /* max # cpus system can run */
18:
19: /*
20: * Time
21: */
22: #define HZ (100) /* clock frequency */
23: #define MS2HZ (1000/HZ) /* millisec per clock tick */
24: #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */
25: #define SEC2TK(t) (((ulong)(t))*HZ) /* seconds to ticks */
26: #define TK2MS(t) ((((ulong)(t))*1000)/HZ) /* ticks to milliseconds */
27: #define MS2TK(t) ((((ulong)(t))*HZ)/1000) /* milliseconds to ticks */
28:
29: /*
30: * Fundamental addresses
31: */
32:
33: /*
34: * Address spaces
35: *
36: * User is at 0-2GB
37: * Kernel is at 2GB-4GB
38: *
39: * To avoid an extra page map, both the user stack (USTKTOP) and
40: * the temporary user stack (TSTKTOP) should be in the the same
41: * 4 meg.
42: */
43: #define UZERO 0 /* base of user address space */
44: #define UTZERO (UZERO+BY2PG) /* first address in user text */
45: #define KZERO 0x80000000 /* base of kernel address space */
46: #define KTZERO KZERO /* first address in kernel text */
47: #define USERADDR 0xC0000000 /* struct User */
48: #define UREGADDR (USERADDR+BY2PG-4*19)
49: #define TSTKTOP USERADDR /* end of new stack in sysexec */
50: #define TSTKSIZ 10
51: #define USTKTOP (TSTKTOP-TSTKSIZ*BY2PG) /* byte just beyond user stack */
52: #define USTKSIZE (16*1024*1024 - TSTKSIZ*BY2PG) /* size of user stack */
53: #define ROMBIOS (KZERO|0xF0000)
54: #define ISAMEMSIZE (4*MB) /* mem space reserved for ISA */
55:
56: #define MACHSIZE 4096
57:
58:
59: /*
60: * known 80386 segments (in GDT) and their selectors
61: */
62: #define NULLSEG 0 /* null segment */
63: #define KDSEG 1 /* kernel data/stack */
64: #define KESEG 2 /* kernel executable */
65: #define UDSEG 3 /* user data/stack */
66: #define UESEG 4 /* user executable */
67: #define TSSSEG 5 /* task segment */
68: #define N386SEG 6 /* number of segments */
69:
70: #define SELGDT (0<<3) /* selector is in gdt */
71: #define SELLDT (1<<3) /* selector is in ldt */
72:
73: #define SELECTOR(i, t, p) (((i)<<3) | (t) | (p))
74:
75: #define NULLSEL SELECTOR(NULLSEG, SELGDT, 0)
76: #define KESEL SELECTOR(KESEG, SELGDT, 0)
77: #define KDSEL SELECTOR(KDSEG, SELGDT, 0)
78: #define UESEL SELECTOR(UESEG, SELGDT, 3)
79: #define UDSEL SELECTOR(UDSEG, SELGDT, 3)
80: #define TSSSEL SELECTOR(TSSSEG, SELGDT, 0)
81:
82: /*
83: * fields in segment descriptors
84: */
85: #define SEGDATA (0x10<<8) /* data/stack segment */
86: #define SEGEXEC (0x18<<8) /* executable segment */
87: #define SEGTSS (0x9<<8) /* TSS segment */
88: #define SEGCG (0x0C<<8) /* call gate */
89: #define SEGIG (0x0E<<8) /* interrupt gate */
90: #define SEGTG (0x0F<<8) /* task gate */
91: #define SEGTYPE (0x1F<<8)
92:
93: #define SEGP (1<<15) /* segment present */
94: #define SEGPL(x) ((x)<<13) /* priority level */
95: #define SEGB (1<<22) /* granularity 1==4k (for expand-down) */
96: #define SEGG (1<<23) /* granularity 1==4k (for other) */
97: #define SEGE (1<<10) /* expand down */
98: #define SEGW (1<<9) /* writable (for data/stack) */
99: #define SEGR (1<<9) /* readable (for code) */
100: #define SEGD (1<<22) /* default 1==32bit (for code) */
101:
102: /*
103: * virtual MMU
104: */
105: #define PTEMAPMEM (1024*1024)
106: #define SEGMAPSIZE 16
107: #define PTEPERTAB (PTEMAPMEM/BY2PG)
108: #define PPN(x) ((x)&~(BY2PG-1))
109:
110: /*
111: * physical MMU
112: */
113: #define PTEVALID (1<<0)
114: #define PTEUNCACHED (1<<4)
115: #define PTEWRITE (1<<1)
116: #define PTERONLY (0<<1)
117: #define PTEKERNEL (0<<2)
118: #define PTEUSER (1<<2)
119:
120: /*
121: * flag register bits that we care about
122: */
123: #define IFLAG 0x200
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.