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 */ 20ed2decc6SPeter Maydell #include "qemu/osdep.h" 215b50e790SAndreas Färber #include "qemu-common.h" 2233c11879SPaolo Bonzini #include "cpu.h" 235b50e790SAndreas Färber #include "exec/gdbstub.h" 2430028739SAndreas Färber 255b50e790SAndreas Färber int openrisc_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) 2630028739SAndreas Färber { 275b50e790SAndreas Färber OpenRISCCPU *cpu = OPENRISC_CPU(cs); 285b50e790SAndreas Färber CPUOpenRISCState *env = &cpu->env; 295b50e790SAndreas Färber 3030028739SAndreas Färber if (n < 32) { 31986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->gpr[n]); 3230028739SAndreas Färber } else { 3330028739SAndreas Färber switch (n) { 3430028739SAndreas Färber case 32: /* PPC */ 35986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->ppc); 3630028739SAndreas Färber 3724c32852SRichard Henderson case 33: /* NPC (equals PC) */ 3824c32852SRichard Henderson return gdb_get_reg32(mem_buf, env->pc); 3930028739SAndreas Färber 4030028739SAndreas Färber case 34: /* SR */ 4184775c43SRichard Henderson return gdb_get_reg32(mem_buf, cpu_get_sr(env)); 4230028739SAndreas Färber 4330028739SAndreas Färber default: 4430028739SAndreas Färber break; 4530028739SAndreas Färber } 4630028739SAndreas Färber } 4730028739SAndreas Färber return 0; 4830028739SAndreas Färber } 4930028739SAndreas Färber 505b50e790SAndreas Färber int openrisc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 5130028739SAndreas Färber { 525b50e790SAndreas Färber OpenRISCCPU *cpu = OPENRISC_CPU(cs); 535b50e790SAndreas Färber CPUClass *cc = CPU_GET_CLASS(cs); 545b50e790SAndreas Färber CPUOpenRISCState *env = &cpu->env; 5530028739SAndreas Färber uint32_t tmp; 5630028739SAndreas Färber 5730028739SAndreas Färber if (n > cc->gdb_num_core_regs) { 5830028739SAndreas Färber return 0; 5930028739SAndreas Färber } 6030028739SAndreas Färber 6130028739SAndreas Färber tmp = ldl_p(mem_buf); 6230028739SAndreas Färber 6330028739SAndreas Färber if (n < 32) { 6430028739SAndreas Färber env->gpr[n] = tmp; 6530028739SAndreas Färber } else { 6630028739SAndreas Färber switch (n) { 6730028739SAndreas Färber case 32: /* PPC */ 6830028739SAndreas Färber env->ppc = tmp; 6930028739SAndreas Färber break; 7030028739SAndreas Färber 7124c32852SRichard Henderson case 33: /* NPC (equals PC) */ 7224c32852SRichard Henderson /* If setting PC to something different, 7324c32852SRichard Henderson also clear delayed branch status. */ 7424c32852SRichard Henderson if (env->pc != tmp) { 7524c32852SRichard Henderson env->pc = tmp; 76*a01deb36SRichard Henderson env->dflag = 0; 7724c32852SRichard Henderson } 7830028739SAndreas Färber break; 7930028739SAndreas Färber 8030028739SAndreas Färber case 34: /* SR */ 8184775c43SRichard Henderson cpu_set_sr(env, tmp); 8230028739SAndreas Färber break; 8330028739SAndreas Färber 8430028739SAndreas Färber default: 8530028739SAndreas Färber break; 8630028739SAndreas Färber } 8730028739SAndreas Färber } 8830028739SAndreas Färber return 4; 8930028739SAndreas Färber } 90