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 10779fc6adSThomas Huth * version 2.1 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" 2133c11879SPaolo Bonzini #include "cpu.h" 22*4ea5fe99SAlex Bennée #include "gdbstub/helpers.h" 2330028739SAndreas Färber 24a010bdbeSAlex Bennée int openrisc_cpu_gdb_read_register(CPUState *cs, GByteArray *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) { 30d89e71e8SStafford Horne return gdb_get_reg32(mem_buf, cpu_get_gpr(env, 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 3624c32852SRichard Henderson case 33: /* NPC (equals PC) */ 3724c32852SRichard Henderson return gdb_get_reg32(mem_buf, env->pc); 3830028739SAndreas Färber 3930028739SAndreas Färber case 34: /* SR */ 4084775c43SRichard Henderson return gdb_get_reg32(mem_buf, cpu_get_sr(env)); 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) { 63d89e71e8SStafford Horne cpu_set_gpr(env, 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 7024c32852SRichard Henderson case 33: /* NPC (equals PC) */ 7124c32852SRichard Henderson /* If setting PC to something different, 7224c32852SRichard Henderson also clear delayed branch status. */ 7324c32852SRichard Henderson if (env->pc != tmp) { 7424c32852SRichard Henderson env->pc = tmp; 75a01deb36SRichard Henderson env->dflag = 0; 7624c32852SRichard Henderson } 7730028739SAndreas Färber break; 7830028739SAndreas Färber 7930028739SAndreas Färber case 34: /* SR */ 8084775c43SRichard Henderson cpu_set_sr(env, tmp); 8130028739SAndreas Färber break; 8230028739SAndreas Färber 8330028739SAndreas Färber default: 8430028739SAndreas Färber break; 8530028739SAndreas Färber } 8630028739SAndreas Färber } 8730028739SAndreas Färber return 4; 8830028739SAndreas Färber } 89