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); 84fbda88f7SNicholas Piggin void spr_write_generic32(DisasContext *ctx, int sprn, int gprn); 859cdfd1b9SNicholas Piggin void spr_core_write_generic(DisasContext *ctx, int sprn, int gprn); 865fa7efe4SNicholas Piggin void spr_core_write_generic32(DisasContext *ctx, int sprn, int gprn); 875fa7efe4SNicholas Piggin void spr_core_lpar_write_generic(DisasContext *ctx, int sprn, int gprn); 88c2eff582SDaniel Henrique Barboza void spr_write_MMCR0(DisasContext *ctx, int sprn, int gprn); 89a6f91249SDaniel Henrique Barboza void spr_write_MMCR1(DisasContext *ctx, int sprn, int gprn); 90a7138e28SGlenn Miles void spr_write_MMCRA(DisasContext *ctx, int sprn, int gprn); 91308b9fadSDaniel Henrique Barboza void spr_write_PMC(DisasContext *ctx, int sprn, int gprn); 927aeac354SDaniel Henrique Barboza void spr_write_CTRL(DisasContext *ctx, int sprn, int gprn); 93a829cec3SBruno Larsen (billionai) void spr_read_xer(DisasContext *ctx, int gprn, int sprn); 94a829cec3SBruno Larsen (billionai) void spr_write_xer(DisasContext *ctx, int sprn, int gprn); 95a829cec3SBruno Larsen (billionai) void spr_read_lr(DisasContext *ctx, int gprn, int sprn); 96a829cec3SBruno Larsen (billionai) void spr_write_lr(DisasContext *ctx, int sprn, int gprn); 97a829cec3SBruno Larsen (billionai) void spr_read_ctr(DisasContext *ctx, int gprn, int sprn); 98a829cec3SBruno Larsen (billionai) void spr_write_ctr(DisasContext *ctx, int sprn, int gprn); 99a829cec3SBruno Larsen (billionai) void spr_read_ureg(DisasContext *ctx, int gprn, int sprn); 100565cb109SGustavo Romero void spr_read_MMCR0_ureg(DisasContext *ctx, int gprn, int sprn); 1017b3ecf16SDaniel Henrique Barboza void spr_read_MMCR2_ureg(DisasContext *ctx, int gprn, int sprn); 102308b9fadSDaniel Henrique Barboza void spr_read_PMC(DisasContext *ctx, int gprn, int sprn); 103cedf7069SDaniel Henrique Barboza void spr_read_PMC14_ureg(DisasContext *ctx, int gprn, int sprn); 104cedf7069SDaniel Henrique Barboza void spr_read_PMC56_ureg(DisasContext *ctx, int gprn, int sprn); 105a829cec3SBruno Larsen (billionai) void spr_read_tbl(DisasContext *ctx, int gprn, int sprn); 106a829cec3SBruno Larsen (billionai) void spr_read_tbu(DisasContext *ctx, int gprn, int sprn); 107a829cec3SBruno Larsen (billionai) void spr_read_atbl(DisasContext *ctx, int gprn, int sprn); 108a829cec3SBruno Larsen (billionai) void spr_read_atbu(DisasContext *ctx, int gprn, int sprn); 109a829cec3SBruno Larsen (billionai) void spr_read_spefscr(DisasContext *ctx, int gprn, int sprn); 110a829cec3SBruno Larsen (billionai) void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn); 111565cb109SGustavo Romero void spr_write_MMCR0_ureg(DisasContext *ctx, int sprn, int gprn); 1127b3ecf16SDaniel Henrique Barboza void spr_write_MMCR2_ureg(DisasContext *ctx, int sprn, int gprn); 113cedf7069SDaniel Henrique Barboza void spr_write_PMC14_ureg(DisasContext *ctx, int sprn, int gprn); 114cedf7069SDaniel Henrique Barboza void spr_write_PMC56_ureg(DisasContext *ctx, int sprn, int gprn); 115a829cec3SBruno Larsen (billionai) 116a829cec3SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY 117a829cec3SBruno Larsen (billionai) void spr_write_clear(DisasContext *ctx, int sprn, int gprn); 118a829cec3SBruno Larsen (billionai) void spr_access_nop(DisasContext *ctx, int sprn, int gprn); 119a829cec3SBruno Larsen (billionai) void spr_read_decr(DisasContext *ctx, int gprn, int sprn); 120a829cec3SBruno Larsen (billionai) void spr_write_decr(DisasContext *ctx, int sprn, int gprn); 121a829cec3SBruno Larsen (billionai) void spr_write_tbl(DisasContext *ctx, int sprn, int gprn); 122a829cec3SBruno Larsen (billionai) void spr_write_tbu(DisasContext *ctx, int sprn, int gprn); 123a829cec3SBruno Larsen (billionai) void spr_write_atbl(DisasContext *ctx, int sprn, int gprn); 124a829cec3SBruno Larsen (billionai) void spr_write_atbu(DisasContext *ctx, int sprn, int gprn); 125a829cec3SBruno Larsen (billionai) void spr_read_ibat(DisasContext *ctx, int gprn, int sprn); 126a829cec3SBruno Larsen (billionai) void spr_read_ibat_h(DisasContext *ctx, int gprn, int sprn); 127a829cec3SBruno Larsen (billionai) void spr_write_ibatu(DisasContext *ctx, int sprn, int gprn); 128a829cec3SBruno Larsen (billionai) void spr_write_ibatu_h(DisasContext *ctx, int sprn, int gprn); 129a829cec3SBruno Larsen (billionai) void spr_write_ibatl(DisasContext *ctx, int sprn, int gprn); 130a829cec3SBruno Larsen (billionai) void spr_write_ibatl_h(DisasContext *ctx, int sprn, int gprn); 131a829cec3SBruno Larsen (billionai) void spr_read_dbat(DisasContext *ctx, int gprn, int sprn); 132a829cec3SBruno Larsen (billionai) void spr_read_dbat_h(DisasContext *ctx, int gprn, int sprn); 133a829cec3SBruno Larsen (billionai) void spr_write_dbatu(DisasContext *ctx, int sprn, int gprn); 134a829cec3SBruno Larsen (billionai) void spr_write_dbatu_h(DisasContext *ctx, int sprn, int gprn); 135a829cec3SBruno Larsen (billionai) void spr_write_dbatl(DisasContext *ctx, int sprn, int gprn); 136a829cec3SBruno Larsen (billionai) void spr_write_dbatl_h(DisasContext *ctx, int sprn, int gprn); 137a829cec3SBruno Larsen (billionai) void spr_write_sdr1(DisasContext *ctx, int sprn, int gprn); 138a829cec3SBruno Larsen (billionai) void spr_read_40x_pit(DisasContext *ctx, int gprn, int sprn); 139a829cec3SBruno Larsen (billionai) void spr_write_40x_pit(DisasContext *ctx, int sprn, int gprn); 140a829cec3SBruno Larsen (billionai) void spr_write_40x_dbcr0(DisasContext *ctx, int sprn, int gprn); 141a829cec3SBruno Larsen (billionai) void spr_write_40x_sler(DisasContext *ctx, int sprn, int gprn); 142cbd8f17dSCédric Le Goater void spr_write_40x_tcr(DisasContext *ctx, int sprn, int gprn); 143cbd8f17dSCédric Le Goater void spr_write_40x_tsr(DisasContext *ctx, int sprn, int gprn); 144dd69d140SCédric Le Goater void spr_write_40x_pid(DisasContext *ctx, int sprn, int gprn); 145a829cec3SBruno Larsen (billionai) void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn); 146a829cec3SBruno Larsen (billionai) void spr_write_booke_tsr(DisasContext *ctx, int sprn, int gprn); 147a829cec3SBruno Larsen (billionai) void spr_read_403_pbr(DisasContext *ctx, int gprn, int sprn); 148a829cec3SBruno Larsen (billionai) void spr_write_403_pbr(DisasContext *ctx, int sprn, int gprn); 149a829cec3SBruno Larsen (billionai) void spr_write_pir(DisasContext *ctx, int sprn, int gprn); 150a829cec3SBruno Larsen (billionai) void spr_write_excp_prefix(DisasContext *ctx, int sprn, int gprn); 151a829cec3SBruno Larsen (billionai) void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn); 152a829cec3SBruno Larsen (billionai) void spr_read_thrm(DisasContext *ctx, int gprn, int sprn); 153a829cec3SBruno Larsen (billionai) void spr_write_e500_l1csr0(DisasContext *ctx, int sprn, int gprn); 154a829cec3SBruno Larsen (billionai) void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn); 155a829cec3SBruno Larsen (billionai) void spr_write_e500_l2csr0(DisasContext *ctx, int sprn, int gprn); 156a829cec3SBruno Larsen (billionai) void spr_write_booke206_mmucsr0(DisasContext *ctx, int sprn, int gprn); 157a829cec3SBruno Larsen (billionai) void spr_write_booke_pid(DisasContext *ctx, int sprn, int gprn); 158a829cec3SBruno Larsen (billionai) void spr_write_eplc(DisasContext *ctx, int sprn, int gprn); 159a829cec3SBruno Larsen (billionai) void spr_write_epsc(DisasContext *ctx, int sprn, int gprn); 160a829cec3SBruno Larsen (billionai) void spr_write_mas73(DisasContext *ctx, int sprn, int gprn); 161a829cec3SBruno Larsen (billionai) void spr_read_mas73(DisasContext *ctx, int gprn, int sprn); 162a829cec3SBruno Larsen (billionai) #ifdef TARGET_PPC64 163a829cec3SBruno Larsen (billionai) void spr_read_cfar(DisasContext *ctx, int gprn, int sprn); 164a829cec3SBruno Larsen (billionai) void spr_write_cfar(DisasContext *ctx, int sprn, int gprn); 16514192307SNicholas Piggin void spr_write_ciabr(DisasContext *ctx, int sprn, int gprn); 166d5ee641cSNicholas Piggin void spr_write_dawr0(DisasContext *ctx, int sprn, int gprn); 167d5ee641cSNicholas Piggin void spr_write_dawrx0(DisasContext *ctx, int sprn, int gprn); 168*7ea6e125SShivaprasad G Bhat void spr_write_dawr1(DisasContext *ctx, int sprn, int gprn); 169*7ea6e125SShivaprasad G Bhat void spr_write_dawrx1(DisasContext *ctx, int sprn, int gprn); 170a829cec3SBruno Larsen (billionai) void spr_write_ureg(DisasContext *ctx, int sprn, int gprn); 171a829cec3SBruno Larsen (billionai) void spr_read_purr(DisasContext *ctx, int gprn, int sprn); 172a829cec3SBruno Larsen (billionai) void spr_write_purr(DisasContext *ctx, int sprn, int gprn); 173a829cec3SBruno Larsen (billionai) void spr_read_hdecr(DisasContext *ctx, int gprn, int sprn); 174a829cec3SBruno Larsen (billionai) void spr_write_hdecr(DisasContext *ctx, int sprn, int gprn); 175a829cec3SBruno Larsen (billionai) void spr_read_vtb(DisasContext *ctx, int gprn, int sprn); 176a829cec3SBruno Larsen (billionai) void spr_write_vtb(DisasContext *ctx, int sprn, int gprn); 177a829cec3SBruno Larsen (billionai) void spr_write_tbu40(DisasContext *ctx, int sprn, int gprn); 178a829cec3SBruno Larsen (billionai) void spr_write_pidr(DisasContext *ctx, int sprn, int gprn); 179a829cec3SBruno Larsen (billionai) void spr_write_lpidr(DisasContext *ctx, int sprn, int gprn); 180a829cec3SBruno Larsen (billionai) void spr_read_hior(DisasContext *ctx, int gprn, int sprn); 181a829cec3SBruno Larsen (billionai) void spr_write_hior(DisasContext *ctx, int sprn, int gprn); 182a829cec3SBruno Larsen (billionai) void spr_write_ptcr(DisasContext *ctx, int sprn, int gprn); 183a829cec3SBruno Larsen (billionai) void spr_write_pcr(DisasContext *ctx, int sprn, int gprn); 184a829cec3SBruno Larsen (billionai) void spr_read_dpdes(DisasContext *ctx, int gprn, int sprn); 185a829cec3SBruno Larsen (billionai) void spr_write_dpdes(DisasContext *ctx, int sprn, int gprn); 186a829cec3SBruno Larsen (billionai) void spr_write_amr(DisasContext *ctx, int sprn, int gprn); 187a829cec3SBruno Larsen (billionai) void spr_write_uamor(DisasContext *ctx, int sprn, int gprn); 188a829cec3SBruno Larsen (billionai) void spr_write_iamr(DisasContext *ctx, int sprn, int gprn); 189a829cec3SBruno Larsen (billionai) #endif 190a829cec3SBruno Larsen (billionai) #endif 191a829cec3SBruno Larsen (billionai) 192a829cec3SBruno Larsen (billionai) #ifdef TARGET_PPC64 193a829cec3SBruno Larsen (billionai) void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn); 194a829cec3SBruno Larsen (billionai) void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn); 195a829cec3SBruno Larsen (billionai) void spr_read_tar(DisasContext *ctx, int gprn, int sprn); 196a829cec3SBruno Larsen (billionai) void spr_write_tar(DisasContext *ctx, int sprn, int gprn); 197a829cec3SBruno Larsen (billionai) void spr_read_tm(DisasContext *ctx, int gprn, int sprn); 198a829cec3SBruno Larsen (billionai) void spr_write_tm(DisasContext *ctx, int sprn, int gprn); 199a829cec3SBruno Larsen (billionai) void spr_read_tm_upper32(DisasContext *ctx, int gprn, int sprn); 200a829cec3SBruno Larsen (billionai) void spr_write_tm_upper32(DisasContext *ctx, int sprn, int gprn); 201a829cec3SBruno Larsen (billionai) void spr_read_ebb(DisasContext *ctx, int gprn, int sprn); 202a829cec3SBruno Larsen (billionai) void spr_write_ebb(DisasContext *ctx, int sprn, int gprn); 203a829cec3SBruno Larsen (billionai) void spr_read_ebb_upper32(DisasContext *ctx, int gprn, int sprn); 204a829cec3SBruno Larsen (billionai) void spr_write_ebb_upper32(DisasContext *ctx, int sprn, int gprn); 205a829cec3SBruno Larsen (billionai) void spr_write_hmer(DisasContext *ctx, int sprn, int gprn); 206b25f2ffaSNicholas Piggin void spr_read_tfmr(DisasContext *ctx, int gprn, int sprn); 207b25f2ffaSNicholas Piggin void spr_write_tfmr(DisasContext *ctx, int sprn, int gprn); 208a829cec3SBruno Larsen (billionai) void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn); 209d3ce7dc9SNicholas Piggin void spr_read_pmsr(DisasContext *ctx, int gprn, int sprn); 210d3ce7dc9SNicholas Piggin void spr_write_pmcr(DisasContext *ctx, int sprn, int gprn); 211395b5d5bSNicholas Miehlbradt void spr_read_dexcr_ureg(DisasContext *ctx, int gprn, int sprn); 2121cbcbcb8SNicholas Piggin void spr_read_ppr32(DisasContext *ctx, int sprn, int gprn); 2131cbcbcb8SNicholas Piggin void spr_write_ppr32(DisasContext *ctx, int sprn, int gprn); 2142736432fSNicholas Piggin void spr_write_sprc(DisasContext *ctx, int sprn, int gprn); 2152736432fSNicholas Piggin void spr_read_sprd(DisasContext *ctx, int sprn, int gprn); 2162736432fSNicholas Piggin void spr_write_sprd(DisasContext *ctx, int sprn, int gprn); 217a829cec3SBruno Larsen (billionai) #endif 218a829cec3SBruno Larsen (billionai) 219917ea438SFabiano Rosas void register_low_BATs(CPUPPCState *env); 220917ea438SFabiano Rosas void register_high_BATs(CPUPPCState *env); 221917ea438SFabiano Rosas void register_sdr1_sprs(CPUPPCState *env); 222917ea438SFabiano Rosas void register_thrm_sprs(CPUPPCState *env); 223917ea438SFabiano Rosas void register_usprgh_sprs(CPUPPCState *env); 224917ea438SFabiano Rosas void register_non_embedded_sprs(CPUPPCState *env); 225917ea438SFabiano Rosas void register_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways); 22665e0446cSFabiano Rosas void register_generic_sprs(PowerPCCPU *cpu); 227917ea438SFabiano Rosas 228a829cec3SBruno Larsen (billionai) #endif 229