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