Skip to content

Commit 50e4d0a

Browse files
author
Alexander Romanov
committed
refactor: make extensions accept processor as an argument
1 parent c1c0b8b commit 50e4d0a

File tree

9 files changed

+58
-65
lines changed

9 files changed

+58
-65
lines changed

ci-tests/custom-csr.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ struct xdummycsr_t : public extension_t {
2424

2525
xdummycsr_t() {}
2626

27-
std::vector<insn_desc_t> get_instructions() override {
27+
std::vector<insn_desc_t> get_instructions(processor_t &) override {
2828
return {};
2929
}
3030

31-
std::vector<disasm_insn_t *> get_disasms() override {
31+
std::vector<disasm_insn_t *> get_disasms(processor_t *) override {
3232
return {};
3333
}
3434

ci-tests/test-customext.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,15 @@ struct xslliuw_dummy_t : public extension_t {
3030

3131
xslliuw_dummy_t() {}
3232

33-
std::vector<insn_desc_t> get_instructions() {
33+
std::vector<insn_desc_t> get_instructions(processor_t &) {
3434
std::vector<insn_desc_t> insns;
3535
insns.push_back(insn_desc_t{MATCH_SLLI_UW, MASK_SLLI_UW, do_nop4, do_nop4,
3636
do_nop4, do_nop4, do_nop4, do_nop4, do_nop4,
3737
do_nop4});
3838
return insns;
3939
}
4040

41-
std::vector<disasm_insn_t *> get_disasms() {
41+
std::vector<disasm_insn_t *> get_disasms(processor_t *) {
4242
std::vector<disasm_insn_t *> insns;
4343
insns.push_back(new disasm_insn_t("dummy_slliuw", MATCH_SLLI_UW,
4444
MASK_SLLI_UW, {&xrd, &xrs1, &shamt}));

customext/cflush.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ class cflush_t : public extension_t
2323

2424
cflush_t() {}
2525

26-
std::vector<insn_desc_t> get_instructions() {
26+
std::vector<insn_desc_t> get_instructions(processor_t &) override {
2727
std::vector<insn_desc_t> insns;
2828
insns.push_back((insn_desc_t){0xFC000073, 0xFFF07FFF, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush});
2929
insns.push_back((insn_desc_t){0xFC200073, 0xFFF07FFF, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush});
3030
insns.push_back((insn_desc_t){0xFC100073, 0xFFF07FFF, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush, custom_cflush});
3131
return insns;
3232
}
3333

34-
std::vector<disasm_insn_t*> get_disasms() {
34+
std::vector<disasm_insn_t *> get_disasms(processor_t *) override {
3535
std::vector<disasm_insn_t*> insns;
3636
insns.push_back(new disasm_insn_t("cflush.d.l1", 0xFC000073, 0xFFF07FFF, {&xrs1}));
3737
insns.push_back(new disasm_insn_t("cdiscard.d.l1", 0xFC200073, 0xFFF07FFF, {&xrs1}));

customext/dummy_rocc.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ class dummy_rocc_t : public rocc_t
77
public:
88
const char* name() { return "dummy_rocc"; }
99

10-
reg_t custom0(rocc_insn_t insn, reg_t xs1, reg_t UNUSED xs2)
10+
reg_t custom0(processor_t *p, rocc_insn_t insn, reg_t xs1, reg_t UNUSED xs2)
1111
{
1212
reg_t prev_acc = acc[insn.rs2];
1313

1414
if (insn.rs2 >= num_acc)
15-
illegal_instruction();
15+
illegal_instruction(*p);
1616

1717
switch (insn.funct)
1818
{
@@ -28,7 +28,7 @@ class dummy_rocc_t : public rocc_t
2828
acc[insn.rs2] += xs1;
2929
break;
3030
default:
31-
illegal_instruction();
31+
illegal_instruction(*p);
3232
}
3333

3434
return prev_acc; // in all cases, xd <- previous value of acc[rs2]

riscv/extension.cc

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,15 @@
33
#include "extension.h"
44
#include "trap.h"
55

6-
extension_t::~extension_t()
7-
{
8-
}
9-
10-
void extension_t::illegal_instruction()
6+
void extension_t::illegal_instruction([[maybe_unused]] processor_t &proc)
117
{
128
throw trap_illegal_instruction(0);
139
}
1410

15-
void extension_t::raise_interrupt()
11+
void extension_t::raise_interrupt([[maybe_unused]] processor_t &proc)
1612
{
17-
p->take_interrupt((reg_t)1 << IRQ_COP); // must not return
13+
proc.take_interrupt((reg_t)1 << IRQ_COP); // must not return
1814
throw std::logic_error("a COP exception was posted, but interrupts are disabled!");
1915
}
2016

21-
void extension_t::clear_interrupt()
22-
{
23-
}
17+
void extension_t::clear_interrupt([[maybe_unused]] processor_t &proc) {}

riscv/extension.h

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,19 @@
1111
class extension_t
1212
{
1313
public:
14-
virtual std::vector<insn_desc_t> get_instructions() = 0;
15-
virtual std::vector<disasm_insn_t*> get_disasms() = 0;
16-
virtual std::vector<csr_t_p> get_csrs ([[maybe_unused]] processor_t &proc) const { return {}; };
17-
virtual const char* name() = 0;
18-
virtual void reset() {};
19-
virtual void set_debug(bool UNUSED value) {}
20-
virtual ~extension_t();
14+
virtual std::vector<insn_desc_t> get_instructions(processor_t &proc) = 0;
15+
virtual std::vector<disasm_insn_t *>
16+
get_disasms(processor_t *proc = nullptr) = 0;
17+
virtual std::vector<csr_t_p> get_csrs(processor_t &) const { return {}; };
18+
virtual const char *name() = 0;
19+
virtual void reset(processor_t &) {};
20+
virtual void set_debug(bool UNUSED value, processor_t &) {}
21+
virtual ~extension_t() = default;
2122

22-
void set_processor(processor_t* _p) { p = _p; }
2323
protected:
24-
processor_t* p;
25-
26-
void illegal_instruction();
27-
void raise_interrupt();
28-
void clear_interrupt();
24+
void illegal_instruction(processor_t &proc);
25+
void raise_interrupt(processor_t &proc);
26+
void clear_interrupt(processor_t &proc);
2927
};
3028

3129
std::function<extension_t*()> find_extension(const char* name);

riscv/processor.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ void processor_t::set_debug(bool value)
169169
debug = value;
170170

171171
for (auto e : custom_extensions)
172-
e.second->set_debug(value);
172+
e.second->set_debug(value, *this);
173173
}
174174

175175
void processor_t::set_histogram(bool value)
@@ -200,7 +200,7 @@ void processor_t::reset()
200200
for (auto e : custom_extensions) { // reset any extensions
201201
for (auto &csr: e.second->get_csrs(*this))
202202
state.add_csr(csr->address, csr);
203-
e.second->reset();
203+
e.second->reset(*this);
204204
}
205205

206206
if (sim)
@@ -703,18 +703,17 @@ void processor_t::build_opcode_map()
703703
}
704704

705705
void processor_t::register_extension(extension_t *x) {
706-
for (auto insn : x->get_instructions())
706+
for (auto insn : x->get_instructions(*this))
707707
register_custom_insn(insn);
708708
build_opcode_map();
709709

710-
for (auto disasm_insn : x->get_disasms())
710+
for (auto disasm_insn : x->get_disasms(this))
711711
disassembler->add_insn(disasm_insn);
712712

713713
if (!custom_extensions.insert(std::make_pair(x->name(), x)).second) {
714714
fprintf(stderr, "extensions must have unique names (got two named \"%s\"!)\n", x->name());
715715
abort();
716716
}
717-
x->set_processor(this);
718717
}
719718

720719
void processor_t::register_base_instructions()

riscv/rocc.cc

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,35 @@
66
#include "trap.h"
77
#include <cstdlib>
88

9-
#define customX(n) \
10-
static reg_t c##n(processor_t* p, insn_t insn, reg_t pc) \
11-
{ \
12-
rocc_t* rocc = static_cast<rocc_t*>(p->get_extension()); \
13-
rocc_insn_union_t u; \
14-
u.i = insn; \
15-
reg_t xs1 = u.r.xs1 ? RS1 : -1; \
16-
reg_t xs2 = u.r.xs2 ? RS2 : -1; \
17-
reg_t xd = rocc->custom##n(u.r, xs1, xs2); \
18-
if (u.r.xd) \
19-
WRITE_RD(xd); \
20-
return pc+4; \
21-
} \
22-
\
23-
reg_t rocc_t::custom##n(rocc_insn_t UNUSED insn, reg_t UNUSED xs1, reg_t UNUSED xs2) \
24-
{ \
25-
illegal_instruction(); \
26-
return 0; \
9+
#define customX(n) \
10+
static reg_t c##n(processor_t *p, insn_t insn, reg_t pc) \
11+
{ \
12+
rocc_t *rocc = static_cast<rocc_t *>(p->get_extension()); \
13+
rocc_insn_union_t u; \
14+
u.i = insn; \
15+
reg_t xs1 = u.r.xs1 ? RS1 : -1; \
16+
reg_t xs2 = u.r.xs2 ? RS2 : -1; \
17+
reg_t xd = rocc->custom##n(p, u.r, xs1, xs2); \
18+
if (u.r.xd) \
19+
WRITE_RD(xd); \
20+
return pc + 4; \
21+
} \
22+
\
23+
reg_t rocc_t::custom##n(processor_t *p, rocc_insn_t UNUSED insn, \
24+
reg_t UNUSED xs1, reg_t UNUSED xs2) \
25+
{ \
26+
illegal_instruction(*p); \
27+
return 0; \
2728
}
2829

30+
// clang-format off
2931
customX(0)
3032
customX(1)
3133
customX(2)
3234
customX(3)
35+
// clang-format on
3336

34-
std::vector<insn_desc_t> rocc_t::get_instructions()
35-
{
37+
std::vector<insn_desc_t> rocc_t::get_instructions(processor_t &) {
3638
std::vector<insn_desc_t> insns;
3739
insns.push_back((insn_desc_t){0x0b, 0x7f,
3840
&::illegal_instruction, c0, &::illegal_instruction, c0,
@@ -49,8 +51,7 @@ std::vector<insn_desc_t> rocc_t::get_instructions()
4951
return insns;
5052
}
5153

52-
std::vector<disasm_insn_t*> rocc_t::get_disasms()
53-
{
54+
std::vector<disasm_insn_t *> rocc_t::get_disasms(processor_t *) {
5455
std::vector<disasm_insn_t*> insns;
5556
return insns;
5657
}

riscv/rocc.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ union rocc_insn_union_t
2424
class rocc_t : public extension_t
2525
{
2626
public:
27-
virtual reg_t custom0(rocc_insn_t insn, reg_t xs1, reg_t xs2);
28-
virtual reg_t custom1(rocc_insn_t insn, reg_t xs1, reg_t xs2);
29-
virtual reg_t custom2(rocc_insn_t insn, reg_t xs1, reg_t xs2);
30-
virtual reg_t custom3(rocc_insn_t insn, reg_t xs1, reg_t xs2);
31-
std::vector<insn_desc_t> get_instructions();
32-
std::vector<disasm_insn_t*> get_disasms();
27+
virtual reg_t custom0(processor_t *, rocc_insn_t insn, reg_t xs1, reg_t xs2);
28+
virtual reg_t custom1(processor_t *, rocc_insn_t insn, reg_t xs1, reg_t xs2);
29+
virtual reg_t custom2(processor_t *, rocc_insn_t insn, reg_t xs1, reg_t xs2);
30+
virtual reg_t custom3(processor_t *, rocc_insn_t insn, reg_t xs1, reg_t xs2);
31+
std::vector<insn_desc_t> get_instructions(processor_t &proc) override;
32+
std::vector<disasm_insn_t *>
33+
get_disasms(processor_t *proc = nullptr) override;
3334
};
3435

3536
#define define_custom_func(type_name, ext_name_str, func_name, method_name) \

0 commit comments

Comments
 (0)