diff options
Diffstat (limited to 'fesvr')
-rw-r--r-- | fesvr/byteorder.h | 4 | ||||
-rw-r--r-- | fesvr/dtm.cc | 43 | ||||
-rw-r--r-- | fesvr/dtm.h | 2 | ||||
-rw-r--r-- | fesvr/htif.cc | 13 | ||||
-rw-r--r-- | fesvr/memif.cc | 28 | ||||
-rw-r--r-- | fesvr/syscall.cc | 12 |
6 files changed, 51 insertions, 51 deletions
diff --git a/fesvr/byteorder.h b/fesvr/byteorder.h index 71ce515..2147f96 100644 --- a/fesvr/byteorder.h +++ b/fesvr/byteorder.h @@ -16,8 +16,8 @@ static inline int32_t swap(int32_t n) { return int32_t(swap(uint32_t(n))); } static inline int64_t swap(int64_t n) { return int64_t(swap(uint64_t(n))); } #ifdef HAVE_INT128 -typedef __int128 int128_t; -typedef unsigned __int128 uint128_t; +__extension__ typedef __int128 int128_t; +__extension__ typedef unsigned __int128 uint128_t; static inline uint128_t swap(uint128_t n) { return (uint128_t(swap(uint64_t(n))) << 64) | swap(uint64_t(n >> 64)); } static inline int128_t swap(int128_t n) { return int128_t(swap(uint128_t(n))); } #endif diff --git a/fesvr/dtm.cc b/fesvr/dtm.cc index 0f810e7..a0c3254 100644 --- a/fesvr/dtm.cc +++ b/fesvr/dtm.cc @@ -51,6 +51,9 @@ } \ } +#define MAX_DATA_WORDS (1 << DM_ABSTRACTCS_DATACOUNT_LENGTH) +#define MAX_PROG_WORDS (1 << DM_ABSTRACTCS_PROGBUFSIZE_LENGTH) + uint32_t dtm_t::do_command(dtm_t::req r) { req_buf = r; @@ -61,17 +64,20 @@ uint32_t dtm_t::do_command(dtm_t::req r) uint32_t dtm_t::read(uint32_t addr) { - return do_command((req){addr, 1, 0}); + req r = {addr, 1, 0}; + return do_command(r); } uint32_t dtm_t::write(uint32_t addr, uint32_t data) { - return do_command((req){addr, 2, data}); + req r = {addr, 2, data}; + return do_command(r); } void dtm_t::nop() { - do_command((req){0, 0, 0}); + req r = {0, 0, 0}; + do_command(r); } void dtm_t::select_hart(int hartsel) { @@ -104,7 +110,7 @@ void dtm_t::halt(int hartsel) read(DM_DMSTATUS); } - int dmcontrol = DM_DMCONTROL_HALTREQ | DM_DMCONTROL_DMACTIVE; + reg_t dmcontrol = DM_DMCONTROL_HALTREQ | DM_DMCONTROL_DMACTIVE; dmcontrol = set_field(dmcontrol, DM_DMCONTROL_HASEL, hartsel); write(DM_DMCONTROL, dmcontrol); int dmstatus; @@ -142,7 +148,7 @@ void dtm_t::resume(int hartsel) uint64_t dtm_t::save_reg(unsigned regno) { - uint32_t data[xlen/(8*4)]; + uint32_t data[MAX_DATA_WORDS]; uint32_t command = AC_ACCESS_REGISTER_TRANSFER | AC_AR_SIZE(xlen) | AC_AR_REGNO(regno); RUN_AC_OR_DIE(command, 0, 0, data, xlen / (8*4)); @@ -155,7 +161,7 @@ uint64_t dtm_t::save_reg(unsigned regno) void dtm_t::restore_reg(unsigned regno, uint64_t val) { - uint32_t data[xlen/(8*4)]; + uint32_t data[MAX_DATA_WORDS]; data[0] = (uint32_t) val; if (xlen > 32) { data[1] = (uint32_t) (val >> 32); @@ -174,8 +180,8 @@ uint32_t dtm_t::run_abstract_command(uint32_t command, const uint32_t program[], size_t program_n, uint32_t data[], size_t data_n) { - assert(program_n <= ram_words); - assert(data_n <= data_words); + assert(program_n <= MAX_PROG_WORDS); + assert(data_n <= MAX_DATA_WORDS); for (size_t i = 0; i < program_n; i++) { write(DM_PROGBUF0 + i, program[i]); @@ -214,8 +220,8 @@ size_t dtm_t::chunk_align() void dtm_t::read_chunk(uint64_t taddr, size_t len, void* dst) { - uint32_t prog[ram_words]; - uint32_t data[data_words]; + uint32_t prog[MAX_PROG_WORDS]; + uint32_t data[MAX_DATA_WORDS]; uint8_t * curr = (uint8_t*) dst; @@ -267,8 +273,8 @@ void dtm_t::read_chunk(uint64_t taddr, size_t len, void* dst) void dtm_t::write_chunk(uint64_t taddr, size_t len, const void* src) { - uint32_t prog[ram_words]; - uint32_t data[data_words]; + uint32_t prog[MAX_PROG_WORDS]; + uint32_t data[MAX_DATA_WORDS]; const uint8_t * curr = (const uint8_t*) src; @@ -362,8 +368,8 @@ void dtm_t::die(uint32_t cmderr) void dtm_t::clear_chunk(uint64_t taddr, size_t len) { - uint32_t prog[ram_words]; - uint32_t data[data_words]; + uint32_t prog[MAX_PROG_WORDS]; + uint32_t data[MAX_DATA_WORDS]; halt(current_hart); uint64_t s0 = save_reg(S0); @@ -477,8 +483,8 @@ uint32_t dtm_t::get_xlen() uint32_t command = AC_ACCESS_REGISTER_TRANSFER | AC_AR_REGNO(S0); uint32_t cmderr; - const uint32_t prog[] = {}; - uint32_t data[] = {}; + const uint32_t prog[1] = {}; + uint32_t data[1] = {}; cmderr = run_abstract_command(command | AC_AR_SIZE(128), prog, 0, data, 0); if (cmderr == 0){ @@ -560,11 +566,6 @@ void dtm_t::producer_thread() // Poll until the debugger agrees it's enabled. while ((read(DM_DMCONTROL) & DM_DMCONTROL_DMACTIVE) == 0) ; - // These are checked every time we run an abstract command. - uint32_t abstractcs = read(DM_ABSTRACTCS); - ram_words = get_field(abstractcs, DM_ABSTRACTCS_PROGBUFSIZE); - data_words = get_field(abstractcs, DM_ABSTRACTCS_DATACOUNT); - // These things are only needed for the 'modify_csr' function. // That could be re-written to not use these at some performance // overhead. diff --git a/fesvr/dtm.h b/fesvr/dtm.h index f47b648..03c2f79 100644 --- a/fesvr/dtm.h +++ b/fesvr/dtm.h @@ -109,8 +109,6 @@ class dtm_t : public htif_t static const int max_idle_cycles = 10000; - size_t ram_words; - size_t data_words; int num_harts; int current_hart; diff --git a/fesvr/htif.cc b/fesvr/htif.cc index a2477c1..15f79bf 100644 --- a/fesvr/htif.cc +++ b/fesvr/htif.cc @@ -65,14 +65,14 @@ htif_t::htif_t(int argc, char** argv) : htif_t() htif_t::htif_t(const std::vector<std::string>& args) : htif_t() { int argc = args.size() + 1; - char * argv[argc]; + std::vector<char*>argv(argc); argv[0] = (char *) "htif"; for (unsigned int i = 0; i < args.size(); i++) { argv[i+1] = (char *) args[i].c_str(); } //Set line size as 16 by default. line_size = 16; - parse_arguments(argc, argv); + parse_arguments(argc, &argv[0]); register_devices(); } @@ -158,11 +158,9 @@ void htif_t::load_symbols(std::map<std::string, uint64_t>& symbols) { class nop_memif_t : public memif_t { public: - nop_memif_t(htif_t* htif) : memif_t(htif), htif(htif) {} + nop_memif_t(htif_t* htif) : memif_t(htif) {} void read(addr_t UNUSED addr, size_t UNUSED len, void UNUSED *bytes) override {} void write(addr_t UNUSED taddr, size_t UNUSED len, const void UNUSED *src) override {} - private: - htif_t* htif; } nop_memif(this); reg_t nop_entry; @@ -253,11 +251,10 @@ void htif_t::stop() void htif_t::clear_chunk(addr_t taddr, size_t len) { - char zeros[chunk_max_size()]; - memset(zeros, 0, chunk_max_size()); + std::vector<uint8_t> zeros(chunk_max_size(), 0); for (size_t pos = 0; pos < len; pos += chunk_max_size()) - write_chunk(taddr + pos, std::min(len - pos, chunk_max_size()), zeros); + write_chunk(taddr + pos, std::min(len - pos, chunk_max_size()), &zeros[0]); } int htif_t::run() diff --git a/fesvr/memif.cc b/fesvr/memif.cc index e56bd94..59938b9 100644 --- a/fesvr/memif.cc +++ b/fesvr/memif.cc @@ -12,10 +12,10 @@ void memif_t::read(addr_t addr, size_t len, void* bytes) if (len && (addr & (align-1))) { size_t this_len = std::min(len, align - size_t(addr & (align-1))); - uint8_t chunk[align]; + std::vector<uint8_t> chunk(align); - cmemif->read_chunk(addr & ~(align-1), align, chunk); - memcpy(bytes, chunk + (addr & (align-1)), this_len); + cmemif->read_chunk(addr & ~(align-1), align, &chunk[0]); + memcpy(bytes, &chunk[addr & (align-1)], this_len); bytes = (char*)bytes + this_len; addr += this_len; @@ -26,10 +26,10 @@ void memif_t::read(addr_t addr, size_t len, void* bytes) { size_t this_len = len & (align-1); size_t start = len - this_len; - uint8_t chunk[align]; + std::vector<uint8_t> chunk(align); - cmemif->read_chunk(addr + start, align, chunk); - memcpy((char*)bytes + start, chunk, this_len); + cmemif->read_chunk(addr + start, align, &chunk[0]); + memcpy((char*)bytes + start, &chunk[0], this_len); len -= this_len; } @@ -45,11 +45,11 @@ void memif_t::write(addr_t addr, size_t len, const void* bytes) if (len && (addr & (align-1))) { size_t this_len = std::min(len, align - size_t(addr & (align-1))); - uint8_t chunk[align]; + std::vector<uint8_t> chunk(align); - cmemif->read_chunk(addr & ~(align-1), align, chunk); - memcpy(chunk + (addr & (align-1)), bytes, this_len); - cmemif->write_chunk(addr & ~(align-1), align, chunk); + cmemif->read_chunk(addr & ~(align-1), align, &chunk[0]); + memcpy(&chunk[addr & (align-1)], bytes, this_len); + cmemif->write_chunk(addr & ~(align-1), align, &chunk[0]); bytes = (char*)bytes + this_len; addr += this_len; @@ -60,11 +60,11 @@ void memif_t::write(addr_t addr, size_t len, const void* bytes) { size_t this_len = len & (align-1); size_t start = len - this_len; - uint8_t chunk[align]; + std::vector<uint8_t> chunk(align); - cmemif->read_chunk(addr + start, align, chunk); - memcpy(chunk, (char*)bytes + start, this_len); - cmemif->write_chunk(addr + start, align, chunk); + cmemif->read_chunk(addr + start, align, &chunk[0]); + memcpy(&chunk[0], (char*)bytes + start, this_len); + cmemif->write_chunk(addr + start, align, &chunk[0]); len -= this_len; } diff --git a/fesvr/syscall.cc b/fesvr/syscall.cc index f848126..014a468 100644 --- a/fesvr/syscall.cc +++ b/fesvr/syscall.cc @@ -114,19 +114,23 @@ struct riscv_statx attributes_mask(htif->to_target<uint64_t>(s.stx_attributes_mask)), atime { htif->to_target<int64_t>(s.stx_atime.tv_sec), - htif->to_target<uint32_t>(s.stx_atime.tv_nsec) + htif->to_target<uint32_t>(s.stx_atime.tv_nsec), + htif->to_target<int32_t>(0) }, btime { htif->to_target<int64_t>(s.stx_btime.tv_sec), - htif->to_target<uint32_t>(s.stx_btime.tv_nsec) + htif->to_target<uint32_t>(s.stx_btime.tv_nsec), + htif->to_target<int32_t>(0) }, ctime { htif->to_target<int64_t>(s.stx_ctime.tv_sec), - htif->to_target<uint32_t>(s.stx_ctime.tv_nsec) + htif->to_target<uint32_t>(s.stx_ctime.tv_nsec), + htif->to_target<int32_t>(0) }, mtime { htif->to_target<int64_t>(s.stx_mtime.tv_sec), - htif->to_target<uint32_t>(s.stx_mtime.tv_nsec) + htif->to_target<uint32_t>(s.stx_mtime.tv_nsec), + htif->to_target<int32_t>(0) }, rdev_major(htif->to_target<uint32_t>(s.stx_rdev_major)), rdev_minor(htif->to_target<uint32_t>(s.stx_rdev_minor)), |