Changed handling of disassembler output so that tarcing becomes possible
This commit is contained in:
		| @@ -435,11 +435,11 @@ public: | ||||
|     virtual uint64_t leave_trap(uint64_t flags) override; | ||||
|     void wait_until(uint64_t flags) override; | ||||
|  | ||||
|     virtual std::string get_additional_disass_info() { | ||||
|     void disass_output(uint64_t pc, const std::string instr) override { | ||||
|         std::stringstream s; | ||||
|         s << "[p:" << lvl[this->reg.machine_state] << ";s:0x" << std::hex << std::setfill('0') | ||||
|           << std::setw(sizeof(reg_t) * 2) << (reg_t)state.mstatus << std::dec << ";c:" << this->reg.icount << "]"; | ||||
|         return s.str(); | ||||
|         CLOG(INFO, disass) << "0x"<<std::setw(16)<<std::setfill('0')<<std::hex<<pc<<"\t\t"<<instr<<"\t"<<s.str(); | ||||
|     }; | ||||
|  | ||||
| protected: | ||||
|   | ||||
| @@ -1,21 +1,21 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| //  | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| //  | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| //  | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| //  | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| //  | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| @@ -27,8 +27,8 @@ | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Tue Sep 26 17:41:14 CEST 2017 | ||||
| //  | ||||
| // Created on: Wed Oct 18 11:42:36 CEST 2017 | ||||
| //             *      rv32imac.h Author: <CoreDSL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -36,30 +36,19 @@ | ||||
| #ifndef _RV32IMAC_H_ | ||||
| #define _RV32IMAC_H_ | ||||
|  | ||||
| #include <iss/arch/traits.h> | ||||
| #include <iss/arch_if.h> | ||||
| #include <iss/vm_if.h> | ||||
| #include <iss/arch/traits.h> | ||||
|  | ||||
| namespace iss { | ||||
| namespace arch { | ||||
|  | ||||
| class rv32imac; | ||||
| struct rv32imac; | ||||
|  | ||||
| template <> class traits<rv32imac> { | ||||
| public: | ||||
|     enum constants { | ||||
|         XLEN = 32, | ||||
|         XLEN2 = 64, | ||||
|         XLEN_BIT_MASK = 31, | ||||
|         PCLEN = 32, | ||||
|         fence = 0, | ||||
|         fencei = 1, | ||||
|         fencevmal = 2, | ||||
|         fencevmau = 3, | ||||
|         MISA_VAL = 1075056897, | ||||
|         PGSIZE = 4096, | ||||
|         PGMASK = 4095 | ||||
|     }; | ||||
| template<> | ||||
| struct traits<rv32imac> { | ||||
|  | ||||
|     enum constants {XLEN=32,XLEN2=64,XLEN_BIT_MASK=31,PCLEN=32,fence=0,fencei=1,fencevmal=2,fencevmau=3,MISA_VAL=1075056897,PGSIZE=4096,PGMASK=4095}; | ||||
|  | ||||
|     enum reg_e { | ||||
|         X0, | ||||
| @@ -96,7 +85,7 @@ public: | ||||
|         X31, | ||||
|         PC, | ||||
|         NUM_REGS, | ||||
|         NEXT_PC = NUM_REGS, | ||||
|         NEXT_PC=NUM_REGS, | ||||
|         TRAP_STATE, | ||||
|         PENDING_TRAP, | ||||
|         MACHINE_STATE, | ||||
| @@ -107,64 +96,61 @@ public: | ||||
|  | ||||
|     using addr_t = uint32_t; | ||||
|  | ||||
|     using code_word_t = uint32_t; // TODO: check removal | ||||
|     using code_word_t = uint32_t; //TODO: check removal | ||||
|  | ||||
|     using virt_addr_t = iss::typed_addr_t<iss::VIRTUAL>; | ||||
|  | ||||
|     using phys_addr_t = iss::typed_addr_t<iss::PHYSICAL>; | ||||
|  | ||||
|     constexpr static unsigned reg_bit_width(unsigned r) { | ||||
|         const uint32_t RV32IMAC_reg_size[] = {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, | ||||
|                                               32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, | ||||
|                                               32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 64}; | ||||
|         const uint32_t RV32IMAC_reg_size[] = {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64}; | ||||
|         return RV32IMAC_reg_size[r]; | ||||
|     } | ||||
|  | ||||
|     constexpr static unsigned reg_byte_offset(unsigned r) { | ||||
|         const uint32_t RV32IMAC_reg_byte_offset[] = {0,   4,   8,   12,  16,  20,  24,  28,  32,  36,  40,  44,  48, | ||||
|                                                      52,  56,  60,  64,  68,  72,  76,  80,  84,  88,  92,  96,  100, | ||||
|                                                      104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 152, 160}; | ||||
|         const uint32_t RV32IMAC_reg_byte_offset[] = {0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,152,160}; | ||||
|         return RV32IMAC_reg_byte_offset[r]; | ||||
|     } | ||||
|  | ||||
|     enum sreg_flag_e { FLAGS }; | ||||
|     enum sreg_flag_e {FLAGS}; | ||||
|  | ||||
|     enum mem_type_e {MEM,CSR,FENCE,RES}; | ||||
|  | ||||
|     enum mem_type_e { MEM, CSR, FENCE, RES }; | ||||
| }; | ||||
|  | ||||
| class rv32imac : public arch_if { | ||||
| public: | ||||
| struct rv32imac: public arch_if { | ||||
|  | ||||
|     using virt_addr_t = typename traits<rv32imac>::virt_addr_t; | ||||
|     using phys_addr_t = typename traits<rv32imac>::phys_addr_t; | ||||
|     using reg_t = typename traits<rv32imac>::reg_t; | ||||
|     using reg_t =  typename traits<rv32imac>::reg_t; | ||||
|     using addr_t = typename traits<rv32imac>::addr_t; | ||||
|  | ||||
|     rv32imac(); | ||||
|     ~rv32imac() = default; | ||||
|  | ||||
|     void reset(uint64_t address = 0) override; | ||||
|     void reset(uint64_t address=0) override; | ||||
|  | ||||
|     uint8_t *get_regs_base_ptr() override; | ||||
|     uint8_t* get_regs_base_ptr() override; | ||||
|     /// deprecated | ||||
|     void get_reg(short idx, std::vector<uint8_t> &value) override {} | ||||
|     void set_reg(short idx, const std::vector<uint8_t> &value) override {} | ||||
|     void get_reg(short idx, std::vector<uint8_t>& value) override {} | ||||
|     void set_reg(short idx, const std::vector<uint8_t>& value) override {} | ||||
|     /// deprecated | ||||
|     bool get_flag(int flag) override { return false; } | ||||
|     void set_flag(int, bool value) override{}; | ||||
|     bool get_flag(int flag) override {return false;} | ||||
|     void set_flag(int, bool value) override {}; | ||||
|     /// deprecated | ||||
|     void update_flags(operations op, uint64_t opr1, uint64_t opr2) override{}; | ||||
|     void update_flags(operations op, uint64_t opr1, uint64_t opr2) override {}; | ||||
|  | ||||
|     void notify_phase(exec_phase phase) override { | ||||
|         if (phase == ISTART) { | ||||
|     void notify_phase(exec_phase phase){ | ||||
|         if(phase==ISTART){ | ||||
|             ++reg.icount; | ||||
|             reg.PC = reg.NEXT_PC; | ||||
|             reg.trap_state = reg.pending_trap; | ||||
|             reg.PC=reg.NEXT_PC; | ||||
|             reg.trap_state=reg.pending_trap; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     uint64_t get_icount() { return reg.icount; } | ||||
|     uint64_t get_icount() { return reg.icount;} | ||||
|  | ||||
|     virtual phys_addr_t v2p(const iss::addr_t &pc); | ||||
|     virtual phys_addr_t v2p(const iss::addr_t& pc); | ||||
|  | ||||
|     virtual iss::sync_type needed_sync() const { return iss::PRE_SYNC; } | ||||
|  | ||||
| @@ -208,6 +194,7 @@ protected: | ||||
|         uint64_t icount; | ||||
|     } reg; | ||||
| }; | ||||
|  | ||||
| } | ||||
| } | ||||
| }             | ||||
| #endif /* _RV32IMAC_H_ */ | ||||
|   | ||||
| @@ -1,21 +1,21 @@ | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Copyright (C) 2017, MINRES Technologies GmbH | ||||
| // All rights reserved. | ||||
| // | ||||
| //  | ||||
| // Redistribution and use in source and binary forms, with or without | ||||
| // modification, are permitted provided that the following conditions are met: | ||||
| // | ||||
| //  | ||||
| // 1. Redistributions of source code must retain the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer. | ||||
| // | ||||
| //  | ||||
| // 2. Redistributions in binary form must reproduce the above copyright notice, | ||||
| //    this list of conditions and the following disclaimer in the documentation | ||||
| //    and/or other materials provided with the distribution. | ||||
| // | ||||
| //  | ||||
| // 3. Neither the name of the copyright holder nor the names of its contributors | ||||
| //    may be used to endorse or promote products derived from this software | ||||
| //    without specific prior written permission. | ||||
| // | ||||
| //  | ||||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
| // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
| // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
| @@ -27,8 +27,8 @@ | ||||
| // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
| // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
| // POSSIBILITY OF SUCH DAMAGE. | ||||
| // | ||||
| // Created on: Tue Sep 26 17:41:14 CEST 2017 | ||||
| //  | ||||
| // Created on: Wed Oct 18 11:42:36 CEST 2017 | ||||
| //             *      rv64ia.h Author: <CoreDSL Generator> | ||||
| // | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -36,30 +36,19 @@ | ||||
| #ifndef _RV64IA_H_ | ||||
| #define _RV64IA_H_ | ||||
|  | ||||
| #include <iss/arch/traits.h> | ||||
| #include <iss/arch_if.h> | ||||
| #include <iss/vm_if.h> | ||||
| #include <iss/arch/traits.h> | ||||
|  | ||||
| namespace iss { | ||||
| namespace arch { | ||||
|  | ||||
| class rv64ia; | ||||
| struct rv64ia; | ||||
|  | ||||
| template <> class traits<rv64ia> { | ||||
| public: | ||||
|     enum constants { | ||||
|         XLEN = 64, | ||||
|         XLEN2 = 128, | ||||
|         XLEN_BIT_MASK = 63, | ||||
|         PCLEN = 64, | ||||
|         fence = 0, | ||||
|         fencei = 1, | ||||
|         fencevmal = 2, | ||||
|         fencevmau = 3, | ||||
|         MISA_VAL = 2147750144, | ||||
|         PGSIZE = 4096, | ||||
|         PGMASK = 4095 | ||||
|     }; | ||||
| template<> | ||||
| struct traits<rv64ia> { | ||||
|  | ||||
|     enum constants {XLEN=64,XLEN2=128,XLEN_BIT_MASK=63,PCLEN=64,fence=0,fencei=1,fencevmal=2,fencevmau=3,MISA_VAL=2147750144,PGSIZE=4096,PGMASK=4095}; | ||||
|  | ||||
|     enum reg_e { | ||||
|         X0, | ||||
| @@ -96,7 +85,7 @@ public: | ||||
|         X31, | ||||
|         PC, | ||||
|         NUM_REGS, | ||||
|         NEXT_PC = NUM_REGS, | ||||
|         NEXT_PC=NUM_REGS, | ||||
|         TRAP_STATE, | ||||
|         PENDING_TRAP, | ||||
|         MACHINE_STATE, | ||||
| @@ -107,63 +96,61 @@ public: | ||||
|  | ||||
|     using addr_t = uint64_t; | ||||
|  | ||||
|     using code_word_t = uint64_t; // TODO: check removal | ||||
|     using code_word_t = uint64_t; //TODO: check removal | ||||
|  | ||||
|     using virt_addr_t = iss::typed_addr_t<iss::VIRTUAL>; | ||||
|  | ||||
|     using phys_addr_t = iss::typed_addr_t<iss::PHYSICAL>; | ||||
|  | ||||
|     constexpr static unsigned reg_bit_width(unsigned r) { | ||||
|         const uint32_t RV64IA_reg_size[] = {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, | ||||
|                                             64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 32, 32, 32, 64}; | ||||
|         const uint32_t RV64IA_reg_size[] = {64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,32,32,32,64}; | ||||
|         return RV64IA_reg_size[r]; | ||||
|     } | ||||
|  | ||||
|     constexpr static unsigned reg_byte_offset(unsigned r) { | ||||
|         const uint32_t RV64IA_reg_byte_offset[] = {0,   8,   16,  24,  32,  40,  48,  56,  64,  72,  80,  88,  96, | ||||
|                                                    104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, | ||||
|                                                    208, 216, 224, 232, 240, 248, 256, 264, 272, 276, 280, 288, 296}; | ||||
|         const uint32_t RV64IA_reg_byte_offset[] = {0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,256,264,272,276,280,288,296}; | ||||
|         return RV64IA_reg_byte_offset[r]; | ||||
|     } | ||||
|  | ||||
|     enum sreg_flag_e { FLAGS }; | ||||
|     enum sreg_flag_e {FLAGS}; | ||||
|  | ||||
|     enum mem_type_e {MEM,CSR,FENCE,RES}; | ||||
|  | ||||
|     enum mem_type_e { MEM, CSR, FENCE, RES }; | ||||
| }; | ||||
|  | ||||
| class rv64ia : public arch_if { | ||||
| public: | ||||
| struct rv64ia: public arch_if { | ||||
|  | ||||
|     using virt_addr_t = typename traits<rv64ia>::virt_addr_t; | ||||
|     using phys_addr_t = typename traits<rv64ia>::phys_addr_t; | ||||
|     using reg_t = typename traits<rv64ia>::reg_t; | ||||
|     using reg_t =  typename traits<rv64ia>::reg_t; | ||||
|     using addr_t = typename traits<rv64ia>::addr_t; | ||||
|  | ||||
|     rv64ia(); | ||||
|     ~rv64ia(); | ||||
|  | ||||
|     void reset(uint64_t address = 0) override; | ||||
|     void reset(uint64_t address=0) override; | ||||
|  | ||||
|     uint8_t *get_regs_base_ptr() override; | ||||
|     uint8_t* get_regs_base_ptr() override; | ||||
|     /// deprecated | ||||
|     void get_reg(short idx, std::vector<uint8_t> &value) override {} | ||||
|     void set_reg(short idx, const std::vector<uint8_t> &value) override {} | ||||
|     void get_reg(short idx, std::vector<uint8_t>& value) override {} | ||||
|     void set_reg(short idx, const std::vector<uint8_t>& value) override {} | ||||
|     /// deprecated | ||||
|     bool get_flag(int flag) override { return false; } | ||||
|     void set_flag(int, bool value) override{}; | ||||
|     bool get_flag(int flag) override {return false;} | ||||
|     void set_flag(int, bool value) override {}; | ||||
|     /// deprecated | ||||
|     void update_flags(operations op, uint64_t opr1, uint64_t opr2) override{}; | ||||
|     void update_flags(operations op, uint64_t opr1, uint64_t opr2) override {}; | ||||
|  | ||||
|     void notify_phase(exec_phase phase) { | ||||
|         if (phase == ISTART) { | ||||
|     void notify_phase(exec_phase phase){ | ||||
|         if(phase==ISTART){ | ||||
|             ++reg.icount; | ||||
|             reg.PC = reg.NEXT_PC; | ||||
|             reg.trap_state = reg.pending_trap; | ||||
|             reg.PC=reg.NEXT_PC; | ||||
|             reg.trap_state=reg.pending_trap; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     uint64_t get_icount() { return reg.icount; } | ||||
|     uint64_t get_icount() { return reg.icount;} | ||||
|  | ||||
|     virtual phys_addr_t v2p(const iss::addr_t &pc); | ||||
|     virtual phys_addr_t v2p(const iss::addr_t& pc); | ||||
|  | ||||
|     virtual iss::sync_type needed_sync() const { return iss::PRE_SYNC; } | ||||
|  | ||||
| @@ -207,6 +194,7 @@ protected: | ||||
|         uint64_t icount; | ||||
|     } reg; | ||||
| }; | ||||
|  | ||||
| } | ||||
| } | ||||
| }             | ||||
| #endif /* _RV64IA_H_ */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user