Using mmap to allocate virtual memory instead of a std:map.

This commit is contained in:
Éder F. Zulian
2016-07-07 16:57:54 +02:00
parent ed76b58aaf
commit 88c9cfade9

View File

@@ -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;
}