xref: /openbmc/qemu/target/ppc/spr_common.h (revision ffdd099a782556b9ead26551a6f1d070a595306d)
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