qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

gdbstub.c (6230B)


      1 /*
      2  * HPPA gdb server stub
      3  *
      4  * Copyright (c) 2016 Richard Henderson <rth@twiddle.net>
      5  *
      6  * This library is free software; you can redistribute it and/or
      7  * modify it under the terms of the GNU Lesser General Public
      8  * License as published by the Free Software Foundation; either
      9  * version 2.1 of the License, or (at your option) any later version.
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Lesser General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU Lesser General Public
     17  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
     18  */
     19 
     20 #include "qemu/osdep.h"
     21 #include "cpu.h"
     22 #include "exec/gdbstub.h"
     23 
     24 int hppa_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
     25 {
     26     HPPACPU *cpu = HPPA_CPU(cs);
     27     CPUHPPAState *env = &cpu->env;
     28     target_ureg val;
     29 
     30     switch (n) {
     31     case 0:
     32         val = cpu_hppa_get_psw(env);
     33         break;
     34     case 1 ... 31:
     35         val = env->gr[n];
     36         break;
     37     case 32:
     38         val = env->cr[CR_SAR];
     39         break;
     40     case 33:
     41         val = env->iaoq_f;
     42         break;
     43     case 34:
     44         val = env->iasq_f >> 32;
     45         break;
     46     case 35:
     47         val = env->iaoq_b;
     48         break;
     49     case 36:
     50         val = env->iasq_b >> 32;
     51         break;
     52     case 37:
     53         val = env->cr[CR_EIEM];
     54         break;
     55     case 38:
     56         val = env->cr[CR_IIR];
     57         break;
     58     case 39:
     59         val = env->cr[CR_ISR];
     60         break;
     61     case 40:
     62         val = env->cr[CR_IOR];
     63         break;
     64     case 41:
     65         val = env->cr[CR_IPSW];
     66         break;
     67     case 43:
     68         val = env->sr[4] >> 32;
     69         break;
     70     case 44:
     71         val = env->sr[0] >> 32;
     72         break;
     73     case 45:
     74         val = env->sr[1] >> 32;
     75         break;
     76     case 46:
     77         val = env->sr[2] >> 32;
     78         break;
     79     case 47:
     80         val = env->sr[3] >> 32;
     81         break;
     82     case 48:
     83         val = env->sr[5] >> 32;
     84         break;
     85     case 49:
     86         val = env->sr[6] >> 32;
     87         break;
     88     case 50:
     89         val = env->sr[7] >> 32;
     90         break;
     91     case 51:
     92         val = env->cr[CR_RC];
     93         break;
     94     case 52:
     95         val = env->cr[CR_PID1];
     96         break;
     97     case 53:
     98         val = env->cr[CR_PID2];
     99         break;
    100     case 54:
    101         val = env->cr[CR_SCRCCR];
    102         break;
    103     case 55:
    104         val = env->cr[CR_PID3];
    105         break;
    106     case 56:
    107         val = env->cr[CR_PID4];
    108         break;
    109     case 57:
    110         val = env->cr[24];
    111         break;
    112     case 58:
    113         val = env->cr[25];
    114         break;
    115     case 59:
    116         val = env->cr[26];
    117         break;
    118     case 60:
    119         val = env->cr[27];
    120         break;
    121     case 61:
    122         val = env->cr[28];
    123         break;
    124     case 62:
    125         val = env->cr[29];
    126         break;
    127     case 63:
    128         val = env->cr[30];
    129         break;
    130     case 64 ... 127:
    131         val = extract64(env->fr[(n - 64) / 2], (n & 1 ? 0 : 32), 32);
    132         break;
    133     default:
    134         if (n < 128) {
    135             val = 0;
    136         } else {
    137             return 0;
    138         }
    139         break;
    140     }
    141 
    142     if (TARGET_REGISTER_BITS == 64) {
    143         return gdb_get_reg64(mem_buf, val);
    144     } else {
    145         return gdb_get_reg32(mem_buf, val);
    146     }
    147 }
    148 
    149 int hppa_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
    150 {
    151     HPPACPU *cpu = HPPA_CPU(cs);
    152     CPUHPPAState *env = &cpu->env;
    153     target_ureg val;
    154 
    155     if (TARGET_REGISTER_BITS == 64) {
    156         val = ldq_p(mem_buf);
    157     } else {
    158         val = ldl_p(mem_buf);
    159     }
    160 
    161     switch (n) {
    162     case 0:
    163         cpu_hppa_put_psw(env, val);
    164         break;
    165     case 1 ... 31:
    166         env->gr[n] = val;
    167         break;
    168     case 32:
    169         env->cr[CR_SAR] = val;
    170         break;
    171     case 33:
    172         env->iaoq_f = val;
    173         break;
    174     case 34:
    175         env->iasq_f = (uint64_t)val << 32;
    176         break;
    177     case 35:
    178         env->iaoq_b = val;
    179         break;
    180     case 36:
    181         env->iasq_b = (uint64_t)val << 32;
    182         break;
    183     case 37:
    184         env->cr[CR_EIEM] = val;
    185         break;
    186     case 38:
    187         env->cr[CR_IIR] = val;
    188         break;
    189     case 39:
    190         env->cr[CR_ISR] = val;
    191         break;
    192     case 40:
    193         env->cr[CR_IOR] = val;
    194         break;
    195     case 41:
    196         env->cr[CR_IPSW] = val;
    197         break;
    198     case 43:
    199         env->sr[4] = (uint64_t)val << 32;
    200         break;
    201     case 44:
    202         env->sr[0] = (uint64_t)val << 32;
    203         break;
    204     case 45:
    205         env->sr[1] = (uint64_t)val << 32;
    206         break;
    207     case 46:
    208         env->sr[2] = (uint64_t)val << 32;
    209         break;
    210     case 47:
    211         env->sr[3] = (uint64_t)val << 32;
    212         break;
    213     case 48:
    214         env->sr[5] = (uint64_t)val << 32;
    215         break;
    216     case 49:
    217         env->sr[6] = (uint64_t)val << 32;
    218         break;
    219     case 50:
    220         env->sr[7] = (uint64_t)val << 32;
    221         break;
    222     case 51:
    223         env->cr[CR_RC] = val;
    224         break;
    225     case 52:
    226         env->cr[CR_PID1] = val;
    227         cpu_hppa_change_prot_id(env);
    228         break;
    229     case 53:
    230         env->cr[CR_PID2] = val;
    231         cpu_hppa_change_prot_id(env);
    232         break;
    233     case 54:
    234         env->cr[CR_SCRCCR] = val;
    235         break;
    236     case 55:
    237         env->cr[CR_PID3] = val;
    238         cpu_hppa_change_prot_id(env);
    239         break;
    240     case 56:
    241         env->cr[CR_PID4] = val;
    242         cpu_hppa_change_prot_id(env);
    243         break;
    244     case 57:
    245         env->cr[24] = val;
    246         break;
    247     case 58:
    248         env->cr[25] = val;
    249         break;
    250     case 59:
    251         env->cr[26] = val;
    252         break;
    253     case 60:
    254         env->cr[27] = val;
    255         break;
    256     case 61:
    257         env->cr[28] = val;
    258         break;
    259     case 62:
    260         env->cr[29] = val;
    261         break;
    262     case 63:
    263         env->cr[30] = val;
    264         break;
    265     case 64:
    266         env->fr[0] = deposit64(env->fr[0], 32, 32, val);
    267         cpu_hppa_loaded_fr0(env);
    268         break;
    269     case 65 ... 127:
    270         {
    271             uint64_t *fr = &env->fr[(n - 64) / 2];
    272             *fr = deposit64(*fr, (n & 1 ? 0 : 32), 32, val);
    273         }
    274         break;
    275     default:
    276         if (n >= 128) {
    277             return 0;
    278         }
    279         break;
    280     }
    281     return sizeof(target_ureg);
    282 }