Browse Source
We want to be able to debug AArch64 guests. So let's add the respective gdb stub functions and xml descriptions that allow us to do so. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: John Rigby <john.rigby@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 1378235544-22290-12-git-send-email-peter.maydell@linaro.org Message-id: 1368505980-17151-6-git-send-email-john.rigby@linaro.org [PMM: dropped unused fp regs XML for now; moved 64 bit only functions to new gdbstub64.c; these are hooked up in AArch64CPU, not via ifdefs in ARMCPU] Signed-off-by: Peter Maydell <peter.maydell@linaro.org>pull/8/head
committed by
Peter Maydell
5 changed files with 126 additions and 1 deletions
@ -0,0 +1,46 @@ |
|||||
|
<?xml version="1.0"?> |
||||
|
<!-- Copyright (C) 2009-2012 Free Software Foundation, Inc. |
||||
|
Contributed by ARM Ltd. |
||||
|
|
||||
|
Copying and distribution of this file, with or without modification, |
||||
|
are permitted in any medium without royalty provided the copyright |
||||
|
notice and this notice are preserved. --> |
||||
|
|
||||
|
<!DOCTYPE feature SYSTEM "gdb-target.dtd"> |
||||
|
<feature name="org.gnu.gdb.aarch64.core"> |
||||
|
<reg name="x0" bitsize="64"/> |
||||
|
<reg name="x1" bitsize="64"/> |
||||
|
<reg name="x2" bitsize="64"/> |
||||
|
<reg name="x3" bitsize="64"/> |
||||
|
<reg name="x4" bitsize="64"/> |
||||
|
<reg name="x5" bitsize="64"/> |
||||
|
<reg name="x6" bitsize="64"/> |
||||
|
<reg name="x7" bitsize="64"/> |
||||
|
<reg name="x8" bitsize="64"/> |
||||
|
<reg name="x9" bitsize="64"/> |
||||
|
<reg name="x10" bitsize="64"/> |
||||
|
<reg name="x11" bitsize="64"/> |
||||
|
<reg name="x12" bitsize="64"/> |
||||
|
<reg name="x13" bitsize="64"/> |
||||
|
<reg name="x14" bitsize="64"/> |
||||
|
<reg name="x15" bitsize="64"/> |
||||
|
<reg name="x16" bitsize="64"/> |
||||
|
<reg name="x17" bitsize="64"/> |
||||
|
<reg name="x18" bitsize="64"/> |
||||
|
<reg name="x19" bitsize="64"/> |
||||
|
<reg name="x20" bitsize="64"/> |
||||
|
<reg name="x21" bitsize="64"/> |
||||
|
<reg name="x22" bitsize="64"/> |
||||
|
<reg name="x23" bitsize="64"/> |
||||
|
<reg name="x24" bitsize="64"/> |
||||
|
<reg name="x25" bitsize="64"/> |
||||
|
<reg name="x26" bitsize="64"/> |
||||
|
<reg name="x27" bitsize="64"/> |
||||
|
<reg name="x28" bitsize="64"/> |
||||
|
<reg name="x29" bitsize="64"/> |
||||
|
<reg name="x30" bitsize="64"/> |
||||
|
<reg name="sp" bitsize="64" type="data_ptr"/> |
||||
|
|
||||
|
<reg name="pc" bitsize="64" type="code_ptr"/> |
||||
|
<reg name="cpsr" bitsize="32"/> |
||||
|
</feature> |
||||
@ -0,0 +1,73 @@ |
|||||
|
/*
|
||||
|
* ARM gdb server stub: AArch64 specific functions. |
||||
|
* |
||||
|
* Copyright (c) 2013 SUSE LINUX Products GmbH |
||||
|
* |
||||
|
* This library is free software; you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU Lesser General Public |
||||
|
* License as published by the Free Software Foundation; either |
||||
|
* version 2 of the License, or (at your option) any later version. |
||||
|
* |
||||
|
* This library 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 |
||||
|
* Lesser General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU Lesser General Public |
||||
|
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
*/ |
||||
|
#include "config.h" |
||||
|
#include "qemu-common.h" |
||||
|
#include "exec/gdbstub.h" |
||||
|
|
||||
|
int aarch64_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) |
||||
|
{ |
||||
|
ARMCPU *cpu = ARM_CPU(cs); |
||||
|
CPUARMState *env = &cpu->env; |
||||
|
|
||||
|
if (n < 31) { |
||||
|
/* Core integer register. */ |
||||
|
return gdb_get_reg64(mem_buf, env->xregs[n]); |
||||
|
} |
||||
|
switch (n) { |
||||
|
case 31: |
||||
|
return gdb_get_reg64(mem_buf, env->xregs[31]); |
||||
|
break; |
||||
|
case 32: |
||||
|
return gdb_get_reg64(mem_buf, env->pc); |
||||
|
break; |
||||
|
case 33: |
||||
|
return gdb_get_reg32(mem_buf, env->pstate); |
||||
|
} |
||||
|
/* Unknown register. */ |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
int aarch64_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) |
||||
|
{ |
||||
|
ARMCPU *cpu = ARM_CPU(cs); |
||||
|
CPUARMState *env = &cpu->env; |
||||
|
uint64_t tmp; |
||||
|
|
||||
|
tmp = ldq_p(mem_buf); |
||||
|
|
||||
|
if (n < 31) { |
||||
|
/* Core integer register. */ |
||||
|
env->xregs[n] = tmp; |
||||
|
return 8; |
||||
|
} |
||||
|
switch (n) { |
||||
|
case 31: |
||||
|
env->xregs[31] = tmp; |
||||
|
return 8; |
||||
|
case 32: |
||||
|
env->pc = tmp; |
||||
|
return 8; |
||||
|
case 33: |
||||
|
/* CPSR */ |
||||
|
env->pstate = tmp; |
||||
|
return 4; |
||||
|
} |
||||
|
/* Unknown register. */ |
||||
|
return 0; |
||||
|
} |
||||
Loading…
Reference in new issue