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: 62*76e8187dSRichard Henderson val = env->pc; 638a42ddf0SRichard Henderson break; 648a42ddf0SRichard Henderson case GDB_MSR: 658a42ddf0SRichard Henderson val = env->sregs[SR_MSR]; 668a42ddf0SRichard Henderson break; 678a42ddf0SRichard Henderson case GDB_EAR: 688a42ddf0SRichard Henderson val = env->sregs[SR_EAR]; 698a42ddf0SRichard Henderson break; 708a42ddf0SRichard Henderson case GDB_ESR: 718a42ddf0SRichard Henderson val = env->sregs[SR_ESR]; 728a42ddf0SRichard Henderson break; 738a42ddf0SRichard Henderson case GDB_FSR: 748a42ddf0SRichard Henderson val = env->sregs[SR_FSR]; 758a42ddf0SRichard Henderson break; 768a42ddf0SRichard Henderson case GDB_BTR: 778a42ddf0SRichard Henderson val = env->sregs[SR_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: 848a42ddf0SRichard Henderson val = env->sregs[SR_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: 118*76e8187dSRichard Henderson env->pc = tmp; 1198a42ddf0SRichard Henderson break; 1208a42ddf0SRichard Henderson case GDB_MSR: 1218a42ddf0SRichard Henderson env->sregs[SR_MSR] = tmp; 1228a42ddf0SRichard Henderson break; 1238a42ddf0SRichard Henderson case GDB_EAR: 1248a42ddf0SRichard Henderson env->sregs[SR_EAR] = tmp; 1258a42ddf0SRichard Henderson break; 1268a42ddf0SRichard Henderson case GDB_ESR: 1278a42ddf0SRichard Henderson env->sregs[SR_ESR] = tmp; 1288a42ddf0SRichard Henderson break; 1298a42ddf0SRichard Henderson case GDB_FSR: 1308a42ddf0SRichard Henderson env->sregs[SR_FSR] = tmp; 1318a42ddf0SRichard Henderson break; 1328a42ddf0SRichard Henderson case GDB_BTR: 1338a42ddf0SRichard Henderson env->sregs[SR_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: 140201dd7d3SJoe Komlodi env->sregs[SR_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