1eabfc239SAndreas Färber /* 2eabfc239SAndreas Färber * MicroBlaze gdb server stub 3eabfc239SAndreas Färber * 4eabfc239SAndreas Färber * Copyright (c) 2003-2005 Fabrice Bellard 5eabfc239SAndreas Färber * Copyright (c) 2013 SUSE LINUX Products GmbH 6eabfc239SAndreas Färber * 7eabfc239SAndreas Färber * This library is free software; you can redistribute it and/or 8eabfc239SAndreas Färber * modify it under the terms of the GNU Lesser General Public 9eabfc239SAndreas Färber * License as published by the Free Software Foundation; either 10eabfc239SAndreas Färber * version 2 of the License, or (at your option) any later version. 11eabfc239SAndreas Färber * 12eabfc239SAndreas Färber * This library is distributed in the hope that it will be useful, 13eabfc239SAndreas Färber * but WITHOUT ANY WARRANTY; without even the implied warranty of 14eabfc239SAndreas Färber * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15eabfc239SAndreas Färber * Lesser General Public License for more details. 16eabfc239SAndreas Färber * 17eabfc239SAndreas Färber * You should have received a copy of the GNU Lesser General Public 18eabfc239SAndreas Färber * License along with this library; if not, see <http://www.gnu.org/licenses/>. 19eabfc239SAndreas Färber */ 208fd9deceSPeter Maydell #include "qemu/osdep.h" 2133c11879SPaolo Bonzini #include "cpu.h" 225b50e790SAndreas Färber #include "exec/gdbstub.h" 23eabfc239SAndreas Färber 24a010bdbeSAlex Bennée int mb_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) 25eabfc239SAndreas Färber { 265b50e790SAndreas Färber MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 275b50e790SAndreas Färber CPUMBState *env = &cpu->env; 285b50e790SAndreas Färber 29*a44e82dbSJoe Komlodi /* 30*a44e82dbSJoe Komlodi * GDB expects registers to be reported in this order: 31*a44e82dbSJoe Komlodi * R0-R31 32*a44e82dbSJoe Komlodi * PC-BTR 33*a44e82dbSJoe Komlodi * PVR0-PVR11 34*a44e82dbSJoe Komlodi * EDR-TLBHI 35*a44e82dbSJoe Komlodi * SLR-SHR 36*a44e82dbSJoe Komlodi */ 37eabfc239SAndreas Färber if (n < 32) { 38986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->regs[n]); 39eabfc239SAndreas Färber } else { 40*a44e82dbSJoe Komlodi n -= 32; 41*a44e82dbSJoe Komlodi switch (n) { 42*a44e82dbSJoe Komlodi case 0 ... 5: 43*a44e82dbSJoe Komlodi return gdb_get_reg32(mem_buf, env->sregs[n]); 44*a44e82dbSJoe Komlodi /* PVR12 is intentionally skipped */ 45*a44e82dbSJoe Komlodi case 6 ... 17: 46*a44e82dbSJoe Komlodi n -= 6; 47*a44e82dbSJoe Komlodi return gdb_get_reg32(mem_buf, env->pvr.regs[n]); 48*a44e82dbSJoe Komlodi case 18 ... 24: 49*a44e82dbSJoe Komlodi /* Add an offset of 6 to resume where we left off with SRegs */ 50*a44e82dbSJoe Komlodi n = n - 18 + 6; 51*a44e82dbSJoe Komlodi return gdb_get_reg32(mem_buf, env->sregs[n]); 52*a44e82dbSJoe Komlodi case 25: 53*a44e82dbSJoe Komlodi return gdb_get_reg32(mem_buf, env->slr); 54*a44e82dbSJoe Komlodi case 26: 55*a44e82dbSJoe Komlodi return gdb_get_reg32(mem_buf, env->shr); 56*a44e82dbSJoe Komlodi default: 57eabfc239SAndreas Färber return 0; 58eabfc239SAndreas Färber } 59*a44e82dbSJoe Komlodi } 60*a44e82dbSJoe Komlodi } 61eabfc239SAndreas Färber 625b50e790SAndreas Färber int mb_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 63eabfc239SAndreas Färber { 645b50e790SAndreas Färber MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 655b50e790SAndreas Färber CPUClass *cc = CPU_GET_CLASS(cs); 665b50e790SAndreas Färber CPUMBState *env = &cpu->env; 67eabfc239SAndreas Färber uint32_t tmp; 68eabfc239SAndreas Färber 69eabfc239SAndreas Färber if (n > cc->gdb_num_core_regs) { 70eabfc239SAndreas Färber return 0; 71eabfc239SAndreas Färber } 72eabfc239SAndreas Färber 73eabfc239SAndreas Färber tmp = ldl_p(mem_buf); 74eabfc239SAndreas Färber 75eabfc239SAndreas Färber if (n < 32) { 76eabfc239SAndreas Färber env->regs[n] = tmp; 77eabfc239SAndreas Färber } else { 78*a44e82dbSJoe Komlodi n -= 32; 79*a44e82dbSJoe Komlodi switch (n) { 80*a44e82dbSJoe Komlodi case 0 ... 5: 81*a44e82dbSJoe Komlodi env->sregs[n] = tmp; 82*a44e82dbSJoe Komlodi break; 83*a44e82dbSJoe Komlodi /* PVR12 is intentionally skipped */ 84*a44e82dbSJoe Komlodi case 6 ... 17: 85*a44e82dbSJoe Komlodi n -= 6; 86*a44e82dbSJoe Komlodi env->pvr.regs[n] = tmp; 87*a44e82dbSJoe Komlodi break; 88*a44e82dbSJoe Komlodi case 18 ... 24: 89*a44e82dbSJoe Komlodi /* Add an offset of 6 to resume where we left off with SRegs */ 90*a44e82dbSJoe Komlodi n = n - 18 + 6; 91*a44e82dbSJoe Komlodi env->sregs[n] = tmp; 92*a44e82dbSJoe Komlodi break; 93*a44e82dbSJoe Komlodi case 25: 94*a44e82dbSJoe Komlodi env->slr = tmp; 95*a44e82dbSJoe Komlodi break; 96*a44e82dbSJoe Komlodi case 26: 97*a44e82dbSJoe Komlodi env->shr = tmp; 98*a44e82dbSJoe Komlodi break; 99*a44e82dbSJoe Komlodi } 100eabfc239SAndreas Färber } 101eabfc239SAndreas Färber return 4; 102eabfc239SAndreas Färber } 103