]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/qi/power.h
ip/ipconfig: format ipmask with %M instead of %I
[plan9front.git] / sys / src / cmd / qi / power.h
1 /*
2  * power sim.h
3  *
4  * The integer instruction side of this emulator is portable if sizeof(long) >= 4
5  * Floating point emulation assumes:
6  *      sizeof(ulong) == sizeof(float)
7  *      sizeof(ulong)*2 == sizeof(double) <= sizeof(vlong)
8  *      unions of double & vlong have no padding
9  *      vlongs provide at least 64 bits precision
10  */
11 #include "/power/include/ureg.h"
12 #define USERADDR        0xC0000000
13 #define UREGADDR        (USERADDR+BY2PG-4-0xA0)
14 #define USER_REG(x)     (UREGADDR+(ulong)(x))
15 #define REGOFF(x)       (USER_REG(&((struct Ureg *) 0)->x))
16
17 typedef struct Registers Registers;
18 typedef struct Segment Segment;
19 typedef struct Memory Memory;
20 typedef struct Inset Inset;
21 typedef struct Inst Inst;
22 typedef struct Icache Icache;
23 typedef struct Breakpoint Breakpoint;
24
25 enum
26 {
27         Instruction     = 1,
28         Read            = 2,
29         Write           = 4,
30         Access          = 2|4,
31         Equal           = 4|8,
32 };
33
34 struct Breakpoint
35 {
36         int             type;           /* Instruction/Read/Access/Write/Equal */
37         ulong           addr;           /* Place at address */
38         int             count;          /* To execute count times or value */
39         int             done;           /* How many times passed through */
40         Breakpoint      *next;          /* Link to next one */
41 };
42
43 enum
44 {
45         Iload,
46         Istore,
47         Iarith,
48         Ilog,
49         Ibranch,
50         Ireg,
51         Isyscall,
52         Ifloat,
53         Inop,
54         Icontrol,
55 };
56
57 struct Icache
58 {
59         int     on;                     /* Turned on */
60         int     linesize;               /* Line size in bytes */
61         int     stall;                  /* Cache stalls */
62         int     *lines;                 /* Tag array */
63         int*    (*hash)(ulong);         /* Hash function */
64         char    *hashtext;              /* What the function looks like */
65 };
66
67 struct Inset
68 {
69         Inst    *tab;           /* indexed by extended opcode */
70         int     nel;
71 };
72
73 struct Inst
74 {
75         void    (*func)(ulong);
76         char    *name;
77         int     type;
78         int     count;
79         int     taken;
80 };
81
82 struct Registers
83 {
84         ulong   pc;
85         ulong   ir;
86         Inst    *ip;
87         long    r[32];
88         ulong   ctr;
89         ulong   cr;
90         ulong   xer;
91         ulong   lr;
92         ulong   fpscr;
93         ulong   dec;
94         ulong   tbl;
95         ulong   tbu;
96         double  fd[32];
97 };
98
99 enum
100 {
101         MemRead,
102         MemReadstring,
103         MemWrite,
104 };
105
106 enum
107 {
108         Stack,
109         Text,
110         Data,
111         Bss,
112         Nseg,
113 };
114
115 struct Segment
116 {
117         short   type;
118         ulong   base;
119         ulong   end;
120         ulong   fileoff;
121         ulong   fileend;
122         int     rss;
123         int     refs;
124         uchar   **table;
125 };
126
127 struct Memory
128 {
129         Segment seg[Nseg];
130 };
131
132 void            fatal(int, char*, ...);
133 void            fpreginit(void);
134 void            run(void);
135 void            undef(ulong);
136 void            unimp(ulong);
137 void            dumpreg(void);
138 void            dumpfreg(void);
139 void            dumpdreg(void);
140 void*           emalloc(ulong);
141 void*           erealloc(void*, ulong, ulong);
142 void*           vaddr(ulong);
143 void            itrace(char *, ...);
144 void            segsum(void);
145 void            sc(ulong);
146 char*           memio(char*, ulong, int, int);
147 ulong           getmem_w(ulong);
148 ulong           ifetch(ulong);
149 ushort          getmem_h(ulong);
150 void            putmem_w(ulong, ulong);
151 uchar           getmem_b(ulong);
152 void            putmem_b(ulong, uchar);
153 uvlong  getmem_v(ulong);
154 ulong           getmem_4(ulong);
155 ulong           getmem_2(ulong);
156 void    putmem_v(ulong, uvlong);
157 void            putmem_h(ulong, short);
158 void            isum(void);
159 void            initicache(void);
160 void            updateicache(ulong addr);
161 long            lnrand(long);
162 void            randseed(long, long);
163 void            cmd(void);
164 void            brkchk(ulong, int);
165 void            delbpt(char*);
166 void            breakpoint(char*, char*);
167 char*           nextc(char*);
168 ulong           expr(char*);
169 void            initstk(int, char**);
170 void            initmap(void);
171 void            inithdr(int);
172 void            reset(void);
173 void            dobplist(void);
174 void            procinit(int);
175 void            printsource(long);
176 void            printparams(Symbol *, ulong);
177 void            printlocals(Symbol *, ulong);
178 void            stktrace(int);
179 void            iprofile(void);
180
181 /* Globals */
182 Extern          Registers reg;
183 Extern          Memory memory;
184 Extern          int text;
185 Extern          int trace;
186 Extern          int sysdbg;
187 Extern          int calltree;
188 Extern          Icache icache;
189 Extern          int count;
190 Extern          jmp_buf errjmp;
191 Extern          Breakpoint *bplist;
192 Extern          int atbpt;
193 Extern          int membpt;
194 Extern          int cmdcount;
195 Extern          int nopcount;
196 Extern          ulong dot;
197 extern          char *file;
198 Extern          Biobuf *bioout;
199 Extern          Biobuf *bin;
200 Extern          Inst *ci;
201 Extern          ulong *iprof;
202 Extern          ulong   iprofsize;
203 Extern          ulong loadlock;
204 extern          int datasize;           
205 extern          int printcol;
206 Extern          Map *symmap;
207 extern          ulong bits[];
208
209 extern          Inset ops0, ops19, ops31, ops59, ops63a, ops63b;
210
211 /* Plan9 Kernel constants */
212 #define BY2PG           4096
213 #define BY2WD           4
214 #define UTZERO          0x1000
215 #define TSTKSIZ         32
216 #define TSTACKTOP       0x20000000
217 #define STACKTOP        (TSTACKTOP-TSTKSIZ*BY2PG)
218 #define STACKSIZE       (4*1024*1024)
219
220 #define PROFGRAN        4
221 #define NOP             0x80300000
222 #define SIGNBIT         0x80000000
223
224
225 enum {
226         CRLT = 1<<31,
227         CRGT = 1<<30,
228         CREQ = 1<<29,
229         CRSO = 1<<28,
230         CRFU = CRSO,
231
232         CRFX = 1<<27,
233         CRFEX = 1<<26,
234         CRVX = 1<<25,
235         CROX = 1<<24,
236 };
237
238 #define getCR(x,w) (((w)>>(28-(x*4)))&0xF)
239 #define mkCR(x,v) (((v)&0xF)<<(28-(x*4)))
240
241 #define simm(xx, ii)    xx = (short)(ii&0xFFFF);
242 #define uimm(xx, ii)    xx = ii&0xFFFF;
243 #define imms(xx, ii) xx = ii<<16;
244 #define getairr(i)      rd = (i>>21)&0x1f; ra = (i>>16)&0x1f; simm(imm,i)
245 #define getarrr(i)      rd = (i>>21)&0x1f; ra = (i>>16)&0x1f; rb = (i>>11)&0x1f;
246 #define getbobi(i)      bo = (i>>21)&0x1f; bi = (i>>16)&0x1f; xx = (i>>11)&0x1f;
247 #define getlirr(i)      rs = (i>>21)&0x1f; ra = (i>>16)&0x1f; uimm(imm,i)
248 #define getlrrr(i)      rs = (i>>21)&0x1f; ra = (i>>16)&0x1f; rb = (i>>11)&0x1f;
249
250 #define OP(o,xo) ((o<<26)|(xo<<1))      /* build an operation */
251 #define xop(a,b) ((b<<6)|a)     /* compact form for use in a decoding switch on op/xo */
252 #define getop(i) ((i>>26)&0x3F)
253 #define getxo(i) ((i>>1)&0x3FF)
254
255 #define FPS_FX  (1<<31) /* exception summary (sticky) */
256 #define FPS_EX  (1<<30) /* enabled exception summary */
257 #define FPS_VX  (1<<29) /* invalid operation exception summary */
258 #define FPS_OX  (1<<28) /* overflow exception OX (sticky) */
259 #define FPS_UX  (1<<27) /* underflow exception UX (sticky) */
260 #define FPS_ZX  (1<<26) /* zero divide exception ZX (sticky) */
261 #define FPS_XX  (1<<25) /* inexact exception XX (sticky) */
262 #define FPS_VXSNAN (1<<24)      /* invalid operation exception for SNaN (sticky) */
263 #define FPS_VXISI       (1<<23) /* invalid operation exception for ∞-∞ (sticky) */
264 #define FPS_VXIDI       (1<<22) /* invalid operation exception for ∞/∞ (sticky) */
265 #define FPS_VXZDZ (1<<21)       /* invalid operation exception for 0/0 (sticky) */
266 #define FPS_VXIMZ       (1<<20) /* invalid operation exception for ∞*0 (sticky) */
267 #define FPS_VXVC        (1<<19) /* invalid operation exception for invalid compare (sticky) */
268 #define FPS_FR  (1<<18) /* fraction rounded */
269 #define FPS_FI  (1<<17) /* fraction inexact */
270 #define FPS_FPRF        (1<<16) /* floating point result class */
271 #define FPS_FPCC        (0xF<<12)       /* <, >, =, unordered */
272 #define FPS_VXCVI       (1<<8)  /* enable exception for invalid integer convert (sticky) */
273 #define FPS_VE  (1<<7)  /* invalid operation exception enable */
274 #define FPS_OE  (1<<6)  /* enable overflow exceptions */
275 #define FPS_UE  (1<<5)  /* enable underflow */
276 #define FPS_ZE  (1<<4)  /* enable zero divide */
277 #define FPS_XE  (1<<3)  /* enable inexact exceptions */
278 #define FPS_RN  (3<<0)  /* rounding mode */
279
280 #define XER_SO  (1<<31)
281 #define XER_OV  (1<<30)
282 #define XER_CA  (1<<29)
283
284 #define Rc      1
285 #define OE      0x400