Skip to content

Commit 433efbc

Browse files
committed
fixes clic subword access
1 parent e4ad8a9 commit 433efbc

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/iss/mem/clic.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,11 @@ template <typename WORD_TYPE> struct clic : public memory_elem {
259259
};
260260

261261
template <typename WORD_TYPE> iss::status clic<WORD_TYPE>::read_clic(uint64_t addr, unsigned length, uint8_t* const data) {
262-
if(addr == cfg.clic_base) { // cliccfg
263-
*data = clic_cfg_reg;
264-
for(auto i = 1; i < length; ++i)
265-
*(data + i) = 0;
262+
if(addr >= cfg.clic_base && (addr+length-1)<cfg.clic_base+4) { // cliccfg
263+
std::array<uint8_t, 4> reg = {0, 0, 0, clic_cfg_reg};
264+
auto offset = addr-cfg.clic_base;
265+
for(auto i = 0; i < length; ++i)
266+
*(data + i) = reg[offset+i];
266267
return iss::Ok;
267268
#if 0
268269
} else if(addr >= (cfg.clic_base + 0x40) && (addr + length) <= (cfg.clic_base + 0x40 + cfg.clic_num_trigger * 4)) { // clicinttrig
@@ -280,8 +281,11 @@ template <typename WORD_TYPE> iss::status clic<WORD_TYPE>::read_clic(uint64_t ad
280281
}
281282

282283
template <typename WORD_TYPE> iss::status clic<WORD_TYPE>::write_clic(uint64_t addr, unsigned length, const uint8_t* const data) {
283-
if(addr == cfg.clic_base) { // cliccfg
284-
clic_cfg_reg = (clic_cfg_reg & ~0x1e) | (*data & 0x1e);
284+
if(addr >= cfg.clic_base && (addr+length-1)<cfg.clic_base+4) { // cliccfg
285+
auto offset = addr-cfg.clic_base;
286+
for(auto i = 0; i < length; ++i)
287+
if((i+offset) == 0)
288+
clic_cfg_reg = (clic_cfg_reg & ~0x1e) | (*data & 0x1e);
285289
return iss::Ok;
286290
#if 0
287291
} else if(addr >= (cfg.clic_base + 0x40) && (addr + length) <= (cfg.clic_base + 0x40 + cfg.clic_num_trigger * 4)) { // clicinttrig

0 commit comments

Comments
 (0)