##// END OF EJS Templates
Added bool loadfile(abstractBinFile* file)...
Added bool loadfile(abstractBinFile* file) and bool dumpMemory(unsigned int address, unsigned int count, QString file, const QString &format); to the genericPySysDriver, now all plugins can load an abstract binary file(bin/srec/elf) and they can dump any memory space to either an srec or a binary file. This function are able to deal with file and host endianness. Functions: -bool dumpMemory(unsigned int address,unsigned int count,QString file); -bool memSet(unsigned int address,int value, unsigned int count); -bool loadbin(unsigned int address,QString file); are moved to socexplorerplugin which makes them available from C++.

File last commit:

r71:c4b98d42ee59 default
r71:c4b98d42ee59 default
Show More
socexplorerplugin.cpp
244 lines | 8.0 KiB | text/x-c | CppLexer
/*------------------------------------------------------------------------------
-- This file is a part of the SocExplorer Software
-- Copyright (C) 2014, Plasma Physics Laboratory - CNRS
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-------------------------------------------------------------------------------*/
/*-- Author : Alexis Jeandet
-- Mail : alexis.jeandet@lpp.polytechnique.fr
----------------------------------------------------------------------------*/
#include <socexplorerplugin.h>
#include <abstractbinfile.h>
#include <srec/srecfile.h>
#include <BinFile/binaryfile.h>
int socexplorerplugin::isConnected(){return this->Connected;}
QString socexplorerplugin::baseName(){return *_Name;}
int socexplorerplugin::baseAddress(){return this->BaseAddress;}
void socexplorerplugin::setBaseAddress(unsigned int baseAddress){this->BaseAddress = baseAddress;}
QString socexplorerplugin::instanceName()
{
return this->_instanceName;
}
int socexplorerplugin::registermenu(QMenu *menu)
{
this->menu = menu->addMenu(this->_instanceName);
this->closeAction = this->menu->addAction(tr("Close plugin"));
QObject::connect(this->closeAction,SIGNAL(triggered()),this,SLOT(closeMe()));
this->ChildsMenu = this->menu->addMenu(QString("Childs"));
for(int i=0;i<this->childs.count();i++)
{
this->childs.at(i)->registermenu(this->ChildsMenu);
}
if(this->pyObject!=NULL)emit this->registerObject((QObject*)this->pyObject,this->instanceName());
return 0;
}
void socexplorerplugin::postInstantiationTrigger()
{
return;
}
unsigned int socexplorerplugin::Write(unsigned int *Value, unsigned int count, unsigned int address)
{
if(parent!=NULL)
{
return parent->Write(Value,count,address);
}
return 0;
}
unsigned int socexplorerplugin::Read(unsigned int *Value, unsigned int count, unsigned int address)
{
if(parent!=NULL)
{
return parent->Read(Value,count,address);
}
return 0;
}
void socexplorerplugin::closeMe(){emit this->closePlugin(this);}
void socexplorerplugin::activate(bool flag){this->setEnabled(flag);emit this->activateSig(flag);}
void socexplorerplugin::setInstanceName(const QString &newName)
{
this->_instanceName = newName;
if(this->menu)
this->menu->setTitle(this->_instanceName);
this->setWindowTitle(newName);
}
bool socexplorerplugin::dumpMemory(unsigned int address, unsigned int count, QString file)
{
unsigned int* buffer = (unsigned int*)malloc(count*sizeof(unsigned int));
if(buffer!=NULL)
{
this->Read(buffer,count,address);
QFile outfile(file);
if (!outfile.open(QIODevice::ReadWrite | QIODevice::Text))
return false;
QTextStream out(&outfile);
for(int i=0;(unsigned int)i<count;i++)
out << "0x"+QString::number(address+(i*4),16) + ": 0x" + QString::number(buffer[i],16) + "\n";
free(buffer);
out.flush();
outfile.close();
return true;
}
return false;
}
bool socexplorerplugin::memSet(unsigned int address, int value, unsigned int count)
{
unsigned int* buffer = (unsigned int*)malloc(count*sizeof(unsigned int));
if(buffer!=NULL)
{
memset((void*)buffer,value,count*sizeof(unsigned int));
this->Write(buffer,count,address);
free(buffer );
return true;
}
return false;
}
bool socexplorerplugin::loadbin(unsigned int address, QString file)
{
QFile infile(file);
if (!infile.open(QIODevice::ReadOnly))
return false;
uint32_t* buffer = (uint32_t*)malloc(infile.size());
if(buffer!=NULL)
{
infile.read((char*)buffer,infile.size());
for(int i=0;i<(infile.size()/4);i++)
{
buffer[i] = socexplorerBswap32(buffer[i]);
}
this->Write(buffer,infile.size()/4,address);
free(buffer);
return true;
}
return false;
}
bool socexplorerplugin::loadfile(abstractBinFile *file)
{
if(file->isopened())
{
QList<codeFragment*> fragments= file->getFragments();
for(int i=0;i<fragments.count();i++)
{
int size = fragments.at(i)->size/4;
// TODO fixme, should be the oposite
#if __BYTE_ORDER == __LITTLE_ENDIAN
if(!file->litleendian)
{
uint32_t* buffer = (uint32_t*)malloc(fragments.at(i)->size);
memcpy(buffer,fragments.at(i)->data,fragments.at(i)->size);
if(buffer!=NULL)
{
for(int l=0;l<(size);l++)
{
buffer[l] = socexplorerBswap32(buffer[l]);
}
this->Write(buffer,size,fragments.at(i)->address);
free(buffer);
}
}
else
{
this->Write((uint32_t*) fragments.at(i)->data,size,fragments.at(i)->address);
}
#elif __BYTE_ORDER == __BIG_ENDIAN
if(file->litleendian)
{
uint32_t* buffer = (uint32_t*)malloc(fragments.at(i)->size);
memcpy(buffer,fragments.at(i)->data,fragments.at(i)->size);
if(buffer!=NULL)
{
for(int l=0;l<(size);l++)
{
buffer[l] = socexplorerBswap32(buffer[l]);
}
this->Write(buffer,size,fragments.at(i)->address);
free(buffer);
}
}
else
{
this->Write((uint32_t*) fragments.at(i)->data,size,fragments.at(i)->address);
}
#endif
}
}
return true;
}
bool socexplorerplugin::dumpMemory(unsigned int address, unsigned int count, QString file, const QString &format)
{
unsigned int* buffer = (unsigned int*)malloc(count*sizeof(unsigned int));
if(buffer!=NULL)
{
this->Read(buffer,count,address);
if(!format.compare("srec",Qt::CaseInsensitive))
{
//need to convert from in memory endianness to file endianness
//SREC is always big endian
#if __BYTE_ORDER == __LITTLE_ENDIAN
for(int l=0;l<(count);l++)
{
buffer[l] = socexplorerBswap32(buffer[l]);
}
#elif __BYTE_ORDER == __BIG_ENDIAN
#endif
codeFragment fragment((char*)buffer,count*4,address);
srecFile::toSrec(QList<codeFragment*>()<<&fragment,file);
}
if(!format.compare("bin",Qt::CaseInsensitive))
{
//beware this format is not portable from a big endian host to a litle endian one
codeFragment fragment((char*)buffer,count*4,address);
binaryFile::toBinary(QList<codeFragment*>()<<&fragment,file);
}
if(!format.compare("hexa",Qt::CaseInsensitive))
{
QFile outfile(file);
if (!outfile.open(QIODevice::ReadWrite | QIODevice::Text))
return false;
QTextStream out(&outfile);
for(int i=0;(unsigned int)i<count;i++)
out << "0x"+QString::number(address+(i*4),16) + ": 0x" + QString::number(buffer[i],16) + "\n";
free(buffer);
out.flush();
outfile.close();
}
return true;
}
return false;
}
void socexplorerplugin::makeGenericPyWrapper()
{
this->pyObject = new genericPySysdriver(this);
}