1c3ce8eb3SAndreas Färber /* 2c3ce8eb3SAndreas Färber * Alpha gdb server stub 3c3ce8eb3SAndreas Färber * 4c3ce8eb3SAndreas Färber * Copyright (c) 2003-2005 Fabrice Bellard 5c3ce8eb3SAndreas Färber * Copyright (c) 2013 SUSE LINUX Products GmbH 6c3ce8eb3SAndreas Färber * 7c3ce8eb3SAndreas Färber * This library is free software; you can redistribute it and/or 8c3ce8eb3SAndreas Färber * modify it under the terms of the GNU Lesser General Public 9c3ce8eb3SAndreas Färber * License as published by the Free Software Foundation; either 10c3ce8eb3SAndreas Färber * version 2 of the License, or (at your option) any later version. 11c3ce8eb3SAndreas Färber * 12c3ce8eb3SAndreas Färber * This library is distributed in the hope that it will be useful, 13c3ce8eb3SAndreas Färber * but WITHOUT ANY WARRANTY; without even the implied warranty of 14c3ce8eb3SAndreas Färber * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15c3ce8eb3SAndreas Färber * Lesser General Public License for more details. 16c3ce8eb3SAndreas Färber * 17c3ce8eb3SAndreas Färber * You should have received a copy of the GNU Lesser General Public 18c3ce8eb3SAndreas Färber * License along with this library; if not, see <http://www.gnu.org/licenses/>. 19c3ce8eb3SAndreas Färber */ 205b50e790SAndreas Färber #include "config.h" 215b50e790SAndreas Färber #include "qemu-common.h" 225b50e790SAndreas Färber #include "exec/gdbstub.h" 23c3ce8eb3SAndreas Färber 245b50e790SAndreas Färber int alpha_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) 25c3ce8eb3SAndreas Färber { 265b50e790SAndreas Färber AlphaCPU *cpu = ALPHA_CPU(cs); 275b50e790SAndreas Färber CPUAlphaState *env = &cpu->env; 28c3ce8eb3SAndreas Färber uint64_t val; 29c3ce8eb3SAndreas Färber CPU_DoubleU d; 30c3ce8eb3SAndreas Färber 31c3ce8eb3SAndreas Färber switch (n) { 32c3ce8eb3SAndreas Färber case 0 ... 30: 3359124384SRichard Henderson val = cpu_alpha_load_gr(env, n); 34c3ce8eb3SAndreas Färber break; 35c3ce8eb3SAndreas Färber case 32 ... 62: 36c3ce8eb3SAndreas Färber d.d = env->fir[n - 32]; 37c3ce8eb3SAndreas Färber val = d.ll; 38c3ce8eb3SAndreas Färber break; 39c3ce8eb3SAndreas Färber case 63: 40c3ce8eb3SAndreas Färber val = cpu_alpha_load_fpcr(env); 41c3ce8eb3SAndreas Färber break; 42c3ce8eb3SAndreas Färber case 64: 43c3ce8eb3SAndreas Färber val = env->pc; 44c3ce8eb3SAndreas Färber break; 45c3ce8eb3SAndreas Färber case 66: 46c3ce8eb3SAndreas Färber val = env->unique; 47c3ce8eb3SAndreas Färber break; 48c3ce8eb3SAndreas Färber case 31: 49c3ce8eb3SAndreas Färber case 65: 50c3ce8eb3SAndreas Färber /* 31 really is the zero register; 65 is unassigned in the 51c3ce8eb3SAndreas Färber gdb protocol, but is still required to occupy 8 bytes. */ 52c3ce8eb3SAndreas Färber val = 0; 53c3ce8eb3SAndreas Färber break; 54c3ce8eb3SAndreas Färber default: 55c3ce8eb3SAndreas Färber return 0; 56c3ce8eb3SAndreas Färber } 57986a2998SAndreas Färber return gdb_get_regl(mem_buf, val); 58c3ce8eb3SAndreas Färber } 59c3ce8eb3SAndreas Färber 605b50e790SAndreas Färber int alpha_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 61c3ce8eb3SAndreas Färber { 625b50e790SAndreas Färber AlphaCPU *cpu = ALPHA_CPU(cs); 635b50e790SAndreas Färber CPUAlphaState *env = &cpu->env; 64c3ce8eb3SAndreas Färber target_ulong tmp = ldtul_p(mem_buf); 65c3ce8eb3SAndreas Färber CPU_DoubleU d; 66c3ce8eb3SAndreas Färber 67c3ce8eb3SAndreas Färber switch (n) { 68c3ce8eb3SAndreas Färber case 0 ... 30: 6959124384SRichard Henderson cpu_alpha_store_gr(env, n, tmp); 70c3ce8eb3SAndreas Färber break; 71c3ce8eb3SAndreas Färber case 32 ... 62: 72c3ce8eb3SAndreas Färber d.ll = tmp; 73c3ce8eb3SAndreas Färber env->fir[n - 32] = d.d; 74c3ce8eb3SAndreas Färber break; 75c3ce8eb3SAndreas Färber case 63: 76c3ce8eb3SAndreas Färber cpu_alpha_store_fpcr(env, tmp); 77c3ce8eb3SAndreas Färber break; 78c3ce8eb3SAndreas Färber case 64: 79c3ce8eb3SAndreas Färber env->pc = tmp; 80c3ce8eb3SAndreas Färber break; 81c3ce8eb3SAndreas Färber case 66: 82c3ce8eb3SAndreas Färber env->unique = tmp; 83c3ce8eb3SAndreas Färber break; 84c3ce8eb3SAndreas Färber case 31: 85c3ce8eb3SAndreas Färber case 65: 86c3ce8eb3SAndreas Färber /* 31 really is the zero register; 65 is unassigned in the 87c3ce8eb3SAndreas Färber gdb protocol, but is still required to occupy 8 bytes. */ 88c3ce8eb3SAndreas Färber break; 89c3ce8eb3SAndreas Färber default: 90c3ce8eb3SAndreas Färber return 0; 91c3ce8eb3SAndreas Färber } 92c3ce8eb3SAndreas Färber return 8; 93c3ce8eb3SAndreas Färber } 94