T32: Evalute memory map, RangeListener, MemAccess
This commit is contained in:
@ -1,17 +1,79 @@
|
||||
#include "T32Connector.hpp"
|
||||
#include <iostream>
|
||||
namespace fail {
|
||||
|
||||
T32Connector::T32Connector(char *hostname, unsigned port, unsigned packlen) : m_hostname(hostname), m_port(port), m_packetlength(packlen) {
|
||||
}
|
||||
#include <t32.h>
|
||||
|
||||
using namespace fail;
|
||||
|
||||
T32Connector::~T32Connector() {
|
||||
if(m_connection_established){
|
||||
// Close Connection to T32 on object deletion. Also works, on simulator.terminate -> global object.
|
||||
std::cout << "[T32] Closing connection." << std::endl;
|
||||
m_log << "Closing connection." << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
bool T32Connector::startup(){
|
||||
// Setup connection to Lauterbach
|
||||
m_log << "Remote connection: " << m_hostname << ":" << m_port << " - Packet length: " << m_packetlength << std::endl;
|
||||
T32_Config("NODE=", m_hostname);
|
||||
T32_Config("PACKLEN=", m_packetlength);
|
||||
T32_Config("PORT=", m_port);
|
||||
|
||||
m_log << "Init." << std::endl;
|
||||
if(!err(T32_Init()) ) { return false; }
|
||||
|
||||
m_log << "Attach." << std::endl;
|
||||
if(!err(T32_Attach(T32_DEV_ICD)) ) { return false; }
|
||||
|
||||
word tmp, fpu, endian;
|
||||
char* cpuname[128];
|
||||
//if(!err(T32_GetCpuInfo( reinterpret_cast<char**>(&m_cpustring), &fpu, &endian, &tmp))) { return false; }
|
||||
if(!err(T32_GetCpuInfo( reinterpret_cast<char**>(&cpuname), &fpu, &endian, &tmp))) { return false; }
|
||||
m_littleendian = (endian != 0);
|
||||
m_cpustring = reinterpret_cast<const char*>(cpuname);
|
||||
|
||||
m_log << "Attached to: " << m_cpustring << std::endl;
|
||||
|
||||
// discoverMemory(DISCOVER_PROGRAM_RAM, m_program_memory_map);
|
||||
// discoverMemory(DISCOVER_DATA_RAM, m_data_memory_map);
|
||||
|
||||
m_connection_established = true;
|
||||
// TODO send init script.
|
||||
return true;
|
||||
}
|
||||
|
||||
void T32Connector::discoverMemory(int access, memory_map_t& map) {
|
||||
dword pstart = 0, pend;
|
||||
word paccess;
|
||||
do {
|
||||
paccess = access;
|
||||
err(T32_GetRam(&pstart, &pend, &paccess));
|
||||
if(paccess != DISCOVER_END){
|
||||
map.push_back(std::make_pair<address_t, address_t>( pstart, pend ));
|
||||
}
|
||||
} while(paccess != DISCOVER_END);
|
||||
}
|
||||
|
||||
bool T32Connector::scriptRunning() const {
|
||||
int retval = 0;
|
||||
err(T32_GetPracticeState( &retval ));
|
||||
return (retval == 1);
|
||||
}
|
||||
|
||||
int T32Connector::getState() const {
|
||||
int retval = 0;
|
||||
err(T32_GetState( &retval ));
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
/* Default T32 error handler */
|
||||
bool T32Connector::err(int errornum) const {
|
||||
if(errornum != 0){
|
||||
//m_log << "Error: " << errornum << std::endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <vector>
|
||||
#include "config/VariantConfig.hpp"
|
||||
#include "sal/SALInst.hpp"
|
||||
#include "optionparser.h"
|
||||
@ -24,14 +24,6 @@
|
||||
#include "T32Connector.hpp"
|
||||
using namespace std;
|
||||
|
||||
/* Default T32 error handler */
|
||||
void err(int ernum){
|
||||
if(err != 0){
|
||||
cerr << "Error: " << err << endl;
|
||||
//exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
static fail::T32Connector t32;
|
||||
|
||||
//!< Program options
|
||||
@ -62,7 +54,7 @@ int main(int argc, char** argv){
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( options[HELP] ) // || argc == 0 || options[RUN].count() == 0) // to enforce -s
|
||||
if ( options[HELP] ) // || argc == 0 || options[RUN].count() == 0) // to enforce -s
|
||||
{
|
||||
int columns = getenv("COLUMNS")? atoi(getenv("COLUMNS")) : 80;
|
||||
option::printUsage(fwrite, stdout, usage, columns);
|
||||
@ -70,39 +62,23 @@ int main(int argc, char** argv){
|
||||
}
|
||||
|
||||
if(options[RUN].count()){
|
||||
cout << "Script: " << options[RUN].first()->arg << endl;
|
||||
t32.setScript(options[RUN].first()->arg);
|
||||
}
|
||||
|
||||
char hostname[] = "localhost";
|
||||
if(options[T32HOST].count()){
|
||||
cout << "T32 Hostname: " << options[T32HOST].first()->arg << endl;
|
||||
t32.setHostname(options[T32HOST].first()->arg);
|
||||
}
|
||||
|
||||
char port[] = "20010";
|
||||
if(options[PORT].count()){
|
||||
cout << "T32 Port: " << options[PORT].first()->arg << endl;
|
||||
t32.setPort(options[PORT].first()->arg);
|
||||
}
|
||||
|
||||
char packlen[] = "1024";
|
||||
if(options[PACKLEN].count()){
|
||||
cout << "T32 Packet Length: " << options[PACKLEN].first()->arg << endl;
|
||||
t32.setPacketlength(options[PACKLEN].first()->arg);
|
||||
}
|
||||
|
||||
|
||||
// Setup connection to Lauterbach
|
||||
cout << "Lauterbach remote connection" << endl;
|
||||
int error;
|
||||
|
||||
cout << "[T32] Connecting to " << hostname << ":" << port << " Packlen: " << packlen << endl;
|
||||
T32_Config("NODE=", hostname);
|
||||
T32_Config("PACKLEN=", packlen);
|
||||
T32_Config("PORT=", port);
|
||||
|
||||
cout << "[T32] Init." << endl;
|
||||
err(T32_Init());
|
||||
|
||||
cout << "[T32] Attach." << endl;
|
||||
err(T32_Attach(T32_DEV_ICD));
|
||||
// Initialize T32
|
||||
t32.startup();
|
||||
|
||||
|
||||
// Let the SimulatorController do the dirty work.
|
||||
|
||||
Reference in New Issue
Block a user