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 10ee452036SChetan Pant * version 2.1 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" 224ea5fe99SAlex Bennée #include "gdbstub/helpers.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, 42c3bef3b4SRichard Henderson }; 43c3bef3b4SRichard Henderson 44c3bef3b4SRichard Henderson enum { 45c3bef3b4SRichard Henderson GDB_SP_SHL, 46c3bef3b4SRichard Henderson GDB_SP_SHR, 47201dd7d3SJoe Komlodi }; 485b50e790SAndreas Färber 498a42ddf0SRichard Henderson int mb_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) 508a42ddf0SRichard Henderson { 518a42ddf0SRichard Henderson MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 528a42ddf0SRichard Henderson CPUMBState *env = &cpu->env; 538a42ddf0SRichard Henderson uint32_t val; 548a42ddf0SRichard Henderson 558a42ddf0SRichard Henderson switch (n) { 568a42ddf0SRichard Henderson case 1 ... 31: 578a42ddf0SRichard Henderson val = env->regs[n]; 588a42ddf0SRichard Henderson break; 598a42ddf0SRichard Henderson case GDB_PC: 6076e8187dSRichard Henderson val = env->pc; 618a42ddf0SRichard Henderson break; 628a42ddf0SRichard Henderson case GDB_MSR: 631074c0fbSRichard Henderson val = mb_cpu_read_msr(env); 648a42ddf0SRichard Henderson break; 658a42ddf0SRichard Henderson case GDB_EAR: 66b2e80a3cSRichard Henderson val = env->ear; 678a42ddf0SRichard Henderson break; 688a42ddf0SRichard Henderson case GDB_ESR: 6978e9caf2SRichard Henderson val = env->esr; 708a42ddf0SRichard Henderson break; 718a42ddf0SRichard Henderson case GDB_FSR: 725a8e0136SRichard Henderson val = env->fsr; 738a42ddf0SRichard Henderson break; 748a42ddf0SRichard Henderson case GDB_BTR: 756fbf78f2SRichard Henderson val = env->btr; 768a42ddf0SRichard Henderson break; 778a42ddf0SRichard Henderson case GDB_PVR0 ... GDB_PVR11: 788a42ddf0SRichard Henderson /* PVR12 is intentionally skipped */ 79a4bcfc33SRichard Henderson val = cpu->cfg.pvr_regs[n - GDB_PVR0]; 808a42ddf0SRichard Henderson break; 818a42ddf0SRichard Henderson case GDB_EDR: 82af20a93aSRichard Henderson val = env->edr; 838a42ddf0SRichard Henderson break; 848a42ddf0SRichard Henderson default: 858a42ddf0SRichard Henderson /* Other SRegs aren't modeled, so report a value of 0 */ 868a42ddf0SRichard Henderson val = 0; 878a42ddf0SRichard Henderson break; 88a44e82dbSJoe Komlodi } 898a42ddf0SRichard Henderson return gdb_get_reg32(mem_buf, val); 90a44e82dbSJoe Komlodi } 91eabfc239SAndreas Färber 9266260159SAkihiko Odaki int mb_cpu_gdb_read_stack_protect(CPUState *cs, GByteArray *mem_buf, int n) 93c3bef3b4SRichard Henderson { 9466260159SAkihiko Odaki MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 9566260159SAkihiko Odaki CPUMBState *env = &cpu->env; 96c3bef3b4SRichard Henderson uint32_t val; 97c3bef3b4SRichard Henderson 98c3bef3b4SRichard Henderson switch (n) { 99c3bef3b4SRichard Henderson case GDB_SP_SHL: 100c3bef3b4SRichard Henderson val = env->slr; 101c3bef3b4SRichard Henderson break; 102c3bef3b4SRichard Henderson case GDB_SP_SHR: 103c3bef3b4SRichard Henderson val = env->shr; 104c3bef3b4SRichard Henderson break; 105c3bef3b4SRichard Henderson default: 106c3bef3b4SRichard Henderson return 0; 107c3bef3b4SRichard Henderson } 108c3bef3b4SRichard Henderson return gdb_get_reg32(mem_buf, val); 109c3bef3b4SRichard Henderson } 110c3bef3b4SRichard Henderson 1115b50e790SAndreas Färber int mb_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 112eabfc239SAndreas Färber { 1135b50e790SAndreas Färber CPUClass *cc = CPU_GET_CLASS(cs); 114*da953643SPhilippe Mathieu-Daudé CPUMBState *env = cpu_env(cs); 115eabfc239SAndreas Färber uint32_t tmp; 116eabfc239SAndreas Färber 117eabfc239SAndreas Färber if (n > cc->gdb_num_core_regs) { 118eabfc239SAndreas Färber return 0; 119eabfc239SAndreas Färber } 120eabfc239SAndreas Färber 121eabfc239SAndreas Färber tmp = ldl_p(mem_buf); 122eabfc239SAndreas Färber 123a44e82dbSJoe Komlodi switch (n) { 1248a42ddf0SRichard Henderson case 1 ... 31: 1258a42ddf0SRichard Henderson env->regs[n] = tmp; 126a44e82dbSJoe Komlodi break; 1278a42ddf0SRichard Henderson case GDB_PC: 12876e8187dSRichard Henderson env->pc = tmp; 1298a42ddf0SRichard Henderson break; 1308a42ddf0SRichard Henderson case GDB_MSR: 1311074c0fbSRichard Henderson mb_cpu_write_msr(env, tmp); 1328a42ddf0SRichard Henderson break; 1338a42ddf0SRichard Henderson case GDB_EAR: 134b2e80a3cSRichard Henderson env->ear = tmp; 1358a42ddf0SRichard Henderson break; 1368a42ddf0SRichard Henderson case GDB_ESR: 13778e9caf2SRichard Henderson env->esr = tmp; 1388a42ddf0SRichard Henderson break; 1398a42ddf0SRichard Henderson case GDB_FSR: 1405a8e0136SRichard Henderson env->fsr = tmp; 1418a42ddf0SRichard Henderson break; 1428a42ddf0SRichard Henderson case GDB_BTR: 1436fbf78f2SRichard Henderson env->btr = tmp; 1448a42ddf0SRichard Henderson break; 1458a42ddf0SRichard Henderson case GDB_EDR: 146af20a93aSRichard Henderson env->edr = tmp; 147a44e82dbSJoe Komlodi break; 148c3bef3b4SRichard Henderson } 149c3bef3b4SRichard Henderson return 4; 150c3bef3b4SRichard Henderson } 151c3bef3b4SRichard Henderson 15266260159SAkihiko Odaki int mb_cpu_gdb_write_stack_protect(CPUState *cs, uint8_t *mem_buf, int n) 153c3bef3b4SRichard Henderson { 15466260159SAkihiko Odaki MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 15566260159SAkihiko Odaki CPUMBState *env = &cpu->env; 15666260159SAkihiko Odaki 157c3bef3b4SRichard Henderson switch (n) { 158c3bef3b4SRichard Henderson case GDB_SP_SHL: 159c3bef3b4SRichard Henderson env->slr = ldl_p(mem_buf); 160a44e82dbSJoe Komlodi break; 161c3bef3b4SRichard Henderson case GDB_SP_SHR: 162c3bef3b4SRichard Henderson env->shr = ldl_p(mem_buf); 163a44e82dbSJoe Komlodi break; 164c3bef3b4SRichard Henderson default: 165c3bef3b4SRichard Henderson return 0; 166a44e82dbSJoe Komlodi } 167eabfc239SAndreas Färber return 4; 168eabfc239SAndreas Färber } 169