161766fe9SRichard Henderson /* 261766fe9SRichard Henderson * HPPA gdb server stub 361766fe9SRichard Henderson * 461766fe9SRichard Henderson * Copyright (c) 2016 Richard Henderson <rth@twiddle.net> 561766fe9SRichard Henderson * 661766fe9SRichard Henderson * This library is free software; you can redistribute it and/or 761766fe9SRichard Henderson * modify it under the terms of the GNU Lesser General Public 861766fe9SRichard Henderson * License as published by the Free Software Foundation; either 9d6ea4236SChetan Pant * version 2.1 of the License, or (at your option) any later version. 1061766fe9SRichard Henderson * 1161766fe9SRichard Henderson * This library is distributed in the hope that it will be useful, 1261766fe9SRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of 1361766fe9SRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1461766fe9SRichard Henderson * Lesser General Public License for more details. 1561766fe9SRichard Henderson * 1661766fe9SRichard Henderson * You should have received a copy of the GNU Lesser General Public 1761766fe9SRichard Henderson * License along with this library; if not, see <http://www.gnu.org/licenses/>. 1861766fe9SRichard Henderson */ 1961766fe9SRichard Henderson 2061766fe9SRichard Henderson #include "qemu/osdep.h" 2161766fe9SRichard Henderson #include "cpu.h" 224ea5fe99SAlex Bennée #include "gdbstub/helpers.h" 2361766fe9SRichard Henderson 24*e207b4aaSRichard Henderson /* 25*e207b4aaSRichard Henderson * GDB 15 only supports PA1.0 via the remote protocol, and ignores 26*e207b4aaSRichard Henderson * any provided xml. Which means that any attempt to provide more 27*e207b4aaSRichard Henderson * data results in "Remote 'g' packet reply is too long". 28*e207b4aaSRichard Henderson */ 29*e207b4aaSRichard Henderson 30a010bdbeSAlex Bennée int hppa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) 3161766fe9SRichard Henderson { 32*e207b4aaSRichard Henderson CPUHPPAState *env = cpu_env(cs); 33*e207b4aaSRichard Henderson uint32_t val; 3461766fe9SRichard Henderson 3561766fe9SRichard Henderson switch (n) { 3661766fe9SRichard Henderson case 0: 3761766fe9SRichard Henderson val = cpu_hppa_get_psw(env); 3861766fe9SRichard Henderson break; 3961766fe9SRichard Henderson case 1 ... 31: 4061766fe9SRichard Henderson val = env->gr[n]; 4161766fe9SRichard Henderson break; 4261766fe9SRichard Henderson case 32: 4335136a77SRichard Henderson val = env->cr[CR_SAR]; 4461766fe9SRichard Henderson break; 4561766fe9SRichard Henderson case 33: 4661766fe9SRichard Henderson val = env->iaoq_f; 4761766fe9SRichard Henderson break; 48e33348a6SRichard Henderson case 34: 49e33348a6SRichard Henderson val = env->iasq_f >> 32; 50e33348a6SRichard Henderson break; 5161766fe9SRichard Henderson case 35: 5261766fe9SRichard Henderson val = env->iaoq_b; 5361766fe9SRichard Henderson break; 54e33348a6SRichard Henderson case 36: 55e33348a6SRichard Henderson val = env->iasq_b >> 32; 56e33348a6SRichard Henderson break; 57e33348a6SRichard Henderson case 37: 58e33348a6SRichard Henderson val = env->cr[CR_EIEM]; 59e33348a6SRichard Henderson break; 60e33348a6SRichard Henderson case 38: 61e33348a6SRichard Henderson val = env->cr[CR_IIR]; 62e33348a6SRichard Henderson break; 63e33348a6SRichard Henderson case 39: 64e33348a6SRichard Henderson val = env->cr[CR_ISR]; 65e33348a6SRichard Henderson break; 66e33348a6SRichard Henderson case 40: 67e33348a6SRichard Henderson val = env->cr[CR_IOR]; 68e33348a6SRichard Henderson break; 69e33348a6SRichard Henderson case 41: 70e33348a6SRichard Henderson val = env->cr[CR_IPSW]; 71e33348a6SRichard Henderson break; 72e33348a6SRichard Henderson case 43: 73e33348a6SRichard Henderson val = env->sr[4] >> 32; 74e33348a6SRichard Henderson break; 75e33348a6SRichard Henderson case 44: 76e33348a6SRichard Henderson val = env->sr[0] >> 32; 77e33348a6SRichard Henderson break; 78e33348a6SRichard Henderson case 45: 79e33348a6SRichard Henderson val = env->sr[1] >> 32; 80e33348a6SRichard Henderson break; 81e33348a6SRichard Henderson case 46: 82e33348a6SRichard Henderson val = env->sr[2] >> 32; 83e33348a6SRichard Henderson break; 84e33348a6SRichard Henderson case 47: 85e33348a6SRichard Henderson val = env->sr[3] >> 32; 86e33348a6SRichard Henderson break; 87e33348a6SRichard Henderson case 48: 88e33348a6SRichard Henderson val = env->sr[5] >> 32; 89e33348a6SRichard Henderson break; 90e33348a6SRichard Henderson case 49: 91e33348a6SRichard Henderson val = env->sr[6] >> 32; 92e33348a6SRichard Henderson break; 93e33348a6SRichard Henderson case 50: 94e33348a6SRichard Henderson val = env->sr[7] >> 32; 95e33348a6SRichard Henderson break; 96e33348a6SRichard Henderson case 51: 97e33348a6SRichard Henderson val = env->cr[CR_RC]; 98e33348a6SRichard Henderson break; 99e33348a6SRichard Henderson case 52: 100d5de20bdSSven Schnelle val = env->cr[CR_PID1]; 101e33348a6SRichard Henderson break; 102e33348a6SRichard Henderson case 53: 103d5de20bdSSven Schnelle val = env->cr[CR_PID2]; 104e33348a6SRichard Henderson break; 105e33348a6SRichard Henderson case 54: 106e33348a6SRichard Henderson val = env->cr[CR_SCRCCR]; 107e33348a6SRichard Henderson break; 108e33348a6SRichard Henderson case 55: 109d5de20bdSSven Schnelle val = env->cr[CR_PID3]; 110e33348a6SRichard Henderson break; 111e33348a6SRichard Henderson case 56: 112d5de20bdSSven Schnelle val = env->cr[CR_PID4]; 113e33348a6SRichard Henderson break; 114e33348a6SRichard Henderson case 57: 115e33348a6SRichard Henderson val = env->cr[24]; 116e33348a6SRichard Henderson break; 117e33348a6SRichard Henderson case 58: 118e33348a6SRichard Henderson val = env->cr[25]; 119e33348a6SRichard Henderson break; 12061766fe9SRichard Henderson case 59: 12135136a77SRichard Henderson val = env->cr[26]; 12261766fe9SRichard Henderson break; 12361766fe9SRichard Henderson case 60: 12435136a77SRichard Henderson val = env->cr[27]; 12561766fe9SRichard Henderson break; 126e33348a6SRichard Henderson case 61: 127e33348a6SRichard Henderson val = env->cr[28]; 128e33348a6SRichard Henderson break; 129e33348a6SRichard Henderson case 62: 130e33348a6SRichard Henderson val = env->cr[29]; 131e33348a6SRichard Henderson break; 132e33348a6SRichard Henderson case 63: 133e33348a6SRichard Henderson val = env->cr[30]; 134e33348a6SRichard Henderson break; 13561766fe9SRichard Henderson case 64 ... 127: 13661766fe9SRichard Henderson val = extract64(env->fr[(n - 64) / 2], (n & 1 ? 0 : 32), 32); 13761766fe9SRichard Henderson break; 13861766fe9SRichard Henderson default: 13961766fe9SRichard Henderson if (n < 128) { 14061766fe9SRichard Henderson val = 0; 14161766fe9SRichard Henderson } else { 14261766fe9SRichard Henderson return 0; 14361766fe9SRichard Henderson } 14461766fe9SRichard Henderson break; 14561766fe9SRichard Henderson } 146eaa3783bSRichard Henderson 147eaa3783bSRichard Henderson return gdb_get_reg32(mem_buf, val); 148eaa3783bSRichard Henderson } 14961766fe9SRichard Henderson 15061766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 15161766fe9SRichard Henderson { 152*e207b4aaSRichard Henderson CPUHPPAState *env = cpu_env(cs); 153*e207b4aaSRichard Henderson uint32_t val = ldl_p(mem_buf); 15461766fe9SRichard Henderson 15561766fe9SRichard Henderson switch (n) { 15661766fe9SRichard Henderson case 0: 15761766fe9SRichard Henderson cpu_hppa_put_psw(env, val); 15861766fe9SRichard Henderson break; 15961766fe9SRichard Henderson case 1 ... 31: 16061766fe9SRichard Henderson env->gr[n] = val; 16161766fe9SRichard Henderson break; 16261766fe9SRichard Henderson case 32: 163*e207b4aaSRichard Henderson env->cr[CR_SAR] = val & (hppa_is_pa20(env) ? 63 : 31); 16461766fe9SRichard Henderson break; 16561766fe9SRichard Henderson case 33: 16661766fe9SRichard Henderson env->iaoq_f = val; 16761766fe9SRichard Henderson break; 168e33348a6SRichard Henderson case 34: 169e33348a6SRichard Henderson env->iasq_f = (uint64_t)val << 32; 170e33348a6SRichard Henderson break; 17161766fe9SRichard Henderson case 35: 17261766fe9SRichard Henderson env->iaoq_b = val; 1736836a8fbSRichard Henderson break; 174e33348a6SRichard Henderson case 36: 175e33348a6SRichard Henderson env->iasq_b = (uint64_t)val << 32; 176e33348a6SRichard Henderson break; 177e33348a6SRichard Henderson case 37: 178e33348a6SRichard Henderson env->cr[CR_EIEM] = val; 179e33348a6SRichard Henderson break; 180e33348a6SRichard Henderson case 38: 181e33348a6SRichard Henderson env->cr[CR_IIR] = val; 182e33348a6SRichard Henderson break; 183e33348a6SRichard Henderson case 39: 184e33348a6SRichard Henderson env->cr[CR_ISR] = val; 185e33348a6SRichard Henderson break; 186e33348a6SRichard Henderson case 40: 187e33348a6SRichard Henderson env->cr[CR_IOR] = val; 188e33348a6SRichard Henderson break; 189e33348a6SRichard Henderson case 41: 190e33348a6SRichard Henderson env->cr[CR_IPSW] = val; 191e33348a6SRichard Henderson break; 192e33348a6SRichard Henderson case 43: 193e33348a6SRichard Henderson env->sr[4] = (uint64_t)val << 32; 194e33348a6SRichard Henderson break; 195e33348a6SRichard Henderson case 44: 196e33348a6SRichard Henderson env->sr[0] = (uint64_t)val << 32; 197e33348a6SRichard Henderson break; 198e33348a6SRichard Henderson case 45: 199e33348a6SRichard Henderson env->sr[1] = (uint64_t)val << 32; 200e33348a6SRichard Henderson break; 201e33348a6SRichard Henderson case 46: 202e33348a6SRichard Henderson env->sr[2] = (uint64_t)val << 32; 203e33348a6SRichard Henderson break; 204e33348a6SRichard Henderson case 47: 205e33348a6SRichard Henderson env->sr[3] = (uint64_t)val << 32; 206e33348a6SRichard Henderson break; 207e33348a6SRichard Henderson case 48: 208e33348a6SRichard Henderson env->sr[5] = (uint64_t)val << 32; 209e33348a6SRichard Henderson break; 210e33348a6SRichard Henderson case 49: 211e33348a6SRichard Henderson env->sr[6] = (uint64_t)val << 32; 212e33348a6SRichard Henderson break; 213e33348a6SRichard Henderson case 50: 214e33348a6SRichard Henderson env->sr[7] = (uint64_t)val << 32; 215e33348a6SRichard Henderson break; 216e33348a6SRichard Henderson case 51: 217e33348a6SRichard Henderson env->cr[CR_RC] = val; 218e33348a6SRichard Henderson break; 219e33348a6SRichard Henderson case 52: 220d5de20bdSSven Schnelle env->cr[CR_PID1] = val; 221d5de20bdSSven Schnelle cpu_hppa_change_prot_id(env); 222e33348a6SRichard Henderson break; 223e33348a6SRichard Henderson case 53: 224d5de20bdSSven Schnelle env->cr[CR_PID2] = val; 225d5de20bdSSven Schnelle cpu_hppa_change_prot_id(env); 226e33348a6SRichard Henderson break; 227e33348a6SRichard Henderson case 54: 228e33348a6SRichard Henderson env->cr[CR_SCRCCR] = val; 229e33348a6SRichard Henderson break; 230e33348a6SRichard Henderson case 55: 231d5de20bdSSven Schnelle env->cr[CR_PID3] = val; 232d5de20bdSSven Schnelle cpu_hppa_change_prot_id(env); 233e33348a6SRichard Henderson break; 234e33348a6SRichard Henderson case 56: 235d5de20bdSSven Schnelle env->cr[CR_PID4] = val; 236d5de20bdSSven Schnelle cpu_hppa_change_prot_id(env); 237e33348a6SRichard Henderson break; 238e33348a6SRichard Henderson case 57: 239e33348a6SRichard Henderson env->cr[24] = val; 240e33348a6SRichard Henderson break; 241e33348a6SRichard Henderson case 58: 242e33348a6SRichard Henderson env->cr[25] = val; 243e33348a6SRichard Henderson break; 24461766fe9SRichard Henderson case 59: 24535136a77SRichard Henderson env->cr[26] = val; 24661766fe9SRichard Henderson break; 24761766fe9SRichard Henderson case 60: 24835136a77SRichard Henderson env->cr[27] = val; 24961766fe9SRichard Henderson break; 250e33348a6SRichard Henderson case 61: 251e33348a6SRichard Henderson env->cr[28] = val; 252e33348a6SRichard Henderson break; 253e33348a6SRichard Henderson case 62: 254e33348a6SRichard Henderson env->cr[29] = val; 255e33348a6SRichard Henderson break; 256e33348a6SRichard Henderson case 63: 257e33348a6SRichard Henderson env->cr[30] = val; 258e33348a6SRichard Henderson break; 25961766fe9SRichard Henderson case 64: 26061766fe9SRichard Henderson env->fr[0] = deposit64(env->fr[0], 32, 32, val); 26161766fe9SRichard Henderson cpu_hppa_loaded_fr0(env); 26261766fe9SRichard Henderson break; 26361766fe9SRichard Henderson case 65 ... 127: 26461766fe9SRichard Henderson { 26561766fe9SRichard Henderson uint64_t *fr = &env->fr[(n - 64) / 2]; 2665c41496dSSven Schnelle *fr = deposit64(*fr, (n & 1 ? 0 : 32), 32, val); 26761766fe9SRichard Henderson } 26861766fe9SRichard Henderson break; 26961766fe9SRichard Henderson default: 27061766fe9SRichard Henderson if (n >= 128) { 27161766fe9SRichard Henderson return 0; 27261766fe9SRichard Henderson } 27361766fe9SRichard Henderson break; 27461766fe9SRichard Henderson } 275*e207b4aaSRichard Henderson return 4; 27661766fe9SRichard Henderson } 277