Skip to content

Commit 145547c

Browse files
committed
reset now correctly zeroes out all registers
The solution before could lead to UB as it zeroed out NUM_REGS registers of reg_t, even if the other registers were smaller
1 parent 4bae3b8 commit 145547c

9 files changed

Lines changed: 9 additions & 45 deletions

File tree

gen_input/templates/CORENAME.cpp.gtl

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,10 @@ ${coreDef.name.toLowerCase()}::${coreDef.name.toLowerCase()}() = default;
5757
${coreDef.name.toLowerCase()}::~${coreDef.name.toLowerCase()}() = default;
5858

5959
void ${coreDef.name.toLowerCase()}::reset(uint64_t address) {
60-
auto base_ptr = reinterpret_cast<traits<${coreDef.name.toLowerCase()}>::reg_t*>(get_regs_base_ptr());
61-
for(size_t i=0; i<traits<${coreDef.name.toLowerCase()}>::NUM_REGS; ++i)
62-
*(base_ptr+i)=0;
60+
std::memset(&reg, 0, sizeof(reg));
6361
reg.PC=address;
6462
reg.NEXT_PC=reg.PC;
6563
reg.PRIV=0x3;
66-
reg.trap_state=0;
67-
reg.icount=0;
6864
}
6965

7066
uint8_t *${coreDef.name.toLowerCase()}::get_regs_base_ptr() {

src/iss/arch/rv32gc.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ rv32gc::rv32gc() = default;
5050
rv32gc::~rv32gc() = default;
5151

5252
void rv32gc::reset(uint64_t address) {
53-
auto base_ptr = reinterpret_cast<traits<rv32gc>::reg_t*>(get_regs_base_ptr());
54-
for(size_t i=0; i<traits<rv32gc>::NUM_REGS; ++i)
55-
*(base_ptr+i)=0;
53+
std::memset(&reg, 0, sizeof(reg));
5654
reg.PC=address;
5755
reg.NEXT_PC=reg.PC;
5856
reg.PRIV=0x3;
59-
reg.trap_state=0;
60-
reg.icount=0;
6157
}
6258

6359
uint8_t *rv32gc::get_regs_base_ptr() {

src/iss/arch/rv32gcv.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ rv32gcv::rv32gcv() = default;
5050
rv32gcv::~rv32gcv() = default;
5151

5252
void rv32gcv::reset(uint64_t address) {
53-
auto base_ptr = reinterpret_cast<traits<rv32gcv>::reg_t*>(get_regs_base_ptr());
54-
for(size_t i=0; i<traits<rv32gcv>::NUM_REGS; ++i)
55-
*(base_ptr+i)=0;
53+
std::memset(&reg, 0, sizeof(reg));
5654
reg.PC=address;
5755
reg.NEXT_PC=reg.PC;
5856
reg.PRIV=0x3;
59-
reg.trap_state=0;
60-
reg.icount=0;
6157
}
6258

6359
uint8_t *rv32gcv::get_regs_base_ptr() {

src/iss/arch/rv32i.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ rv32i::rv32i() = default;
5050
rv32i::~rv32i() = default;
5151

5252
void rv32i::reset(uint64_t address) {
53-
auto base_ptr = reinterpret_cast<traits<rv32i>::reg_t*>(get_regs_base_ptr());
54-
for(size_t i=0; i<traits<rv32i>::NUM_REGS; ++i)
55-
*(base_ptr+i)=0;
53+
std::memset(&reg, 0, sizeof(reg));
5654
reg.PC=address;
5755
reg.NEXT_PC=reg.PC;
5856
reg.PRIV=0x3;
59-
reg.trap_state=0;
60-
reg.icount=0;
6157
}
6258

6359
uint8_t *rv32i::get_regs_base_ptr() {

src/iss/arch/rv32imac.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ rv32imac::rv32imac() = default;
5050
rv32imac::~rv32imac() = default;
5151

5252
void rv32imac::reset(uint64_t address) {
53-
auto base_ptr = reinterpret_cast<traits<rv32imac>::reg_t*>(get_regs_base_ptr());
54-
for(size_t i=0; i<traits<rv32imac>::NUM_REGS; ++i)
55-
*(base_ptr+i)=0;
53+
std::memset(&reg, 0, sizeof(reg));
5654
reg.PC=address;
5755
reg.NEXT_PC=reg.PC;
5856
reg.PRIV=0x3;
59-
reg.trap_state=0;
60-
reg.icount=0;
6157
}
6258

6359
uint8_t *rv32imac::get_regs_base_ptr() {

src/iss/arch/rv64gc.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ rv64gc::rv64gc() = default;
5050
rv64gc::~rv64gc() = default;
5151

5252
void rv64gc::reset(uint64_t address) {
53-
auto base_ptr = reinterpret_cast<traits<rv64gc>::reg_t*>(get_regs_base_ptr());
54-
for(size_t i=0; i<traits<rv64gc>::NUM_REGS; ++i)
55-
*(base_ptr+i)=0;
53+
std::memset(&reg, 0, sizeof(reg));
5654
reg.PC=address;
5755
reg.NEXT_PC=reg.PC;
5856
reg.PRIV=0x3;
59-
reg.trap_state=0;
60-
reg.icount=0;
6157
}
6258

6359
uint8_t *rv64gc::get_regs_base_ptr() {

src/iss/arch/rv64gcv.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ rv64gcv::rv64gcv() = default;
5050
rv64gcv::~rv64gcv() = default;
5151

5252
void rv64gcv::reset(uint64_t address) {
53-
auto base_ptr = reinterpret_cast<traits<rv64gcv>::reg_t*>(get_regs_base_ptr());
54-
for(size_t i=0; i<traits<rv64gcv>::NUM_REGS; ++i)
55-
*(base_ptr+i)=0;
53+
std::memset(&reg, 0, sizeof(reg));
5654
reg.PC=address;
5755
reg.NEXT_PC=reg.PC;
5856
reg.PRIV=0x3;
59-
reg.trap_state=0;
60-
reg.icount=0;
6157
}
6258

6359
uint8_t *rv64gcv::get_regs_base_ptr() {

src/iss/arch/rv64i.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ rv64i::rv64i() = default;
5050
rv64i::~rv64i() = default;
5151

5252
void rv64i::reset(uint64_t address) {
53-
auto base_ptr = reinterpret_cast<traits<rv64i>::reg_t*>(get_regs_base_ptr());
54-
for(size_t i=0; i<traits<rv64i>::NUM_REGS; ++i)
55-
*(base_ptr+i)=0;
53+
std::memset(&reg, 0, sizeof(reg));
5654
reg.PC=address;
5755
reg.NEXT_PC=reg.PC;
5856
reg.PRIV=0x3;
59-
reg.trap_state=0;
60-
reg.icount=0;
6157
}
6258

6359
uint8_t *rv64i::get_regs_base_ptr() {

src/iss/arch/rv64imac.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ rv64imac::rv64imac() = default;
5050
rv64imac::~rv64imac() = default;
5151

5252
void rv64imac::reset(uint64_t address) {
53-
auto base_ptr = reinterpret_cast<traits<rv64imac>::reg_t*>(get_regs_base_ptr());
54-
for(size_t i=0; i<traits<rv64imac>::NUM_REGS; ++i)
55-
*(base_ptr+i)=0;
53+
std::memset(&reg, 0, sizeof(reg));
5654
reg.PC=address;
5755
reg.NEXT_PC=reg.PC;
5856
reg.PRIV=0x3;
59-
reg.trap_state=0;
60-
reg.icount=0;
6157
}
6258

6359
uint8_t *rv64imac::get_regs_base_ptr() {

0 commit comments

Comments
 (0)