From 084ff6eb996fafab3c687be2dc57920210281c9a Mon Sep 17 00:00:00 2001 From: sirozipp Date: Sat, 5 May 2012 07:57:43 +0000 Subject: [PATCH] OVP: save/restore registers using protocol buffer git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1206 8c4709b5-6ec9-48aa-a5cd-a96041d1645a --- ovp/CMakeLists.txt | 1 + ovp/OVPCpu.hpp | 12 ++++++ ovp/OVPPlatform.cc | 8 ++++ ovp/OVPPlatform.hpp | 10 +++++ ovp/cortexM3/CMakeLists.txt | 6 +-- ovp/cortexM3/platform/platform.cc | 57 +++++++++++++++++++++++++++- ovp/cortexM3/platform/platform.hpp | 4 ++ ovp/statusmsg/CMakeLists.txt | 15 ++++++++ ovp/statusmsg/OVPStatusMessage.proto | 10 +++++ ovp/statusmsg/protogen.sh | 2 + 10 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 ovp/statusmsg/CMakeLists.txt create mode 100644 ovp/statusmsg/OVPStatusMessage.proto create mode 100755 ovp/statusmsg/protogen.sh diff --git a/ovp/CMakeLists.txt b/ovp/CMakeLists.txt index 013281cb..034d9ff4 100644 --- a/ovp/CMakeLists.txt +++ b/ovp/CMakeLists.txt @@ -43,6 +43,7 @@ include_directories($ENV{IMPERAS_HOME}/ImpPublic/include/host) #add_subdirectory(ovpworld.org/mmc/flakyMemory/1.0/model) add_subdirectory(cortexM3) +add_subdirectory(statusmsg) include(ExternalProject) #### Put resulting (model) library file in /lib #### diff --git a/ovp/OVPCpu.hpp b/ovp/OVPCpu.hpp index a718781f..6ecee3f3 100644 --- a/ovp/OVPCpu.hpp +++ b/ovp/OVPCpu.hpp @@ -86,10 +86,22 @@ class OVPCpu { */ virtual void makeCallbackMemory(size_t sizeText, size_t offText, size_t sizeMem, size_t offMem) = 0; + /** + * Saves cpu status in file at given path + * @param path path to store file + */ + virtual void save(const string& path) = 0; + + /** + * Restore cpu status from file at given path + * @param path path to store file + */ + virtual void restore(const string& path) = 0; /** * Returns the private icmProcessorObject pointer needed for some OVP action * @return icmProcessorObject */ + icmProcessorObject *getProcessor() { return cpu; } diff --git a/ovp/OVPPlatform.cc b/ovp/OVPPlatform.cc index d26fb3c4..218c90ca 100644 --- a/ovp/OVPPlatform.cc +++ b/ovp/OVPPlatform.cc @@ -47,3 +47,11 @@ uint32_t OVPPlatform::getSP() { return res; } + +void OVPPlatform::save(const string& path) { + platform->save(path); +} + +void OVPPlatform::restore(const string& path) { + platform->restore(path); +} diff --git a/ovp/OVPPlatform.hpp b/ovp/OVPPlatform.hpp index f6343b75..cbcf0569 100644 --- a/ovp/OVPPlatform.hpp +++ b/ovp/OVPPlatform.hpp @@ -48,6 +48,16 @@ public: */ uint32_t getSP(); + /** + * Save cpu status + */ + void save(const string&); + + /** + * Restore cpu status + */ + void restore(const string&); + }; #endif diff --git a/ovp/cortexM3/CMakeLists.txt b/ovp/cortexM3/CMakeLists.txt index 982a032a..49b8393a 100644 --- a/ovp/cortexM3/CMakeLists.txt +++ b/ovp/cortexM3/CMakeLists.txt @@ -7,9 +7,9 @@ set(SRCS ) add_executable(ovp_cortexM3 ${SRCS}) +add_dependencies(ovp_cortexM3 ovpstatusmessages ) -add_dependencies(ovp_cortexM3 protomessages ) -target_link_libraries(ovp_cortexM3 ${SIM_LDFLAGS} SAL controller jobserver util ) +target_link_libraries(ovp_cortexM3 ${SIM_LDFLAGS} SAL controller jobserver util ovpstatusmessages) ## OVP links all needed shared libraries via a runtimeloader -set_target_properties(ovp_cortexM3 PROPERTIES LINK_FLAGS "-L${CMAKE_BINARY_DIR}/lib -lpcl -m32 ") +set_target_properties(ovp_cortexM3 PROPERTIES LINK_FLAGS "-L${CMAKE_BINARY_DIR}/lib -lpcl -lprotobuf -m32 ") diff --git a/ovp/cortexM3/platform/platform.cc b/ovp/cortexM3/platform/platform.cc index ad8d7b7c..4394662d 100644 --- a/ovp/cortexM3/platform/platform.cc +++ b/ovp/cortexM3/platform/platform.cc @@ -332,6 +332,61 @@ void ARM_Cortex_M3::makeCallbackMemory(size_t sizeText, size_t offText, size_t s textMemSize = sizeText; } +void ARM_Cortex_M3::save(const string& path) { + OVPStatusMessage ovpstat; + + // save registers + // FIXME: what about reg with id 16? should be status register + for(unsigned int i = 0; i < 16; ++i) { + uint32_t tmp = 0; + icmRegInfoP reg = icmGetRegByIndex(processorP, i); + icmReadRegInfoValue(processorP, reg, (void *)&tmp); + OVPStatusMessage::Register *msgReg = ovpstat.add_reg(); + + switch(i) { + case 13: msgReg->set_name("sp"); + break; + case 14: msgReg->set_name("lr"); + break; + case 15: msgReg->set_name("pc"); + break; + case 16: msgReg->set_name("sr"); + break; + default: char num[3]; + sprintf(num, "r%d", i); + msgReg->set_name(num); + } + + msgReg->set_value(tmp); +// std::cerr << "save " << i << ": " << tmp << std::endl; + } + + + string stmp; + ovpstat.SerializeToString(&stmp); + ofstream file; + file.open(path.c_str(), ios::out); + file << stmp; + file.close(); +/* ofstream file(path.c_str(), ios::out | ios::trunc); + if(!ovpstat.SerializeToOstream(&file)) { + std::cerr << "Error writing to file " << path << "!" << std::endl; + }*/ +} + +void ARM_Cortex_M3::restore(const string& path) { + fstream input(path.c_str(), ios::in); + OVPStatusMessage ovpstat; + ovpstat.ParseFromIstream(&input); + + for(int i = 0; i < ovpstat.reg_size(); ++i) { + const OVPStatusMessage::Register& ovpreg = ovpstat.reg(i); + uint32_t val = ovpreg.value(); +// std::cerr << "restore "<