Adapted to log system
This commit is contained in:
@ -39,98 +39,10 @@
|
||||
#include <iostream>
|
||||
#include <cstdio>
|
||||
|
||||
namespace {
|
||||
const size_t ERROR_IN_COMMAND_LINE = 1;
|
||||
const size_t SUCCESS = 0;
|
||||
const size_t ERROR_UNHANDLED_EXCEPTION = 2;
|
||||
|
||||
|
||||
inline void enable_log_level(int level){
|
||||
switch(level){
|
||||
case 0:
|
||||
logging::Logger::reporting_level()= logging::FATAL;
|
||||
/* no break */
|
||||
case 1:
|
||||
logging::Logger::reporting_level()= logging::ERROR;
|
||||
/* no break */
|
||||
case 2:
|
||||
logging::Logger::reporting_level()= logging::WARNING;
|
||||
/* no break */
|
||||
case 3:
|
||||
logging::Logger::reporting_level()= logging::INFO;
|
||||
/* no break */
|
||||
case 4:
|
||||
logging::Logger::reporting_level()= logging::DEBUG;
|
||||
/* no break */
|
||||
case 5:
|
||||
logging::Logger::reporting_level()= logging::TRACE;
|
||||
/* no break */
|
||||
}
|
||||
}
|
||||
|
||||
inline void configure_default_logger(boost::program_options::variables_map& vm){
|
||||
// el::Configurations defaultConf;
|
||||
// defaultConf.setToDefault();
|
||||
// defaultConf.set(el::Level::Error, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
|
||||
// defaultConf.set(el::Level::Warning, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
|
||||
// defaultConf.set(el::Level::Info, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
|
||||
// defaultConf.set(el::Level::Debug, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
|
||||
// defaultConf.set(el::Level::Trace, el::ConfigurationType::Format, "%datetime{%H:%m:%s.%g} %level %msg");
|
||||
if(vm.count("verbose"))
|
||||
enable_log_level(vm["verbose"].as<int>());
|
||||
if(vm.count("log-file"))
|
||||
logging::Output2FILE::stream() = fopen(vm["log-file"].as<std::string>().c_str(), "w");
|
||||
// default logger uses default configurations
|
||||
// el::Loggers::reconfigureLogger("default", defaultConf);
|
||||
}
|
||||
|
||||
inline void configure_debugger_logger() {
|
||||
// configure the connection logger
|
||||
// el::Logger* gdbServerLogger = el::Loggers::getLogger("connection");
|
||||
// el::Configurations gdbServerConf;
|
||||
// gdbServerConf.setToDefault();
|
||||
// gdbServerConf.set(el::Level::Error, el::ConfigurationType::Format,
|
||||
// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
|
||||
// gdbServerConf.set(el::Level::Warning, el::ConfigurationType::Format,
|
||||
// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
|
||||
// gdbServerConf.set(el::Level::Info, el::ConfigurationType::Format,
|
||||
// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
|
||||
// gdbServerConf.set(el::Level::Debug, el::ConfigurationType::Format,
|
||||
// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
|
||||
// gdbServerConf.set(el::Level::Trace, el::ConfigurationType::Format,
|
||||
// "%datetime{%H:%m:%s.%g} %level [%logger] %msg");
|
||||
// enable_log_level(gdbServerConf, 5);
|
||||
// gdbServerLogger->configure(gdbServerConf);
|
||||
}
|
||||
|
||||
inline void configure_disass_logger(boost::program_options::variables_map& vm) {
|
||||
// el::Logger* disassLogger = el::Loggers::getLogger("disass");
|
||||
// el::Configurations disassConf;
|
||||
// if(vm.count("disass")){
|
||||
// auto file_name=vm["disass"].as<std::string>();
|
||||
// disassConf.setToDefault();
|
||||
// if (file_name.length() > 0) {
|
||||
// disassConf.set(el::Level::Global, el::ConfigurationType::ToFile,
|
||||
// std::string("true"));
|
||||
// disassConf.set(el::Level::Global,
|
||||
// el::ConfigurationType::ToStandardOutput, std::string("false"));
|
||||
// disassConf.set(el::Level::Global, el::ConfigurationType::Format,
|
||||
// std::string("%msg"));
|
||||
// disassConf.set(el::Level::Global, el::ConfigurationType::Filename,
|
||||
// file_name);
|
||||
// std::ofstream str(file_name); // just to clear the file
|
||||
// } else {
|
||||
// disassConf.set(el::Level::Global, el::ConfigurationType::Format,
|
||||
// "%datetime{%H:%m:%s.%g} [%logger] %msg");
|
||||
// }
|
||||
// } else {
|
||||
// enable_log_level(disassConf, 0);
|
||||
// }
|
||||
// disassLogger->configure(disassConf);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
inline int parse_cli_options(boost::program_options::variables_map& vm, int argc, char *argv[]){
|
||||
namespace po = boost::program_options;
|
||||
po::options_description desc("Options");
|
||||
|
@ -40,7 +40,7 @@
|
||||
#include <util/ities.h>
|
||||
#include <util/sparse_array.h>
|
||||
#include <elfio/elfio.hpp>
|
||||
#include <util/logging.h>
|
||||
#include <iss/log_categories.h>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#include <unordered_map>
|
||||
@ -628,9 +628,9 @@ template<typename BASE>
|
||||
iss::status riscv_hart_msu_vp<BASE>::read(const iss::addr_t& addr, unsigned length, uint8_t* const data){
|
||||
#ifndef NDEBUG
|
||||
if(addr.type& iss::DEBUG){
|
||||
LOG(logging::DEBUG)<<"debug read of "<<length<<" bytes @addr "<<addr;
|
||||
LOG(DEBUG)<<"debug read of "<<length<<" bytes @addr "<<addr;
|
||||
} else {
|
||||
LOG(logging::DEBUG)<<"read of "<<length<<" bytes @addr "<<addr;
|
||||
LOG(DEBUG)<<"read of "<<length<<" bytes @addr "<<addr;
|
||||
}
|
||||
#endif
|
||||
switch(addr.space){
|
||||
@ -726,19 +726,19 @@ iss::status riscv_hart_msu_vp<BASE>::write(const iss::addr_t& addr, unsigned len
|
||||
const char* prefix = addr.type & iss::DEBUG?"debug ":"";
|
||||
switch(length){
|
||||
case 8:
|
||||
LOG(logging::DEBUG)<<prefix<<"write of "<<length<<" bytes (0x"<<std::hex<<*(uint64_t*)&data[0]<<std::dec<<") @addr "<<addr;
|
||||
LOG(DEBUG)<<prefix<<"write of "<<length<<" bytes (0x"<<std::hex<<*(uint64_t*)&data[0]<<std::dec<<") @addr "<<addr;
|
||||
break;
|
||||
case 4:
|
||||
LOG(logging::DEBUG)<<prefix<<"write of "<<length<<" bytes (0x"<<std::hex<<*(uint32_t*)&data[0]<<std::dec<<") @addr "<<addr;
|
||||
LOG(DEBUG)<<prefix<<"write of "<<length<<" bytes (0x"<<std::hex<<*(uint32_t*)&data[0]<<std::dec<<") @addr "<<addr;
|
||||
break;
|
||||
case 2:
|
||||
LOG(logging::DEBUG)<<prefix<<"write of "<<length<<" bytes (0x"<<std::hex<<*(uint16_t*)&data[0]<<std::dec<<") @addr "<<addr;
|
||||
LOG(DEBUG)<<prefix<<"write of "<<length<<" bytes (0x"<<std::hex<<*(uint16_t*)&data[0]<<std::dec<<") @addr "<<addr;
|
||||
break;
|
||||
case 1:
|
||||
LOG(logging::DEBUG)<<prefix<<"write of "<<length<<" bytes (0x"<<std::hex<<(uint16_t)data[0]<<std::dec<<") @addr "<<addr;
|
||||
LOG(DEBUG)<<prefix<<"write of "<<length<<" bytes (0x"<<std::hex<<(uint16_t)data[0]<<std::dec<<") @addr "<<addr;
|
||||
break;
|
||||
default:
|
||||
LOG(logging::DEBUG)<<prefix<<"write of "<<length<<" bytes @addr "<<addr;
|
||||
LOG(DEBUG)<<prefix<<"write of "<<length<<" bytes @addr "<<addr;
|
||||
}
|
||||
#endif
|
||||
try {
|
||||
@ -965,14 +965,14 @@ iss::status riscv_hart_msu_vp<BASE>::write_mem(phys_addr_t addr, unsigned length
|
||||
switch(hostvar>>48){
|
||||
case 0:
|
||||
if(hostvar!=0x1)
|
||||
LOG(logging::FATAL)<<"tohost value is 0x"<<std::hex<<hostvar<<std::dec<<" ("<<hostvar<<"), stopping simulation";
|
||||
LOG(FATAL)<<"tohost value is 0x"<<std::hex<<hostvar<<std::dec<<" ("<<hostvar<<"), stopping simulation";
|
||||
else
|
||||
LOG(logging::INFO)<<"tohost value is 0x"<<std::hex<<hostvar<<std::dec<<" ("<<hostvar<<"), stopping simulation";
|
||||
LOG(INFO)<<"tohost value is 0x"<<std::hex<<hostvar<<std::dec<<" ("<<hostvar<<"), stopping simulation";
|
||||
throw(iss::simulation_stopped(hostvar));
|
||||
case 0x0101:{
|
||||
char c = static_cast<char>(hostvar & 0xff);
|
||||
if(c=='\n' || c==0){
|
||||
LOG(logging::INFO)<<"tohost send '"<<uart_buf.str()<<"'";
|
||||
LOG(INFO)<<"tohost send '"<<uart_buf.str()<<"'";
|
||||
uart_buf.str("");
|
||||
} else
|
||||
uart_buf<<c;
|
||||
@ -1190,7 +1190,7 @@ uint64_t riscv_hart_msu_vp<BASE>::enter_trap(uint64_t flags, uint64_t addr) {
|
||||
this->reg.trap_state=0;
|
||||
char buffer[32];
|
||||
sprintf(buffer, "0x%016lx", addr);
|
||||
CLOG(logging::INFO, "disass")<<(trap_id?"Interrupt ":"Trap ")<<trap_id<<" with cause '"<<irq_str[cause]<<"' at address "<<buffer
|
||||
CLOG(INFO, disass)<<(trap_id?"Interrupt ":"Trap ")<<trap_id<<" with cause '"<<irq_str[cause]<<"' at address "<<buffer
|
||||
<<" occurred, changing privilege level from "<<lvl[cur_priv]<<" to "<<lvl[new_priv];
|
||||
return this->reg.NEXT_PC;
|
||||
}
|
||||
@ -1230,7 +1230,7 @@ uint64_t riscv_hart_msu_vp<BASE>::leave_trap(uint64_t flags) {
|
||||
status|= pie<<inst_priv; // and set the pie
|
||||
csr[mstatus]=status;
|
||||
this->reg.machine_state=ppl;
|
||||
CLOG(logging::INFO, "disass")<<"Executing xRET , changing privilege level from "<<lvl[cur_priv]<<" to "<<lvl[ppl];
|
||||
CLOG(INFO, disass)<<"Executing xRET , changing privilege level from "<<lvl[cur_priv]<<" to "<<lvl[ppl];
|
||||
return this->reg.NEXT_PC;
|
||||
}
|
||||
|
||||
|
@ -521,7 +521,7 @@ namespace CORE_DEF_NAME {
|
||||
|
||||
template<typename ARCH>
|
||||
status target_adapter<ARCH>::read_registers(std::vector<uint8_t>& data, std::vector<uint8_t>& avail) {
|
||||
LOG(logging::TRACE)<<"reading target registers";
|
||||
LOG(TRACE)<<"reading target registers";
|
||||
//return idx<0?:;
|
||||
data.clear();
|
||||
avail.clear();
|
||||
@ -663,8 +663,8 @@ namespace CORE_DEF_NAME {
|
||||
auto saddr=map_addr({iss::CODE, iss::PHYSICAL, addr});
|
||||
auto eaddr=map_addr({iss::CODE, iss::PHYSICAL, addr+length});
|
||||
target_adapter_base::bp_lut.addEntry(++target_adapter_base::bp_count, saddr.val, eaddr.val-saddr.val);
|
||||
LOG(logging::TRACE)<<"Adding breakpoint with handle "<<target_adapter_base::bp_count<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Adding breakpoint with handle "<<target_adapter_base::bp_count<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Ok;
|
||||
}
|
||||
|
||||
@ -674,12 +674,12 @@ namespace CORE_DEF_NAME {
|
||||
unsigned handle=target_adapter_base::bp_lut.getEntry(saddr.val);
|
||||
// TODO: check length of addr range
|
||||
if(handle){
|
||||
LOG(logging::TRACE)<<"Removing breakpoint with handle "<<handle<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(TRACE)<<"Removing breakpoint with handle "<<handle<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
target_adapter_base::bp_lut.removeEntry(handle);
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Ok;
|
||||
}
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Err;
|
||||
}
|
||||
|
||||
|
@ -4708,7 +4708,7 @@ namespace rv32imac {
|
||||
|
||||
template<typename ARCH>
|
||||
status target_adapter<ARCH>::read_registers(std::vector<uint8_t>& data, std::vector<uint8_t>& avail) {
|
||||
LOG(logging::TRACE)<<"reading target registers";
|
||||
LOG(TRACE)<<"reading target registers";
|
||||
//return idx<0?:;
|
||||
data.clear();
|
||||
avail.clear();
|
||||
@ -4850,8 +4850,8 @@ namespace rv32imac {
|
||||
auto saddr=map_addr({iss::CODE, iss::PHYSICAL, addr});
|
||||
auto eaddr=map_addr({iss::CODE, iss::PHYSICAL, addr+length});
|
||||
target_adapter_base::bp_lut.addEntry(++target_adapter_base::bp_count, saddr.val, eaddr.val-saddr.val);
|
||||
LOG(logging::TRACE)<<"Adding breakpoint with handle "<<target_adapter_base::bp_count<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Adding breakpoint with handle "<<target_adapter_base::bp_count<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Ok;
|
||||
}
|
||||
|
||||
@ -4861,12 +4861,12 @@ namespace rv32imac {
|
||||
unsigned handle=target_adapter_base::bp_lut.getEntry(saddr.val);
|
||||
// TODO: check length of addr range
|
||||
if(handle){
|
||||
LOG(logging::TRACE)<<"Removing breakpoint with handle "<<handle<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(TRACE)<<"Removing breakpoint with handle "<<handle<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
target_adapter_base::bp_lut.removeEntry(handle);
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Ok;
|
||||
}
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Err;
|
||||
}
|
||||
|
||||
|
@ -3710,7 +3710,7 @@ namespace rv64ia {
|
||||
|
||||
template<typename ARCH>
|
||||
status target_adapter<ARCH>::read_registers(std::vector<uint8_t>& data, std::vector<uint8_t>& avail) {
|
||||
LOG(logging::TRACE)<<"reading target registers";
|
||||
LOG(TRACE)<<"reading target registers";
|
||||
//return idx<0?:;
|
||||
data.clear();
|
||||
avail.clear();
|
||||
@ -3852,8 +3852,8 @@ namespace rv64ia {
|
||||
auto saddr=map_addr({iss::CODE, iss::PHYSICAL, addr});
|
||||
auto eaddr=map_addr({iss::CODE, iss::PHYSICAL, addr+length});
|
||||
target_adapter_base::bp_lut.addEntry(++target_adapter_base::bp_count, saddr.val, eaddr.val-saddr.val);
|
||||
LOG(logging::TRACE)<<"Adding breakpoint with handle "<<target_adapter_base::bp_count<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Adding breakpoint with handle "<<target_adapter_base::bp_count<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Ok;
|
||||
}
|
||||
|
||||
@ -3863,12 +3863,12 @@ namespace rv64ia {
|
||||
unsigned handle=target_adapter_base::bp_lut.getEntry(saddr.val);
|
||||
// TODO: check length of addr range
|
||||
if(handle){
|
||||
LOG(logging::TRACE)<<"Removing breakpoint with handle "<<handle<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
LOG(TRACE)<<"Removing breakpoint with handle "<<handle<<" for addr 0x"<<std::hex<<saddr.val<<std::dec;
|
||||
target_adapter_base::bp_lut.removeEntry(handle);
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Ok;
|
||||
}
|
||||
LOG(logging::TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
LOG(TRACE)<<"Now having "<<target_adapter_base::bp_lut.size()<<" breakpoints";
|
||||
return Err;
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <iss/iss.h>
|
||||
#include <iostream>
|
||||
|
||||
#include <iss/log_categories.h>
|
||||
#include <iss/arch/rv32imac.h>
|
||||
#include <iss/arch/rv64ia.h>
|
||||
#include <iss/jit/MCJIThelper.h>
|
||||
@ -46,13 +47,22 @@ namespace po= boost::program_options;
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
try{
|
||||
/** Define and parse the program options
|
||||
/*
|
||||
* Define and parse the program options
|
||||
*/
|
||||
po::variables_map vm;
|
||||
if(parse_cli_options(vm, argc, argv)) return ERROR_IN_COMMAND_LINE;
|
||||
configure_default_logger(vm);
|
||||
// configure the connection logger
|
||||
configure_debugger_logger();
|
||||
if(vm.count("verbose")){
|
||||
auto l = logging::as_log_level(vm["verbose"].as<int>());
|
||||
LOGGER(DEFAULT)::reporting_level() = l;
|
||||
LOGGER(connection)::reporting_level()=l;
|
||||
}
|
||||
if(vm.count("log-file")){
|
||||
// configure the connection logger
|
||||
auto f = fopen(vm["log-file"].as<std::string>().c_str(), "w");
|
||||
LOG_OUTPUT(DEFAULT)::stream() = f;
|
||||
LOG_OUTPUT(connection)::stream() = f;
|
||||
}
|
||||
|
||||
// application code comes here //
|
||||
iss::init_jit(argc, argv);
|
||||
@ -77,9 +87,15 @@ int main(int argc, char *argv[]) {
|
||||
cpu->get_arch()->load_file(vm["mem"].as<std::string>() , iss::arch::traits<iss::arch::rv32imac>::MEM);
|
||||
}
|
||||
|
||||
configure_disass_logger(vm);
|
||||
if(vm.count("disass")){
|
||||
cpu->setDisassEnabled(true);
|
||||
LOGGER(disass)::reporting_level()=logging::INFO;
|
||||
auto file_name=vm["disass"].as<std::string>();
|
||||
if (file_name.length() > 0) {
|
||||
LOG_OUTPUT(disass)::stream() = fopen(file_name.c_str(), "w");
|
||||
LOGGER(disass)::print_time() = false;
|
||||
LOGGER(disass)::print_severity() = false;
|
||||
}
|
||||
}
|
||||
if(vm.count("reset")){
|
||||
auto str = vm["reset"].as<std::string>();
|
||||
@ -90,7 +106,7 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
return cpu->start(vm["cycles"].as<int64_t>());
|
||||
} catch(std::exception& e){
|
||||
LOG(logging::ERROR) << "Unhandled Exception reached the top of main: "
|
||||
LOG(ERROR) << "Unhandled Exception reached the top of main: "
|
||||
<< e.what() << ", application will now exit" << std::endl;
|
||||
return ERROR_UNHANDLED_EXCEPTION;
|
||||
}
|
||||
|
Reference in New Issue
Block a user