Using mmap to allocate virtual memory instead of a std:map.
This commit is contained in:
@@ -39,6 +39,8 @@
|
||||
#ifndef DRAM_H_
|
||||
#define DRAM_H_
|
||||
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include <tlm.h>
|
||||
#include <systemc.h>
|
||||
#include <tlm_utils/peq_with_cb_and_phase.h>
|
||||
@@ -88,7 +90,7 @@ struct Dram : sc_module
|
||||
std::vector<errorModel *> ememory;
|
||||
|
||||
// Data Storage:
|
||||
map< unsigned long int, std::vector<unsigned char> > 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user