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 961766fe9SRichard Henderson * version 2 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 "qemu-common.h" 2261766fe9SRichard Henderson #include "cpu.h" 2361766fe9SRichard Henderson #include "exec/gdbstub.h" 2461766fe9SRichard Henderson 2561766fe9SRichard Henderson int hppa_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) 2661766fe9SRichard Henderson { 2761766fe9SRichard Henderson HPPACPU *cpu = HPPA_CPU(cs); 2861766fe9SRichard Henderson CPUHPPAState *env = &cpu->env; 29eaa3783bSRichard Henderson target_ureg val; 3061766fe9SRichard Henderson 3161766fe9SRichard Henderson switch (n) { 3261766fe9SRichard Henderson case 0: 3361766fe9SRichard Henderson val = cpu_hppa_get_psw(env); 3461766fe9SRichard Henderson break; 3561766fe9SRichard Henderson case 1 ... 31: 3661766fe9SRichard Henderson val = env->gr[n]; 3761766fe9SRichard Henderson break; 3861766fe9SRichard Henderson case 32: 3935136a77SRichard Henderson val = env->cr[CR_SAR]; 4061766fe9SRichard Henderson break; 4161766fe9SRichard Henderson case 33: 4261766fe9SRichard Henderson val = env->iaoq_f; 4361766fe9SRichard Henderson break; 44*e33348a6SRichard Henderson case 34: 45*e33348a6SRichard Henderson val = env->iasq_f >> 32; 46*e33348a6SRichard Henderson break; 4761766fe9SRichard Henderson case 35: 4861766fe9SRichard Henderson val = env->iaoq_b; 4961766fe9SRichard Henderson break; 50*e33348a6SRichard Henderson case 36: 51*e33348a6SRichard Henderson val = env->iasq_b >> 32; 52*e33348a6SRichard Henderson break; 53*e33348a6SRichard Henderson case 37: 54*e33348a6SRichard Henderson val = env->cr[CR_EIEM]; 55*e33348a6SRichard Henderson break; 56*e33348a6SRichard Henderson case 38: 57*e33348a6SRichard Henderson val = env->cr[CR_IIR]; 58*e33348a6SRichard Henderson break; 59*e33348a6SRichard Henderson case 39: 60*e33348a6SRichard Henderson val = env->cr[CR_ISR]; 61*e33348a6SRichard Henderson break; 62*e33348a6SRichard Henderson case 40: 63*e33348a6SRichard Henderson val = env->cr[CR_IOR]; 64*e33348a6SRichard Henderson break; 65*e33348a6SRichard Henderson case 41: 66*e33348a6SRichard Henderson val = env->cr[CR_IPSW]; 67*e33348a6SRichard Henderson break; 68*e33348a6SRichard Henderson case 43: 69*e33348a6SRichard Henderson val = env->sr[4] >> 32; 70*e33348a6SRichard Henderson break; 71*e33348a6SRichard Henderson case 44: 72*e33348a6SRichard Henderson val = env->sr[0] >> 32; 73*e33348a6SRichard Henderson break; 74*e33348a6SRichard Henderson case 45: 75*e33348a6SRichard Henderson val = env->sr[1] >> 32; 76*e33348a6SRichard Henderson break; 77*e33348a6SRichard Henderson case 46: 78*e33348a6SRichard Henderson val = env->sr[2] >> 32; 79*e33348a6SRichard Henderson break; 80*e33348a6SRichard Henderson case 47: 81*e33348a6SRichard Henderson val = env->sr[3] >> 32; 82*e33348a6SRichard Henderson break; 83*e33348a6SRichard Henderson case 48: 84*e33348a6SRichard Henderson val = env->sr[5] >> 32; 85*e33348a6SRichard Henderson break; 86*e33348a6SRichard Henderson case 49: 87*e33348a6SRichard Henderson val = env->sr[6] >> 32; 88*e33348a6SRichard Henderson break; 89*e33348a6SRichard Henderson case 50: 90*e33348a6SRichard Henderson val = env->sr[7] >> 32; 91*e33348a6SRichard Henderson break; 92*e33348a6SRichard Henderson case 51: 93*e33348a6SRichard Henderson val = env->cr[CR_RC]; 94*e33348a6SRichard Henderson break; 95*e33348a6SRichard Henderson case 52: 96*e33348a6SRichard Henderson val = env->cr[8]; 97*e33348a6SRichard Henderson break; 98*e33348a6SRichard Henderson case 53: 99*e33348a6SRichard Henderson val = env->cr[9]; 100*e33348a6SRichard Henderson break; 101*e33348a6SRichard Henderson case 54: 102*e33348a6SRichard Henderson val = env->cr[CR_SCRCCR]; 103*e33348a6SRichard Henderson break; 104*e33348a6SRichard Henderson case 55: 105*e33348a6SRichard Henderson val = env->cr[12]; 106*e33348a6SRichard Henderson break; 107*e33348a6SRichard Henderson case 56: 108*e33348a6SRichard Henderson val = env->cr[13]; 109*e33348a6SRichard Henderson break; 110*e33348a6SRichard Henderson case 57: 111*e33348a6SRichard Henderson val = env->cr[24]; 112*e33348a6SRichard Henderson break; 113*e33348a6SRichard Henderson case 58: 114*e33348a6SRichard Henderson val = env->cr[25]; 115*e33348a6SRichard Henderson break; 11661766fe9SRichard Henderson case 59: 11735136a77SRichard Henderson val = env->cr[26]; 11861766fe9SRichard Henderson break; 11961766fe9SRichard Henderson case 60: 12035136a77SRichard Henderson val = env->cr[27]; 12161766fe9SRichard Henderson break; 122*e33348a6SRichard Henderson case 61: 123*e33348a6SRichard Henderson val = env->cr[28]; 124*e33348a6SRichard Henderson break; 125*e33348a6SRichard Henderson case 62: 126*e33348a6SRichard Henderson val = env->cr[29]; 127*e33348a6SRichard Henderson break; 128*e33348a6SRichard Henderson case 63: 129*e33348a6SRichard Henderson val = env->cr[30]; 130*e33348a6SRichard Henderson break; 13161766fe9SRichard Henderson case 64 ... 127: 13261766fe9SRichard Henderson val = extract64(env->fr[(n - 64) / 2], (n & 1 ? 0 : 32), 32); 13361766fe9SRichard Henderson break; 13461766fe9SRichard Henderson default: 13561766fe9SRichard Henderson if (n < 128) { 13661766fe9SRichard Henderson val = 0; 13761766fe9SRichard Henderson } else { 13861766fe9SRichard Henderson return 0; 13961766fe9SRichard Henderson } 14061766fe9SRichard Henderson break; 14161766fe9SRichard Henderson } 142eaa3783bSRichard Henderson 143eaa3783bSRichard Henderson if (TARGET_REGISTER_BITS == 64) { 144eaa3783bSRichard Henderson return gdb_get_reg64(mem_buf, val); 145eaa3783bSRichard Henderson } else { 146eaa3783bSRichard Henderson return gdb_get_reg32(mem_buf, val); 147eaa3783bSRichard Henderson } 14861766fe9SRichard Henderson } 14961766fe9SRichard Henderson 15061766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) 15161766fe9SRichard Henderson { 15261766fe9SRichard Henderson HPPACPU *cpu = HPPA_CPU(cs); 15361766fe9SRichard Henderson CPUHPPAState *env = &cpu->env; 154eaa3783bSRichard Henderson target_ureg val; 155eaa3783bSRichard Henderson 156eaa3783bSRichard Henderson if (TARGET_REGISTER_BITS == 64) { 157eaa3783bSRichard Henderson val = ldq_p(mem_buf); 158eaa3783bSRichard Henderson } else { 159eaa3783bSRichard Henderson val = ldl_p(mem_buf); 160eaa3783bSRichard Henderson } 16161766fe9SRichard Henderson 16261766fe9SRichard Henderson switch (n) { 16361766fe9SRichard Henderson case 0: 16461766fe9SRichard Henderson cpu_hppa_put_psw(env, val); 16561766fe9SRichard Henderson break; 16661766fe9SRichard Henderson case 1 ... 31: 16761766fe9SRichard Henderson env->gr[n] = val; 16861766fe9SRichard Henderson break; 16961766fe9SRichard Henderson case 32: 17035136a77SRichard Henderson env->cr[CR_SAR] = val; 17161766fe9SRichard Henderson break; 17261766fe9SRichard Henderson case 33: 17361766fe9SRichard Henderson env->iaoq_f = val; 17461766fe9SRichard Henderson break; 175*e33348a6SRichard Henderson case 34: 176*e33348a6SRichard Henderson env->iasq_f = (uint64_t)val << 32; 177*e33348a6SRichard Henderson break; 17861766fe9SRichard Henderson case 35: 17961766fe9SRichard Henderson env->iaoq_b = val; 1806836a8fbSRichard Henderson break; 181*e33348a6SRichard Henderson case 36: 182*e33348a6SRichard Henderson env->iasq_b = (uint64_t)val << 32; 183*e33348a6SRichard Henderson break; 184*e33348a6SRichard Henderson case 37: 185*e33348a6SRichard Henderson env->cr[CR_EIEM] = val; 186*e33348a6SRichard Henderson break; 187*e33348a6SRichard Henderson case 38: 188*e33348a6SRichard Henderson env->cr[CR_IIR] = val; 189*e33348a6SRichard Henderson break; 190*e33348a6SRichard Henderson case 39: 191*e33348a6SRichard Henderson env->cr[CR_ISR] = val; 192*e33348a6SRichard Henderson break; 193*e33348a6SRichard Henderson case 40: 194*e33348a6SRichard Henderson env->cr[CR_IOR] = val; 195*e33348a6SRichard Henderson break; 196*e33348a6SRichard Henderson case 41: 197*e33348a6SRichard Henderson env->cr[CR_IPSW] = val; 198*e33348a6SRichard Henderson break; 199*e33348a6SRichard Henderson case 43: 200*e33348a6SRichard Henderson env->sr[4] = (uint64_t)val << 32; 201*e33348a6SRichard Henderson break; 202*e33348a6SRichard Henderson case 44: 203*e33348a6SRichard Henderson env->sr[0] = (uint64_t)val << 32; 204*e33348a6SRichard Henderson break; 205*e33348a6SRichard Henderson case 45: 206*e33348a6SRichard Henderson env->sr[1] = (uint64_t)val << 32; 207*e33348a6SRichard Henderson break; 208*e33348a6SRichard Henderson case 46: 209*e33348a6SRichard Henderson env->sr[2] = (uint64_t)val << 32; 210*e33348a6SRichard Henderson break; 211*e33348a6SRichard Henderson case 47: 212*e33348a6SRichard Henderson env->sr[3] = (uint64_t)val << 32; 213*e33348a6SRichard Henderson break; 214*e33348a6SRichard Henderson case 48: 215*e33348a6SRichard Henderson env->sr[5] = (uint64_t)val << 32; 216*e33348a6SRichard Henderson break; 217*e33348a6SRichard Henderson case 49: 218*e33348a6SRichard Henderson env->sr[6] = (uint64_t)val << 32; 219*e33348a6SRichard Henderson break; 220*e33348a6SRichard Henderson case 50: 221*e33348a6SRichard Henderson env->sr[7] = (uint64_t)val << 32; 222*e33348a6SRichard Henderson break; 223*e33348a6SRichard Henderson case 51: 224*e33348a6SRichard Henderson env->cr[CR_RC] = val; 225*e33348a6SRichard Henderson break; 226*e33348a6SRichard Henderson case 52: 227*e33348a6SRichard Henderson env->cr[8] = val; 228*e33348a6SRichard Henderson break; 229*e33348a6SRichard Henderson case 53: 230*e33348a6SRichard Henderson env->cr[9] = val; 231*e33348a6SRichard Henderson break; 232*e33348a6SRichard Henderson case 54: 233*e33348a6SRichard Henderson env->cr[CR_SCRCCR] = val; 234*e33348a6SRichard Henderson break; 235*e33348a6SRichard Henderson case 55: 236*e33348a6SRichard Henderson env->cr[12] = val; 237*e33348a6SRichard Henderson break; 238*e33348a6SRichard Henderson case 56: 239*e33348a6SRichard Henderson env->cr[13] = val; 240*e33348a6SRichard Henderson break; 241*e33348a6SRichard Henderson case 57: 242*e33348a6SRichard Henderson env->cr[24] = val; 243*e33348a6SRichard Henderson break; 244*e33348a6SRichard Henderson case 58: 245*e33348a6SRichard Henderson env->cr[25] = val; 246*e33348a6SRichard Henderson break; 24761766fe9SRichard Henderson case 59: 24835136a77SRichard Henderson env->cr[26] = val; 24961766fe9SRichard Henderson break; 25061766fe9SRichard Henderson case 60: 25135136a77SRichard Henderson env->cr[27] = val; 25261766fe9SRichard Henderson break; 253*e33348a6SRichard Henderson case 61: 254*e33348a6SRichard Henderson env->cr[28] = val; 255*e33348a6SRichard Henderson break; 256*e33348a6SRichard Henderson case 62: 257*e33348a6SRichard Henderson env->cr[29] = val; 258*e33348a6SRichard Henderson break; 259*e33348a6SRichard Henderson case 63: 260*e33348a6SRichard Henderson env->cr[30] = val; 261*e33348a6SRichard Henderson break; 26261766fe9SRichard Henderson case 64: 26361766fe9SRichard Henderson env->fr[0] = deposit64(env->fr[0], 32, 32, val); 26461766fe9SRichard Henderson cpu_hppa_loaded_fr0(env); 26561766fe9SRichard Henderson break; 26661766fe9SRichard Henderson case 65 ... 127: 26761766fe9SRichard Henderson { 26861766fe9SRichard Henderson uint64_t *fr = &env->fr[(n - 64) / 2]; 26961766fe9SRichard Henderson *fr = deposit64(*fr, val, (n & 1 ? 0 : 32), 32); 27061766fe9SRichard Henderson } 27161766fe9SRichard Henderson break; 27261766fe9SRichard Henderson default: 27361766fe9SRichard Henderson if (n >= 128) { 27461766fe9SRichard Henderson return 0; 27561766fe9SRichard Henderson } 27661766fe9SRichard Henderson break; 27761766fe9SRichard Henderson } 278eaa3783bSRichard Henderson return sizeof(target_ureg); 27961766fe9SRichard Henderson } 280