130028739SAndreas Färber /* 230028739SAndreas Färber * OpenRISC gdb server stub 330028739SAndreas Färber * 430028739SAndreas Färber * Copyright (c) 2003-2005 Fabrice Bellard 530028739SAndreas Färber * Copyright (c) 2013 SUSE LINUX Products GmbH 630028739SAndreas Färber * 730028739SAndreas Färber * This library is free software; you can redistribute it and/or 830028739SAndreas Färber * modify it under the terms of the GNU Lesser General Public 930028739SAndreas Färber * License as published by the Free Software Foundation; either 1030028739SAndreas Färber * version 2 of the License, or (at your option) any later version. 1130028739SAndreas Färber * 1230028739SAndreas Färber * This library is distributed in the hope that it will be useful, 1330028739SAndreas Färber * but WITHOUT ANY WARRANTY; without even the implied warranty of 1430028739SAndreas Färber * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1530028739SAndreas Färber * Lesser General Public License for more details. 1630028739SAndreas Färber * 1730028739SAndreas Färber * You should have received a copy of the GNU Lesser General Public 1830028739SAndreas Färber * License along with this library; if not, see <http://www.gnu.org/licenses/>. 1930028739SAndreas Färber */ 205b50e790SAndreas Färber #include "config.h" 215b50e790SAndreas Färber #include "qemu-common.h" 225b50e790SAndreas Färber #include "exec/gdbstub.h" 2330028739SAndreas Färber 245b50e790SAndreas Färber int openrisc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) 2530028739SAndreas Färber { 265b50e790SAndreas Färber OpenRISCCPU *cpu = OPENRISC_CPU(cs); 275b50e790SAndreas Färber CPUOpenRISCState *env = &cpu->env; 285b50e790SAndreas Färber 2930028739SAndreas Färber if (n < 32) { 30986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->gpr[n]); 3130028739SAndreas Färber } else { 3230028739SAndreas Färber switch (n) { 3330028739SAndreas Färber case 32: /* PPC */ 34986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->ppc); 3530028739SAndreas Färber 3630028739SAndreas Färber case 33: /* NPC */ 37986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->npc); 3830028739SAndreas Färber 3930028739SAndreas Färber case 34: /* SR */ 40986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->sr); 4130028739SAndreas Färber 4230028739SAndreas Färber default: 4330028739SAndreas Färber break; 4430028739SAndreas Färber } 4530028739SAndreas Färber } 4630028739SAndreas Färber return 0; 4730028739SAndreas Färber } 4830028739SAndreas Färber 495b50e790SAndreas Färber int openrisc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 5030028739SAndreas Färber { 515b50e790SAndreas Färber OpenRISCCPU *cpu = OPENRISC_CPU(cs); 525b50e790SAndreas Färber CPUClass *cc = CPU_GET_CLASS(cs); 535b50e790SAndreas Färber CPUOpenRISCState *env = &cpu->env; 5430028739SAndreas Färber uint32_t tmp; 5530028739SAndreas Färber 5630028739SAndreas Färber if (n > cc->gdb_num_core_regs) { 5730028739SAndreas Färber return 0; 5830028739SAndreas Färber } 5930028739SAndreas Färber 6030028739SAndreas Färber tmp = ldl_p(mem_buf); 6130028739SAndreas Färber 6230028739SAndreas Färber if (n < 32) { 6330028739SAndreas Färber env->gpr[n] = tmp; 6430028739SAndreas Färber } else { 6530028739SAndreas Färber switch (n) { 6630028739SAndreas Färber case 32: /* PPC */ 6730028739SAndreas Färber env->ppc = tmp; 6830028739SAndreas Färber break; 6930028739SAndreas Färber 7030028739SAndreas Färber case 33: /* NPC */ 7130028739SAndreas Färber env->npc = tmp; 7230028739SAndreas Färber break; 7330028739SAndreas Färber 7430028739SAndreas Färber case 34: /* SR */ 7530028739SAndreas Färber env->sr = tmp; 7630028739SAndreas Färber break; 7730028739SAndreas Färber 7830028739SAndreas Färber default: 7930028739SAndreas Färber break; 8030028739SAndreas Färber } 8130028739SAndreas Färber } 8230028739SAndreas Färber return 4; 8330028739SAndreas Färber } 84