qemu

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

spr_common.h (10687B)


      1 /*
      2  *  PowerPC emulation for qemu: read/write callbacks for SPRs
      3  *
      4  *  Copyright (C) 2021 Instituto de Pesquisas Eldorado
      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 #ifndef SPR_COMMON_H
     20 #define SPR_COMMON_H
     21 
     22 #define SPR_NOACCESS (&spr_noaccess)
     23 
     24 #ifdef CONFIG_TCG
     25 # define USR_ARG(X)    X,
     26 # ifdef CONFIG_USER_ONLY
     27 #  define SYS_ARG(X)
     28 # else
     29 #  define SYS_ARG(X)   X,
     30 # endif
     31 #else
     32 # define USR_ARG(X)
     33 # define SYS_ARG(X)
     34 #endif
     35 #ifdef CONFIG_KVM
     36 # define KVM_ARG(X)    X,
     37 #else
     38 # define KVM_ARG(X)
     39 #endif
     40 
     41 typedef void spr_callback(DisasContext *, int, int);
     42 
     43 void _spr_register(CPUPPCState *env, int num, const char *name,
     44                    USR_ARG(spr_callback *uea_read)
     45                    USR_ARG(spr_callback *uea_write)
     46                    SYS_ARG(spr_callback *oea_read)
     47                    SYS_ARG(spr_callback *oea_write)
     48                    SYS_ARG(spr_callback *hea_read)
     49                    SYS_ARG(spr_callback *hea_write)
     50                    KVM_ARG(uint64_t one_reg_id)
     51                    target_ulong initial_value);
     52 
     53 /* spr_register_kvm_hv passes all required arguments. */
     54 #define spr_register_kvm_hv(env, num, name, uea_read, uea_write,             \
     55                             oea_read, oea_write, hea_read, hea_write,        \
     56                             one_reg_id, initial_value)                       \
     57     _spr_register(env, num, name,                                            \
     58                   USR_ARG(uea_read) USR_ARG(uea_write)                       \
     59                   SYS_ARG(oea_read) SYS_ARG(oea_write)                       \
     60                   SYS_ARG(hea_read) SYS_ARG(hea_write)                       \
     61                   KVM_ARG(one_reg_id) initial_value)
     62 
     63 /* spr_register_kvm duplicates the oea callbacks to the hea callbacks. */
     64 #define spr_register_kvm(env, num, name, uea_read, uea_write,                \
     65                          oea_read, oea_write, one_reg_id, ival)              \
     66     spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read,       \
     67                         oea_write, oea_read, oea_write, one_reg_id, ival)
     68 
     69 /* spr_register_hv and spr_register are similar, except there is no kvm id. */
     70 #define spr_register_hv(env, num, name, uea_read, uea_write,                 \
     71                         oea_read, oea_write, hea_read, hea_write, ival)      \
     72     spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read,       \
     73                         oea_write, hea_read, hea_write, 0, ival)
     74 
     75 #define spr_register(env, num, name, uea_read, uea_write,                    \
     76                      oea_read, oea_write, ival)                              \
     77     spr_register_kvm(env, num, name, uea_read, uea_write,                    \
     78                      oea_read, oea_write, 0, ival)
     79 
     80 /* prototypes for readers and writers for SPRs */
     81 void spr_noaccess(DisasContext *ctx, int gprn, int sprn);
     82 void spr_read_generic(DisasContext *ctx, int gprn, int sprn);
     83 void spr_write_generic(DisasContext *ctx, int sprn, int gprn);
     84 void spr_write_MMCR0(DisasContext *ctx, int sprn, int gprn);
     85 void spr_write_MMCR1(DisasContext *ctx, int sprn, int gprn);
     86 void spr_write_PMC(DisasContext *ctx, int sprn, int gprn);
     87 void spr_write_CTRL(DisasContext *ctx, int sprn, int gprn);
     88 void spr_read_xer(DisasContext *ctx, int gprn, int sprn);
     89 void spr_write_xer(DisasContext *ctx, int sprn, int gprn);
     90 void spr_read_lr(DisasContext *ctx, int gprn, int sprn);
     91 void spr_write_lr(DisasContext *ctx, int sprn, int gprn);
     92 void spr_read_ctr(DisasContext *ctx, int gprn, int sprn);
     93 void spr_write_ctr(DisasContext *ctx, int sprn, int gprn);
     94 void spr_read_ureg(DisasContext *ctx, int gprn, int sprn);
     95 void spr_read_MMCR0_ureg(DisasContext *ctx, int gprn, int sprn);
     96 void spr_read_MMCR2_ureg(DisasContext *ctx, int gprn, int sprn);
     97 void spr_read_PMC(DisasContext *ctx, int gprn, int sprn);
     98 void spr_read_PMC14_ureg(DisasContext *ctx, int gprn, int sprn);
     99 void spr_read_PMC56_ureg(DisasContext *ctx, int gprn, int sprn);
    100 void spr_read_tbl(DisasContext *ctx, int gprn, int sprn);
    101 void spr_read_tbu(DisasContext *ctx, int gprn, int sprn);
    102 void spr_read_atbl(DisasContext *ctx, int gprn, int sprn);
    103 void spr_read_atbu(DisasContext *ctx, int gprn, int sprn);
    104 void spr_read_spefscr(DisasContext *ctx, int gprn, int sprn);
    105 void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn);
    106 void spr_write_MMCR0_ureg(DisasContext *ctx, int sprn, int gprn);
    107 void spr_write_MMCR2_ureg(DisasContext *ctx, int sprn, int gprn);
    108 void spr_write_PMC14_ureg(DisasContext *ctx, int sprn, int gprn);
    109 void spr_write_PMC56_ureg(DisasContext *ctx, int sprn, int gprn);
    110 
    111 #ifndef CONFIG_USER_ONLY
    112 void spr_write_generic32(DisasContext *ctx, int sprn, int gprn);
    113 void spr_write_clear(DisasContext *ctx, int sprn, int gprn);
    114 void spr_access_nop(DisasContext *ctx, int sprn, int gprn);
    115 void spr_read_decr(DisasContext *ctx, int gprn, int sprn);
    116 void spr_write_decr(DisasContext *ctx, int sprn, int gprn);
    117 void spr_write_tbl(DisasContext *ctx, int sprn, int gprn);
    118 void spr_write_tbu(DisasContext *ctx, int sprn, int gprn);
    119 void spr_write_atbl(DisasContext *ctx, int sprn, int gprn);
    120 void spr_write_atbu(DisasContext *ctx, int sprn, int gprn);
    121 void spr_read_ibat(DisasContext *ctx, int gprn, int sprn);
    122 void spr_read_ibat_h(DisasContext *ctx, int gprn, int sprn);
    123 void spr_write_ibatu(DisasContext *ctx, int sprn, int gprn);
    124 void spr_write_ibatu_h(DisasContext *ctx, int sprn, int gprn);
    125 void spr_write_ibatl(DisasContext *ctx, int sprn, int gprn);
    126 void spr_write_ibatl_h(DisasContext *ctx, int sprn, int gprn);
    127 void spr_read_dbat(DisasContext *ctx, int gprn, int sprn);
    128 void spr_read_dbat_h(DisasContext *ctx, int gprn, int sprn);
    129 void spr_write_dbatu(DisasContext *ctx, int sprn, int gprn);
    130 void spr_write_dbatu_h(DisasContext *ctx, int sprn, int gprn);
    131 void spr_write_dbatl(DisasContext *ctx, int sprn, int gprn);
    132 void spr_write_dbatl_h(DisasContext *ctx, int sprn, int gprn);
    133 void spr_write_sdr1(DisasContext *ctx, int sprn, int gprn);
    134 void spr_read_40x_pit(DisasContext *ctx, int gprn, int sprn);
    135 void spr_write_40x_pit(DisasContext *ctx, int sprn, int gprn);
    136 void spr_write_40x_dbcr0(DisasContext *ctx, int sprn, int gprn);
    137 void spr_write_40x_sler(DisasContext *ctx, int sprn, int gprn);
    138 void spr_write_40x_tcr(DisasContext *ctx, int sprn, int gprn);
    139 void spr_write_40x_tsr(DisasContext *ctx, int sprn, int gprn);
    140 void spr_write_40x_pid(DisasContext *ctx, int sprn, int gprn);
    141 void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn);
    142 void spr_write_booke_tsr(DisasContext *ctx, int sprn, int gprn);
    143 void spr_read_403_pbr(DisasContext *ctx, int gprn, int sprn);
    144 void spr_write_403_pbr(DisasContext *ctx, int sprn, int gprn);
    145 void spr_write_pir(DisasContext *ctx, int sprn, int gprn);
    146 void spr_write_excp_prefix(DisasContext *ctx, int sprn, int gprn);
    147 void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn);
    148 void spr_read_thrm(DisasContext *ctx, int gprn, int sprn);
    149 void spr_write_e500_l1csr0(DisasContext *ctx, int sprn, int gprn);
    150 void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn);
    151 void spr_write_e500_l2csr0(DisasContext *ctx, int sprn, int gprn);
    152 void spr_write_booke206_mmucsr0(DisasContext *ctx, int sprn, int gprn);
    153 void spr_write_booke_pid(DisasContext *ctx, int sprn, int gprn);
    154 void spr_write_eplc(DisasContext *ctx, int sprn, int gprn);
    155 void spr_write_epsc(DisasContext *ctx, int sprn, int gprn);
    156 void spr_write_mas73(DisasContext *ctx, int sprn, int gprn);
    157 void spr_read_mas73(DisasContext *ctx, int gprn, int sprn);
    158 #ifdef TARGET_PPC64
    159 void spr_read_cfar(DisasContext *ctx, int gprn, int sprn);
    160 void spr_write_cfar(DisasContext *ctx, int sprn, int gprn);
    161 void spr_write_ureg(DisasContext *ctx, int sprn, int gprn);
    162 void spr_read_purr(DisasContext *ctx, int gprn, int sprn);
    163 void spr_write_purr(DisasContext *ctx, int sprn, int gprn);
    164 void spr_read_hdecr(DisasContext *ctx, int gprn, int sprn);
    165 void spr_write_hdecr(DisasContext *ctx, int sprn, int gprn);
    166 void spr_read_vtb(DisasContext *ctx, int gprn, int sprn);
    167 void spr_write_vtb(DisasContext *ctx, int sprn, int gprn);
    168 void spr_write_tbu40(DisasContext *ctx, int sprn, int gprn);
    169 void spr_write_pidr(DisasContext *ctx, int sprn, int gprn);
    170 void spr_write_lpidr(DisasContext *ctx, int sprn, int gprn);
    171 void spr_read_hior(DisasContext *ctx, int gprn, int sprn);
    172 void spr_write_hior(DisasContext *ctx, int sprn, int gprn);
    173 void spr_write_ptcr(DisasContext *ctx, int sprn, int gprn);
    174 void spr_write_pcr(DisasContext *ctx, int sprn, int gprn);
    175 void spr_read_dpdes(DisasContext *ctx, int gprn, int sprn);
    176 void spr_write_dpdes(DisasContext *ctx, int sprn, int gprn);
    177 void spr_write_amr(DisasContext *ctx, int sprn, int gprn);
    178 void spr_write_uamor(DisasContext *ctx, int sprn, int gprn);
    179 void spr_write_iamr(DisasContext *ctx, int sprn, int gprn);
    180 #endif
    181 #endif
    182 
    183 #ifdef TARGET_PPC64
    184 void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn);
    185 void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn);
    186 void spr_read_tar(DisasContext *ctx, int gprn, int sprn);
    187 void spr_write_tar(DisasContext *ctx, int sprn, int gprn);
    188 void spr_read_tm(DisasContext *ctx, int gprn, int sprn);
    189 void spr_write_tm(DisasContext *ctx, int sprn, int gprn);
    190 void spr_read_tm_upper32(DisasContext *ctx, int gprn, int sprn);
    191 void spr_write_tm_upper32(DisasContext *ctx, int sprn, int gprn);
    192 void spr_read_ebb(DisasContext *ctx, int gprn, int sprn);
    193 void spr_write_ebb(DisasContext *ctx, int sprn, int gprn);
    194 void spr_read_ebb_upper32(DisasContext *ctx, int gprn, int sprn);
    195 void spr_write_ebb_upper32(DisasContext *ctx, int sprn, int gprn);
    196 void spr_write_hmer(DisasContext *ctx, int sprn, int gprn);
    197 void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn);
    198 #endif
    199 
    200 void register_low_BATs(CPUPPCState *env);
    201 void register_high_BATs(CPUPPCState *env);
    202 void register_sdr1_sprs(CPUPPCState *env);
    203 void register_thrm_sprs(CPUPPCState *env);
    204 void register_usprgh_sprs(CPUPPCState *env);
    205 void register_non_embedded_sprs(CPUPPCState *env);
    206 void register_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways);
    207 void register_generic_sprs(PowerPCCPU *cpu);
    208 
    209 #endif