]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/xen/mem.h
import xen 32 bit paravirtual kernel from /n/sources/xen.
[plan9front.git] / sys / src / 9 / xen / mem.h
1 /*
2  * Memory and machine-specific definitions.  Used in C and assembler.
3  */
4
5 #define MIN(a, b)       ((a) < (b)? (a): (b))
6 #define MAX(a, b)       ((a) > (b)? (a): (b))
7
8 /*
9  * Sizes
10  */
11 #define BI2BY           8                       /* bits per byte */
12 #define BI2WD           32                      /* bits per word */
13 #define BY2WD           4                       /* bytes per word */
14 #define BY2V            8                       /* bytes per double word */
15 #define BY2PG           4096                    /* bytes per page */
16 #define WD2PG           (BY2PG/BY2WD)           /* words per page */
17 #define PGSHIFT         12                      /* log(BY2PG) */
18 #define ROUND(s, sz)    (((s)+((sz)-1))&~((sz)-1))
19 #define PGROUND(s)      ROUND(s, BY2PG)
20 #define BLOCKALIGN      8
21 #define FPalign         16                      /* required for FXSAVE */
22
23 #define MAXMACH         8                       /* max # cpus system can run */
24 #define MAX_VIRT_CPUS   MAXMACH
25 #define KSTACK          4096                    /* Size of kernel stack */
26
27 /*
28  * Time
29  */
30 #define HZ              (100)                   /* clock frequency */
31 #define MS2HZ           (1000/HZ)               /* millisec per clock tick */
32 #define TK2SEC(t)       ((t)/HZ)                /* ticks to seconds */
33
34 /*
35  * Fundamental addresses
36  */
37 #define REBOOTADDR      0x00001000              /* reboot code - physical address */
38 #define APBOOTSTRAP     0x80001000              /* AP bootstrap code */
39 #define MACHADDR        0x80002000              /* as seen by current processor */
40 #define CPU0MACH        MACHADDR                /* Mach for bootstrap processor */
41 #define XENCONSOLE      0x80003000              /* xen console ring */
42 #define XENSHARED       0x80004000              /* xen shared page */
43 #define XENBUS          0x80005000              /* xenbus aka xenstore ring */
44 #define XENGRANTTAB     0x80006000              /* grant table */
45
46 #define MACHSIZE        BY2PG
47
48 /*
49  *  Address spaces
50  *
51  *  User is at 0-2GB
52  *  Kernel is at 2GB-4GB
53  */
54 #define UZERO           0                       /* base of user address space */
55 #define UTZERO          (UZERO+BY2PG)           /* first address in user text */
56 #define UTROUND(t)      ROUNDUP((t), BY2PG)
57 #define KZERO           0x80000000              /* base of kernel address space */
58 #define KTZERO          0x80010000              /* first address in kernel text */
59 #define USTKTOP         (KZERO-BY2PG)           /* byte just beyond user stack */
60 #define USTKSIZE        (16*1024*1024)          /* size of user stack */
61 #define TSTKTOP         (USTKTOP-USTKSIZE)      /* end of new stack in sysexec */
62 #define TSTKSIZ         100
63
64 /*
65  *  known x86 segments (in GDT) and their selectors
66  */
67 #define NULLSEG 0       /* null segment */
68 #define KDSEG   1       /* kernel data/stack */
69 #define KESEG   2       /* kernel executable */ 
70 #define UDSEG   3       /* user data/stack */
71 #define UESEG   4       /* user executable */
72 #define TSSSEG  5       /* task segment */
73 #define APMCSEG         6       /* APM code segment */
74 #define APMCSEG16       7       /* APM 16-bit code segment */
75 #define APMDSEG         8       /* APM data segment */
76 #define PROCSEG0        11      /* per process descriptor0 */
77 #define NPROCSEG        3       /* number of per process descriptors */
78 #define NGDT            13      /* number of GDT entries required */
79 /* #define      APM40SEG        8       /* APM segment 0x40 */
80
81 #define SELGDT  (0<<2)  /* selector is in gdt */
82 #define SELLDT  (1<<2)  /* selector is in ldt */
83
84 #define SELECTOR(i, t, p)       (((i)<<3) | (t) | (p))
85
86 #define NULLSEL SELECTOR(NULLSEG, SELGDT, 0)
87 /* these are replaced by XEN entries */
88 #ifdef NOPE  // XXX investigate more
89 #define KDSEL   SELECTOR(KDSEG, SELGDT, 0)
90 #define KESEL   SELECTOR(KESEG, SELGDT, 0)
91 #define UESEL   SELECTOR(UESEG, SELGDT, 3)
92 #define UDSEL   SELECTOR(UDSEG, SELGDT, 3)
93 /* comment out to make sure unused ... */
94
95 #define TSSSEL  SELECTOR(TSSSEG, SELGDT, 0)
96 #define APMCSEL         SELECTOR(APMCSEG, SELGDT, 0)
97 #define APMCSEL16       SELECTOR(APMCSEG16, SELGDT, 0)
98 #define APMDSEL         SELECTOR(APMDSEG, SELGDT, 0)
99 /* #define      APM40SEL        SELECTOR(APM40SEG, SELGDT, 0) */
100 #else
101 /* use the selectors that xen gives us */
102 #define KESEL FLAT_KERNEL_CS
103 #define KDSEL FLAT_KERNEL_DS
104 #define UESEL FLAT_USER_CS
105 #define UDSEL FLAT_USER_DS
106 #endif
107
108 /*
109  *  fields in segment descriptors
110  */
111 #define SEGDATA (0x10<<8)       /* data/stack segment */
112 #define SEGEXEC (0x18<<8)       /* executable segment */
113 #define SEGTSS  (0x9<<8)        /* TSS segment */
114 #define SEGCG   (0x0C<<8)       /* call gate */
115 #define SEGIG   (0x0E<<8)       /* interrupt gate */
116 #define SEGTG   (0x0F<<8)       /* trap gate */
117 #define SEGTYPE (0x1F<<8)
118
119 #define SEGP    (1<<15)         /* segment present */
120 #define SEGPL(x) ((x)<<13)      /* priority level */
121 #define SEGB    (1<<22)         /* granularity 1==4k (for expand-down) */
122 #define SEGG    (1<<23)         /* granularity 1==4k (for other) */
123 #define SEGE    (1<<10)         /* expand down */
124 #define SEGW    (1<<9)          /* writable (for data/stack) */
125 #define SEGR    (1<<9)          /* readable (for code) */
126 #define SEGD    (1<<22)         /* default 1==32bit (for code) */
127
128 /*
129  *  virtual MMU
130  */
131 #define PTEMAPMEM       (1024*1024)     
132 #define PTEPERTAB       (PTEMAPMEM/BY2PG)
133 #define SEGMAPSIZE      1984
134 #define SSEGMAPSIZE     16
135 #define PPN(x)          ((x)&~(BY2PG-1))
136 #define PGOFF(x)                ((x)&(BY2PG-1))
137
138 /*
139  *  physical MMU
140  */
141 #define PTEVALID        (1<<0)
142 #define PTEWT           (1<<3)
143 #define PTEUNCACHED     (1<<4)
144 #define PTEWRITE        (1<<1)
145 #define PTERONLY        (0<<1)
146 #define PTEKERNEL       (0<<2)
147 #define PTEUSER         (1<<2)
148 #define PTESIZE         (1<<7)
149 #define PTEGLOBAL       (1<<8)
150
151 /*
152  * Macros for calculating offsets within the page directory base
153  * and page tables. 
154  */
155 #define PAX(va)         (paemode? ((ulong)(va)>>29) & 0x6 : 0)
156 #define PDX(va)         (paemode? (((ulong)(va))>>20) & 0x03FE : (((ulong)(va))>>22) & 0x03FF)
157 #define PTX(va)         (paemode? (((ulong)(va))>>11) & 0x03FE : (((ulong)(va))>>12) & 0x03FF)
158 #define PDB(pdb,va)     (paemode? KADDR(MAPPN((pdb)[((ulong)(va)>>29) & 0x6])) : pdb)
159
160 #define getpgcolor(a)   0