diff options
Diffstat (limited to 'src/arch/arm/remote_gdb.cc')
-rw-r--r-- | src/arch/arm/remote_gdb.cc | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/src/arch/arm/remote_gdb.cc b/src/arch/arm/remote_gdb.cc index f3ffa8589..05adfeaed 100644 --- a/src/arch/arm/remote_gdb.cc +++ b/src/arch/arm/remote_gdb.cc @@ -1,7 +1,7 @@ /* * Copyright 2015 LabWare * Copyright 2014 Google Inc. - * Copyright (c) 2010, 2013, 2016 ARM Limited + * Copyright (c) 2010, 2013, 2016, 2018 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -150,6 +150,12 @@ #include "base/remote_gdb.hh" #include "base/socket.hh" #include "base/trace.hh" +#include "blobs/gdb_xml_aarch64_core.hh" +#include "blobs/gdb_xml_aarch64_fpu.hh" +#include "blobs/gdb_xml_aarch64_target.hh" +#include "blobs/gdb_xml_arm_core.hh" +#include "blobs/gdb_xml_arm_target.hh" +#include "blobs/gdb_xml_arm_vfpv3.hh" #include "cpu/static_inst.hh" #include "cpu/thread_context.hh" #include "cpu/thread_state.hh" @@ -211,6 +217,8 @@ RemoteGDB::AArch64GdbRegCache::getRegs(ThreadContext *context) base++; } } + r.fpsr = context->readMiscRegNoEffect(MISCREG_FPSR); + r.fpcr = context->readMiscRegNoEffect(MISCREG_FPCR); } void @@ -238,6 +246,8 @@ RemoteGDB::AArch64GdbRegCache::setRegs(ThreadContext *context) const base++; } } + context->setMiscRegNoEffect(MISCREG_FPSR, r.fpsr); + context->setMiscRegNoEffect(MISCREG_FPCR, r.fpcr); } void @@ -261,12 +271,13 @@ RemoteGDB::AArch32GdbRegCache::getRegs(ThreadContext *context) r.gpr[13] = context->readIntReg(INTREG_SP); r.gpr[14] = context->readIntReg(INTREG_LR); r.gpr[15] = context->pcState().pc(); + r.cpsr = context->readMiscRegNoEffect(MISCREG_CPSR); // One day somebody will implement transfer of FPRs correctly. - for (int i=0; i<8*3; i++) r.fpr[i] = 0; + for (int i = 0; i < 32; i++) + r.fpr[i] = 0; r.fpscr = context->readMiscRegNoEffect(MISCREG_FPSCR); - r.cpsr = context->readMiscRegNoEffect(MISCREG_CPSR); } void @@ -299,6 +310,31 @@ RemoteGDB::AArch32GdbRegCache::setRegs(ThreadContext *context) const context->setMiscRegNoEffect(MISCREG_CPSR, r.cpsr); } +bool +RemoteGDB::getXferFeaturesRead(const std::string &annex, std::string &output) +{ +#define GDB_XML(x, s) \ + { x, std::string(reinterpret_cast<const char *>(Blobs::s), \ + Blobs::s ## _len) } + static const std::map<std::string, std::string> annexMap32{ + GDB_XML("target.xml", gdb_xml_arm_target), + GDB_XML("arm-core.xml", gdb_xml_arm_core), + GDB_XML("arm-vfpv3.xml", gdb_xml_arm_vfpv3), + }; + static const std::map<std::string, std::string> annexMap64{ + GDB_XML("target.xml", gdb_xml_aarch64_target), + GDB_XML("aarch64-core.xml", gdb_xml_aarch64_core), + GDB_XML("aarch64-fpu.xml", gdb_xml_aarch64_fpu), + }; +#undef GDB_XML + auto& annexMap = inAArch64(context()) ? annexMap64 : annexMap32; + auto it = annexMap.find(annex); + if (it == annexMap.end()) + return false; + output = it->second; + return true; +} + BaseGdbRegCache* RemoteGDB::gdbRegs() { |