199e964efSFabiano Rosas /* 299e964efSFabiano Rosas * PowerPC emulation for qemu: read/write callbacks for SPRs 399e964efSFabiano Rosas * 499e964efSFabiano Rosas * Copyright (C) 2021 Instituto de Pesquisas Eldorado 599e964efSFabiano Rosas * 699e964efSFabiano Rosas * This library is free software; you can redistribute it and/or 799e964efSFabiano Rosas * modify it under the terms of the GNU Lesser General Public 899e964efSFabiano Rosas * License as published by the Free Software Foundation; either 999e964efSFabiano Rosas * version 2.1 of the License, or (at your option) any later version. 1099e964efSFabiano Rosas * 1199e964efSFabiano Rosas * This library is distributed in the hope that it will be useful, 1299e964efSFabiano Rosas * but WITHOUT ANY WARRANTY; without even the implied warranty of 1399e964efSFabiano Rosas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1499e964efSFabiano Rosas * Lesser General Public License for more details. 1599e964efSFabiano Rosas * 1699e964efSFabiano Rosas * You should have received a copy of the GNU Lesser General Public 1799e964efSFabiano Rosas * License along with this library; if not, see <http://www.gnu.org/licenses/>. 1899e964efSFabiano Rosas */ 1999e964efSFabiano Rosas #ifndef SPR_COMMON_H 2099e964efSFabiano Rosas #define SPR_COMMON_H 2199e964efSFabiano Rosas 2299e964efSFabiano Rosas #define SPR_NOACCESS (&spr_noaccess) 2399e964efSFabiano Rosas 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 8099e964efSFabiano Rosas /* prototypes for readers and writers for SPRs */ 8199e964efSFabiano Rosas void spr_noaccess(DisasContext *ctx, int gprn, int sprn); 8299e964efSFabiano Rosas void spr_read_generic(DisasContext *ctx, int gprn, int sprn); 8399e964efSFabiano Rosas 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); 8899e964efSFabiano Rosas void spr_write_MMCR0(DisasContext *ctx, int sprn, int gprn); 8999e964efSFabiano Rosas void spr_write_MMCR1(DisasContext *ctx, int sprn, int gprn); 90a7138e28SGlenn Miles void spr_write_MMCRA(DisasContext *ctx, int sprn, int gprn); 9199e964efSFabiano Rosas void spr_write_PMC(DisasContext *ctx, int sprn, int gprn); 9299e964efSFabiano Rosas void spr_write_CTRL(DisasContext *ctx, int sprn, int gprn); 9399e964efSFabiano Rosas void spr_read_xer(DisasContext *ctx, int gprn, int sprn); 9499e964efSFabiano Rosas void spr_write_xer(DisasContext *ctx, int sprn, int gprn); 9599e964efSFabiano Rosas void spr_read_lr(DisasContext *ctx, int gprn, int sprn); 9699e964efSFabiano Rosas void spr_write_lr(DisasContext *ctx, int sprn, int gprn); 9799e964efSFabiano Rosas void spr_read_ctr(DisasContext *ctx, int gprn, int sprn); 9899e964efSFabiano Rosas void spr_write_ctr(DisasContext *ctx, int sprn, int gprn); 9999e964efSFabiano Rosas void spr_read_ureg(DisasContext *ctx, int gprn, int sprn); 10099e964efSFabiano Rosas void spr_read_MMCR0_ureg(DisasContext *ctx, int gprn, int sprn); 10199e964efSFabiano Rosas void spr_read_MMCR2_ureg(DisasContext *ctx, int gprn, int sprn); 10299e964efSFabiano Rosas void spr_read_PMC(DisasContext *ctx, int gprn, int sprn); 10399e964efSFabiano Rosas void spr_read_PMC14_ureg(DisasContext *ctx, int gprn, int sprn); 10499e964efSFabiano Rosas void spr_read_PMC56_ureg(DisasContext *ctx, int gprn, int sprn); 10599e964efSFabiano Rosas void spr_read_tbl(DisasContext *ctx, int gprn, int sprn); 10699e964efSFabiano Rosas void spr_read_tbu(DisasContext *ctx, int gprn, int sprn); 10799e964efSFabiano Rosas void spr_read_atbl(DisasContext *ctx, int gprn, int sprn); 10899e964efSFabiano Rosas void spr_read_atbu(DisasContext *ctx, int gprn, int sprn); 10999e964efSFabiano Rosas void spr_read_spefscr(DisasContext *ctx, int gprn, int sprn); 11099e964efSFabiano Rosas void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn); 11199e964efSFabiano Rosas void spr_write_MMCR0_ureg(DisasContext *ctx, int sprn, int gprn); 11299e964efSFabiano Rosas void spr_write_MMCR2_ureg(DisasContext *ctx, int sprn, int gprn); 11399e964efSFabiano Rosas void spr_write_PMC14_ureg(DisasContext *ctx, int sprn, int gprn); 11499e964efSFabiano Rosas void spr_write_PMC56_ureg(DisasContext *ctx, int sprn, int gprn); 11599e964efSFabiano Rosas 11699e964efSFabiano Rosas #ifndef CONFIG_USER_ONLY 11799e964efSFabiano Rosas void spr_write_clear(DisasContext *ctx, int sprn, int gprn); 11899e964efSFabiano Rosas void spr_access_nop(DisasContext *ctx, int sprn, int gprn); 11999e964efSFabiano Rosas void spr_read_decr(DisasContext *ctx, int gprn, int sprn); 12099e964efSFabiano Rosas void spr_write_decr(DisasContext *ctx, int sprn, int gprn); 12199e964efSFabiano Rosas void spr_write_tbl(DisasContext *ctx, int sprn, int gprn); 12299e964efSFabiano Rosas void spr_write_tbu(DisasContext *ctx, int sprn, int gprn); 12399e964efSFabiano Rosas void spr_write_atbl(DisasContext *ctx, int sprn, int gprn); 12499e964efSFabiano Rosas void spr_write_atbu(DisasContext *ctx, int sprn, int gprn); 12599e964efSFabiano Rosas void spr_read_ibat(DisasContext *ctx, int gprn, int sprn); 12699e964efSFabiano Rosas void spr_read_ibat_h(DisasContext *ctx, int gprn, int sprn); 12799e964efSFabiano Rosas void spr_write_ibatu(DisasContext *ctx, int sprn, int gprn); 12899e964efSFabiano Rosas void spr_write_ibatu_h(DisasContext *ctx, int sprn, int gprn); 12999e964efSFabiano Rosas void spr_write_ibatl(DisasContext *ctx, int sprn, int gprn); 13099e964efSFabiano Rosas void spr_write_ibatl_h(DisasContext *ctx, int sprn, int gprn); 13199e964efSFabiano Rosas void spr_read_dbat(DisasContext *ctx, int gprn, int sprn); 13299e964efSFabiano Rosas void spr_read_dbat_h(DisasContext *ctx, int gprn, int sprn); 13399e964efSFabiano Rosas void spr_write_dbatu(DisasContext *ctx, int sprn, int gprn); 13499e964efSFabiano Rosas void spr_write_dbatu_h(DisasContext *ctx, int sprn, int gprn); 13599e964efSFabiano Rosas void spr_write_dbatl(DisasContext *ctx, int sprn, int gprn); 13699e964efSFabiano Rosas void spr_write_dbatl_h(DisasContext *ctx, int sprn, int gprn); 13799e964efSFabiano Rosas void spr_write_sdr1(DisasContext *ctx, int sprn, int gprn); 13899e964efSFabiano Rosas void spr_read_40x_pit(DisasContext *ctx, int gprn, int sprn); 13999e964efSFabiano Rosas void spr_write_40x_pit(DisasContext *ctx, int sprn, int gprn); 14099e964efSFabiano Rosas void spr_write_40x_dbcr0(DisasContext *ctx, int sprn, int gprn); 14199e964efSFabiano Rosas void spr_write_40x_sler(DisasContext *ctx, int sprn, int gprn); 14299e964efSFabiano Rosas void spr_write_40x_tcr(DisasContext *ctx, int sprn, int gprn); 14399e964efSFabiano Rosas void spr_write_40x_tsr(DisasContext *ctx, int sprn, int gprn); 14499e964efSFabiano Rosas void spr_write_40x_pid(DisasContext *ctx, int sprn, int gprn); 14599e964efSFabiano Rosas void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn); 14699e964efSFabiano Rosas void spr_write_booke_tsr(DisasContext *ctx, int sprn, int gprn); 14799e964efSFabiano Rosas void spr_read_403_pbr(DisasContext *ctx, int gprn, int sprn); 14899e964efSFabiano Rosas void spr_write_403_pbr(DisasContext *ctx, int sprn, int gprn); 14999e964efSFabiano Rosas void spr_write_pir(DisasContext *ctx, int sprn, int gprn); 15099e964efSFabiano Rosas void spr_write_excp_prefix(DisasContext *ctx, int sprn, int gprn); 15199e964efSFabiano Rosas void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn); 15299e964efSFabiano Rosas void spr_read_thrm(DisasContext *ctx, int gprn, int sprn); 15399e964efSFabiano Rosas void spr_write_e500_l1csr0(DisasContext *ctx, int sprn, int gprn); 15499e964efSFabiano Rosas void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn); 15599e964efSFabiano Rosas void spr_write_e500_l2csr0(DisasContext *ctx, int sprn, int gprn); 15699e964efSFabiano Rosas void spr_write_booke206_mmucsr0(DisasContext *ctx, int sprn, int gprn); 15799e964efSFabiano Rosas void spr_write_booke_pid(DisasContext *ctx, int sprn, int gprn); 15899e964efSFabiano Rosas void spr_write_eplc(DisasContext *ctx, int sprn, int gprn); 15999e964efSFabiano Rosas void spr_write_epsc(DisasContext *ctx, int sprn, int gprn); 16099e964efSFabiano Rosas void spr_write_mas73(DisasContext *ctx, int sprn, int gprn); 16199e964efSFabiano Rosas void spr_read_mas73(DisasContext *ctx, int gprn, int sprn); 16299e964efSFabiano Rosas #ifdef TARGET_PPC64 16399e964efSFabiano Rosas void spr_read_cfar(DisasContext *ctx, int gprn, int sprn); 16499e964efSFabiano Rosas 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); 16899e964efSFabiano Rosas void spr_write_ureg(DisasContext *ctx, int sprn, int gprn); 16999e964efSFabiano Rosas void spr_read_purr(DisasContext *ctx, int gprn, int sprn); 17099e964efSFabiano Rosas void spr_write_purr(DisasContext *ctx, int sprn, int gprn); 17199e964efSFabiano Rosas void spr_read_hdecr(DisasContext *ctx, int gprn, int sprn); 17299e964efSFabiano Rosas void spr_write_hdecr(DisasContext *ctx, int sprn, int gprn); 17399e964efSFabiano Rosas void spr_read_vtb(DisasContext *ctx, int gprn, int sprn); 17499e964efSFabiano Rosas void spr_write_vtb(DisasContext *ctx, int sprn, int gprn); 17599e964efSFabiano Rosas void spr_write_tbu40(DisasContext *ctx, int sprn, int gprn); 17699e964efSFabiano Rosas void spr_write_pidr(DisasContext *ctx, int sprn, int gprn); 17799e964efSFabiano Rosas void spr_write_lpidr(DisasContext *ctx, int sprn, int gprn); 17899e964efSFabiano Rosas void spr_read_hior(DisasContext *ctx, int gprn, int sprn); 17999e964efSFabiano Rosas void spr_write_hior(DisasContext *ctx, int sprn, int gprn); 18099e964efSFabiano Rosas void spr_write_ptcr(DisasContext *ctx, int sprn, int gprn); 18199e964efSFabiano Rosas void spr_write_pcr(DisasContext *ctx, int sprn, int gprn); 18299e964efSFabiano Rosas void spr_read_dpdes(DisasContext *ctx, int gprn, int sprn); 18399e964efSFabiano Rosas void spr_write_dpdes(DisasContext *ctx, int sprn, int gprn); 18499e964efSFabiano Rosas void spr_write_amr(DisasContext *ctx, int sprn, int gprn); 18599e964efSFabiano Rosas void spr_write_uamor(DisasContext *ctx, int sprn, int gprn); 18699e964efSFabiano Rosas void spr_write_iamr(DisasContext *ctx, int sprn, int gprn); 18799e964efSFabiano Rosas #endif 18899e964efSFabiano Rosas #endif 18999e964efSFabiano Rosas 19099e964efSFabiano Rosas #ifdef TARGET_PPC64 19199e964efSFabiano Rosas void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn); 19299e964efSFabiano Rosas void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn); 19399e964efSFabiano Rosas void spr_read_tar(DisasContext *ctx, int gprn, int sprn); 19499e964efSFabiano Rosas void spr_write_tar(DisasContext *ctx, int sprn, int gprn); 19599e964efSFabiano Rosas void spr_read_tm(DisasContext *ctx, int gprn, int sprn); 19699e964efSFabiano Rosas void spr_write_tm(DisasContext *ctx, int sprn, int gprn); 19799e964efSFabiano Rosas void spr_read_tm_upper32(DisasContext *ctx, int gprn, int sprn); 19899e964efSFabiano Rosas void spr_write_tm_upper32(DisasContext *ctx, int sprn, int gprn); 19999e964efSFabiano Rosas void spr_read_ebb(DisasContext *ctx, int gprn, int sprn); 20099e964efSFabiano Rosas void spr_write_ebb(DisasContext *ctx, int sprn, int gprn); 20199e964efSFabiano Rosas void spr_read_ebb_upper32(DisasContext *ctx, int gprn, int sprn); 20299e964efSFabiano Rosas void spr_write_ebb_upper32(DisasContext *ctx, int sprn, int gprn); 20399e964efSFabiano Rosas void spr_write_hmer(DisasContext *ctx, int sprn, int gprn); 204b25f2ffaSNicholas Piggin void spr_read_tfmr(DisasContext *ctx, int gprn, int sprn); 205b25f2ffaSNicholas Piggin void spr_write_tfmr(DisasContext *ctx, int sprn, int gprn); 20699e964efSFabiano Rosas void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn); 207395b5d5bSNicholas Miehlbradt void spr_read_dexcr_ureg(DisasContext *ctx, int gprn, int sprn); 2081cbcbcb8SNicholas Piggin void spr_read_ppr32(DisasContext *ctx, int sprn, int gprn); 2091cbcbcb8SNicholas Piggin void spr_write_ppr32(DisasContext *ctx, int sprn, int gprn); 210*2736432fSNicholas Piggin void spr_write_sprc(DisasContext *ctx, int sprn, int gprn); 211*2736432fSNicholas Piggin void spr_read_sprd(DisasContext *ctx, int sprn, int gprn); 212*2736432fSNicholas Piggin void spr_write_sprd(DisasContext *ctx, int sprn, int gprn); 21399e964efSFabiano Rosas #endif 21499e964efSFabiano Rosas 215917ea438SFabiano Rosas void register_low_BATs(CPUPPCState *env); 216917ea438SFabiano Rosas void register_high_BATs(CPUPPCState *env); 217917ea438SFabiano Rosas void register_sdr1_sprs(CPUPPCState *env); 218917ea438SFabiano Rosas void register_thrm_sprs(CPUPPCState *env); 219917ea438SFabiano Rosas void register_usprgh_sprs(CPUPPCState *env); 220917ea438SFabiano Rosas void register_non_embedded_sprs(CPUPPCState *env); 221917ea438SFabiano Rosas void register_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways); 22265e0446cSFabiano Rosas void register_generic_sprs(PowerPCCPU *cpu); 223917ea438SFabiano Rosas 22499e964efSFabiano Rosas #endif 225