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" 22*4ea5fe99SAlex 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 CPUClass *cc = CPU_GET_CLASS(cs); 538a42ddf0SRichard Henderson CPUMBState *env = &cpu->env; 548a42ddf0SRichard Henderson uint32_t val; 558a42ddf0SRichard Henderson 568a42ddf0SRichard Henderson if (n > cc->gdb_num_core_regs) { 57eabfc239SAndreas Färber return 0; 58eabfc239SAndreas Färber } 598a42ddf0SRichard Henderson 608a42ddf0SRichard Henderson switch (n) { 618a42ddf0SRichard Henderson case 1 ... 31: 628a42ddf0SRichard Henderson val = env->regs[n]; 638a42ddf0SRichard Henderson break; 648a42ddf0SRichard Henderson case GDB_PC: 6576e8187dSRichard Henderson val = env->pc; 668a42ddf0SRichard Henderson break; 678a42ddf0SRichard Henderson case GDB_MSR: 681074c0fbSRichard Henderson val = mb_cpu_read_msr(env); 698a42ddf0SRichard Henderson break; 708a42ddf0SRichard Henderson case GDB_EAR: 71b2e80a3cSRichard Henderson val = env->ear; 728a42ddf0SRichard Henderson break; 738a42ddf0SRichard Henderson case GDB_ESR: 7478e9caf2SRichard Henderson val = env->esr; 758a42ddf0SRichard Henderson break; 768a42ddf0SRichard Henderson case GDB_FSR: 775a8e0136SRichard Henderson val = env->fsr; 788a42ddf0SRichard Henderson break; 798a42ddf0SRichard Henderson case GDB_BTR: 806fbf78f2SRichard Henderson val = env->btr; 818a42ddf0SRichard Henderson break; 828a42ddf0SRichard Henderson case GDB_PVR0 ... GDB_PVR11: 838a42ddf0SRichard Henderson /* PVR12 is intentionally skipped */ 84a4bcfc33SRichard Henderson val = cpu->cfg.pvr_regs[n - GDB_PVR0]; 858a42ddf0SRichard Henderson break; 868a42ddf0SRichard Henderson case GDB_EDR: 87af20a93aSRichard Henderson val = env->edr; 888a42ddf0SRichard Henderson break; 898a42ddf0SRichard Henderson default: 908a42ddf0SRichard Henderson /* Other SRegs aren't modeled, so report a value of 0 */ 918a42ddf0SRichard Henderson val = 0; 928a42ddf0SRichard Henderson break; 93a44e82dbSJoe Komlodi } 948a42ddf0SRichard Henderson return gdb_get_reg32(mem_buf, val); 95a44e82dbSJoe Komlodi } 96eabfc239SAndreas Färber 97c3bef3b4SRichard Henderson int mb_cpu_gdb_read_stack_protect(CPUMBState *env, GByteArray *mem_buf, int n) 98c3bef3b4SRichard Henderson { 99c3bef3b4SRichard Henderson uint32_t val; 100c3bef3b4SRichard Henderson 101c3bef3b4SRichard Henderson switch (n) { 102c3bef3b4SRichard Henderson case GDB_SP_SHL: 103c3bef3b4SRichard Henderson val = env->slr; 104c3bef3b4SRichard Henderson break; 105c3bef3b4SRichard Henderson case GDB_SP_SHR: 106c3bef3b4SRichard Henderson val = env->shr; 107c3bef3b4SRichard Henderson break; 108c3bef3b4SRichard Henderson default: 109c3bef3b4SRichard Henderson return 0; 110c3bef3b4SRichard Henderson } 111c3bef3b4SRichard Henderson return gdb_get_reg32(mem_buf, val); 112c3bef3b4SRichard Henderson } 113c3bef3b4SRichard Henderson 1145b50e790SAndreas Färber int mb_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 115eabfc239SAndreas Färber { 1165b50e790SAndreas Färber MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs); 1175b50e790SAndreas Färber CPUClass *cc = CPU_GET_CLASS(cs); 1185b50e790SAndreas Färber CPUMBState *env = &cpu->env; 119eabfc239SAndreas Färber uint32_t tmp; 120eabfc239SAndreas Färber 121eabfc239SAndreas Färber if (n > cc->gdb_num_core_regs) { 122eabfc239SAndreas Färber return 0; 123eabfc239SAndreas Färber } 124eabfc239SAndreas Färber 125eabfc239SAndreas Färber tmp = ldl_p(mem_buf); 126eabfc239SAndreas Färber 127a44e82dbSJoe Komlodi switch (n) { 1288a42ddf0SRichard Henderson case 1 ... 31: 1298a42ddf0SRichard Henderson env->regs[n] = tmp; 130a44e82dbSJoe Komlodi break; 1318a42ddf0SRichard Henderson case GDB_PC: 13276e8187dSRichard Henderson env->pc = tmp; 1338a42ddf0SRichard Henderson break; 1348a42ddf0SRichard Henderson case GDB_MSR: 1351074c0fbSRichard Henderson mb_cpu_write_msr(env, tmp); 1368a42ddf0SRichard Henderson break; 1378a42ddf0SRichard Henderson case GDB_EAR: 138b2e80a3cSRichard Henderson env->ear = tmp; 1398a42ddf0SRichard Henderson break; 1408a42ddf0SRichard Henderson case GDB_ESR: 14178e9caf2SRichard Henderson env->esr = tmp; 1428a42ddf0SRichard Henderson break; 1438a42ddf0SRichard Henderson case GDB_FSR: 1445a8e0136SRichard Henderson env->fsr = tmp; 1458a42ddf0SRichard Henderson break; 1468a42ddf0SRichard Henderson case GDB_BTR: 1476fbf78f2SRichard Henderson env->btr = tmp; 1488a42ddf0SRichard Henderson break; 1498a42ddf0SRichard Henderson case GDB_EDR: 150af20a93aSRichard Henderson env->edr = tmp; 151a44e82dbSJoe Komlodi break; 152c3bef3b4SRichard Henderson } 153c3bef3b4SRichard Henderson return 4; 154c3bef3b4SRichard Henderson } 155c3bef3b4SRichard Henderson 156c3bef3b4SRichard Henderson int mb_cpu_gdb_write_stack_protect(CPUMBState *env, uint8_t *mem_buf, int n) 157c3bef3b4SRichard Henderson { 158c3bef3b4SRichard Henderson switch (n) { 159c3bef3b4SRichard Henderson case GDB_SP_SHL: 160c3bef3b4SRichard Henderson env->slr = ldl_p(mem_buf); 161a44e82dbSJoe Komlodi break; 162c3bef3b4SRichard Henderson case GDB_SP_SHR: 163c3bef3b4SRichard Henderson env->shr = ldl_p(mem_buf); 164a44e82dbSJoe Komlodi break; 165c3bef3b4SRichard Henderson default: 166c3bef3b4SRichard Henderson return 0; 167a44e82dbSJoe Komlodi } 168eabfc239SAndreas Färber return 4; 169eabfc239SAndreas Färber } 170