1a829cec3SBruno Larsen (billionai) /* 2a829cec3SBruno Larsen (billionai) * PowerPC emulation for qemu: read/write callbacks for SPRs 3a829cec3SBruno Larsen (billionai) * 4a829cec3SBruno Larsen (billionai) * Copyright (C) 2021 Instituto de Pesquisas Eldorado 5a829cec3SBruno Larsen (billionai) * 6a829cec3SBruno Larsen (billionai) * This library is free software; you can redistribute it and/or 7a829cec3SBruno Larsen (billionai) * modify it under the terms of the GNU Lesser General Public 8a829cec3SBruno Larsen (billionai) * License as published by the Free Software Foundation; either 9a829cec3SBruno Larsen (billionai) * version 2.1 of the License, or (at your option) any later version. 10a829cec3SBruno Larsen (billionai) * 11a829cec3SBruno Larsen (billionai) * This library is distributed in the hope that it will be useful, 12a829cec3SBruno Larsen (billionai) * but WITHOUT ANY WARRANTY; without even the implied warranty of 13a829cec3SBruno Larsen (billionai) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14a829cec3SBruno Larsen (billionai) * Lesser General Public License for more details. 15a829cec3SBruno Larsen (billionai) * 16a829cec3SBruno Larsen (billionai) * You should have received a copy of the GNU Lesser General Public 17a829cec3SBruno Larsen (billionai) * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18a829cec3SBruno Larsen (billionai) */ 1999e964efSFabiano Rosas #ifndef SPR_COMMON_H 2099e964efSFabiano Rosas #define SPR_COMMON_H 21a829cec3SBruno Larsen (billionai) 223e770bf7SBruno Larsen (billionai) #define SPR_NOACCESS (&spr_noaccess) 233e770bf7SBruno Larsen (billionai) 24565873b3SFabiano Rosas #ifdef CONFIG_TCG 25565873b3SFabiano Rosas # define USR_ARG(X) X, 26565873b3SFabiano Rosas # ifdef CONFIG_USER_ONLY 27565873b3SFabiano Rosas # define SYS_ARG(X) 28565873b3SFabiano Rosas # else 29565873b3SFabiano Rosas # define SYS_ARG(X) X, 30565873b3SFabiano Rosas # endif 31565873b3SFabiano Rosas #else 32565873b3SFabiano Rosas # define USR_ARG(X) 33565873b3SFabiano Rosas # define SYS_ARG(X) 34565873b3SFabiano Rosas #endif 35565873b3SFabiano Rosas #ifdef CONFIG_KVM 36565873b3SFabiano Rosas # define KVM_ARG(X) X, 37565873b3SFabiano Rosas #else 38565873b3SFabiano Rosas # define KVM_ARG(X) 39565873b3SFabiano Rosas #endif 40565873b3SFabiano Rosas 41565873b3SFabiano Rosas typedef void spr_callback(DisasContext *, int, int); 42565873b3SFabiano Rosas 43565873b3SFabiano Rosas void _spr_register(CPUPPCState *env, int num, const char *name, 44565873b3SFabiano Rosas USR_ARG(spr_callback *uea_read) 45565873b3SFabiano Rosas USR_ARG(spr_callback *uea_write) 46565873b3SFabiano Rosas SYS_ARG(spr_callback *oea_read) 47565873b3SFabiano Rosas SYS_ARG(spr_callback *oea_write) 48565873b3SFabiano Rosas SYS_ARG(spr_callback *hea_read) 49565873b3SFabiano Rosas SYS_ARG(spr_callback *hea_write) 50565873b3SFabiano Rosas KVM_ARG(uint64_t one_reg_id) 51565873b3SFabiano Rosas target_ulong initial_value); 52565873b3SFabiano Rosas 53565873b3SFabiano Rosas /* spr_register_kvm_hv passes all required arguments. */ 54565873b3SFabiano Rosas #define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \ 55565873b3SFabiano Rosas oea_read, oea_write, hea_read, hea_write, \ 56565873b3SFabiano Rosas one_reg_id, initial_value) \ 57565873b3SFabiano Rosas _spr_register(env, num, name, \ 58565873b3SFabiano Rosas USR_ARG(uea_read) USR_ARG(uea_write) \ 59565873b3SFabiano Rosas SYS_ARG(oea_read) SYS_ARG(oea_write) \ 60565873b3SFabiano Rosas SYS_ARG(hea_read) SYS_ARG(hea_write) \ 61565873b3SFabiano Rosas KVM_ARG(one_reg_id) initial_value) 62565873b3SFabiano Rosas 63565873b3SFabiano Rosas /* spr_register_kvm duplicates the oea callbacks to the hea callbacks. */ 64565873b3SFabiano Rosas #define spr_register_kvm(env, num, name, uea_read, uea_write, \ 65565873b3SFabiano Rosas oea_read, oea_write, one_reg_id, ival) \ 66565873b3SFabiano Rosas spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \ 67565873b3SFabiano Rosas oea_write, oea_read, oea_write, one_reg_id, ival) 68565873b3SFabiano Rosas 69565873b3SFabiano Rosas /* spr_register_hv and spr_register are similar, except there is no kvm id. */ 70565873b3SFabiano Rosas #define spr_register_hv(env, num, name, uea_read, uea_write, \ 71565873b3SFabiano Rosas oea_read, oea_write, hea_read, hea_write, ival) \ 72565873b3SFabiano Rosas spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \ 73565873b3SFabiano Rosas oea_write, hea_read, hea_write, 0, ival) 74565873b3SFabiano Rosas 75565873b3SFabiano Rosas #define spr_register(env, num, name, uea_read, uea_write, \ 76565873b3SFabiano Rosas oea_read, oea_write, ival) \ 77565873b3SFabiano Rosas spr_register_kvm(env, num, name, uea_read, uea_write, \ 78565873b3SFabiano Rosas oea_read, oea_write, 0, ival) 79565873b3SFabiano Rosas 80a829cec3SBruno Larsen (billionai) /* prototypes for readers and writers for SPRs */ 81a829cec3SBruno Larsen (billionai) void spr_noaccess(DisasContext *ctx, int gprn, int sprn); 82a829cec3SBruno Larsen (billionai) void spr_read_generic(DisasContext *ctx, int gprn, int sprn); 83a829cec3SBruno Larsen (billionai) void spr_write_generic(DisasContext *ctx, int sprn, int gprn); 84*fbda88f7SNicholas Piggin void spr_write_generic32(DisasContext *ctx, int sprn, int gprn); 85c2eff582SDaniel Henrique Barboza void spr_write_MMCR0(DisasContext *ctx, int sprn, int gprn); 86a6f91249SDaniel Henrique Barboza void spr_write_MMCR1(DisasContext *ctx, int sprn, int gprn); 87308b9fadSDaniel Henrique Barboza void spr_write_PMC(DisasContext *ctx, int sprn, int gprn); 887aeac354SDaniel Henrique Barboza void spr_write_CTRL(DisasContext *ctx, int sprn, int gprn); 89a829cec3SBruno Larsen (billionai) void spr_read_xer(DisasContext *ctx, int gprn, int sprn); 90a829cec3SBruno Larsen (billionai) void spr_write_xer(DisasContext *ctx, int sprn, int gprn); 91a829cec3SBruno Larsen (billionai) void spr_read_lr(DisasContext *ctx, int gprn, int sprn); 92a829cec3SBruno Larsen (billionai) void spr_write_lr(DisasContext *ctx, int sprn, int gprn); 93a829cec3SBruno Larsen (billionai) void spr_read_ctr(DisasContext *ctx, int gprn, int sprn); 94a829cec3SBruno Larsen (billionai) void spr_write_ctr(DisasContext *ctx, int sprn, int gprn); 95a829cec3SBruno Larsen (billionai) void spr_read_ureg(DisasContext *ctx, int gprn, int sprn); 96565cb109SGustavo Romero void spr_read_MMCR0_ureg(DisasContext *ctx, int gprn, int sprn); 977b3ecf16SDaniel Henrique Barboza void spr_read_MMCR2_ureg(DisasContext *ctx, int gprn, int sprn); 98308b9fadSDaniel Henrique Barboza void spr_read_PMC(DisasContext *ctx, int gprn, int sprn); 99cedf7069SDaniel Henrique Barboza void spr_read_PMC14_ureg(DisasContext *ctx, int gprn, int sprn); 100cedf7069SDaniel Henrique Barboza void spr_read_PMC56_ureg(DisasContext *ctx, int gprn, int sprn); 101a829cec3SBruno Larsen (billionai) void spr_read_tbl(DisasContext *ctx, int gprn, int sprn); 102a829cec3SBruno Larsen (billionai) void spr_read_tbu(DisasContext *ctx, int gprn, int sprn); 103a829cec3SBruno Larsen (billionai) void spr_read_atbl(DisasContext *ctx, int gprn, int sprn); 104a829cec3SBruno Larsen (billionai) void spr_read_atbu(DisasContext *ctx, int gprn, int sprn); 105a829cec3SBruno Larsen (billionai) void spr_read_spefscr(DisasContext *ctx, int gprn, int sprn); 106a829cec3SBruno Larsen (billionai) void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn); 107565cb109SGustavo Romero void spr_write_MMCR0_ureg(DisasContext *ctx, int sprn, int gprn); 1087b3ecf16SDaniel Henrique Barboza void spr_write_MMCR2_ureg(DisasContext *ctx, int sprn, int gprn); 109cedf7069SDaniel Henrique Barboza void spr_write_PMC14_ureg(DisasContext *ctx, int sprn, int gprn); 110cedf7069SDaniel Henrique Barboza void spr_write_PMC56_ureg(DisasContext *ctx, int sprn, int gprn); 111a829cec3SBruno Larsen (billionai) 112a829cec3SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY 113a829cec3SBruno Larsen (billionai) void spr_write_clear(DisasContext *ctx, int sprn, int gprn); 114a829cec3SBruno Larsen (billionai) void spr_access_nop(DisasContext *ctx, int sprn, int gprn); 115a829cec3SBruno Larsen (billionai) void spr_read_decr(DisasContext *ctx, int gprn, int sprn); 116a829cec3SBruno Larsen (billionai) void spr_write_decr(DisasContext *ctx, int sprn, int gprn); 117a829cec3SBruno Larsen (billionai) void spr_write_tbl(DisasContext *ctx, int sprn, int gprn); 118a829cec3SBruno Larsen (billionai) void spr_write_tbu(DisasContext *ctx, int sprn, int gprn); 119a829cec3SBruno Larsen (billionai) void spr_write_atbl(DisasContext *ctx, int sprn, int gprn); 120a829cec3SBruno Larsen (billionai) void spr_write_atbu(DisasContext *ctx, int sprn, int gprn); 121a829cec3SBruno Larsen (billionai) void spr_read_ibat(DisasContext *ctx, int gprn, int sprn); 122a829cec3SBruno Larsen (billionai) void spr_read_ibat_h(DisasContext *ctx, int gprn, int sprn); 123a829cec3SBruno Larsen (billionai) void spr_write_ibatu(DisasContext *ctx, int sprn, int gprn); 124a829cec3SBruno Larsen (billionai) void spr_write_ibatu_h(DisasContext *ctx, int sprn, int gprn); 125a829cec3SBruno Larsen (billionai) void spr_write_ibatl(DisasContext *ctx, int sprn, int gprn); 126a829cec3SBruno Larsen (billionai) void spr_write_ibatl_h(DisasContext *ctx, int sprn, int gprn); 127a829cec3SBruno Larsen (billionai) void spr_read_dbat(DisasContext *ctx, int gprn, int sprn); 128a829cec3SBruno Larsen (billionai) void spr_read_dbat_h(DisasContext *ctx, int gprn, int sprn); 129a829cec3SBruno Larsen (billionai) void spr_write_dbatu(DisasContext *ctx, int sprn, int gprn); 130a829cec3SBruno Larsen (billionai) void spr_write_dbatu_h(DisasContext *ctx, int sprn, int gprn); 131a829cec3SBruno Larsen (billionai) void spr_write_dbatl(DisasContext *ctx, int sprn, int gprn); 132a829cec3SBruno Larsen (billionai) void spr_write_dbatl_h(DisasContext *ctx, int sprn, int gprn); 133a829cec3SBruno Larsen (billionai) void spr_write_sdr1(DisasContext *ctx, int sprn, int gprn); 134a829cec3SBruno Larsen (billionai) void spr_read_40x_pit(DisasContext *ctx, int gprn, int sprn); 135a829cec3SBruno Larsen (billionai) void spr_write_40x_pit(DisasContext *ctx, int sprn, int gprn); 136a829cec3SBruno Larsen (billionai) void spr_write_40x_dbcr0(DisasContext *ctx, int sprn, int gprn); 137a829cec3SBruno Larsen (billionai) void spr_write_40x_sler(DisasContext *ctx, int sprn, int gprn); 138cbd8f17dSCédric Le Goater void spr_write_40x_tcr(DisasContext *ctx, int sprn, int gprn); 139cbd8f17dSCédric Le Goater void spr_write_40x_tsr(DisasContext *ctx, int sprn, int gprn); 140dd69d140SCédric Le Goater void spr_write_40x_pid(DisasContext *ctx, int sprn, int gprn); 141a829cec3SBruno Larsen (billionai) void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn); 142a829cec3SBruno Larsen (billionai) void spr_write_booke_tsr(DisasContext *ctx, int sprn, int gprn); 143a829cec3SBruno Larsen (billionai) void spr_read_403_pbr(DisasContext *ctx, int gprn, int sprn); 144a829cec3SBruno Larsen (billionai) void spr_write_403_pbr(DisasContext *ctx, int sprn, int gprn); 145a829cec3SBruno Larsen (billionai) void spr_write_pir(DisasContext *ctx, int sprn, int gprn); 146a829cec3SBruno Larsen (billionai) void spr_write_excp_prefix(DisasContext *ctx, int sprn, int gprn); 147a829cec3SBruno Larsen (billionai) void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn); 148a829cec3SBruno Larsen (billionai) void spr_read_thrm(DisasContext *ctx, int gprn, int sprn); 149a829cec3SBruno Larsen (billionai) void spr_write_e500_l1csr0(DisasContext *ctx, int sprn, int gprn); 150a829cec3SBruno Larsen (billionai) void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn); 151a829cec3SBruno Larsen (billionai) void spr_write_e500_l2csr0(DisasContext *ctx, int sprn, int gprn); 152a829cec3SBruno Larsen (billionai) void spr_write_booke206_mmucsr0(DisasContext *ctx, int sprn, int gprn); 153a829cec3SBruno Larsen (billionai) void spr_write_booke_pid(DisasContext *ctx, int sprn, int gprn); 154a829cec3SBruno Larsen (billionai) void spr_write_eplc(DisasContext *ctx, int sprn, int gprn); 155a829cec3SBruno Larsen (billionai) void spr_write_epsc(DisasContext *ctx, int sprn, int gprn); 156a829cec3SBruno Larsen (billionai) void spr_write_mas73(DisasContext *ctx, int sprn, int gprn); 157a829cec3SBruno Larsen (billionai) void spr_read_mas73(DisasContext *ctx, int gprn, int sprn); 158a829cec3SBruno Larsen (billionai) #ifdef TARGET_PPC64 159a829cec3SBruno Larsen (billionai) void spr_read_cfar(DisasContext *ctx, int gprn, int sprn); 160a829cec3SBruno Larsen (billionai) void spr_write_cfar(DisasContext *ctx, int sprn, int gprn); 161a829cec3SBruno Larsen (billionai) void spr_write_ureg(DisasContext *ctx, int sprn, int gprn); 162a829cec3SBruno Larsen (billionai) void spr_read_purr(DisasContext *ctx, int gprn, int sprn); 163a829cec3SBruno Larsen (billionai) void spr_write_purr(DisasContext *ctx, int sprn, int gprn); 164a829cec3SBruno Larsen (billionai) void spr_read_hdecr(DisasContext *ctx, int gprn, int sprn); 165a829cec3SBruno Larsen (billionai) void spr_write_hdecr(DisasContext *ctx, int sprn, int gprn); 166a829cec3SBruno Larsen (billionai) void spr_read_vtb(DisasContext *ctx, int gprn, int sprn); 167a829cec3SBruno Larsen (billionai) void spr_write_vtb(DisasContext *ctx, int sprn, int gprn); 168a829cec3SBruno Larsen (billionai) void spr_write_tbu40(DisasContext *ctx, int sprn, int gprn); 169a829cec3SBruno Larsen (billionai) void spr_write_pidr(DisasContext *ctx, int sprn, int gprn); 170a829cec3SBruno Larsen (billionai) void spr_write_lpidr(DisasContext *ctx, int sprn, int gprn); 171a829cec3SBruno Larsen (billionai) void spr_read_hior(DisasContext *ctx, int gprn, int sprn); 172a829cec3SBruno Larsen (billionai) void spr_write_hior(DisasContext *ctx, int sprn, int gprn); 173a829cec3SBruno Larsen (billionai) void spr_write_ptcr(DisasContext *ctx, int sprn, int gprn); 174a829cec3SBruno Larsen (billionai) void spr_write_pcr(DisasContext *ctx, int sprn, int gprn); 175a829cec3SBruno Larsen (billionai) void spr_read_dpdes(DisasContext *ctx, int gprn, int sprn); 176a829cec3SBruno Larsen (billionai) void spr_write_dpdes(DisasContext *ctx, int sprn, int gprn); 177a829cec3SBruno Larsen (billionai) void spr_write_amr(DisasContext *ctx, int sprn, int gprn); 178a829cec3SBruno Larsen (billionai) void spr_write_uamor(DisasContext *ctx, int sprn, int gprn); 179a829cec3SBruno Larsen (billionai) void spr_write_iamr(DisasContext *ctx, int sprn, int gprn); 180a829cec3SBruno Larsen (billionai) #endif 181a829cec3SBruno Larsen (billionai) #endif 182a829cec3SBruno Larsen (billionai) 183a829cec3SBruno Larsen (billionai) #ifdef TARGET_PPC64 184a829cec3SBruno Larsen (billionai) void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn); 185a829cec3SBruno Larsen (billionai) void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn); 186a829cec3SBruno Larsen (billionai) void spr_read_tar(DisasContext *ctx, int gprn, int sprn); 187a829cec3SBruno Larsen (billionai) void spr_write_tar(DisasContext *ctx, int sprn, int gprn); 188a829cec3SBruno Larsen (billionai) void spr_read_tm(DisasContext *ctx, int gprn, int sprn); 189a829cec3SBruno Larsen (billionai) void spr_write_tm(DisasContext *ctx, int sprn, int gprn); 190a829cec3SBruno Larsen (billionai) void spr_read_tm_upper32(DisasContext *ctx, int gprn, int sprn); 191a829cec3SBruno Larsen (billionai) void spr_write_tm_upper32(DisasContext *ctx, int sprn, int gprn); 192a829cec3SBruno Larsen (billionai) void spr_read_ebb(DisasContext *ctx, int gprn, int sprn); 193a829cec3SBruno Larsen (billionai) void spr_write_ebb(DisasContext *ctx, int sprn, int gprn); 194a829cec3SBruno Larsen (billionai) void spr_read_ebb_upper32(DisasContext *ctx, int gprn, int sprn); 195a829cec3SBruno Larsen (billionai) void spr_write_ebb_upper32(DisasContext *ctx, int sprn, int gprn); 196a829cec3SBruno Larsen (billionai) void spr_write_hmer(DisasContext *ctx, int sprn, int gprn); 197a829cec3SBruno Larsen (billionai) void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn); 198395b5d5bSNicholas Miehlbradt void spr_read_dexcr_ureg(DisasContext *ctx, int gprn, int sprn); 199a829cec3SBruno Larsen (billionai) #endif 200a829cec3SBruno Larsen (billionai) 201917ea438SFabiano Rosas void register_low_BATs(CPUPPCState *env); 202917ea438SFabiano Rosas void register_high_BATs(CPUPPCState *env); 203917ea438SFabiano Rosas void register_sdr1_sprs(CPUPPCState *env); 204917ea438SFabiano Rosas void register_thrm_sprs(CPUPPCState *env); 205917ea438SFabiano Rosas void register_usprgh_sprs(CPUPPCState *env); 206917ea438SFabiano Rosas void register_non_embedded_sprs(CPUPPCState *env); 207917ea438SFabiano Rosas void register_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways); 20865e0446cSFabiano Rosas void register_generic_sprs(PowerPCCPU *cpu); 209917ea438SFabiano Rosas 210a829cec3SBruno Larsen (billionai) #endif 211