aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns/mfpcr.h
blob: e0c67ae1fd42708d47f8b72b31a7d173a05a4fd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
require_supervisor;

reg_t val;

switch(insn.rtype.rs2)
{
  case 0:
    val = sr;
    break;
  case 1:
    val = epc;
    break;
  case 2:
    val = badvaddr;
    break;
  case 3:
    val = evec;
    break;
  case 4:
    val = count;
    break;
  case 5:
    val = compare;
    break;
  case 6:
    val = cause;
    break;
  case 7:
    val = 0;
    cause &= ~(1 << (IPI_IRQ+CAUSE_IP_SHIFT));
    break;

  case 8:
    val = mmu.memsz >> PGSHIFT;
    break;

  case 9:
    val = mmu.get_ptbr();
    break;

  case 10:
    val = id;
    break;

  case 11:
    val = vecbanks;
    break;

  case 12:
    val = sim->num_cores();
    break;

  case 17:
    fromhost = val = sim->get_fromhost();
    break;

  case 24:
    val = pcr_k0;
    break;
  case 25:
    val = pcr_k1;
    break;

  default:
    val = -1;
}

RD = sext_xprlen(val);