]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/vi/mips.h
ndb/dnsquery, ndb/csquery: handle long lines
[plan9front.git] / sys / src / cmd / vi / mips.h
1 /*
2  * mipsim.h
3  */
4 #include "/mips/include/ureg.h"
5 #define USERADDR        0xC0000000
6 #define UREGADDR        (USERADDR+BY2PG-4-0xA0)
7 #define USER_REG(x)     (UREGADDR+(ulong)(x))
8 #define REGOFF(x)       (USER_REG(&((struct Ureg *) 0)->x))
9
10 typedef struct Registers Registers;
11 typedef struct Segment Segment;
12 typedef struct Memory Memory;
13 typedef struct Mul Mul;
14 typedef struct Mulu Mulu;
15 typedef struct Inst Inst;
16 typedef struct Icache Icache;
17 typedef struct Tlb Tlb;
18 typedef struct Breakpoint Breakpoint;
19
20 enum
21 {
22         Instruction     = 1,
23         Read            = 2,
24         Write           = 4,
25         Access          = 2|4,
26         Equal           = 4|8,
27 };
28
29 struct Breakpoint
30 {
31         int             type;           /* Instruction/Read/Access/Write/Equal */
32         ulong           addr;           /* Place at address */
33         int             count;          /* To execute count times or value */
34         int             done;           /* How many times passed through */
35         Breakpoint      *next;          /* Link to next one */
36 };
37
38 enum
39 {
40         Iload,
41         Istore,
42         Iarith,
43         Ibranch,
44         Ireg,
45         Isyscall,
46         Ifloat,
47 };
48
49 enum
50 {
51         Nmaxtlb = 64,
52 };
53
54 struct Tlb
55 {
56         int     on;                     /* Being updated */
57         int     tlbsize;                /* Number of entries */
58         ulong   tlbent[Nmaxtlb];        /* Virtual address tags */
59         int     hit;                    /* Number of successful tag matches */
60         int     miss;                   /* Number of failed tag matches */
61 };              
62
63 struct Icache
64 {
65         int     on;                     /* Turned on */
66         int     linesize;               /* Line size in bytes */
67         int     stall;                  /* Cache stalls */
68         int     *lines;                 /* Tag array */
69         int*    (*hash)(ulong);         /* Hash function */
70         char    *hashtext;              /* What the function looks like */
71 };
72
73 struct Inst
74 {
75         void    (*func)(ulong);
76         char    *name;
77         int     type;
78         int     count;
79         int     taken;
80         int     useddelay;
81 };
82
83 struct Registers
84 {
85         ulong   pc;
86         ulong   ir;
87         Inst    *ip;
88         long    r[32];
89         ulong   mhi;
90         ulong   mlo;
91
92         ulong   fpsr;
93         union {
94                 double  fd[16];
95                 float   fl[32];
96                 ulong   di[32];
97         };
98         char    ft[32];
99 };
100
101 enum
102 {
103         FPd     = 0,
104         FPs,
105         FPmemory,
106 };
107 #define dreg(r) ((r)>>1)
108
109 struct Mulu
110 {
111         ulong lo;
112         ulong hi;
113 };
114
115 struct Mul
116 {
117         long lo;
118         long hi;
119 };
120
121 enum
122 {
123         MemRead,
124         MemReadstring,
125         MemWrite,
126 };
127
128 enum
129 {
130         Stack,
131         Text,
132         Data,
133         Bss,
134         Nseg,
135 };
136
137 struct Segment
138 {
139         short   type;
140         ulong   base;
141         ulong   end;
142         ulong   fileoff;
143         ulong   fileend;
144         int     rss;
145         int     refs;
146         uchar   **table;
147 };
148
149 struct Memory
150 {
151         Segment seg[Nseg];
152 };
153
154 void            fatal(int, char*, ...);
155 void            run(void);
156 void            undef(ulong);
157 void            dumpreg(void);
158 void            dumpfreg(void);
159 void            dumpdreg(void);
160 void*           emalloc(ulong);
161 void*           erealloc(void*, ulong, ulong);
162 void*           vaddr(ulong);
163 int             badvaddr(ulong, int);
164 void            itrace(char *, ...);
165 void            segsum(void);
166 void            Ssyscall(ulong);
167 char*           memio(char*, ulong, int, int);
168 ulong           ifetch(ulong);
169 ulong           getmem_w(ulong);
170 ushort          getmem_h(ulong);
171 void            putmem_w(ulong, ulong);
172 uchar           getmem_b(ulong);
173 void            putmem_b(ulong, uchar);
174 ulong           getmem_4(ulong);
175 ulong           getmem_2(ulong);
176 void            putmem_h(ulong, short);
177 Mul             mul(long, long);
178 Mulu            mulu(ulong, ulong);
179 void            isum(void);
180 void            initicache(void);
181 void            updateicache(ulong addr);
182 void            tlbsum(void);
183 long            lnrand(long);
184 void            randseed(long, long);
185 void            cmd(void);
186 void            brkchk(ulong, int);
187 void            delbpt(char*);
188 void            breakpoint(char*, char*);
189 char*           nextc(char*);
190 ulong           expr(char*);
191 void            initmap(void);
192 void            inithdr(int);
193 void            initstk(int, char**);
194 void            reset(void);
195 void            dobplist(void);
196 int             _mipscoinst(Map*, uvlong, char*, int);
197 void            procinit(int);
198 void            printsource(long);
199 void            printparams(Symbol *, ulong);
200 void            printlocals(Symbol *, ulong);
201 void            stktrace(int);
202 void            iprofile(void);
203
204 /* Globals */
205 Extern          Registers reg;
206 Extern          Memory memory;
207 Extern          int text;
208 Extern          int trace;
209 Extern          int sysdbg;
210 Extern          int calltree;
211 Extern          Inst itab[];
212 Extern          Inst ispec[];
213 Extern          Icache icache;
214 Extern          Tlb tlb;
215 Extern          int count;
216 Extern          jmp_buf errjmp;
217 Extern          Breakpoint *bplist;
218 Extern          int atbpt;
219 Extern          int membpt;
220 Extern          int cmdcount;
221 Extern          int nopcount;
222 Extern          ulong dot;
223 extern          char *file;
224 Extern          Biobuf *bioout;
225 Extern          Biobuf *bin;
226 Extern          ulong *iprof;
227 extern          int datasize;
228 Extern          Map *symmap;            
229 Extern          int rtrace;
230
231 /* Plan9 Kernel constants */
232 #define BY2PG           4096
233 #define BY2WD           4
234 #define UTZERO          0x1000
235 #define STACKTOP        0x80000000
236 #define STACKSIZE       0x10000
237
238 #define PROFGRAN        4
239 /* Opcode decoders */
240 #define Getrsrt(s,t,i)          s = (i>>21)&0x1f; t = (i>>16)&0x1f;
241 #define Getrbrt(b,t,i)          b = (i>>21)&0x1f; t = (i>>16)&0x1f;
242 #define Get3(s, t, d, i)        s = (i>>21)&0x1f; t = (i>>16)&0x1f; d = (i>>11)&0x1f;
243 #define Getf3(s, t, d, i)       s = (i>>11)&0x1f; t = (i>>16)&0x1f; d = (i>>6)&0x1f;
244 #define Getf2(s, d, i)          s = (i>>11)&0x1f; d = (i>>6)&0x1f;
245 #define SpecialGetrtrd(t, d, i) t = (i>>16)&0x1f; d = (i>>11)&0x1f;
246
247 #define INOPINST        "nor"
248 #define INOP            0x00000027      /* Instruction used as nop */
249 #define SIGNBIT         0x80000000
250 #define Iexec(ir)       {Inst *i; i = &itab[(ir)>>26]; reg.ip = i; i->count++; (*i->func)(ir); }
251 #define Statbra()       reg.ip->taken++; if(reg.ir != INOP) reg.ip->useddelay++;
252
253 #define FP_U            3
254 #define FP_L            1
255 #define FP_G            2
256 #define FP_E            0
257 #define FP_CBIT         (1<<23)