From 88c9cfade96f2b7e1fd7ab8cc134c189c94bcff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89der=20F=2E=20Zulian?= Date: Thu, 7 Jul 2016 16:57:54 +0200 Subject: [PATCH] Using mmap to allocate virtual memory instead of a std:map. --- DRAMSys/simulator/src/simulation/Dram.h | 63 +++++++++---------------- 1 file changed, 21 insertions(+), 42 deletions(-) diff --git a/DRAMSys/simulator/src/simulation/Dram.h b/DRAMSys/simulator/src/simulation/Dram.h index bb608c41..b6e38ca6 100644 --- a/DRAMSys/simulator/src/simulation/Dram.h +++ b/DRAMSys/simulator/src/simulation/Dram.h @@ -39,6 +39,8 @@ #ifndef DRAM_H_ #define DRAM_H_ +#include + #include #include #include @@ -88,7 +90,7 @@ struct Dram : sc_module std::vector ememory; // Data Storage: - map< unsigned long int, std::vector > memory; + unsigned char *memory; TlmRecorder *tlmRecorder; Controller *dramController; @@ -97,6 +99,10 @@ struct Dram : sc_module { ZEROES.assign(bytesPerBurst, 0); + // FIXME: memory size + unsigned int size = 1024 * 1024 * 1024; + memory = (unsigned char *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_NORESERVE, -1, 0); + tSocket.register_nb_transport_fw(this, &Dram::nb_transport_fw); tSocket.register_transport_dbg(this,&Dram::transport_dbg); @@ -382,8 +388,8 @@ struct Dram : sc_module } else if (ErrorStoreMode == ErrorStorageMode::Store) // Use Storage { - memory[payload.get_address()].reserve(bytesPerBurst); - memcpy(memory[payload.get_address()].data(), payload.get_data_ptr(), payload.get_data_length()); + unsigned char *phyAddr = memory + payload.get_address(); + memcpy(phyAddr, payload.get_data_ptr(), payload.get_data_length()); } else // == 2 Use Storage with Error Model { @@ -401,15 +407,8 @@ struct Dram : sc_module // Load data: if (ErrorStoreMode == ErrorStorageMode::Store) //use ErrorStorageMode { - if(memory.count(payload.get_address()) == 1) - { - memcpy(payload.get_data_ptr(), memory[payload.get_address()].data(), payload.get_data_length()); - } - else - { - SC_REPORT_WARNING ("DRAM", "Reading from an empty memory location."); - memcpy(payload.get_data_ptr(), ZEROES.data(), payload.get_data_length()); - } + unsigned char *phyAddr = memory + payload.get_address(); + memcpy(payload.get_data_ptr(), phyAddr, payload.get_data_length()); } else if(ErrorStoreMode == ErrorStorageMode::ErrorModel)// use ErrorStorageMode with errormodel { @@ -430,8 +429,9 @@ struct Dram : sc_module } else if (ErrorStoreMode == ErrorStorageMode::Store) // Use Storage { - memory[payload.get_address()].reserve(bytesPerBurst); - memcpy(memory[payload.get_address()].data(), payload.get_data_ptr(), payload.get_data_length()); + + unsigned char *phyAddr = memory + payload.get_address(); + memcpy(phyAddr, payload.get_data_ptr(), payload.get_data_length()); } else // == 2 Use Storage with Error Model { @@ -447,15 +447,8 @@ struct Dram : sc_module // Load data: if (ErrorStoreMode == ErrorStorageMode::Store) //use ErrorStorageMode { - if(memory.count(payload.get_address()) == 1) - { - memcpy(payload.get_data_ptr(), memory[payload.get_address()].data(), payload.get_data_length()); - } - else - { - SC_REPORT_WARNING ("DRAM", "Reading from an empty memory location."); - memcpy(payload.get_data_ptr(), ZEROES.data(), payload.get_data_length()); - } + unsigned char *phyAddr = memory + payload.get_address(); + memcpy(payload.get_data_ptr(), phyAddr, payload.get_data_length()); } else if(ErrorStoreMode == ErrorStorageMode::ErrorModel)// use ErrorStorageMode with errormodel { @@ -566,15 +559,8 @@ struct Dram : sc_module { if (ErrorStoreMode == ErrorStorageMode::Store) // Use Storage { - if (memory.count(adr) == 1) - { - memcpy(ptr, memory[adr].data(), len); - } - else - { - SC_REPORT_WARNING ("DRAM", "Reading from an empty memory location."); - memcpy(ptr, ZEROES.data(), len); - } + unsigned char *phyAddr = memory + trans.get_address(); + memcpy(trans.get_data_ptr(), phyAddr, trans.get_data_length()); } else { @@ -584,16 +570,9 @@ struct Dram : sc_module } else if ( cmd == tlm::TLM_WRITE_COMMAND ) { - if (ErrorStoreMode == ErrorStorageMode::Store) // Use Storage - { - memory[adr].reserve(bytesPerBurst); - memcpy(memory[adr].data(), ptr, len); - } - else - { - //ememory[bank]->store(trans); - SC_REPORT_FATAL("DRAM", "Debug transport not supported with error model yet."); - } + + unsigned char *phyAddr = memory + trans.get_address(); + memcpy(phyAddr, trans.get_data_ptr(), trans.get_data_length()); } return len; }