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 24201dd7d3SJoe Komlodi /* 25201dd7d3SJoe Komlodi * GDB expects SREGs in the following order: 26201dd7d3SJoe Komlodi * PC, MSR, EAR, ESR, FSR, BTR, EDR, PID, ZPR, TLBX, TLBSX, TLBLO, TLBHI. 27*8a42ddf0SRichard Henderson * 28201dd7d3SJoe Komlodi * PID, ZPR, TLBx, TLBsx, TLBLO, and TLBHI aren't modeled, so we don't 29201dd7d3SJoe Komlodi * map them to anything and return a value of 0 instead. 30201dd7d3SJoe Komlodi */ 31*8a42ddf0SRichard Henderson 32*8a42ddf0SRichard Henderson enum { 33*8a42ddf0SRichard Henderson GDB_PC = 32 + 0, 34*8a42ddf0SRichard Henderson GDB_MSR = 32 + 1, 35*8a42ddf0SRichard Henderson GDB_EAR = 32 + 2, 36*8a42ddf0SRichard Henderson GDB_ESR = 32 + 3, 37*8a42ddf0SRichard Henderson GDB_FSR = 32 + 4, 38*8a42ddf0SRichard Henderson GDB_BTR = 32 + 5, 39*8a42ddf0SRichard Henderson GDB_PVR0 = 32 + 6, 40*8a42ddf0SRichard Henderson GDB_PVR11 = 32 + 17, 41*8a42ddf0SRichard Henderson GDB_EDR = 32 + 18, 42*8a42ddf0SRichard Henderson GDB_SLR = 32 + 25, 43*8a42ddf0SRichard Henderson GDB_SHR = 32 + 26, 44201dd7d3SJoe Komlodi }; 455b50e790SAndreas Färber 46*8a42ddf0SRichard Henderson int mb_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) 47*8a42ddf0SRichard Henderson { 48*8a42ddf0SRichard Henderson MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 49*8a42ddf0SRichard Henderson CPUClass *cc = CPU_GET_CLASS(cs); 50*8a42ddf0SRichard Henderson CPUMBState *env = &cpu->env; 51*8a42ddf0SRichard Henderson uint32_t val; 52*8a42ddf0SRichard Henderson 53*8a42ddf0SRichard Henderson if (n > cc->gdb_num_core_regs) { 54eabfc239SAndreas Färber return 0; 55eabfc239SAndreas Färber } 56*8a42ddf0SRichard Henderson 57*8a42ddf0SRichard Henderson switch (n) { 58*8a42ddf0SRichard Henderson case 1 ... 31: 59*8a42ddf0SRichard Henderson val = env->regs[n]; 60*8a42ddf0SRichard Henderson break; 61*8a42ddf0SRichard Henderson case GDB_PC: 62*8a42ddf0SRichard Henderson val = env->sregs[SR_PC]; 63*8a42ddf0SRichard Henderson break; 64*8a42ddf0SRichard Henderson case GDB_MSR: 65*8a42ddf0SRichard Henderson val = env->sregs[SR_MSR]; 66*8a42ddf0SRichard Henderson break; 67*8a42ddf0SRichard Henderson case GDB_EAR: 68*8a42ddf0SRichard Henderson val = env->sregs[SR_EAR]; 69*8a42ddf0SRichard Henderson break; 70*8a42ddf0SRichard Henderson case GDB_ESR: 71*8a42ddf0SRichard Henderson val = env->sregs[SR_ESR]; 72*8a42ddf0SRichard Henderson break; 73*8a42ddf0SRichard Henderson case GDB_FSR: 74*8a42ddf0SRichard Henderson val = env->sregs[SR_FSR]; 75*8a42ddf0SRichard Henderson break; 76*8a42ddf0SRichard Henderson case GDB_BTR: 77*8a42ddf0SRichard Henderson val = env->sregs[SR_BTR]; 78*8a42ddf0SRichard Henderson break; 79*8a42ddf0SRichard Henderson case GDB_PVR0 ... GDB_PVR11: 80*8a42ddf0SRichard Henderson /* PVR12 is intentionally skipped */ 81*8a42ddf0SRichard Henderson val = env->pvr.regs[n - GDB_PVR0]; 82*8a42ddf0SRichard Henderson break; 83*8a42ddf0SRichard Henderson case GDB_EDR: 84*8a42ddf0SRichard Henderson val = env->sregs[SR_EDR]; 85*8a42ddf0SRichard Henderson break; 86*8a42ddf0SRichard Henderson case GDB_SLR: 87*8a42ddf0SRichard Henderson val = env->slr; 88*8a42ddf0SRichard Henderson break; 89*8a42ddf0SRichard Henderson case GDB_SHR: 90*8a42ddf0SRichard Henderson val = env->shr; 91*8a42ddf0SRichard Henderson break; 92*8a42ddf0SRichard Henderson default: 93*8a42ddf0SRichard Henderson /* Other SRegs aren't modeled, so report a value of 0 */ 94*8a42ddf0SRichard Henderson val = 0; 95*8a42ddf0SRichard Henderson break; 96a44e82dbSJoe Komlodi } 97*8a42ddf0SRichard Henderson return gdb_get_reg32(mem_buf, val); 98a44e82dbSJoe Komlodi } 99eabfc239SAndreas Färber 1005b50e790SAndreas Färber int mb_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 101eabfc239SAndreas Färber { 1025b50e790SAndreas Färber MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 1035b50e790SAndreas Färber CPUClass *cc = CPU_GET_CLASS(cs); 1045b50e790SAndreas Färber CPUMBState *env = &cpu->env; 105eabfc239SAndreas Färber uint32_t tmp; 106eabfc239SAndreas Färber 107eabfc239SAndreas Färber if (n > cc->gdb_num_core_regs) { 108eabfc239SAndreas Färber return 0; 109eabfc239SAndreas Färber } 110eabfc239SAndreas Färber 111eabfc239SAndreas Färber tmp = ldl_p(mem_buf); 112eabfc239SAndreas Färber 113a44e82dbSJoe Komlodi switch (n) { 114*8a42ddf0SRichard Henderson case 1 ... 31: 115*8a42ddf0SRichard Henderson env->regs[n] = tmp; 116a44e82dbSJoe Komlodi break; 117*8a42ddf0SRichard Henderson case GDB_PC: 118*8a42ddf0SRichard Henderson env->sregs[SR_PC] = tmp; 119*8a42ddf0SRichard Henderson break; 120*8a42ddf0SRichard Henderson case GDB_MSR: 121*8a42ddf0SRichard Henderson env->sregs[SR_MSR] = tmp; 122*8a42ddf0SRichard Henderson break; 123*8a42ddf0SRichard Henderson case GDB_EAR: 124*8a42ddf0SRichard Henderson env->sregs[SR_EAR] = tmp; 125*8a42ddf0SRichard Henderson break; 126*8a42ddf0SRichard Henderson case GDB_ESR: 127*8a42ddf0SRichard Henderson env->sregs[SR_ESR] = tmp; 128*8a42ddf0SRichard Henderson break; 129*8a42ddf0SRichard Henderson case GDB_FSR: 130*8a42ddf0SRichard Henderson env->sregs[SR_FSR] = tmp; 131*8a42ddf0SRichard Henderson break; 132*8a42ddf0SRichard Henderson case GDB_BTR: 133*8a42ddf0SRichard Henderson env->sregs[SR_BTR] = tmp; 134*8a42ddf0SRichard Henderson break; 135*8a42ddf0SRichard Henderson case GDB_PVR0 ... GDB_PVR11: 136a44e82dbSJoe Komlodi /* PVR12 is intentionally skipped */ 137*8a42ddf0SRichard Henderson env->pvr.regs[n - GDB_PVR0] = tmp; 138a44e82dbSJoe Komlodi break; 139*8a42ddf0SRichard Henderson case GDB_EDR: 140201dd7d3SJoe Komlodi env->sregs[SR_EDR] = tmp; 141a44e82dbSJoe Komlodi break; 142*8a42ddf0SRichard Henderson case GDB_SLR: 143a44e82dbSJoe Komlodi env->slr = tmp; 144a44e82dbSJoe Komlodi break; 145*8a42ddf0SRichard Henderson case GDB_SHR: 146a44e82dbSJoe Komlodi env->shr = tmp; 147a44e82dbSJoe Komlodi break; 148a44e82dbSJoe Komlodi } 149eabfc239SAndreas Färber return 4; 150eabfc239SAndreas Färber } 151