Compare commits
	
		
			1 Commits
		
	
	
		
			6789cf4c32
			...
			32848ec396
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 32848ec396 | 
| @@ -131,7 +131,16 @@ project(tgc-sim) | |||||||
| find_package(Boost COMPONENTS program_options thread REQUIRED) | find_package(Boost COMPONENTS program_options thread REQUIRED) | ||||||
|  |  | ||||||
| add_executable(${PROJECT_NAME} src/main.cpp) | add_executable(${PROJECT_NAME} src/main.cpp) | ||||||
| FILE(GLOB TGC_SOURCES  ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/iss/arch/*.cpp)  | if(TARGET ${CORE_NAME}_cpp) | ||||||
|  |     list(APPEND TGC_SOURCES ${${CORE_NAME}_OUTPUT_FILES}) | ||||||
|  | else() | ||||||
|  |     FILE(GLOB TGC_SOURCES | ||||||
|  |         ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/iss/arch/*.cpp | ||||||
|  |         ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/vm/interp/vm_*.cpp | ||||||
|  |     ) | ||||||
|  |     list(APPEND TGC_SOURCES ${GEN_SOURCES}) | ||||||
|  | endif() | ||||||
|  |  | ||||||
| foreach(F IN LISTS TGC_SOURCES) | foreach(F IN LISTS TGC_SOURCES) | ||||||
|     string(REGEX REPLACE  ".*/([^/]*)\.cpp"  "\\1" CORE_NAME_LC ${F}) |     string(REGEX REPLACE  ".*/([^/]*)\.cpp"  "\\1" CORE_NAME_LC ${F}) | ||||||
|     string(TOUPPER ${CORE_NAME_LC} CORE_NAME) |     string(TOUPPER ${CORE_NAME_LC} CORE_NAME) | ||||||
|   | |||||||
| @@ -803,7 +803,7 @@ iss::status riscv_hart_mu_p<BASE, FEAT>::read(const address_type type, const acc | |||||||
| #ifndef NDEBUG | #ifndef NDEBUG | ||||||
|     if (access && iss::access_type::DEBUG) { |     if (access && iss::access_type::DEBUG) { | ||||||
|         LOG(TRACEALL) << "debug read of " << length << " bytes @addr 0x" << std::hex << addr; |         LOG(TRACEALL) << "debug read of " << length << " bytes @addr 0x" << std::hex << addr; | ||||||
|     } else if(access && iss::access_type::FETCH){ |     } else if(is_fetch(access)){ | ||||||
|         LOG(TRACEALL) << "fetch of " << length << " bytes  @addr 0x" << std::hex << addr; |         LOG(TRACEALL) << "fetch of " << length << " bytes  @addr 0x" << std::hex << addr; | ||||||
|     } else { |     } else { | ||||||
|         LOG(TRACE) << "read of " << length << " bytes  @addr 0x" << std::hex << addr; |         LOG(TRACE) << "read of " << length << " bytes  @addr 0x" << std::hex << addr; | ||||||
| @@ -835,7 +835,7 @@ iss::status riscv_hart_mu_p<BASE, FEAT>::read(const address_type type, const acc | |||||||
|                 } |                 } | ||||||
|                 auto phys_addr = type==iss::address_type::PHYSICAL?phys_addr_t{access, space, addr}:BASE::v2p(iss::addr_t{access, type, space, addr}); |                 auto phys_addr = type==iss::address_type::PHYSICAL?phys_addr_t{access, space, addr}:BASE::v2p(iss::addr_t{access, type, space, addr}); | ||||||
|                 auto res = iss::Err; |                 auto res = iss::Err; | ||||||
|                 if(access != access_type::FETCH && memfn_range.size()){ |                 if(!is_fetch(access) && memfn_range.size()){ | ||||||
|                     auto it = std::find_if(std::begin(memfn_range), std::end(memfn_range), [phys_addr](std::tuple<uint64_t, uint64_t> const& a){ |                     auto it = std::find_if(std::begin(memfn_range), std::end(memfn_range), [phys_addr](std::tuple<uint64_t, uint64_t> const& a){ | ||||||
|                         return std::get<0>(a)<=phys_addr.val && (std::get<0>(a)+std::get<1>(a))>phys_addr.val; |                         return std::get<0>(a)<=phys_addr.val && (std::get<0>(a)+std::get<1>(a))>phys_addr.val; | ||||||
|                     }); |                     }); | ||||||
| @@ -922,7 +922,7 @@ iss::status riscv_hart_mu_p<BASE, FEAT>::write(const address_type type, const ac | |||||||
|                     return iss::Err; |                     return iss::Err; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             if (unlikely((access && iss::access_type::FETCH) && (addr & 0x1) == 1)) { |             if (unlikely(is_fetch(access) && (addr & 0x1) == 1)) { | ||||||
|                 fault_data = addr; |                 fault_data = addr; | ||||||
|                 if (access && iss::access_type::DEBUG) throw trap_access(0, addr); |                 if (access && iss::access_type::DEBUG) throw trap_access(0, addr); | ||||||
|                 this->trap_state = (1UL << 31); // issue trap 0 |                 this->trap_state = (1UL << 31); // issue trap 0 | ||||||
| @@ -936,7 +936,7 @@ iss::status riscv_hart_mu_p<BASE, FEAT>::write(const address_type type, const ac | |||||||
|                 } |                 } | ||||||
|                 auto phys_addr = type==iss::address_type::PHYSICAL?phys_addr_t{access, space, addr}:BASE::v2p(iss::addr_t{access, type, space, addr}); |                 auto phys_addr = type==iss::address_type::PHYSICAL?phys_addr_t{access, space, addr}:BASE::v2p(iss::addr_t{access, type, space, addr}); | ||||||
|                 auto res = iss::Err; |                 auto res = iss::Err; | ||||||
|                 if(access != access_type::FETCH && memfn_range.size()){ |                 if(!is_fetch(access) && memfn_range.size()){ | ||||||
|                     auto it = std::find_if(std::begin(memfn_range), std::end(memfn_range), [phys_addr](std::tuple<uint64_t, uint64_t> const& a){ |                     auto it = std::find_if(std::begin(memfn_range), std::end(memfn_range), [phys_addr](std::tuple<uint64_t, uint64_t> const& a){ | ||||||
|                         return std::get<0>(a)<=phys_addr.val && (std::get<0>(a)+std::get<1>(a))>phys_addr.val; |                         return std::get<0>(a)<=phys_addr.val && (std::get<0>(a)+std::get<1>(a))>phys_addr.val; | ||||||
|                     }); |                     }); | ||||||
|   | |||||||
| @@ -120,7 +120,7 @@ iss::status iss::arch::wt_cache<BASE>::read_cache(phys_addr_t a, unsigned l, uin | |||||||
|     if((a.val&io_addr_mask) != io_address) { |     if((a.val&io_addr_mask) != io_address) { | ||||||
|         auto set_addr=(a.val&(size-1))>>util::ilog2(line_sz*ways); |         auto set_addr=(a.val&(size-1))>>util::ilog2(line_sz*ways); | ||||||
|         auto tag_addr=a.val>>util::ilog2(line_sz); |         auto tag_addr=a.val>>util::ilog2(line_sz); | ||||||
|         auto& set = (a.access==access_type::FETCH?icache_ptr:dcache_ptr)->sets[set_addr]; |         auto& set = (is_fetch(a.access)?icache_ptr:dcache_ptr)->sets[set_addr]; | ||||||
|         for(auto& cl: set.ways) { |         for(auto& cl: set.ways) { | ||||||
|             if(cl.st==cache::state::VALID && cl.tag_addr==tag_addr) { |             if(cl.st==cache::state::VALID && cl.tag_addr==tag_addr) { | ||||||
|                 auto start_addr = a.val&(line_sz-1); |                 auto start_addr = a.val&(line_sz-1); | ||||||
| @@ -156,7 +156,7 @@ iss::status iss::arch::wt_cache<BASE>::write_cache(phys_addr_t a, unsigned l, co | |||||||
|             if(cl.st==cache::state::VALID && cl.tag_addr==tag_addr) { |             if(cl.st==cache::state::VALID && cl.tag_addr==tag_addr) { | ||||||
|                 auto start_addr = a.val&(line_sz-1); |                 auto start_addr = a.val&(line_sz-1); | ||||||
|                 for(auto i = 0U; i<l; ++i) |                 for(auto i = 0U; i<l; ++i) | ||||||
|                     cl.data[start_addr+1] = d[i]; |                     cl.data[start_addr+i] = d[i]; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -129,7 +129,7 @@ public: | |||||||
|         if (addr.access && access_type::DEBUG) |         if (addr.access && access_type::DEBUG) | ||||||
|             return owner->read_mem_dbg(addr.val, length, data) ? Ok : Err; |             return owner->read_mem_dbg(addr.val, length, data) ? Ok : Err; | ||||||
|         else { |         else { | ||||||
|             return owner->read_mem(addr.val, length, data, addr.access && access_type::FETCH) ? Ok : Err; |             return owner->read_mem(addr.val, length, data, is_fetch(addr.access)) ? Ok : Err; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user