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