1d19c87f4SAndreas Färber /* 2d19c87f4SAndreas Färber * SPARC gdb server stub 3d19c87f4SAndreas Färber * 4d19c87f4SAndreas Färber * Copyright (c) 2003-2005 Fabrice Bellard 5d19c87f4SAndreas Färber * Copyright (c) 2013 SUSE LINUX Products GmbH 6d19c87f4SAndreas Färber * 7d19c87f4SAndreas Färber * This library is free software; you can redistribute it and/or 8d19c87f4SAndreas Färber * modify it under the terms of the GNU Lesser General Public 9d19c87f4SAndreas Färber * License as published by the Free Software Foundation; either 105650b549SChetan Pant * version 2.1 of the License, or (at your option) any later version. 11d19c87f4SAndreas Färber * 12d19c87f4SAndreas Färber * This library is distributed in the hope that it will be useful, 13d19c87f4SAndreas Färber * but WITHOUT ANY WARRANTY; without even the implied warranty of 14d19c87f4SAndreas Färber * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15d19c87f4SAndreas Färber * Lesser General Public License for more details. 16d19c87f4SAndreas Färber * 17d19c87f4SAndreas Färber * You should have received a copy of the GNU Lesser General Public 18d19c87f4SAndreas Färber * License along with this library; if not, see <http://www.gnu.org/licenses/>. 19d19c87f4SAndreas Färber */ 20db5ebe5fSPeter Maydell #include "qemu/osdep.h" 2133c11879SPaolo Bonzini #include "cpu.h" 224ea5fe99SAlex Bennée #include "gdbstub/helpers.h" 23d19c87f4SAndreas Färber 24d19c87f4SAndreas Färber #ifdef TARGET_ABI32 25986a2998SAndreas Färber #define gdb_get_rega(buf, val) gdb_get_reg32(buf, val) 26d19c87f4SAndreas Färber #else 27986a2998SAndreas Färber #define gdb_get_rega(buf, val) gdb_get_regl(buf, val) 28d19c87f4SAndreas Färber #endif 29d19c87f4SAndreas Färber 30a010bdbeSAlex Bennée int sparc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) 31d19c87f4SAndreas Färber { 3277976769SPhilippe Mathieu-Daudé CPUSPARCState *env = cpu_env(cs); 335b50e790SAndreas Färber 34d19c87f4SAndreas Färber if (n < 8) { 35d19c87f4SAndreas Färber /* g0..g7 */ 36986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->gregs[n]); 37d19c87f4SAndreas Färber } 38d19c87f4SAndreas Färber if (n < 32) { 39d19c87f4SAndreas Färber /* register window */ 40986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->regwptr[n - 8]); 41d19c87f4SAndreas Färber } 42d19c87f4SAndreas Färber #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64) 43d19c87f4SAndreas Färber if (n < 64) { 44d19c87f4SAndreas Färber /* fprs */ 45d19c87f4SAndreas Färber if (n & 1) { 46986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.lower); 47d19c87f4SAndreas Färber } else { 48986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.upper); 49d19c87f4SAndreas Färber } 50d19c87f4SAndreas Färber } 51d19c87f4SAndreas Färber /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ 52d19c87f4SAndreas Färber switch (n) { 53d19c87f4SAndreas Färber case 64: 54986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->y); 55d19c87f4SAndreas Färber case 65: 56986a2998SAndreas Färber return gdb_get_rega(mem_buf, cpu_get_psr(env)); 57d19c87f4SAndreas Färber case 66: 58986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->wim); 59d19c87f4SAndreas Färber case 67: 60986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->tbr); 61d19c87f4SAndreas Färber case 68: 62986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->pc); 63d19c87f4SAndreas Färber case 69: 64986a2998SAndreas Färber return gdb_get_rega(mem_buf, env->npc); 65d19c87f4SAndreas Färber case 70: 661ccd6e13SRichard Henderson return gdb_get_rega(mem_buf, cpu_get_fsr(env)); 67d19c87f4SAndreas Färber case 71: 68986a2998SAndreas Färber return gdb_get_rega(mem_buf, 0); /* csr */ 69d19c87f4SAndreas Färber default: 70986a2998SAndreas Färber return gdb_get_rega(mem_buf, 0); 71d19c87f4SAndreas Färber } 72d19c87f4SAndreas Färber #else 73d19c87f4SAndreas Färber if (n < 64) { 74d19c87f4SAndreas Färber /* f0-f31 */ 75d19c87f4SAndreas Färber if (n & 1) { 76986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.lower); 77d19c87f4SAndreas Färber } else { 78986a2998SAndreas Färber return gdb_get_reg32(mem_buf, env->fpr[(n - 32) / 2].l.upper); 79d19c87f4SAndreas Färber } 80d19c87f4SAndreas Färber } 81d19c87f4SAndreas Färber if (n < 80) { 82*7a74e468SMikael Szreder /* f32-f62 (16 double width registers, even register numbers only) 83*7a74e468SMikael Szreder * n == 64: f32 : env->fpr[16] 84*7a74e468SMikael Szreder * n == 65: f34 : env->fpr[17] 85*7a74e468SMikael Szreder * etc... 86*7a74e468SMikael Szreder * n == 79: f62 : env->fpr[31] 87*7a74e468SMikael Szreder */ 88*7a74e468SMikael Szreder return gdb_get_reg64(mem_buf, env->fpr[(n - 64) + 16].ll); 89d19c87f4SAndreas Färber } 90d19c87f4SAndreas Färber switch (n) { 91d19c87f4SAndreas Färber case 80: 92986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->pc); 93d19c87f4SAndreas Färber case 81: 94986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->npc); 95d19c87f4SAndreas Färber case 82: 96986a2998SAndreas Färber return gdb_get_regl(mem_buf, (cpu_get_ccr(env) << 32) | 97d19c87f4SAndreas Färber ((env->asi & 0xff) << 24) | 98d19c87f4SAndreas Färber ((env->pstate & 0xfff) << 8) | 99d19c87f4SAndreas Färber cpu_get_cwp64(env)); 100d19c87f4SAndreas Färber case 83: 1011ccd6e13SRichard Henderson return gdb_get_regl(mem_buf, cpu_get_fsr(env)); 102d19c87f4SAndreas Färber case 84: 103986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->fprs); 104d19c87f4SAndreas Färber case 85: 105986a2998SAndreas Färber return gdb_get_regl(mem_buf, env->y); 106d19c87f4SAndreas Färber } 107d19c87f4SAndreas Färber #endif 108d19c87f4SAndreas Färber return 0; 109d19c87f4SAndreas Färber } 110d19c87f4SAndreas Färber 1115b50e790SAndreas Färber int sparc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 112d19c87f4SAndreas Färber { 1135b50e790SAndreas Färber SPARCCPU *cpu = SPARC_CPU(cs); 1145b50e790SAndreas Färber CPUSPARCState *env = &cpu->env; 115d19c87f4SAndreas Färber #if defined(TARGET_ABI32) 1169b21d29aSPhilippe Mathieu-Daudé uint32_t tmp; 117d19c87f4SAndreas Färber 118d19c87f4SAndreas Färber tmp = ldl_p(mem_buf); 119d19c87f4SAndreas Färber #else 120d19c87f4SAndreas Färber target_ulong tmp; 121d19c87f4SAndreas Färber 122d19c87f4SAndreas Färber tmp = ldtul_p(mem_buf); 123d19c87f4SAndreas Färber #endif 124d19c87f4SAndreas Färber 125d19c87f4SAndreas Färber if (n < 8) { 126d19c87f4SAndreas Färber /* g0..g7 */ 127d19c87f4SAndreas Färber env->gregs[n] = tmp; 128d19c87f4SAndreas Färber } else if (n < 32) { 129d19c87f4SAndreas Färber /* register window */ 130d19c87f4SAndreas Färber env->regwptr[n - 8] = tmp; 131d19c87f4SAndreas Färber } 132d19c87f4SAndreas Färber #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64) 133d19c87f4SAndreas Färber else if (n < 64) { 134d19c87f4SAndreas Färber /* fprs */ 135d19c87f4SAndreas Färber /* f0-f31 */ 136d19c87f4SAndreas Färber if (n & 1) { 137d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.lower = tmp; 138d19c87f4SAndreas Färber } else { 139d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.upper = tmp; 140d19c87f4SAndreas Färber } 141d19c87f4SAndreas Färber } else { 142d19c87f4SAndreas Färber /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ 143d19c87f4SAndreas Färber switch (n) { 144d19c87f4SAndreas Färber case 64: 145d19c87f4SAndreas Färber env->y = tmp; 146d19c87f4SAndreas Färber break; 147d19c87f4SAndreas Färber case 65: 148d19c87f4SAndreas Färber cpu_put_psr(env, tmp); 149d19c87f4SAndreas Färber break; 150d19c87f4SAndreas Färber case 66: 151d19c87f4SAndreas Färber env->wim = tmp; 152d19c87f4SAndreas Färber break; 153d19c87f4SAndreas Färber case 67: 154d19c87f4SAndreas Färber env->tbr = tmp; 155d19c87f4SAndreas Färber break; 156d19c87f4SAndreas Färber case 68: 157d19c87f4SAndreas Färber env->pc = tmp; 158d19c87f4SAndreas Färber break; 159d19c87f4SAndreas Färber case 69: 160d19c87f4SAndreas Färber env->npc = tmp; 161d19c87f4SAndreas Färber break; 162d19c87f4SAndreas Färber case 70: 1631ccd6e13SRichard Henderson cpu_put_fsr(env, tmp); 164d19c87f4SAndreas Färber break; 165d19c87f4SAndreas Färber default: 166d19c87f4SAndreas Färber return 0; 167d19c87f4SAndreas Färber } 168d19c87f4SAndreas Färber } 169d19c87f4SAndreas Färber return 4; 170d19c87f4SAndreas Färber #else 171d19c87f4SAndreas Färber else if (n < 64) { 172d19c87f4SAndreas Färber /* f0-f31 */ 173d19c87f4SAndreas Färber tmp = ldl_p(mem_buf); 174d19c87f4SAndreas Färber if (n & 1) { 175d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.lower = tmp; 176d19c87f4SAndreas Färber } else { 177d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.upper = tmp; 178d19c87f4SAndreas Färber } 179d19c87f4SAndreas Färber return 4; 180d19c87f4SAndreas Färber } else if (n < 80) { 181*7a74e468SMikael Szreder /* f32-f62 (16 double width registers, even register numbers only) 182*7a74e468SMikael Szreder * n == 64: f32 : env->fpr[16] 183*7a74e468SMikael Szreder * n == 65: f34 : env->fpr[17] 184*7a74e468SMikael Szreder * etc... 185*7a74e468SMikael Szreder * n == 79: f62 : env->fpr[31] 186*7a74e468SMikael Szreder */ 187*7a74e468SMikael Szreder env->fpr[(n - 64) + 16].ll = tmp; 188d19c87f4SAndreas Färber } else { 189d19c87f4SAndreas Färber switch (n) { 190d19c87f4SAndreas Färber case 80: 191d19c87f4SAndreas Färber env->pc = tmp; 192d19c87f4SAndreas Färber break; 193d19c87f4SAndreas Färber case 81: 194d19c87f4SAndreas Färber env->npc = tmp; 195d19c87f4SAndreas Färber break; 196d19c87f4SAndreas Färber case 82: 197d19c87f4SAndreas Färber cpu_put_ccr(env, tmp >> 32); 198d19c87f4SAndreas Färber env->asi = (tmp >> 24) & 0xff; 199d19c87f4SAndreas Färber env->pstate = (tmp >> 8) & 0xfff; 200d19c87f4SAndreas Färber cpu_put_cwp64(env, tmp & 0xff); 201d19c87f4SAndreas Färber break; 202d19c87f4SAndreas Färber case 83: 2031ccd6e13SRichard Henderson cpu_put_fsr(env, tmp); 204d19c87f4SAndreas Färber break; 205d19c87f4SAndreas Färber case 84: 206d19c87f4SAndreas Färber env->fprs = tmp; 207d19c87f4SAndreas Färber break; 208d19c87f4SAndreas Färber case 85: 209d19c87f4SAndreas Färber env->y = tmp; 210d19c87f4SAndreas Färber break; 211d19c87f4SAndreas Färber default: 212d19c87f4SAndreas Färber return 0; 213d19c87f4SAndreas Färber } 214d19c87f4SAndreas Färber } 215d19c87f4SAndreas Färber return 8; 216d19c87f4SAndreas Färber #endif 217d19c87f4SAndreas Färber } 218