add state and bank sv csr bitfields
[riscv-isa-sim.git] / riscv / processor.cc
1 // See LICENSE for license details.
2
3 #include "processor.h"
4 #include "extension.h"
5 #include "common.h"
6 #include "config.h"
7 #include "simif.h"
8 #include "mmu.h"
9 #include "disasm.h"
10 #include <cinttypes>
11 #include <cmath>
12 #include <cstdlib>
13 #include <iostream>
14 #include <assert.h>
15 #include <limits.h>
16 #include <stdexcept>
17 #include <algorithm>
18 #ifdef SPIKE_SIMPLEV
19 #include "sv_insn_redirect.h"
20 #endif
21
22 #undef STATE
23 #define STATE state
24
25 processor_t::processor_t(const char* isa, simif_t* sim, uint32_t id,
26 bool halt_on_reset)
27 : debug(false), halt_request(false), sim(sim), ext(NULL), id(id),
28 halt_on_reset(halt_on_reset), last_pc(1), executions(1)
29 #ifdef SPIKE_SIMPLEV
30 , s(this)
31 #endif
32 {
33 parse_isa_string(isa);
34 register_base_instructions();
35
36 #ifdef SPIKE_SIMPLEV
37 mmu = new sv_mmu_t(sim, this);
38 #else
39 mmu = new mmu_t(sim, this);
40 #endif
41
42 disassembler = new disassembler_t(max_xlen);
43 if (ext)
44 for (auto disasm_insn : ext->get_disasms())
45 disassembler->add_insn(disasm_insn);
46
47 reset();
48 }
49
50 processor_t::~processor_t()
51 {
52 #ifdef RISCV_ENABLE_HISTOGRAM
53 if (histogram_enabled)
54 {
55 fprintf(stderr, "PC Histogram size:%zu\n", pc_histogram.size());
56 for (auto it : pc_histogram)
57 fprintf(stderr, "%0" PRIx64 " %" PRIu64 "\n", it.first, it.second);
58 }
59 #endif
60
61 delete mmu;
62 delete disassembler;
63 }
64
65 static void bad_isa_string(const char* isa)
66 {
67 fprintf(stderr, "error: bad --isa option %s\n", isa);
68 abort();
69 }
70
71 void processor_t::parse_isa_string(const char* str)
72 {
73 std::string lowercase, tmp;
74 for (const char *r = str; *r; r++)
75 lowercase += std::tolower(*r);
76
77 const char* p = lowercase.c_str();
78 const char* all_subsets = "imafdqc";
79
80 max_xlen = 64;
81 state.misa = reg_t(2) << 62;
82
83 if (strncmp(p, "rv32", 4) == 0)
84 max_xlen = 32, state.misa = reg_t(1) << 30, p += 4;
85 else if (strncmp(p, "rv64", 4) == 0)
86 p += 4;
87 else if (strncmp(p, "rv", 2) == 0)
88 p += 2;
89
90 if (!*p) {
91 p = "imafdc";
92 } else if (*p == 'g') { // treat "G" as "IMAFD"
93 tmp = std::string("imafd") + (p+1);
94 p = &tmp[0];
95 } else if (*p != 'i') {
96 bad_isa_string(str);
97 }
98
99 isa_string = "rv" + std::to_string(max_xlen) + p;
100 state.misa |= 1L << ('s' - 'a'); // advertise support for supervisor mode
101 state.misa |= 1L << ('u' - 'a'); // advertise support for user mode
102
103 while (*p) {
104 state.misa |= 1L << (*p - 'a');
105
106 if (auto next = strchr(all_subsets, *p)) {
107 all_subsets = next + 1;
108 p++;
109 } else if (*p == 'x') {
110 const char* ext = p+1, *end = ext;
111 while (islower(*end))
112 end++;
113 register_extension(find_extension(std::string(ext, end - ext).c_str())());
114 p = end;
115 } else {
116 bad_isa_string(str);
117 }
118 }
119
120 if (supports_extension('D') && !supports_extension('F'))
121 bad_isa_string(str);
122
123 if (supports_extension('Q') && !supports_extension('D'))
124 bad_isa_string(str);
125
126 if (supports_extension('Q') && max_xlen < 64)
127 bad_isa_string(str);
128
129 max_isa = state.misa;
130 }
131
132 void state_t::reset(reg_t max_isa)
133 {
134 memset(this, 0, sizeof(*this));
135 misa = max_isa;
136 prv = PRV_M;
137 pc = DEFAULT_RSTVEC;
138 tselect = 0;
139 for (unsigned int i = 0; i < num_triggers; i++)
140 mcontrol[i].type = 2;
141 }
142
143 void sv_shape_t::setup_map()
144 {
145 int order[3] = {};
146 int lims[3] = {xsz, ysz, zsz};
147 int idxs[3] = {0,0,0};
148
149 switch (permute) {
150 case SV_SHAPE_PERM_XYZ: order[0] = 0; order[1] = 1; order[2] = 2; break;
151 case SV_SHAPE_PERM_XZY: order[0] = 0; order[1] = 2; order[2] = 1; break;
152 case SV_SHAPE_PERM_YXZ: order[0] = 1; order[1] = 0; order[2] = 2; break;
153 case SV_SHAPE_PERM_YZX: order[0] = 1; order[1] = 2; order[2] = 0; break;
154 case SV_SHAPE_PERM_ZXY: order[0] = 2; order[1] = 0; order[2] = 1; break;
155 case SV_SHAPE_PERM_ZYX: order[0] = 2; order[1] = 1; order[2] = 0; break;
156 default: throw trap_illegal_instruction(0);
157 }
158 for (int i = 0; i < 128; i++)
159 {
160 uint8_t new_idx = idxs[0] + idxs[1] * xsz + idxs[2] * xsz * ysz;
161 map[i] = new_idx;
162 for (int j = 0; j < 3; j++)
163 {
164 idxs[order[j]] = idxs[order[j]] + 1;
165 if (idxs[order[j]] != lims[order[j]]) {
166 break;
167 }
168 idxs[order[j]] = 0;
169 }
170 }
171 }
172
173 int state_t::sv_csr_sz()
174 {
175 if (prv == PRV_M)
176 return SV_MCSR_SZ;
177 if (prv == PRV_S)
178 return SV_SCSR_SZ;
179 return SV_UCSR_SZ;
180 }
181 sv_csr_t &state_t::sv()
182 {
183 if (prv == PRV_M)
184 return get_msv();
185 if (prv == PRV_S)
186 return get_ssv();
187 return get_usv();
188 }
189
190 sv_shape_t* state_t::get_shape(reg_t reg)
191 {
192 if (prv == PRV_M || prv == PRV_S || reg == 0) {
193 return NULL;
194 }
195 for (int i = 0; i < 3; i++) {
196 if (remap[i].regidx == reg) {
197 return &shape[i];
198 }
199 }
200 return NULL;
201 }
202
203 void processor_t::set_debug(bool value)
204 {
205 debug = value;
206 if (ext)
207 ext->set_debug(value);
208 }
209
210 void processor_t::set_histogram(bool value)
211 {
212 histogram_enabled = value;
213 #ifndef RISCV_ENABLE_HISTOGRAM
214 if (value) {
215 fprintf(stderr, "PC Histogram support has not been properly enabled;");
216 fprintf(stderr, " please re-build the riscv-isa-run project using \"configure --enable-histogram\".\n");
217 }
218 #endif
219 }
220
221 void processor_t::reset()
222 {
223 state.reset(max_isa);
224 state.dcsr.halt = halt_on_reset;
225 halt_on_reset = false;
226 set_csr(CSR_MSTATUS, state.mstatus);
227
228 if (ext)
229 ext->reset(); // reset the extension
230
231 if (sim)
232 sim->proc_reset(id);
233 }
234
235 // Count number of contiguous 0 bits starting from the LSB.
236 static int ctz(reg_t val)
237 {
238 int res = 0;
239 if (val)
240 while ((val & 1) == 0)
241 val >>= 1, res++;
242 return res;
243 }
244
245 void processor_t::take_interrupt(reg_t pending_interrupts)
246 {
247 reg_t mie = get_field(state.mstatus, MSTATUS_MIE);
248 reg_t m_enabled = state.prv < PRV_M || (state.prv == PRV_M && mie);
249 reg_t enabled_interrupts = pending_interrupts & ~state.mideleg & -m_enabled;
250
251 reg_t sie = get_field(state.mstatus, MSTATUS_SIE);
252 reg_t s_enabled = state.prv < PRV_S || (state.prv == PRV_S && sie);
253 // M-ints have highest priority; consider S-ints only if no M-ints pending
254 if (enabled_interrupts == 0)
255 enabled_interrupts = pending_interrupts & state.mideleg & -s_enabled;
256
257 if (state.dcsr.cause == 0 && enabled_interrupts) {
258 // nonstandard interrupts have highest priority
259 if (enabled_interrupts >> IRQ_M_EXT)
260 enabled_interrupts = enabled_interrupts >> IRQ_M_EXT << IRQ_M_EXT;
261 // external interrupts have next-highest priority
262 else if (enabled_interrupts & (MIP_MEIP | MIP_SEIP))
263 enabled_interrupts = enabled_interrupts & (MIP_MEIP | MIP_SEIP);
264 // software interrupts have next-highest priority
265 else if (enabled_interrupts & (MIP_MSIP | MIP_SSIP))
266 enabled_interrupts = enabled_interrupts & (MIP_MSIP | MIP_SSIP);
267 // timer interrupts have next-highest priority
268 else if (enabled_interrupts & (MIP_MTIP | MIP_STIP))
269 enabled_interrupts = enabled_interrupts & (MIP_MTIP | MIP_STIP);
270 else
271 abort();
272
273 throw trap_t(((reg_t)1 << (max_xlen-1)) | ctz(enabled_interrupts));
274 }
275 }
276
277 static int xlen_to_uxl(int xlen)
278 {
279 if (xlen == 32)
280 return 1;
281 if (xlen == 64)
282 return 2;
283 abort();
284 }
285
286 reg_t processor_t::legalize_privilege(reg_t prv)
287 {
288 assert(prv <= PRV_M);
289
290 if (!supports_extension('U'))
291 return PRV_M;
292
293 if (prv == PRV_H || !supports_extension('S'))
294 return PRV_U;
295
296 return prv;
297 }
298
299 void processor_t::set_privilege(reg_t prv)
300 {
301 mmu->flush_tlb();
302 state.prv = legalize_privilege(prv);
303 }
304
305 void processor_t::enter_debug_mode(uint8_t cause)
306 {
307 state.dcsr.cause = cause;
308 state.dcsr.prv = state.prv;
309 set_privilege(PRV_M);
310 state.dpc = state.pc;
311 state.pc = DEBUG_ROM_ENTRY;
312 }
313
314 void processor_t::take_trap(trap_t& t, reg_t epc)
315 {
316 if (debug) {
317 fprintf(stderr, "core %3d: exception %s, epc 0x%016" PRIx64 "\n",
318 id, t.name(), epc);
319 if (t.has_tval())
320 fprintf(stderr, "core %3d: tval 0x%016" PRIx64 "\n", id,
321 t.get_tval());
322 }
323
324 if (state.dcsr.cause) {
325 if (t.cause() == CAUSE_BREAKPOINT) {
326 state.pc = DEBUG_ROM_ENTRY;
327 } else {
328 state.pc = DEBUG_ROM_TVEC;
329 }
330 return;
331 }
332
333 if (t.cause() == CAUSE_BREAKPOINT && (
334 (state.prv == PRV_M && state.dcsr.ebreakm) ||
335 (state.prv == PRV_S && state.dcsr.ebreaks) ||
336 (state.prv == PRV_U && state.dcsr.ebreaku))) {
337 enter_debug_mode(DCSR_CAUSE_SWBP);
338 return;
339 }
340
341 // by default, trap to M-mode, unless delegated to S-mode
342 reg_t bit = t.cause();
343 reg_t deleg = state.medeleg;
344 bool interrupt = (bit & ((reg_t)1 << (max_xlen-1))) != 0;
345 if (interrupt)
346 deleg = state.mideleg, bit &= ~((reg_t)1 << (max_xlen-1));
347 if (state.prv <= PRV_S && bit < max_xlen && ((deleg >> bit) & 1)) {
348 // handle the trap in S-mode
349 state.pc = state.stvec;
350 state.scause = t.cause();
351 state.sepc = epc;
352 state.stval = t.get_tval();
353
354 reg_t s = state.mstatus;
355 s = set_field(s, MSTATUS_SPIE, get_field(s, MSTATUS_SIE));
356 s = set_field(s, MSTATUS_SPP, state.prv);
357 s = set_field(s, MSTATUS_SIE, 0);
358 set_csr(CSR_MSTATUS, s);
359 set_privilege(PRV_S);
360 } else {
361 reg_t vector = (state.mtvec & 1) && interrupt ? 4*bit : 0;
362 state.pc = (state.mtvec & ~(reg_t)1) + vector;
363 state.mepc = epc;
364 state.mcause = t.cause();
365 state.mtval = t.get_tval();
366
367 reg_t s = state.mstatus;
368 s = set_field(s, MSTATUS_MPIE, get_field(s, MSTATUS_MIE));
369 s = set_field(s, MSTATUS_MPP, state.prv);
370 s = set_field(s, MSTATUS_MIE, 0);
371 set_csr(CSR_MSTATUS, s);
372 set_privilege(PRV_M);
373 }
374 }
375
376 void processor_t::disasm(insn_t insn)
377 {
378 uint64_t bits = insn.bits() & ((1ULL << (8 * insn_length(insn.bits()))) - 1);
379 if (last_pc != state.pc || last_bits != bits) {
380 if (executions != 1) {
381 fprintf(stderr, "core %3d: Executed %" PRIx64 " times\n", id, executions);
382 }
383
384 fprintf(stderr, "core %3d: 0x%016" PRIx64 " (0x%08" PRIx64 ") %s\n",
385 id, state.pc, bits, disassembler->disassemble(insn).c_str());
386 last_pc = state.pc;
387 last_bits = bits;
388 executions = 1;
389 } else {
390 executions++;
391 }
392 }
393
394 int processor_t::paddr_bits()
395 {
396 assert(xlen == max_xlen);
397 return max_xlen == 64 ? 50 : 34;
398 }
399
400 void processor_t::set_csr(int which, reg_t val)
401 {
402 val = _zext_xlen(val);
403 reg_t delegable_ints = MIP_SSIP | MIP_STIP | MIP_SEIP
404 | ((ext != NULL) << IRQ_COP);
405 reg_t all_ints = delegable_ints | MIP_MSIP | MIP_MTIP;
406 fprintf(stderr, "set CSR %x %lx\n", which, val);
407 switch (which)
408 {
409 #ifdef SPIKE_SIMPLEV
410 case CSR_USVMVL:
411 state.sv().mvl = std::min(val, (uint64_t)64); // limited to XLEN width
412 // TODO XXX throw exception if val == 0
413 fprintf(stderr, "set MVL %lx\n", state.sv().mvl);
414 break;
415 case CSR_USVSTATE:
416 {
417 // bits 0-5: mvl - 6-11: vl - 12-17: srcoffs - 18-23: destoffs
418 set_csr(CSR_USVMVL, get_field(val, SV_STATE_VL )+1);
419 set_csr(CSR_USVVL , get_field(val, SV_STATE_MVL)+1);
420 reg_t srcoffs = get_field(val, SV_STATE_SRCOFFS);
421 reg_t destoffs = get_field(val, SV_STATE_DESTOFFS);
422 state.sv().srcoffs = std::min(srcoffs , state.sv().vl-1);
423 state.sv().destoffs = std::min(destoffs, state.sv().vl-1);
424 state.sv().state_bank = get_field(val, SV_STATE_BANK);
425 state.sv().state_size = get_field(val, SV_STATE_SIZE);
426 break;
427 }
428 case CSR_USVVL:
429 state.sv().vl = std::min(state.sv().mvl, val);
430 // TODO XXX throw exception if val == 0
431 fprintf(stderr, "set VL %lx\n", state.sv().vl);
432 break;
433 case CSR_SVREGCFG0:
434 case CSR_SVREGCFG1:
435 case CSR_SVREGCFG2:
436 case CSR_SVREGCFG3:
437 case CSR_SVREGCFG4:
438 case CSR_SVREGCFG5:
439 case CSR_SVREGCFG6:
440 case CSR_SVREGCFG7:
441 {
442 uint64_t v = (uint64_t)val;
443 // identify which (pair) of SV config CAM registers are being set
444 int tbidx = (which - CSR_SVREGCFG0) * 2;
445 fprintf(stderr, "set REGCFG %d %lx\n", tbidx, v);
446 // lower 16 bits go into even, upper into odd...
447 state.sv().sv_csrs[tbidx].u = get_field(v, 0xffffUL);
448 state.sv().sv_csrs[tbidx+1].u = get_field(v, 0xffffUL<<16);
449 int clroffset = 2;
450 if (xlen == 64)
451 {
452 state.sv().sv_csrs[tbidx+2].u = get_field(v, 0xffffUL<<32);
453 state.sv().sv_csrs[tbidx+3].u = get_field(v, 0xffffUL<<48);
454 clroffset = 4;
455 }
456 // clear out all CSRs above the one(s) being set: this ensures that
457 // when it comes to context-switching, it's clear what needs to be saved
458 for (int i = tbidx+clroffset; i < 16; i++)
459 {
460 fprintf(stderr, "clr REGCFG %d\n", i);
461 state.sv().sv_csrs[i].u = 0;
462 }
463 // okaaay and now "unpack" the CAM to make it easier to use. this
464 // approach is not designed to be efficient right now. optimise later
465 // first clear the old tables
466 memset(state.sv().sv_int_tb, 0, sizeof(state.sv().sv_int_tb));
467 memset(state.sv().sv_fp_tb, 0, sizeof(state.sv().sv_fp_tb));
468 // now walk the CAM and unpack it
469 for (int i = 0; i < state.sv_csr_sz(); i++)
470 {
471 union sv_reg_csr_entry *c = &state.sv().sv_csrs[i];
472 uint64_t idx = c->b.regkey;
473 sv_reg_entry *r;
474 if (c->u == 0)
475 {
476 break;
477 }
478 // XXX damn. this basically duplicates sv_insn_t::get_regentry.
479 if (c->b.type == 1)
480 {
481 r = &state.sv().sv_int_tb[idx];
482 }
483 else
484 {
485 r = &state.sv().sv_fp_tb[idx];
486 }
487 r->elwidth = c->b.elwidth;
488 r->regidx = c->b.regidx;
489 r->isvec = c->b.isvec;
490 r->active = true;
491 fprintf(stderr, "setting REGCFG type:%d isvec:%d %d %d\n",
492 c->b.type, r->isvec, (int)idx, (int)r->regidx);
493 }
494 break;
495 }
496 case CSR_SVPREDCFG0:
497 case CSR_SVPREDCFG1:
498 case CSR_SVPREDCFG2:
499 case CSR_SVPREDCFG3:
500 case CSR_SVPREDCFG4:
501 case CSR_SVPREDCFG5:
502 case CSR_SVPREDCFG6:
503 case CSR_SVPREDCFG7:
504 {
505 // comments removed as it's near-identical to the regs version
506 // TODO: macro-ify
507 uint64_t v = (uint64_t)val;
508 int tbidx = (which - CSR_SVPREDCFG0) * 2;
509 fprintf(stderr, "set PREDCFG %d %lx\n", tbidx, v);
510 state.sv().sv_pred_csrs[tbidx].u = get_field(v, 0xffff);
511 state.sv().sv_pred_csrs[tbidx+1].u = get_field(v, 0xffff0000);
512 int clroffset = 2;
513 if (xlen == 64)
514 {
515 state.sv().sv_pred_csrs[tbidx+2].u = get_field(v, 0xffffUL<<32);
516 state.sv().sv_pred_csrs[tbidx+3].u = get_field(v, 0xffffUL<<48);
517 clroffset = 4;
518 }
519 for (int i = tbidx+clroffset; i < 16; i++)
520 {
521 state.sv().sv_pred_csrs[i].u = 0;
522 }
523 memset(state.sv().sv_pred_int_tb, 0, sizeof(state.sv().sv_pred_int_tb));
524 memset(state.sv().sv_pred_fp_tb, 0, sizeof(state.sv().sv_pred_fp_tb));
525 for (int i = 0; i < state.sv_csr_sz(); i++)
526 {
527 union sv_pred_csr_entry *c = &state.sv().sv_pred_csrs[i];
528 uint64_t idx = c->b.regkey;
529 if (c->u == 0)
530 {
531 break;
532 }
533 sv_pred_entry *r;
534 // XXX damn. this basically duplicates sv_insn_t::get_predentry.
535 if (c->b.type == 1)
536 {
537 r = &state.sv().sv_pred_int_tb[idx];
538 }
539 else
540 {
541 r = &state.sv().sv_pred_fp_tb[idx];
542 }
543 r->regidx = c->b.regidx;
544 r->zero = c->b.zero;
545 r->inv = c->b.inv;
546 r->packed = c->b.packed;
547 r->active = true;
548 fprintf(stderr, "setting PREDCFG %d type:%d zero:%d %d %d\n",
549 i, c->b.type, r->zero, (int)idx, (int)r->regidx);
550 }
551 break;
552 }
553 case CSR_UREMAP:
554 {
555 state.remap[0].regidx = get_field(val, SV_REMAP_REGIDX0);
556 state.remap[1].regidx = get_field(val, SV_REMAP_REGIDX1);
557 state.remap[2].regidx = get_field(val, SV_REMAP_REGIDX2);
558 state.remap[0].shape = get_field(val, SV_REMAP_SHAPE0);
559 state.remap[1].shape = get_field(val, SV_REMAP_SHAPE1);
560 state.remap[2].shape = get_field(val, SV_REMAP_SHAPE2);
561 break;
562 }
563 case CSR_USHAPE0:
564 case CSR_USHAPE1:
565 case CSR_USHAPE2:
566 {
567 int shapeidx = which - CSR_USHAPE0;
568 state.shape[shapeidx].xsz = get_field(val, SV_SHAPE_XDIM) + 1;
569 state.shape[shapeidx].ysz = get_field(val, SV_SHAPE_YDIM) + 1;
570 state.shape[shapeidx].zsz = get_field(val, SV_SHAPE_ZDIM) + 1;
571 state.shape[shapeidx].offs = (get_field(val, (1<<7 )) ? 0x1 : 0) |
572 (get_field(val, (1<<15)) ? 0x2 : 0) |
573 (get_field(val, (1<<23)) ? 0x4 : 0);
574 state.shape[shapeidx].permute = get_field(val, SV_SHAPE_PERM);
575 state.shape[shapeidx].setup_map();
576 fprintf(stderr, "sv shape %d x %d y %d z %d offs %d perm %d\n",
577 shapeidx,
578 state.shape[shapeidx].xsz,
579 state.shape[shapeidx].ysz,
580 state.shape[shapeidx].zsz,
581 state.shape[shapeidx].offs,
582 state.shape[shapeidx].permute);
583 break;
584 }
585 #endif
586 case CSR_FFLAGS:
587 dirty_fp_state;
588 state.fflags = val & (FSR_AEXC >> FSR_AEXC_SHIFT);
589 break;
590 case CSR_FRM:
591 dirty_fp_state;
592 state.frm = val & (FSR_RD >> FSR_RD_SHIFT);
593 break;
594 case CSR_FCSR:
595 dirty_fp_state;
596 state.fflags = (val & FSR_AEXC) >> FSR_AEXC_SHIFT;
597 state.frm = (val & FSR_RD) >> FSR_RD_SHIFT;
598 break;
599 case CSR_MSTATUS: {
600 if ((val ^ state.mstatus) &
601 (MSTATUS_MPP | MSTATUS_MPRV | MSTATUS_SUM | MSTATUS_MXR))
602 mmu->flush_tlb();
603
604 reg_t mask = MSTATUS_SIE | MSTATUS_SPIE | MSTATUS_MIE | MSTATUS_MPIE
605 | MSTATUS_FS | MSTATUS_MPRV | MSTATUS_SUM
606 | MSTATUS_MXR | MSTATUS_TW | MSTATUS_TVM
607 | MSTATUS_TSR | MSTATUS_UXL | MSTATUS_SXL |
608 (ext ? MSTATUS_XS : 0);
609
610 reg_t requested_mpp = legalize_privilege(get_field(val, MSTATUS_MPP));
611 state.mstatus = set_field(state.mstatus, MSTATUS_MPP, requested_mpp);
612 if (supports_extension('S'))
613 mask |= MSTATUS_SPP;
614
615 state.mstatus = (state.mstatus & ~mask) | (val & mask);
616
617 bool dirty = (state.mstatus & MSTATUS_FS) == MSTATUS_FS;
618 dirty |= (state.mstatus & MSTATUS_XS) == MSTATUS_XS;
619 if (max_xlen == 32)
620 state.mstatus = set_field(state.mstatus, MSTATUS32_SD, dirty);
621 else
622 state.mstatus = set_field(state.mstatus, MSTATUS64_SD, dirty);
623
624 state.mstatus = set_field(state.mstatus, MSTATUS_UXL, xlen_to_uxl(max_xlen));
625 state.mstatus = set_field(state.mstatus, MSTATUS_UXL, xlen_to_uxl(max_xlen));
626 state.mstatus = set_field(state.mstatus, MSTATUS_SXL, xlen_to_uxl(max_xlen));
627 // U-XLEN == S-XLEN == M-XLEN
628 xlen = max_xlen;
629 break;
630 }
631 case CSR_MIP: {
632 reg_t mask = MIP_SSIP | MIP_STIP;
633 state.mip = (state.mip & ~mask) | (val & mask);
634 break;
635 }
636 case CSR_MIE:
637 state.mie = (state.mie & ~all_ints) | (val & all_ints);
638 break;
639 case CSR_MIDELEG:
640 state.mideleg = (state.mideleg & ~delegable_ints) | (val & delegable_ints);
641 break;
642 case CSR_MEDELEG: {
643 reg_t mask =
644 (1 << CAUSE_MISALIGNED_FETCH) |
645 (1 << CAUSE_BREAKPOINT) |
646 (1 << CAUSE_USER_ECALL) |
647 (1 << CAUSE_FETCH_PAGE_FAULT) |
648 (1 << CAUSE_LOAD_PAGE_FAULT) |
649 (1 << CAUSE_STORE_PAGE_FAULT);
650 state.medeleg = (state.medeleg & ~mask) | (val & mask);
651 break;
652 }
653 case CSR_MINSTRET:
654 case CSR_MCYCLE:
655 if (xlen == 32)
656 state.minstret = (state.minstret >> 32 << 32) | (val & 0xffffffffU);
657 else
658 state.minstret = val;
659 // The ISA mandates that if an instruction writes instret, the write
660 // takes precedence over the increment to instret. However, Spike
661 // unconditionally increments instret after executing an instruction.
662 // Correct for this artifact by decrementing instret here.
663 state.minstret--;
664 break;
665 case CSR_MINSTRETH:
666 case CSR_MCYCLEH:
667 state.minstret = (val << 32) | (state.minstret << 32 >> 32);
668 state.minstret--; // See comment above.
669 break;
670 case CSR_SCOUNTEREN:
671 state.scounteren = val;
672 break;
673 case CSR_MCOUNTEREN:
674 state.mcounteren = val;
675 break;
676 case CSR_SSTATUS: {
677 reg_t mask = SSTATUS_SIE | SSTATUS_SPIE | SSTATUS_SPP | SSTATUS_FS
678 | SSTATUS_XS | SSTATUS_SUM | SSTATUS_MXR;
679 return set_csr(CSR_MSTATUS, (state.mstatus & ~mask) | (val & mask));
680 }
681 case CSR_SIP: {
682 reg_t mask = MIP_SSIP & state.mideleg;
683 return set_csr(CSR_MIP, (state.mip & ~mask) | (val & mask));
684 }
685 case CSR_SIE:
686 return set_csr(CSR_MIE,
687 (state.mie & ~state.mideleg) | (val & state.mideleg));
688 case CSR_SATP: {
689 mmu->flush_tlb();
690 if (max_xlen == 32)
691 state.satp = val & (SATP32_PPN | SATP32_MODE);
692 if (max_xlen == 64 && (get_field(val, SATP64_MODE) == SATP_MODE_OFF ||
693 get_field(val, SATP64_MODE) == SATP_MODE_SV39 ||
694 get_field(val, SATP64_MODE) == SATP_MODE_SV48))
695 state.satp = val & (SATP64_PPN | SATP64_MODE);
696 break;
697 }
698 case CSR_SEPC: state.sepc = val & ~(reg_t)1; break;
699 case CSR_STVEC: state.stvec = val >> 2 << 2; break;
700 case CSR_SSCRATCH: state.sscratch = val; break;
701 case CSR_SCAUSE: state.scause = val; break;
702 case CSR_STVAL: state.stval = val; break;
703 case CSR_MEPC: state.mepc = val & ~(reg_t)1; break;
704 case CSR_MTVEC: state.mtvec = val & ~(reg_t)2; break;
705 case CSR_MSCRATCH: state.mscratch = val; break;
706 case CSR_MCAUSE: state.mcause = val; break;
707 case CSR_MTVAL: state.mtval = val; break;
708 case CSR_MISA: {
709 // the write is ignored if increasing IALIGN would misalign the PC
710 if (!(val & (1L << ('C' - 'A'))) && (state.pc & 2))
711 break;
712
713 if (!(val & (1L << ('F' - 'A'))))
714 val &= ~(1L << ('D' - 'A'));
715
716 // allow MAFDC bits in MISA to be modified
717 reg_t mask = 0;
718 mask |= 1L << ('M' - 'A');
719 mask |= 1L << ('A' - 'A');
720 mask |= 1L << ('F' - 'A');
721 mask |= 1L << ('D' - 'A');
722 mask |= 1L << ('C' - 'A');
723 mask &= max_isa;
724
725 state.misa = (val & mask) | (state.misa & ~mask);
726 break;
727 }
728 case CSR_TSELECT:
729 if (val < state.num_triggers) {
730 state.tselect = val;
731 }
732 break;
733 case CSR_TDATA1:
734 {
735 mcontrol_t *mc = &state.mcontrol[state.tselect];
736 if (mc->dmode && !state.dcsr.cause) {
737 break;
738 }
739 mc->dmode = get_field(val, MCONTROL_DMODE(xlen));
740 mc->select = get_field(val, MCONTROL_SELECT);
741 mc->timing = get_field(val, MCONTROL_TIMING);
742 mc->action = (mcontrol_action_t) get_field(val, MCONTROL_ACTION);
743 mc->chain = get_field(val, MCONTROL_CHAIN);
744 mc->match = (mcontrol_match_t) get_field(val, MCONTROL_MATCH);
745 mc->m = get_field(val, MCONTROL_M);
746 mc->h = get_field(val, MCONTROL_H);
747 mc->s = get_field(val, MCONTROL_S);
748 mc->u = get_field(val, MCONTROL_U);
749 mc->execute = get_field(val, MCONTROL_EXECUTE);
750 mc->store = get_field(val, MCONTROL_STORE);
751 mc->load = get_field(val, MCONTROL_LOAD);
752 // Assume we're here because of csrw.
753 if (mc->execute)
754 mc->timing = 0;
755 trigger_updated();
756 }
757 break;
758 case CSR_TDATA2:
759 if (state.mcontrol[state.tselect].dmode && !state.dcsr.cause) {
760 break;
761 }
762 if (state.tselect < state.num_triggers) {
763 state.tdata2[state.tselect] = val;
764 }
765 break;
766 case CSR_DCSR:
767 state.dcsr.prv = get_field(val, DCSR_PRV);
768 state.dcsr.step = get_field(val, DCSR_STEP);
769 // TODO: ndreset and fullreset
770 state.dcsr.ebreakm = get_field(val, DCSR_EBREAKM);
771 state.dcsr.ebreakh = get_field(val, DCSR_EBREAKH);
772 state.dcsr.ebreaks = get_field(val, DCSR_EBREAKS);
773 state.dcsr.ebreaku = get_field(val, DCSR_EBREAKU);
774 state.dcsr.halt = get_field(val, DCSR_HALT);
775 break;
776 case CSR_DPC:
777 state.dpc = val & ~(reg_t)1;
778 break;
779 case CSR_DSCRATCH:
780 state.dscratch = val;
781 break;
782 }
783 }
784
785 reg_t processor_t::get_csr(int which)
786 {
787 uint32_t ctr_en = -1;
788 if (state.prv < PRV_M)
789 ctr_en &= state.mcounteren;
790 if (state.prv < PRV_S)
791 ctr_en &= state.scounteren;
792 bool ctr_ok = (ctr_en >> (which & 31)) & 1;
793
794 if (ctr_ok) {
795 if (which >= CSR_HPMCOUNTER3 && which <= CSR_HPMCOUNTER31)
796 return 0;
797 if (xlen == 32 && which >= CSR_HPMCOUNTER3H && which <= CSR_HPMCOUNTER31H)
798 return 0;
799 }
800 if (which >= CSR_MHPMCOUNTER3 && which <= CSR_MHPMCOUNTER31)
801 return 0;
802 if (xlen == 32 && which >= CSR_MHPMCOUNTER3H && which <= CSR_MHPMCOUNTER31H)
803 return 0;
804 if (which >= CSR_MHPMEVENT3 && which <= CSR_MHPMEVENT31)
805 return 0;
806
807 switch (which)
808 {
809 #ifdef SPIKE_SIMPLEV
810 case CSR_USVVL:
811 return state.sv().vl;
812 case CSR_USVSTATE:
813 return (state.sv().vl-1) | ((state.sv().mvl-1)<<6) |
814 (state.sv().srcoffs<<12) | (state.sv().destoffs<<18) |
815 (state.sv().state_bank<<24) | (state.sv().state_size<<26);
816 case CSR_USVMVL:
817 return state.sv().mvl;
818 case CSR_SVREGCFG0:
819 case CSR_SVREGCFG1:
820 case CSR_SVREGCFG2:
821 case CSR_SVREGCFG3:
822 case CSR_SVREGCFG4:
823 case CSR_SVREGCFG5:
824 case CSR_SVREGCFG6:
825 case CSR_SVREGCFG7:
826 return 0;// XXX TODO: return correct entry
827 case CSR_SVPREDCFG0:
828 case CSR_SVPREDCFG1:
829 case CSR_SVPREDCFG2:
830 case CSR_SVPREDCFG3:
831 case CSR_SVPREDCFG4:
832 case CSR_SVPREDCFG5:
833 case CSR_SVPREDCFG6:
834 case CSR_SVPREDCFG7:
835 return 0;// XXX TODO: return correct entry
836 case CSR_UREMAP:
837 return 0;// XXX TODO: return correct entry
838 case CSR_USHAPE0:
839 case CSR_USHAPE1:
840 case CSR_USHAPE2:
841 return 0;// XXX TODO: return correct entry
842 #endif
843 case CSR_FFLAGS:
844 require_fp;
845 if (!supports_extension('F'))
846 break;
847 return state.fflags;
848 case CSR_FRM:
849 require_fp;
850 if (!supports_extension('F'))
851 break;
852 return state.frm;
853 case CSR_FCSR:
854 require_fp;
855 if (!supports_extension('F'))
856 break;
857 return (state.fflags << FSR_AEXC_SHIFT) | (state.frm << FSR_RD_SHIFT);
858 case CSR_INSTRET:
859 case CSR_CYCLE:
860 if (ctr_ok)
861 return state.minstret;
862 break;
863 case CSR_MINSTRET:
864 case CSR_MCYCLE:
865 return state.minstret;
866 case CSR_INSTRETH:
867 case CSR_CYCLEH:
868 if (ctr_ok && xlen == 32)
869 return state.minstret >> 32;
870 break;
871 case CSR_MINSTRETH:
872 case CSR_MCYCLEH:
873 if (xlen == 32)
874 return state.minstret >> 32;
875 break;
876 case CSR_SCOUNTEREN: return state.scounteren;
877 case CSR_MCOUNTEREN: return state.mcounteren;
878 case CSR_SSTATUS: {
879 reg_t mask = SSTATUS_SIE | SSTATUS_SPIE | SSTATUS_SPP | SSTATUS_FS
880 | SSTATUS_XS | SSTATUS_SUM | SSTATUS_MXR | SSTATUS_UXL;
881 reg_t sstatus = state.mstatus & mask;
882 if ((sstatus & SSTATUS_FS) == SSTATUS_FS ||
883 (sstatus & SSTATUS_XS) == SSTATUS_XS)
884 sstatus |= (xlen == 32 ? SSTATUS32_SD : SSTATUS64_SD);
885 return sstatus;
886 }
887 case CSR_SIP: return state.mip & state.mideleg;
888 case CSR_SIE: return state.mie & state.mideleg;
889 case CSR_SEPC: return state.sepc & pc_alignment_mask();
890 case CSR_STVAL: return state.stval;
891 case CSR_STVEC: return state.stvec;
892 case CSR_SCAUSE:
893 if (max_xlen > xlen)
894 return state.scause | ((state.scause >> (max_xlen-1)) << (xlen-1));
895 return state.scause;
896 case CSR_SATP:
897 if (get_field(state.mstatus, MSTATUS_TVM))
898 require_privilege(PRV_M);
899 return state.satp;
900 case CSR_SSCRATCH: return state.sscratch;
901 case CSR_MSTATUS: return state.mstatus;
902 case CSR_MIP: return state.mip;
903 case CSR_MIE: return state.mie;
904 case CSR_MEPC: return state.mepc & pc_alignment_mask();
905 case CSR_MSCRATCH: return state.mscratch;
906 case CSR_MCAUSE: return state.mcause;
907 case CSR_MTVAL: return state.mtval;
908 case CSR_MISA: return state.misa;
909 case CSR_MARCHID: return 0;
910 case CSR_MIMPID: return 0;
911 case CSR_MVENDORID: return 0;
912 case CSR_MHARTID: return id;
913 case CSR_MTVEC: return state.mtvec;
914 case CSR_MEDELEG: return state.medeleg;
915 case CSR_MIDELEG: return state.mideleg;
916 case CSR_TSELECT: return state.tselect;
917 case CSR_TDATA1:
918 if (state.tselect < state.num_triggers) {
919 reg_t v = 0;
920 mcontrol_t *mc = &state.mcontrol[state.tselect];
921 v = set_field(v, MCONTROL_TYPE(xlen), mc->type);
922 v = set_field(v, MCONTROL_DMODE(xlen), mc->dmode);
923 v = set_field(v, MCONTROL_MASKMAX(xlen), mc->maskmax);
924 v = set_field(v, MCONTROL_SELECT, mc->select);
925 v = set_field(v, MCONTROL_TIMING, mc->timing);
926 v = set_field(v, MCONTROL_ACTION, mc->action);
927 v = set_field(v, MCONTROL_CHAIN, mc->chain);
928 v = set_field(v, MCONTROL_MATCH, mc->match);
929 v = set_field(v, MCONTROL_M, mc->m);
930 v = set_field(v, MCONTROL_H, mc->h);
931 v = set_field(v, MCONTROL_S, mc->s);
932 v = set_field(v, MCONTROL_U, mc->u);
933 v = set_field(v, MCONTROL_EXECUTE, mc->execute);
934 v = set_field(v, MCONTROL_STORE, mc->store);
935 v = set_field(v, MCONTROL_LOAD, mc->load);
936 return v;
937 } else {
938 return 0;
939 }
940 break;
941 case CSR_TDATA2:
942 if (state.tselect < state.num_triggers) {
943 return state.tdata2[state.tselect];
944 } else {
945 return 0;
946 }
947 break;
948 case CSR_TDATA3: return 0;
949 case CSR_DCSR:
950 {
951 uint32_t v = 0;
952 v = set_field(v, DCSR_XDEBUGVER, 1);
953 v = set_field(v, DCSR_EBREAKM, state.dcsr.ebreakm);
954 v = set_field(v, DCSR_EBREAKH, state.dcsr.ebreakh);
955 v = set_field(v, DCSR_EBREAKS, state.dcsr.ebreaks);
956 v = set_field(v, DCSR_EBREAKU, state.dcsr.ebreaku);
957 v = set_field(v, DCSR_STOPCYCLE, 0);
958 v = set_field(v, DCSR_STOPTIME, 0);
959 v = set_field(v, DCSR_CAUSE, state.dcsr.cause);
960 v = set_field(v, DCSR_STEP, state.dcsr.step);
961 v = set_field(v, DCSR_PRV, state.dcsr.prv);
962 return v;
963 }
964 case CSR_DPC:
965 return state.dpc & pc_alignment_mask();
966 case CSR_DSCRATCH:
967 return state.dscratch;
968 }
969 throw trap_illegal_instruction(0);
970 }
971
972 reg_t illegal_instruction(processor_t* p, insn_t insn, reg_t pc)
973 {
974 throw trap_illegal_instruction(0);
975 }
976
977 insn_func_t processor_t::decode_insn(insn_t insn)
978 {
979 // look up opcode in hash table
980 size_t idx = insn.bits() % OPCODE_CACHE_SIZE;
981 insn_desc_t desc = opcode_cache[idx];
982
983 if (unlikely(insn.bits() != desc.match)) {
984 // fall back to linear search
985 insn_desc_t* p = &instructions[0];
986 while ((insn.bits() & p->mask) != p->match)
987 p++;
988 desc = *p;
989
990 if (p->mask != 0 && p > &instructions[0]) {
991 if (p->match != (p-1)->match && p->match != (p+1)->match) {
992 // move to front of opcode list to reduce miss penalty
993 while (--p >= &instructions[0])
994 *(p+1) = *p;
995 instructions[0] = desc;
996 }
997 }
998
999 opcode_cache[idx] = desc;
1000 opcode_cache[idx].match = insn.bits();
1001 }
1002
1003 return xlen == 64 ? desc.rv64 : desc.rv32;
1004 }
1005
1006 void processor_t::register_insn(insn_desc_t desc)
1007 {
1008 instructions.push_back(desc);
1009 }
1010
1011 void processor_t::build_opcode_map()
1012 {
1013 struct cmp {
1014 bool operator()(const insn_desc_t& lhs, const insn_desc_t& rhs) {
1015 if (lhs.match == rhs.match)
1016 return lhs.mask > rhs.mask;
1017 return lhs.match > rhs.match;
1018 }
1019 };
1020 std::sort(instructions.begin(), instructions.end(), cmp());
1021
1022 for (size_t i = 0; i < OPCODE_CACHE_SIZE; i++)
1023 opcode_cache[i] = {0, 0, &illegal_instruction, &illegal_instruction};
1024 }
1025
1026 void processor_t::register_extension(extension_t* x)
1027 {
1028 for (auto insn : x->get_instructions())
1029 register_insn(insn);
1030 build_opcode_map();
1031 for (auto disasm_insn : x->get_disasms())
1032 disassembler->add_insn(disasm_insn);
1033 if (ext != NULL)
1034 throw std::logic_error("only one extension may be registered");
1035 ext = x;
1036 x->set_processor(this);
1037 }
1038
1039 void processor_t::register_base_instructions()
1040 {
1041 #define DECLARE_INSN(name, match, mask) \
1042 insn_bits_t name##_match = (match), name##_mask = (mask);
1043 #include "encoding.h"
1044 #undef DECLARE_INSN
1045
1046 #define DEFINE_INSN(name) \
1047 REGISTER_INSN(this, name, name##_match, name##_mask)
1048 #include "insn_list.h"
1049 #undef DEFINE_INSN
1050
1051 register_insn({0, 0, &illegal_instruction, &illegal_instruction});
1052 build_opcode_map();
1053 }
1054
1055 bool processor_t::load(reg_t addr, size_t len, uint8_t* bytes)
1056 {
1057 switch (addr)
1058 {
1059 case 0:
1060 if (len <= 4) {
1061 memset(bytes, 0, len);
1062 bytes[0] = get_field(state.mip, MIP_MSIP);
1063 return true;
1064 }
1065 break;
1066 }
1067
1068 return false;
1069 }
1070
1071 bool processor_t::store(reg_t addr, size_t len, const uint8_t* bytes)
1072 {
1073 switch (addr)
1074 {
1075 case 0:
1076 if (len <= 4) {
1077 state.mip = set_field(state.mip, MIP_MSIP, bytes[0]);
1078 return true;
1079 }
1080 break;
1081 }
1082
1083 return false;
1084 }
1085
1086 void processor_t::trigger_updated()
1087 {
1088 mmu->flush_tlb();
1089 mmu->check_triggers_fetch = false;
1090 mmu->check_triggers_load = false;
1091 mmu->check_triggers_store = false;
1092
1093 for (unsigned i = 0; i < state.num_triggers; i++) {
1094 if (state.mcontrol[i].execute) {
1095 mmu->check_triggers_fetch = true;
1096 }
1097 if (state.mcontrol[i].load) {
1098 mmu->check_triggers_load = true;
1099 }
1100 if (state.mcontrol[i].store) {
1101 mmu->check_triggers_store = true;
1102 }
1103 }
1104 }
1105