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. 278a42ddf0SRichard 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 */ 318a42ddf0SRichard Henderson 328a42ddf0SRichard Henderson enum { 338a42ddf0SRichard Henderson GDB_PC = 32 + 0, 348a42ddf0SRichard Henderson GDB_MSR = 32 + 1, 358a42ddf0SRichard Henderson GDB_EAR = 32 + 2, 368a42ddf0SRichard Henderson GDB_ESR = 32 + 3, 378a42ddf0SRichard Henderson GDB_FSR = 32 + 4, 388a42ddf0SRichard Henderson GDB_BTR = 32 + 5, 398a42ddf0SRichard Henderson GDB_PVR0 = 32 + 6, 408a42ddf0SRichard Henderson GDB_PVR11 = 32 + 17, 418a42ddf0SRichard Henderson GDB_EDR = 32 + 18, 428a42ddf0SRichard Henderson GDB_SLR = 32 + 25, 438a42ddf0SRichard Henderson GDB_SHR = 32 + 26, 44201dd7d3SJoe Komlodi }; 455b50e790SAndreas Färber 468a42ddf0SRichard Henderson int mb_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) 478a42ddf0SRichard Henderson { 488a42ddf0SRichard Henderson MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 498a42ddf0SRichard Henderson CPUClass *cc = CPU_GET_CLASS(cs); 508a42ddf0SRichard Henderson CPUMBState *env = &cpu->env; 518a42ddf0SRichard Henderson uint32_t val; 528a42ddf0SRichard Henderson 538a42ddf0SRichard Henderson if (n > cc->gdb_num_core_regs) { 54eabfc239SAndreas Färber return 0; 55eabfc239SAndreas Färber } 568a42ddf0SRichard Henderson 578a42ddf0SRichard Henderson switch (n) { 588a42ddf0SRichard Henderson case 1 ... 31: 598a42ddf0SRichard Henderson val = env->regs[n]; 608a42ddf0SRichard Henderson break; 618a42ddf0SRichard Henderson case GDB_PC: 6276e8187dSRichard Henderson val = env->pc; 638a42ddf0SRichard Henderson break; 648a42ddf0SRichard Henderson case GDB_MSR: 652e5282caSRichard Henderson val = env->msr; 668a42ddf0SRichard Henderson break; 678a42ddf0SRichard Henderson case GDB_EAR: 68b2e80a3cSRichard Henderson val = env->ear; 698a42ddf0SRichard Henderson break; 708a42ddf0SRichard Henderson case GDB_ESR: 7178e9caf2SRichard Henderson val = env->esr; 728a42ddf0SRichard Henderson break; 738a42ddf0SRichard Henderson case GDB_FSR: 745a8e0136SRichard Henderson val = env->fsr; 758a42ddf0SRichard Henderson break; 768a42ddf0SRichard Henderson case GDB_BTR: 776fbf78f2SRichard Henderson val = env->btr; 788a42ddf0SRichard Henderson break; 798a42ddf0SRichard Henderson case GDB_PVR0 ... GDB_PVR11: 808a42ddf0SRichard Henderson /* PVR12 is intentionally skipped */ 818a42ddf0SRichard Henderson val = env->pvr.regs[n - GDB_PVR0]; 828a42ddf0SRichard Henderson break; 838a42ddf0SRichard Henderson case GDB_EDR: 84*af20a93aSRichard Henderson val = env->edr; 858a42ddf0SRichard Henderson break; 868a42ddf0SRichard Henderson case GDB_SLR: 878a42ddf0SRichard Henderson val = env->slr; 888a42ddf0SRichard Henderson break; 898a42ddf0SRichard Henderson case GDB_SHR: 908a42ddf0SRichard Henderson val = env->shr; 918a42ddf0SRichard Henderson break; 928a42ddf0SRichard Henderson default: 938a42ddf0SRichard Henderson /* Other SRegs aren't modeled, so report a value of 0 */ 948a42ddf0SRichard Henderson val = 0; 958a42ddf0SRichard Henderson break; 96a44e82dbSJoe Komlodi } 978a42ddf0SRichard 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) { 1148a42ddf0SRichard Henderson case 1 ... 31: 1158a42ddf0SRichard Henderson env->regs[n] = tmp; 116a44e82dbSJoe Komlodi break; 1178a42ddf0SRichard Henderson case GDB_PC: 11876e8187dSRichard Henderson env->pc = tmp; 1198a42ddf0SRichard Henderson break; 1208a42ddf0SRichard Henderson case GDB_MSR: 1212e5282caSRichard Henderson env->msr = tmp; 1228a42ddf0SRichard Henderson break; 1238a42ddf0SRichard Henderson case GDB_EAR: 124b2e80a3cSRichard Henderson env->ear = tmp; 1258a42ddf0SRichard Henderson break; 1268a42ddf0SRichard Henderson case GDB_ESR: 12778e9caf2SRichard Henderson env->esr = tmp; 1288a42ddf0SRichard Henderson break; 1298a42ddf0SRichard Henderson case GDB_FSR: 1305a8e0136SRichard Henderson env->fsr = tmp; 1318a42ddf0SRichard Henderson break; 1328a42ddf0SRichard Henderson case GDB_BTR: 1336fbf78f2SRichard Henderson env->btr = tmp; 1348a42ddf0SRichard Henderson break; 1358a42ddf0SRichard Henderson case GDB_PVR0 ... GDB_PVR11: 136a44e82dbSJoe Komlodi /* PVR12 is intentionally skipped */ 1378a42ddf0SRichard Henderson env->pvr.regs[n - GDB_PVR0] = tmp; 138a44e82dbSJoe Komlodi break; 1398a42ddf0SRichard Henderson case GDB_EDR: 140*af20a93aSRichard Henderson env->edr = tmp; 141a44e82dbSJoe Komlodi break; 1428a42ddf0SRichard Henderson case GDB_SLR: 143a44e82dbSJoe Komlodi env->slr = tmp; 144a44e82dbSJoe Komlodi break; 1458a42ddf0SRichard Henderson case GDB_SHR: 146a44e82dbSJoe Komlodi env->shr = tmp; 147a44e82dbSJoe Komlodi break; 148a44e82dbSJoe Komlodi } 149eabfc239SAndreas Färber return 4; 150eabfc239SAndreas Färber } 151