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 */ 20c3ce8eb3SAndreas Färber 21c3ce8eb3SAndreas Färber static int cpu_gdb_read_register(CPUAlphaState *env, uint8_t *mem_buf, int n) 22c3ce8eb3SAndreas Färber { 23c3ce8eb3SAndreas Färber uint64_t val; 24c3ce8eb3SAndreas Färber CPU_DoubleU d; 25c3ce8eb3SAndreas Färber 26c3ce8eb3SAndreas Färber switch (n) { 27c3ce8eb3SAndreas Färber case 0 ... 30: 28c3ce8eb3SAndreas Färber val = env->ir[n]; 29c3ce8eb3SAndreas Färber break; 30c3ce8eb3SAndreas Färber case 32 ... 62: 31c3ce8eb3SAndreas Färber d.d = env->fir[n - 32]; 32c3ce8eb3SAndreas Färber val = d.ll; 33c3ce8eb3SAndreas Färber break; 34c3ce8eb3SAndreas Färber case 63: 35c3ce8eb3SAndreas Färber val = cpu_alpha_load_fpcr(env); 36c3ce8eb3SAndreas Färber break; 37c3ce8eb3SAndreas Färber case 64: 38c3ce8eb3SAndreas Färber val = env->pc; 39c3ce8eb3SAndreas Färber break; 40c3ce8eb3SAndreas Färber case 66: 41c3ce8eb3SAndreas Färber val = env->unique; 42c3ce8eb3SAndreas Färber break; 43c3ce8eb3SAndreas Färber case 31: 44c3ce8eb3SAndreas Färber case 65: 45c3ce8eb3SAndreas Färber /* 31 really is the zero register; 65 is unassigned in the 46c3ce8eb3SAndreas Färber gdb protocol, but is still required to occupy 8 bytes. */ 47c3ce8eb3SAndreas Färber val = 0; 48c3ce8eb3SAndreas Färber break; 49c3ce8eb3SAndreas Färber default: 50c3ce8eb3SAndreas Färber return 0; 51c3ce8eb3SAndreas Färber } 52986a2998SAndreas Färber return gdb_get_regl(mem_buf, val); 53c3ce8eb3SAndreas Färber } 54c3ce8eb3SAndreas Färber 55c3ce8eb3SAndreas Färber static int cpu_gdb_write_register(CPUAlphaState *env, uint8_t *mem_buf, int n) 56c3ce8eb3SAndreas Färber { 57c3ce8eb3SAndreas Färber target_ulong tmp = ldtul_p(mem_buf); 58c3ce8eb3SAndreas Färber CPU_DoubleU d; 59c3ce8eb3SAndreas Färber 60c3ce8eb3SAndreas Färber switch (n) { 61c3ce8eb3SAndreas Färber case 0 ... 30: 62c3ce8eb3SAndreas Färber env->ir[n] = tmp; 63c3ce8eb3SAndreas Färber break; 64c3ce8eb3SAndreas Färber case 32 ... 62: 65c3ce8eb3SAndreas Färber d.ll = tmp; 66c3ce8eb3SAndreas Färber env->fir[n - 32] = d.d; 67c3ce8eb3SAndreas Färber break; 68c3ce8eb3SAndreas Färber case 63: 69c3ce8eb3SAndreas Färber cpu_alpha_store_fpcr(env, tmp); 70c3ce8eb3SAndreas Färber break; 71c3ce8eb3SAndreas Färber case 64: 72c3ce8eb3SAndreas Färber env->pc = tmp; 73c3ce8eb3SAndreas Färber break; 74c3ce8eb3SAndreas Färber case 66: 75c3ce8eb3SAndreas Färber env->unique = tmp; 76c3ce8eb3SAndreas Färber break; 77c3ce8eb3SAndreas Färber case 31: 78c3ce8eb3SAndreas Färber case 65: 79c3ce8eb3SAndreas Färber /* 31 really is the zero register; 65 is unassigned in the 80c3ce8eb3SAndreas Färber gdb protocol, but is still required to occupy 8 bytes. */ 81c3ce8eb3SAndreas Färber break; 82c3ce8eb3SAndreas Färber default: 83c3ce8eb3SAndreas Färber return 0; 84c3ce8eb3SAndreas Färber } 85c3ce8eb3SAndreas Färber return 8; 86c3ce8eb3SAndreas Färber } 87