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 10d19c87f4SAndreas Färber * version 2 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 */ 20d19c87f4SAndreas Färber 21d19c87f4SAndreas Färber #ifdef TARGET_ABI32 22d19c87f4SAndreas Färber #define GET_REGA(val) GET_REG32(val) 23d19c87f4SAndreas Färber #else 24d19c87f4SAndreas Färber #define GET_REGA(val) GET_REGL(val) 25d19c87f4SAndreas Färber #endif 26d19c87f4SAndreas Färber 27d19c87f4SAndreas Färber static int cpu_gdb_read_register(CPUSPARCState *env, uint8_t *mem_buf, int n) 28d19c87f4SAndreas Färber { 29d19c87f4SAndreas Färber if (n < 8) { 30d19c87f4SAndreas Färber /* g0..g7 */ 31d19c87f4SAndreas Färber GET_REGA(env->gregs[n]); 32d19c87f4SAndreas Färber } 33d19c87f4SAndreas Färber if (n < 32) { 34d19c87f4SAndreas Färber /* register window */ 35d19c87f4SAndreas Färber GET_REGA(env->regwptr[n - 8]); 36d19c87f4SAndreas Färber } 37d19c87f4SAndreas Färber #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64) 38d19c87f4SAndreas Färber if (n < 64) { 39d19c87f4SAndreas Färber /* fprs */ 40d19c87f4SAndreas Färber if (n & 1) { 41d19c87f4SAndreas Färber GET_REG32(env->fpr[(n - 32) / 2].l.lower); 42d19c87f4SAndreas Färber } else { 43d19c87f4SAndreas Färber GET_REG32(env->fpr[(n - 32) / 2].l.upper); 44d19c87f4SAndreas Färber } 45d19c87f4SAndreas Färber } 46d19c87f4SAndreas Färber /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ 47d19c87f4SAndreas Färber switch (n) { 48d19c87f4SAndreas Färber case 64: 49d19c87f4SAndreas Färber GET_REGA(env->y); 50d19c87f4SAndreas Färber case 65: 51d19c87f4SAndreas Färber GET_REGA(cpu_get_psr(env)); 52d19c87f4SAndreas Färber case 66: 53d19c87f4SAndreas Färber GET_REGA(env->wim); 54d19c87f4SAndreas Färber case 67: 55d19c87f4SAndreas Färber GET_REGA(env->tbr); 56d19c87f4SAndreas Färber case 68: 57d19c87f4SAndreas Färber GET_REGA(env->pc); 58d19c87f4SAndreas Färber case 69: 59d19c87f4SAndreas Färber GET_REGA(env->npc); 60d19c87f4SAndreas Färber case 70: 61d19c87f4SAndreas Färber GET_REGA(env->fsr); 62d19c87f4SAndreas Färber case 71: 63d19c87f4SAndreas Färber GET_REGA(0); /* csr */ 64d19c87f4SAndreas Färber default: 65d19c87f4SAndreas Färber GET_REGA(0); 66d19c87f4SAndreas Färber } 67d19c87f4SAndreas Färber #else 68d19c87f4SAndreas Färber if (n < 64) { 69d19c87f4SAndreas Färber /* f0-f31 */ 70d19c87f4SAndreas Färber if (n & 1) { 71d19c87f4SAndreas Färber GET_REG32(env->fpr[(n - 32) / 2].l.lower); 72d19c87f4SAndreas Färber } else { 73d19c87f4SAndreas Färber GET_REG32(env->fpr[(n - 32) / 2].l.upper); 74d19c87f4SAndreas Färber } 75d19c87f4SAndreas Färber } 76d19c87f4SAndreas Färber if (n < 80) { 77d19c87f4SAndreas Färber /* f32-f62 (double width, even numbers only) */ 78d19c87f4SAndreas Färber GET_REG64(env->fpr[(n - 32) / 2].ll); 79d19c87f4SAndreas Färber } 80d19c87f4SAndreas Färber switch (n) { 81d19c87f4SAndreas Färber case 80: 82d19c87f4SAndreas Färber GET_REGL(env->pc); 83d19c87f4SAndreas Färber case 81: 84d19c87f4SAndreas Färber GET_REGL(env->npc); 85d19c87f4SAndreas Färber case 82: 86d19c87f4SAndreas Färber GET_REGL((cpu_get_ccr(env) << 32) | 87d19c87f4SAndreas Färber ((env->asi & 0xff) << 24) | 88d19c87f4SAndreas Färber ((env->pstate & 0xfff) << 8) | 89d19c87f4SAndreas Färber cpu_get_cwp64(env)); 90d19c87f4SAndreas Färber case 83: 91d19c87f4SAndreas Färber GET_REGL(env->fsr); 92d19c87f4SAndreas Färber case 84: 93d19c87f4SAndreas Färber GET_REGL(env->fprs); 94d19c87f4SAndreas Färber case 85: 95d19c87f4SAndreas Färber GET_REGL(env->y); 96d19c87f4SAndreas Färber } 97d19c87f4SAndreas Färber #endif 98d19c87f4SAndreas Färber return 0; 99d19c87f4SAndreas Färber } 100d19c87f4SAndreas Färber 101d19c87f4SAndreas Färber static int cpu_gdb_write_register(CPUSPARCState *env, uint8_t *mem_buf, int n) 102d19c87f4SAndreas Färber { 103d19c87f4SAndreas Färber #if defined(TARGET_ABI32) 104d19c87f4SAndreas Färber abi_ulong tmp; 105d19c87f4SAndreas Färber 106d19c87f4SAndreas Färber tmp = ldl_p(mem_buf); 107d19c87f4SAndreas Färber #else 108d19c87f4SAndreas Färber target_ulong tmp; 109d19c87f4SAndreas Färber 110d19c87f4SAndreas Färber tmp = ldtul_p(mem_buf); 111d19c87f4SAndreas Färber #endif 112d19c87f4SAndreas Färber 113d19c87f4SAndreas Färber if (n < 8) { 114d19c87f4SAndreas Färber /* g0..g7 */ 115d19c87f4SAndreas Färber env->gregs[n] = tmp; 116d19c87f4SAndreas Färber } else if (n < 32) { 117d19c87f4SAndreas Färber /* register window */ 118d19c87f4SAndreas Färber env->regwptr[n - 8] = tmp; 119d19c87f4SAndreas Färber } 120d19c87f4SAndreas Färber #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64) 121d19c87f4SAndreas Färber else if (n < 64) { 122d19c87f4SAndreas Färber /* fprs */ 123d19c87f4SAndreas Färber /* f0-f31 */ 124d19c87f4SAndreas Färber if (n & 1) { 125d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.lower = tmp; 126d19c87f4SAndreas Färber } else { 127d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.upper = tmp; 128d19c87f4SAndreas Färber } 129d19c87f4SAndreas Färber } else { 130d19c87f4SAndreas Färber /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ 131d19c87f4SAndreas Färber switch (n) { 132d19c87f4SAndreas Färber case 64: 133d19c87f4SAndreas Färber env->y = tmp; 134d19c87f4SAndreas Färber break; 135d19c87f4SAndreas Färber case 65: 136d19c87f4SAndreas Färber cpu_put_psr(env, tmp); 137d19c87f4SAndreas Färber break; 138d19c87f4SAndreas Färber case 66: 139d19c87f4SAndreas Färber env->wim = tmp; 140d19c87f4SAndreas Färber break; 141d19c87f4SAndreas Färber case 67: 142d19c87f4SAndreas Färber env->tbr = tmp; 143d19c87f4SAndreas Färber break; 144d19c87f4SAndreas Färber case 68: 145d19c87f4SAndreas Färber env->pc = tmp; 146d19c87f4SAndreas Färber break; 147d19c87f4SAndreas Färber case 69: 148d19c87f4SAndreas Färber env->npc = tmp; 149d19c87f4SAndreas Färber break; 150d19c87f4SAndreas Färber case 70: 151d19c87f4SAndreas Färber env->fsr = tmp; 152d19c87f4SAndreas Färber break; 153d19c87f4SAndreas Färber default: 154d19c87f4SAndreas Färber return 0; 155d19c87f4SAndreas Färber } 156d19c87f4SAndreas Färber } 157d19c87f4SAndreas Färber return 4; 158d19c87f4SAndreas Färber #else 159d19c87f4SAndreas Färber else if (n < 64) { 160d19c87f4SAndreas Färber /* f0-f31 */ 161d19c87f4SAndreas Färber tmp = ldl_p(mem_buf); 162d19c87f4SAndreas Färber if (n & 1) { 163d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.lower = tmp; 164d19c87f4SAndreas Färber } else { 165d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].l.upper = tmp; 166d19c87f4SAndreas Färber } 167d19c87f4SAndreas Färber return 4; 168d19c87f4SAndreas Färber } else if (n < 80) { 169d19c87f4SAndreas Färber /* f32-f62 (double width, even numbers only) */ 170d19c87f4SAndreas Färber env->fpr[(n - 32) / 2].ll = tmp; 171d19c87f4SAndreas Färber } else { 172d19c87f4SAndreas Färber switch (n) { 173d19c87f4SAndreas Färber case 80: 174d19c87f4SAndreas Färber env->pc = tmp; 175d19c87f4SAndreas Färber break; 176d19c87f4SAndreas Färber case 81: 177d19c87f4SAndreas Färber env->npc = tmp; 178d19c87f4SAndreas Färber break; 179d19c87f4SAndreas Färber case 82: 180d19c87f4SAndreas Färber cpu_put_ccr(env, tmp >> 32); 181d19c87f4SAndreas Färber env->asi = (tmp >> 24) & 0xff; 182d19c87f4SAndreas Färber env->pstate = (tmp >> 8) & 0xfff; 183d19c87f4SAndreas Färber cpu_put_cwp64(env, tmp & 0xff); 184d19c87f4SAndreas Färber break; 185d19c87f4SAndreas Färber case 83: 186d19c87f4SAndreas Färber env->fsr = tmp; 187d19c87f4SAndreas Färber break; 188d19c87f4SAndreas Färber case 84: 189d19c87f4SAndreas Färber env->fprs = tmp; 190d19c87f4SAndreas Färber break; 191d19c87f4SAndreas Färber case 85: 192d19c87f4SAndreas Färber env->y = tmp; 193d19c87f4SAndreas Färber break; 194d19c87f4SAndreas Färber default: 195d19c87f4SAndreas Färber return 0; 196d19c87f4SAndreas Färber } 197d19c87f4SAndreas Färber } 198d19c87f4SAndreas Färber return 8; 199d19c87f4SAndreas Färber #endif 200d19c87f4SAndreas Färber } 201