remote_gdb.cc revision 10595
13536Sgblack@eecs.umich.edu/* 210595Sgabeblack@google.com * Copyright 2014 Google, Inc. 33536Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 43536Sgblack@eecs.umich.edu * All rights reserved. 53536Sgblack@eecs.umich.edu * 63536Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 73536Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 83536Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 93536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 103536Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 113536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 123536Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 133536Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 143536Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 153536Sgblack@eecs.umich.edu * this software without specific prior written permission. 163536Sgblack@eecs.umich.edu * 173536Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 183536Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 193536Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 203536Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 213536Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 223536Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 233536Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 243536Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 253536Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 263536Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 273536Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 283536Sgblack@eecs.umich.edu * 293536Sgblack@eecs.umich.edu * Authors: Nathan Binkert 303536Sgblack@eecs.umich.edu */ 313536Sgblack@eecs.umich.edu 323536Sgblack@eecs.umich.edu/* 338332Snate@binkert.org * Copyright (c) 1990, 1993 The Regents of the University of California 348332Snate@binkert.org * All rights reserved 353536Sgblack@eecs.umich.edu * 363536Sgblack@eecs.umich.edu * This software was developed by the Computer Systems Engineering group 373536Sgblack@eecs.umich.edu * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 383536Sgblack@eecs.umich.edu * contributed to Berkeley. 393536Sgblack@eecs.umich.edu * 403536Sgblack@eecs.umich.edu * All advertising materials mentioning features or use of this software 413536Sgblack@eecs.umich.edu * must display the following acknowledgement: 425543Ssaidi@eecs.umich.edu * This product includes software developed by the University of 435543Ssaidi@eecs.umich.edu * California, Lawrence Berkeley Laboratories. 443536Sgblack@eecs.umich.edu * 453536Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 463536Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions 473536Sgblack@eecs.umich.edu * are met: 483536Sgblack@eecs.umich.edu * 1. Redistributions of source code must retain the above copyright 493536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer. 503536Sgblack@eecs.umich.edu * 2. Redistributions in binary form must reproduce the above copyright 513536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 523536Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution. 533536Sgblack@eecs.umich.edu * 3. All advertising materials mentioning features or use of this software 543536Sgblack@eecs.umich.edu * must display the following acknowledgement: 555543Ssaidi@eecs.umich.edu * This product includes software developed by the University of 565543Ssaidi@eecs.umich.edu * California, Berkeley and its contributors. 573536Sgblack@eecs.umich.edu * 4. Neither the name of the University nor the names of its contributors 583536Sgblack@eecs.umich.edu * may be used to endorse or promote products derived from this software 593536Sgblack@eecs.umich.edu * without specific prior written permission. 603536Sgblack@eecs.umich.edu * 613536Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 623536Sgblack@eecs.umich.edu * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 633536Sgblack@eecs.umich.edu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 643536Sgblack@eecs.umich.edu * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 653536Sgblack@eecs.umich.edu * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 663536Sgblack@eecs.umich.edu * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 673536Sgblack@eecs.umich.edu * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 683536Sgblack@eecs.umich.edu * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 693536Sgblack@eecs.umich.edu * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 703536Sgblack@eecs.umich.edu * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 713536Sgblack@eecs.umich.edu * SUCH DAMAGE. 723536Sgblack@eecs.umich.edu * 735543Ssaidi@eecs.umich.edu * @(#)kgdb_stub.c 8.4 (Berkeley) 1/12/94 743536Sgblack@eecs.umich.edu */ 753536Sgblack@eecs.umich.edu 763536Sgblack@eecs.umich.edu/*- 773536Sgblack@eecs.umich.edu * Copyright (c) 2001 The NetBSD Foundation, Inc. 783536Sgblack@eecs.umich.edu * All rights reserved. 793536Sgblack@eecs.umich.edu * 803536Sgblack@eecs.umich.edu * This code is derived from software contributed to The NetBSD Foundation 813536Sgblack@eecs.umich.edu * by Jason R. Thorpe. 823536Sgblack@eecs.umich.edu * 833536Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 843536Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions 853536Sgblack@eecs.umich.edu * are met: 863536Sgblack@eecs.umich.edu * 1. Redistributions of source code must retain the above copyright 873536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer. 883536Sgblack@eecs.umich.edu * 2. Redistributions in binary form must reproduce the above copyright 893536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 903536Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution. 913536Sgblack@eecs.umich.edu * 3. All advertising materials mentioning features or use of this software 923536Sgblack@eecs.umich.edu * must display the following acknowledgement: 935543Ssaidi@eecs.umich.edu * This product includes software developed by the NetBSD 945543Ssaidi@eecs.umich.edu * Foundation, Inc. and its contributors. 953536Sgblack@eecs.umich.edu * 4. Neither the name of The NetBSD Foundation nor the names of its 963536Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived 973536Sgblack@eecs.umich.edu * from this software without specific prior written permission. 983536Sgblack@eecs.umich.edu * 993536Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 1003536Sgblack@eecs.umich.edu * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 1013536Sgblack@eecs.umich.edu * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1023536Sgblack@eecs.umich.edu * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 1033536Sgblack@eecs.umich.edu * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1043536Sgblack@eecs.umich.edu * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1053536Sgblack@eecs.umich.edu * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1063536Sgblack@eecs.umich.edu * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1073536Sgblack@eecs.umich.edu * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1083536Sgblack@eecs.umich.edu * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1093536Sgblack@eecs.umich.edu * POSSIBILITY OF SUCH DAMAGE. 1103536Sgblack@eecs.umich.edu */ 1113536Sgblack@eecs.umich.edu 1123536Sgblack@eecs.umich.edu/* 1133536Sgblack@eecs.umich.edu * $NetBSD: kgdb_stub.c,v 1.8 2001/07/07 22:58:00 wdk Exp $ 1143536Sgblack@eecs.umich.edu * 1153536Sgblack@eecs.umich.edu * Taken from NetBSD 1163536Sgblack@eecs.umich.edu * 1173536Sgblack@eecs.umich.edu * "Stub" to allow remote cpu to debug over a serial line using gdb. 1183536Sgblack@eecs.umich.edu */ 1193536Sgblack@eecs.umich.edu 1209202Spalle@lyckegaard.dk#include <signal.h> 1213536Sgblack@eecs.umich.edu#include <sys/signal.h> 1228229Snate@binkert.org#include <unistd.h> 1233536Sgblack@eecs.umich.edu 1243536Sgblack@eecs.umich.edu#include <string> 1253536Sgblack@eecs.umich.edu 1268229Snate@binkert.org#include "arch/sparc/remote_gdb.hh" 1273536Sgblack@eecs.umich.edu#include "arch/vtophys.hh" 1283536Sgblack@eecs.umich.edu#include "base/intmath.hh" 1293536Sgblack@eecs.umich.edu#include "base/remote_gdb.hh" 1303536Sgblack@eecs.umich.edu#include "base/socket.hh" 1313536Sgblack@eecs.umich.edu#include "base/trace.hh" 1328229Snate@binkert.org#include "cpu/static_inst.hh" 1333536Sgblack@eecs.umich.edu#include "cpu/thread_context.hh" 1348232Snate@binkert.org#include "debug/GDBRead.hh" 1355107Sgblack@eecs.umich.edu#include "mem/page_table.hh" 1363536Sgblack@eecs.umich.edu#include "mem/physical.hh" 1373536Sgblack@eecs.umich.edu#include "mem/port.hh" 1387678Sgblack@eecs.umich.edu#include "sim/byteswap.hh" 1398767Sgblack@eecs.umich.edu#include "sim/full_system.hh" 1405107Sgblack@eecs.umich.edu#include "sim/process.hh" 1413536Sgblack@eecs.umich.edu#include "sim/system.hh" 1423536Sgblack@eecs.umich.edu 1433536Sgblack@eecs.umich.eduusing namespace std; 1445567Snate@binkert.orgusing namespace SparcISA; 1453536Sgblack@eecs.umich.edu 1463550Sgblack@eecs.umich.eduRemoteGDB::RemoteGDB(System *_system, ThreadContext *c) 14710595Sgabeblack@google.com : BaseRemoteGDB(_system, c, NumGDBRegs * sizeof(uint64_t)), nextBkpt(0) 1483536Sgblack@eecs.umich.edu{} 1493536Sgblack@eecs.umich.edu 1503536Sgblack@eecs.umich.edu/////////////////////////////////////////////////////////// 1513536Sgblack@eecs.umich.edu// RemoteGDB::acc 1523536Sgblack@eecs.umich.edu// 1535543Ssaidi@eecs.umich.edu// Determine if the mapping at va..(va+len) is valid. 1543536Sgblack@eecs.umich.edu// 1553536Sgblack@eecs.umich.edubool 1563536Sgblack@eecs.umich.eduRemoteGDB::acc(Addr va, size_t len) 1573536Sgblack@eecs.umich.edu{ 1583571Sgblack@eecs.umich.edu //@Todo In NetBSD, this function checks if all addresses 1597741Sgblack@eecs.umich.edu // from va to va + len have valid page map entries. Not 1607741Sgblack@eecs.umich.edu // sure how this will work for other OSes or in general. 1618767Sgblack@eecs.umich.edu if (FullSystem) { 1628767Sgblack@eecs.umich.edu if (va) 1638767Sgblack@eecs.umich.edu return true; 1648767Sgblack@eecs.umich.edu return false; 1658767Sgblack@eecs.umich.edu } else { 1668767Sgblack@eecs.umich.edu TlbEntry entry; 1678767Sgblack@eecs.umich.edu // Check to make sure the first byte is mapped into the processes 1688767Sgblack@eecs.umich.edu // address space. 1698767Sgblack@eecs.umich.edu if (context->getProcessPtr()->pTable->lookup(va, entry)) 1708767Sgblack@eecs.umich.edu return true; 1718767Sgblack@eecs.umich.edu return false; 1728767Sgblack@eecs.umich.edu } 1733536Sgblack@eecs.umich.edu} 1743536Sgblack@eecs.umich.edu 1753536Sgblack@eecs.umich.edu/////////////////////////////////////////////////////////// 1763536Sgblack@eecs.umich.edu// RemoteGDB::getregs 1773536Sgblack@eecs.umich.edu// 1785543Ssaidi@eecs.umich.edu// Translate the kernel debugger register format into 1795543Ssaidi@eecs.umich.edu// the GDB register format. 1803536Sgblack@eecs.umich.eduvoid 1813536Sgblack@eecs.umich.eduRemoteGDB::getregs() 1823536Sgblack@eecs.umich.edu{ 1833536Sgblack@eecs.umich.edu memset(gdbregs.regs, 0, gdbregs.size); 1843536Sgblack@eecs.umich.edu 1857720Sgblack@eecs.umich.edu PCState pc = context->pcState(); 1868829Sgblack@eecs.umich.edu PSTATE pstate = context->readMiscReg(MISCREG_PSTATE); 1877720Sgblack@eecs.umich.edu 1888829Sgblack@eecs.umich.edu if (pstate.am) { 18910595Sgabeblack@google.com gdbregs.regs32[Reg32Pc] = htobe((uint32_t)pc.pc()); 19010595Sgabeblack@google.com gdbregs.regs32[Reg32Npc] = htobe((uint32_t)pc.npc()); 1917741Sgblack@eecs.umich.edu for (int x = RegG0; x <= RegI0 + 7; x++) 19210595Sgabeblack@google.com gdbregs.regs32[x] = htobe((uint32_t)context->readIntReg(x - RegG0)); 1934060Ssaidi@eecs.umich.edu 19410595Sgabeblack@google.com gdbregs.regs32[Reg32Y] = 19510595Sgabeblack@google.com htobe((uint32_t)context->readIntReg(NumIntArchRegs + 1)); 19610595Sgabeblack@google.com gdbregs.regs32[Reg32Psr] = htobe((uint32_t)pstate); 19710595Sgabeblack@google.com gdbregs.regs32[Reg32Fsr] = 19810595Sgabeblack@google.com htobe((uint32_t)context->readMiscReg(MISCREG_FSR)); 19910595Sgabeblack@google.com gdbregs.regs32[Reg32Csr] = 20010595Sgabeblack@google.com htobe((uint32_t)context->readIntReg(NumIntArchRegs + 2)); 2014070Ssaidi@eecs.umich.edu } else { 20210595Sgabeblack@google.com gdbregs.regs64[RegPc] = htobe(pc.pc()); 20310595Sgabeblack@google.com gdbregs.regs64[RegNpc] = htobe(pc.npc()); 2047741Sgblack@eecs.umich.edu for (int x = RegG0; x <= RegI0 + 7; x++) 20510595Sgabeblack@google.com gdbregs.regs64[x] = htobe(context->readIntReg(x - RegG0)); 2064060Ssaidi@eecs.umich.edu 20710595Sgabeblack@google.com gdbregs.regs64[RegFsr] = htobe(context->readMiscReg(MISCREG_FSR)); 20810595Sgabeblack@google.com gdbregs.regs64[RegFprs] = htobe(context->readMiscReg(MISCREG_FPRS)); 20910595Sgabeblack@google.com gdbregs.regs64[RegY] = htobe(context->readIntReg(NumIntArchRegs + 1)); 21010595Sgabeblack@google.com gdbregs.regs64[RegState] = htobe( 2114172Ssaidi@eecs.umich.edu context->readMiscReg(MISCREG_CWP) | 2128829Sgblack@eecs.umich.edu pstate << 8 | 2134172Ssaidi@eecs.umich.edu context->readMiscReg(MISCREG_ASI) << 24 | 2144070Ssaidi@eecs.umich.edu context->readIntReg(NumIntArchRegs + 2) << 32); 2154070Ssaidi@eecs.umich.edu } 2164060Ssaidi@eecs.umich.edu 21710595Sgabeblack@google.com DPRINTF(GDBRead, "PC=%#x\n", gdbregs.regs64[RegPc]); 2184060Ssaidi@eecs.umich.edu 2197741Sgblack@eecs.umich.edu // Floating point registers are left at 0 in netbsd 2207741Sgblack@eecs.umich.edu // All registers other than the pc, npc and int regs 2217741Sgblack@eecs.umich.edu // are ignored as well. 2223536Sgblack@eecs.umich.edu} 2233536Sgblack@eecs.umich.edu 2243536Sgblack@eecs.umich.edu/////////////////////////////////////////////////////////// 2253536Sgblack@eecs.umich.edu// RemoteGDB::setregs 2263536Sgblack@eecs.umich.edu// 2275543Ssaidi@eecs.umich.edu// Translate the GDB register format into the kernel 2285543Ssaidi@eecs.umich.edu// debugger register format. 2293536Sgblack@eecs.umich.edu// 2303536Sgblack@eecs.umich.eduvoid 2313536Sgblack@eecs.umich.eduRemoteGDB::setregs() 2323536Sgblack@eecs.umich.edu{ 2337720Sgblack@eecs.umich.edu PCState pc; 23410595Sgabeblack@google.com pc.pc(gdbregs.regs64[RegPc]); 23510595Sgabeblack@google.com pc.npc(gdbregs.regs64[RegNpc]); 2367720Sgblack@eecs.umich.edu pc.nnpc(pc.npc() + sizeof(MachInst)); 2377720Sgblack@eecs.umich.edu pc.upc(0); 2387720Sgblack@eecs.umich.edu pc.nupc(1); 2397720Sgblack@eecs.umich.edu context->pcState(pc); 2407741Sgblack@eecs.umich.edu for (int x = RegG0; x <= RegI0 + 7; x++) 24110595Sgabeblack@google.com context->setIntReg(x - RegG0, gdbregs.regs64[x]); 2427741Sgblack@eecs.umich.edu // Only the integer registers, pc and npc are set in netbsd 2433536Sgblack@eecs.umich.edu} 2443536Sgblack@eecs.umich.edu 2453536Sgblack@eecs.umich.eduvoid 2463536Sgblack@eecs.umich.eduRemoteGDB::clearSingleStep() 2473536Sgblack@eecs.umich.edu{ 2484060Ssaidi@eecs.umich.edu if (nextBkpt) 2494060Ssaidi@eecs.umich.edu clearTempBreakpoint(nextBkpt); 2503536Sgblack@eecs.umich.edu} 2513536Sgblack@eecs.umich.edu 2523536Sgblack@eecs.umich.eduvoid 2533536Sgblack@eecs.umich.eduRemoteGDB::setSingleStep() 2543536Sgblack@eecs.umich.edu{ 2557720Sgblack@eecs.umich.edu nextBkpt = context->pcState().npc(); 2564060Ssaidi@eecs.umich.edu setTempBreakpoint(nextBkpt); 2573536Sgblack@eecs.umich.edu} 258