161766fe9SRichard Henderson /*
261766fe9SRichard Henderson * PA-RISC emulation cpu definitions for qemu.
361766fe9SRichard Henderson *
461766fe9SRichard Henderson * Copyright (c) 2016 Richard Henderson <rth@twiddle.net>
561766fe9SRichard Henderson *
661766fe9SRichard Henderson * This library is free software; you can redistribute it and/or
761766fe9SRichard Henderson * modify it under the terms of the GNU Lesser General Public
861766fe9SRichard Henderson * License as published by the Free Software Foundation; either
9d6ea4236SChetan Pant * version 2.1 of the License, or (at your option) any later version.
1061766fe9SRichard Henderson *
1161766fe9SRichard Henderson * This library is distributed in the hope that it will be useful,
1261766fe9SRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of
1361766fe9SRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1461766fe9SRichard Henderson * Lesser General Public License for more details.
1561766fe9SRichard Henderson *
1661766fe9SRichard Henderson * You should have received a copy of the GNU Lesser General Public
1761766fe9SRichard Henderson * License along with this library; if not, see <http://www.gnu.org/licenses/>.
1861766fe9SRichard Henderson */
1961766fe9SRichard Henderson
2061766fe9SRichard Henderson #ifndef HPPA_CPU_H
2161766fe9SRichard Henderson #define HPPA_CPU_H
2261766fe9SRichard Henderson
2361766fe9SRichard Henderson #include "cpu-qom.h"
2474433bf0SRichard Henderson #include "exec/cpu-defs.h"
2569242e7eSMarc-André Lureau #include "qemu/cpu-float.h"
2666866cc7SRichard Henderson #include "qemu/interval-tree.h"
27f33a22c1SRichard Henderson #include "hw/registerfields.h"
2861766fe9SRichard Henderson
29451d993dSRichard Henderson #define MMU_ABS_W_IDX 6
30451d993dSRichard Henderson #define MMU_ABS_IDX 7
31451d993dSRichard Henderson #define MMU_KERNEL_IDX 8
32451d993dSRichard Henderson #define MMU_KERNEL_P_IDX 9
33451d993dSRichard Henderson #define MMU_PL1_IDX 10
34451d993dSRichard Henderson #define MMU_PL1_P_IDX 11
35451d993dSRichard Henderson #define MMU_PL2_IDX 12
36451d993dSRichard Henderson #define MMU_PL2_P_IDX 13
37451d993dSRichard Henderson #define MMU_USER_IDX 14
38451d993dSRichard Henderson #define MMU_USER_P_IDX 15
39c400b6edSHelge Deller
40451d993dSRichard Henderson #define MMU_IDX_MMU_DISABLED(MIDX) ((MIDX) < MMU_KERNEL_IDX)
41bb67ec32SRichard Henderson #define MMU_IDX_TO_PRIV(MIDX) (((MIDX) - MMU_KERNEL_IDX) / 2)
42bb67ec32SRichard Henderson #define MMU_IDX_TO_P(MIDX) (((MIDX) - MMU_KERNEL_IDX) & 1)
43bb67ec32SRichard Henderson #define PRIV_P_TO_MMU_IDX(PRIV, P) ((PRIV) * 2 + !!(P) + MMU_KERNEL_IDX)
44c01e5dfbSHelge Deller
453c13b0ffSRichard Henderson #define PRIV_KERNEL 0
463c13b0ffSRichard Henderson #define PRIV_USER 3
473c13b0ffSRichard Henderson
48f5b5c857SRichard Henderson #define TARGET_INSN_START_EXTRA_WORDS 2
4961766fe9SRichard Henderson
50451d993dSRichard Henderson /* No need to flush MMU_ABS*_IDX */
5188b7ad10SHelge Deller #define HPPA_MMU_FLUSH_MASK \
52bb67ec32SRichard Henderson (1 << MMU_KERNEL_IDX | 1 << MMU_KERNEL_P_IDX | \
53bb67ec32SRichard Henderson 1 << MMU_PL1_IDX | 1 << MMU_PL1_P_IDX | \
54bb67ec32SRichard Henderson 1 << MMU_PL2_IDX | 1 << MMU_PL2_P_IDX | \
55bb67ec32SRichard Henderson 1 << MMU_USER_IDX | 1 << MMU_USER_P_IDX)
56bb67ec32SRichard Henderson
57385b3280SMichael Tokarev /* Indices to flush for access_id changes. */
58bb67ec32SRichard Henderson #define HPPA_MMU_FLUSH_P_MASK \
59bb67ec32SRichard Henderson (1 << MMU_KERNEL_P_IDX | 1 << MMU_PL1_P_IDX | \
60bb67ec32SRichard Henderson 1 << MMU_PL2_P_IDX | 1 << MMU_USER_P_IDX)
6188b7ad10SHelge Deller
628b81968cSMichael Tokarev /* Hardware exceptions, interrupts, faults, and traps. */
632986721dSRichard Henderson #define EXCP_HPMC 1 /* high priority machine check */
642986721dSRichard Henderson #define EXCP_POWER_FAIL 2
652986721dSRichard Henderson #define EXCP_RC 3 /* recovery counter */
662986721dSRichard Henderson #define EXCP_EXT_INTERRUPT 4 /* external interrupt */
672986721dSRichard Henderson #define EXCP_LPMC 5 /* low priority machine check */
682986721dSRichard Henderson #define EXCP_ITLB_MISS 6 /* itlb miss / instruction page fault */
692986721dSRichard Henderson #define EXCP_IMP 7 /* instruction memory protection trap */
702986721dSRichard Henderson #define EXCP_ILL 8 /* illegal instruction trap */
712986721dSRichard Henderson #define EXCP_BREAK 9 /* break instruction */
722986721dSRichard Henderson #define EXCP_PRIV_OPR 10 /* privileged operation trap */
732986721dSRichard Henderson #define EXCP_PRIV_REG 11 /* privileged register trap */
742986721dSRichard Henderson #define EXCP_OVERFLOW 12 /* signed overflow trap */
752986721dSRichard Henderson #define EXCP_COND 13 /* trap-on-condition */
762986721dSRichard Henderson #define EXCP_ASSIST 14 /* assist exception trap */
772986721dSRichard Henderson #define EXCP_DTLB_MISS 15 /* dtlb miss / data page fault */
782986721dSRichard Henderson #define EXCP_NA_ITLB_MISS 16 /* non-access itlb miss */
792986721dSRichard Henderson #define EXCP_NA_DTLB_MISS 17 /* non-access dtlb miss */
802986721dSRichard Henderson #define EXCP_DMP 18 /* data memory protection trap */
812986721dSRichard Henderson #define EXCP_DMB 19 /* data memory break trap */
822986721dSRichard Henderson #define EXCP_TLB_DIRTY 20 /* tlb dirty bit trap */
832986721dSRichard Henderson #define EXCP_PAGE_REF 21 /* page reference trap */
842986721dSRichard Henderson #define EXCP_ASSIST_EMU 22 /* assist emulation trap */
852986721dSRichard Henderson #define EXCP_HPT 23 /* high-privilege transfer trap */
862986721dSRichard Henderson #define EXCP_LPT 24 /* low-privilege transfer trap */
872986721dSRichard Henderson #define EXCP_TB 25 /* taken branch trap */
882986721dSRichard Henderson #define EXCP_DMAR 26 /* data memory access rights trap */
892986721dSRichard Henderson #define EXCP_DMPI 27 /* data memory protection id trap */
902986721dSRichard Henderson #define EXCP_UNALIGN 28 /* unaligned data reference trap */
912986721dSRichard Henderson #define EXCP_PER_INTERRUPT 29 /* performance monitor interrupt */
922986721dSRichard Henderson
932986721dSRichard Henderson /* Exceptions for linux-user emulation. */
942986721dSRichard Henderson #define EXCP_SYSCALL 30
952986721dSRichard Henderson #define EXCP_SYSCALL_LWS 31
9661766fe9SRichard Henderson
974a4554c6SHelge Deller /* Emulated hardware TOC button */
984a4554c6SHelge Deller #define EXCP_TOC 32 /* TOC = Transfer of control (NMI) */
994a4554c6SHelge Deller
1004a4554c6SHelge Deller #define CPU_INTERRUPT_NMI CPU_INTERRUPT_TGT_EXT_3 /* TOC */
1014a4554c6SHelge Deller
102fa57e327SRichard Henderson /* Taken from Linux kernel: arch/parisc/include/asm/psw.h */
103fa57e327SRichard Henderson #define PSW_I 0x00000001
104fa57e327SRichard Henderson #define PSW_D 0x00000002
105fa57e327SRichard Henderson #define PSW_P 0x00000004
106fa57e327SRichard Henderson #define PSW_Q 0x00000008
107fa57e327SRichard Henderson #define PSW_R 0x00000010
108fa57e327SRichard Henderson #define PSW_F 0x00000020
109fa57e327SRichard Henderson #define PSW_G 0x00000040 /* PA1.x only */
110fa57e327SRichard Henderson #define PSW_O 0x00000080 /* PA2.0 only */
111fa57e327SRichard Henderson #define PSW_CB 0x0000ff00
112fa57e327SRichard Henderson #define PSW_M 0x00010000
113fa57e327SRichard Henderson #define PSW_V 0x00020000
114fa57e327SRichard Henderson #define PSW_C 0x00040000
115fa57e327SRichard Henderson #define PSW_B 0x00080000
116fa57e327SRichard Henderson #define PSW_X 0x00100000
117fa57e327SRichard Henderson #define PSW_N 0x00200000
118fa57e327SRichard Henderson #define PSW_L 0x00400000
119fa57e327SRichard Henderson #define PSW_H 0x00800000
120fa57e327SRichard Henderson #define PSW_T 0x01000000
121fa57e327SRichard Henderson #define PSW_S 0x02000000
122fa57e327SRichard Henderson #define PSW_E 0x04000000
123fa57e327SRichard Henderson #define PSW_W 0x08000000 /* PA2.0 only */
124fa57e327SRichard Henderson #define PSW_Z 0x40000000 /* PA1.x only */
125fa57e327SRichard Henderson #define PSW_Y 0x80000000 /* PA1.x only */
126fa57e327SRichard Henderson
127fa57e327SRichard Henderson #define PSW_SM (PSW_W | PSW_E | PSW_O | PSW_G | PSW_F \
128fa57e327SRichard Henderson | PSW_R | PSW_Q | PSW_P | PSW_D | PSW_I)
129fa57e327SRichard Henderson
130fa57e327SRichard Henderson /* ssm/rsm instructions number PSW_W and PSW_E differently */
131fa57e327SRichard Henderson #define PSW_SM_I PSW_I /* Enable External Interrupts */
132fa57e327SRichard Henderson #define PSW_SM_D PSW_D
133fa57e327SRichard Henderson #define PSW_SM_P PSW_P
134fa57e327SRichard Henderson #define PSW_SM_Q PSW_Q /* Enable Interrupt State Collection */
135fa57e327SRichard Henderson #define PSW_SM_R PSW_R /* Enable Recover Counter Trap */
136fa57e327SRichard Henderson #define PSW_SM_E 0x100
137fa57e327SRichard Henderson #define PSW_SM_W 0x200 /* PA2.0 only : Enable Wide Mode */
138fa57e327SRichard Henderson
13935136a77SRichard Henderson #define CR_RC 0
140ab9af359SHelge Deller #define CR_PSW_DEFAULT 6 /* see SeaBIOS PDC_PSW firmware call */
141ab9af359SHelge Deller #define PDC_PSW_WIDE_BIT 2
142d5de20bdSSven Schnelle #define CR_PID1 8
143d5de20bdSSven Schnelle #define CR_PID2 9
144d5de20bdSSven Schnelle #define CR_PID3 12
145d5de20bdSSven Schnelle #define CR_PID4 13
14635136a77SRichard Henderson #define CR_SCRCCR 10
14735136a77SRichard Henderson #define CR_SAR 11
14835136a77SRichard Henderson #define CR_IVA 14
14935136a77SRichard Henderson #define CR_EIEM 15
15035136a77SRichard Henderson #define CR_IT 16
15135136a77SRichard Henderson #define CR_IIASQ 17
15235136a77SRichard Henderson #define CR_IIAOQ 18
15335136a77SRichard Henderson #define CR_IIR 19
15435136a77SRichard Henderson #define CR_ISR 20
15535136a77SRichard Henderson #define CR_IOR 21
15635136a77SRichard Henderson #define CR_IPSW 22
15735136a77SRichard Henderson #define CR_EIRR 23
15835136a77SRichard Henderson
159f33a22c1SRichard Henderson FIELD(FPSR, ENA_I, 0, 1)
160f33a22c1SRichard Henderson FIELD(FPSR, ENA_U, 1, 1)
161f33a22c1SRichard Henderson FIELD(FPSR, ENA_O, 2, 1)
162f33a22c1SRichard Henderson FIELD(FPSR, ENA_Z, 3, 1)
163f33a22c1SRichard Henderson FIELD(FPSR, ENA_V, 4, 1)
164f33a22c1SRichard Henderson FIELD(FPSR, ENABLES, 0, 5)
165f33a22c1SRichard Henderson FIELD(FPSR, D, 5, 1)
166f33a22c1SRichard Henderson FIELD(FPSR, T, 6, 1)
167f33a22c1SRichard Henderson FIELD(FPSR, RM, 9, 2)
168f33a22c1SRichard Henderson FIELD(FPSR, CQ, 11, 11)
169f33a22c1SRichard Henderson FIELD(FPSR, CQ0_6, 15, 7)
170f33a22c1SRichard Henderson FIELD(FPSR, CQ0_4, 17, 5)
171f33a22c1SRichard Henderson FIELD(FPSR, CQ0_2, 19, 3)
172f33a22c1SRichard Henderson FIELD(FPSR, CQ0, 21, 1)
173f33a22c1SRichard Henderson FIELD(FPSR, CA, 15, 7)
174f33a22c1SRichard Henderson FIELD(FPSR, CA0, 21, 1)
175f33a22c1SRichard Henderson FIELD(FPSR, C, 26, 1)
176f33a22c1SRichard Henderson FIELD(FPSR, FLG_I, 27, 1)
177f33a22c1SRichard Henderson FIELD(FPSR, FLG_U, 28, 1)
178f33a22c1SRichard Henderson FIELD(FPSR, FLG_O, 29, 1)
179f33a22c1SRichard Henderson FIELD(FPSR, FLG_Z, 30, 1)
180f33a22c1SRichard Henderson FIELD(FPSR, FLG_V, 31, 1)
181f33a22c1SRichard Henderson FIELD(FPSR, FLAGS, 27, 5)
182f33a22c1SRichard Henderson
183729cd350SRichard Henderson typedef struct HPPATLBEntry {
184d7553f35SRichard Henderson union {
18566866cc7SRichard Henderson IntervalTreeNode itree;
186d7553f35SRichard Henderson struct HPPATLBEntry *unused_next;
187d7553f35SRichard Henderson };
18866866cc7SRichard Henderson
189c53e401eSRichard Henderson target_ulong pa;
190f8cda28bSRichard Henderson
191f8cda28bSRichard Henderson unsigned entry_valid : 1;
192f8cda28bSRichard Henderson
193650cdb2aSRichard Henderson unsigned u : 1;
194650cdb2aSRichard Henderson unsigned t : 1;
195650cdb2aSRichard Henderson unsigned d : 1;
196650cdb2aSRichard Henderson unsigned b : 1;
197650cdb2aSRichard Henderson unsigned ar_type : 3;
198650cdb2aSRichard Henderson unsigned ar_pl1 : 2;
199650cdb2aSRichard Henderson unsigned ar_pl2 : 2;
200650cdb2aSRichard Henderson unsigned access_id : 16;
201729cd350SRichard Henderson } HPPATLBEntry;
202650cdb2aSRichard Henderson
2031ea4a06aSPhilippe Mathieu-Daudé typedef struct CPUArchState {
204c53e401eSRichard Henderson target_ulong iaoq_f; /* front */
205c53e401eSRichard Henderson target_ulong iaoq_b; /* back, aka next instruction */
206f8c0fd98SHelge Deller
207c53e401eSRichard Henderson target_ulong gr[32];
20861766fe9SRichard Henderson uint64_t fr[32];
20933423472SRichard Henderson uint64_t sr[8]; /* stored shifted into place for gva */
21061766fe9SRichard Henderson
211ebc9401aSRichard Henderson uint32_t psw; /* All psw bits except the following: */
212ebc9401aSRichard Henderson uint32_t psw_xb; /* X and B, in their normal positions */
213c53e401eSRichard Henderson target_ulong psw_n; /* boolean */
214ead5078cSHelge Deller target_long psw_v; /* in bit 31 */
21561766fe9SRichard Henderson
21661766fe9SRichard Henderson /* Splitting the carry-borrow field into the MSB and "the rest", allows
21761766fe9SRichard Henderson * for "the rest" to be deleted when it is unused, but the MSB is in use.
21861766fe9SRichard Henderson * In addition, it's easier to compute carry-in for bit B+1 than it is to
21961766fe9SRichard Henderson * compute carry-out for bit B (3 vs 4 insns for addition, assuming the
22061766fe9SRichard Henderson * host has the appropriate add-with-carry insn to compute the msb).
22161766fe9SRichard Henderson * Therefore the carry bits are stored as: cb_msb : cb & 0x11111110.
22261766fe9SRichard Henderson */
223c53e401eSRichard Henderson target_ulong psw_cb; /* in least significant bit of next nibble */
224c53e401eSRichard Henderson target_ulong psw_cb_msb; /* boolean */
22561766fe9SRichard Henderson
226c301f34eSRichard Henderson uint64_t iasq_f;
227c301f34eSRichard Henderson uint64_t iasq_b;
22861766fe9SRichard Henderson
22961766fe9SRichard Henderson uint32_t fr0_shadow; /* flags, c, ca/cq, rm, d, enables */
23061766fe9SRichard Henderson float_status fp_status;
23161766fe9SRichard Henderson
232c53e401eSRichard Henderson target_ulong cr[32]; /* control registers */
233c53e401eSRichard Henderson target_ulong cr_back[2]; /* back of cr17/cr18 */
234c53e401eSRichard Henderson target_ulong shadow[7]; /* shadow registers */
23535136a77SRichard Henderson
2369cf2112bSRichard Henderson /*
237f5b5c857SRichard Henderson * During unwind of a memory insn, the base register of the address.
238f5b5c857SRichard Henderson * This is used to construct CR_IOR for pa2.0.
239f5b5c857SRichard Henderson */
240f5b5c857SRichard Henderson uint32_t unwind_breg;
241f5b5c857SRichard Henderson
242f5b5c857SRichard Henderson /*
2439cf2112bSRichard Henderson * ??? The number of entries isn't specified by the architecture.
2449cf2112bSRichard Henderson * BTLBs are not supported in 64-bit machines.
2459cf2112bSRichard Henderson */
2469cf2112bSRichard Henderson #define PA10_BTLB_FIXED 16
2479cf2112bSRichard Henderson #define PA10_BTLB_VARIABLE 0
248df5c6a50SHelge Deller #define HPPA_TLB_ENTRIES 256
249df5c6a50SHelge Deller
250d7553f35SRichard Henderson /* Index for round-robin tlb eviction. */
251650cdb2aSRichard Henderson uint32_t tlb_last;
252d7553f35SRichard Henderson
253d7553f35SRichard Henderson /*
254d7553f35SRichard Henderson * For pa1.x, the partial initialized, still invalid tlb entry
255d7553f35SRichard Henderson * which has had ITLBA performed, but not yet ITLBP.
256d7553f35SRichard Henderson */
257d7553f35SRichard Henderson HPPATLBEntry *tlb_partial;
258d7553f35SRichard Henderson
259d7553f35SRichard Henderson /* Linked list of all invalid (unused) tlb entries. */
260d7553f35SRichard Henderson HPPATLBEntry *tlb_unused;
261d7553f35SRichard Henderson
262d7553f35SRichard Henderson /* Root of the search tree for all valid tlb entries. */
263d7553f35SRichard Henderson IntervalTreeRoot tlb_root;
264d7553f35SRichard Henderson
265d7553f35SRichard Henderson HPPATLBEntry tlb[HPPA_TLB_ENTRIES];
2661ea4a06aSPhilippe Mathieu-Daudé } CPUHPPAState;
26761766fe9SRichard Henderson
26861766fe9SRichard Henderson /**
26961766fe9SRichard Henderson * HPPACPU:
27061766fe9SRichard Henderson * @env: #CPUHPPAState
27161766fe9SRichard Henderson *
27261766fe9SRichard Henderson * An HPPA CPU.
27361766fe9SRichard Henderson */
274b36e239eSPhilippe Mathieu-Daudé struct ArchCPU {
27561766fe9SRichard Henderson CPUState parent_obj;
27661766fe9SRichard Henderson
27761766fe9SRichard Henderson CPUHPPAState env;
27849c29d6cSRichard Henderson QEMUTimer *alarm_timer;
27961766fe9SRichard Henderson };
28061766fe9SRichard Henderson
2819348028eSPhilippe Mathieu-Daudé /**
2829348028eSPhilippe Mathieu-Daudé * HPPACPUClass:
2839348028eSPhilippe Mathieu-Daudé * @parent_realize: The parent class' realize handler.
2849348028eSPhilippe Mathieu-Daudé *
2859348028eSPhilippe Mathieu-Daudé * An HPPA CPU model.
2869348028eSPhilippe Mathieu-Daudé */
2879348028eSPhilippe Mathieu-Daudé struct HPPACPUClass {
2889348028eSPhilippe Mathieu-Daudé CPUClass parent_class;
2899348028eSPhilippe Mathieu-Daudé
2909348028eSPhilippe Mathieu-Daudé DeviceRealize parent_realize;
2919348028eSPhilippe Mathieu-Daudé };
2929348028eSPhilippe Mathieu-Daudé
29361766fe9SRichard Henderson #include "exec/cpu-all.h"
29461766fe9SRichard Henderson
hppa_is_pa20(CPUHPPAState * env)295bd6243a3SRichard Henderson static inline bool hppa_is_pa20(CPUHPPAState *env)
296bd6243a3SRichard Henderson {
297bd6243a3SRichard Henderson return object_dynamic_cast(OBJECT(env_cpu(env)), TYPE_HPPA64_CPU) != NULL;
298bd6243a3SRichard Henderson }
299bd6243a3SRichard Henderson
HPPA_BTLB_ENTRIES(CPUHPPAState * env)3009cf2112bSRichard Henderson static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
3019cf2112bSRichard Henderson {
3029cf2112bSRichard Henderson return hppa_is_pa20(env) ? 0 : PA10_BTLB_FIXED + PA10_BTLB_VARIABLE;
3039cf2112bSRichard Henderson }
3049cf2112bSRichard Henderson
30561766fe9SRichard Henderson void hppa_translate_init(void);
30661766fe9SRichard Henderson
3070dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
30861766fe9SRichard Henderson
gva_offset_mask(target_ulong psw)3097d50b696SSven Schnelle static inline uint64_t gva_offset_mask(target_ulong psw)
3107d50b696SSven Schnelle {
3117d50b696SSven Schnelle return (psw & PSW_W
3127d50b696SSven Schnelle ? MAKE_64BIT_MASK(0, 62)
3137d50b696SSven Schnelle : MAKE_64BIT_MASK(0, 32));
3147d50b696SSven Schnelle }
3157d50b696SSven Schnelle
hppa_form_gva_psw(target_ulong psw,uint64_t spc,target_ulong off)316c53e401eSRichard Henderson static inline target_ulong hppa_form_gva_psw(target_ulong psw, uint64_t spc,
317c53e401eSRichard Henderson target_ulong off)
318c301f34eSRichard Henderson {
319c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY
320d33d3adbSHelge Deller return off & gva_offset_mask(psw);
321c301f34eSRichard Henderson #else
3227d50b696SSven Schnelle return spc | (off & gva_offset_mask(psw));
323c301f34eSRichard Henderson #endif
324c301f34eSRichard Henderson }
325c301f34eSRichard Henderson
hppa_form_gva(CPUHPPAState * env,uint64_t spc,target_ulong off)326c301f34eSRichard Henderson static inline target_ulong hppa_form_gva(CPUHPPAState *env, uint64_t spc,
327c53e401eSRichard Henderson target_ulong off)
328c301f34eSRichard Henderson {
329c301f34eSRichard Henderson return hppa_form_gva_psw(env->psw, spc, off);
330c301f34eSRichard Henderson }
331c301f34eSRichard Henderson
332ccdf741cSRichard Henderson hwaddr hppa_abs_to_phys_pa2_w0(vaddr addr);
333ccdf741cSRichard Henderson hwaddr hppa_abs_to_phys_pa2_w1(vaddr addr);
334ccdf741cSRichard Henderson
335217d1a5eSRichard Henderson /*
336217d1a5eSRichard Henderson * Since PSW_{I,CB} will never need to be in tb->flags, reuse them.
337494737b7SRichard Henderson * TB_FLAG_SR_SAME indicates that SR4 through SR7 all contain the
338494737b7SRichard Henderson * same value.
339494737b7SRichard Henderson */
340494737b7SRichard Henderson #define TB_FLAG_SR_SAME PSW_I
341c301f34eSRichard Henderson #define TB_FLAG_PRIV_SHIFT 8
342217d1a5eSRichard Henderson #define TB_FLAG_UNALIGN 0x400
3439dfcd243SRichard Henderson #define CS_BASE_DIFFPAGE (1 << 12)
3449dfcd243SRichard Henderson #define CS_BASE_DIFFSPACE (1 << 13)
345c301f34eSRichard Henderson
346b61603bfSRichard Henderson void cpu_get_tb_cpu_state(CPUHPPAState *env, vaddr *pc,
347b61603bfSRichard Henderson uint64_t *cs_base, uint32_t *pflags);
34861766fe9SRichard Henderson
349c53e401eSRichard Henderson target_ulong cpu_hppa_get_psw(CPUHPPAState *env);
350c53e401eSRichard Henderson void cpu_hppa_put_psw(CPUHPPAState *env, target_ulong);
35161766fe9SRichard Henderson void cpu_hppa_loaded_fr0(CPUHPPAState *env);
35261766fe9SRichard Henderson
353d5de20bdSSven Schnelle #ifdef CONFIG_USER_ONLY
cpu_hppa_change_prot_id(CPUHPPAState * env)354d5de20bdSSven Schnelle static inline void cpu_hppa_change_prot_id(CPUHPPAState *env) { }
355d5de20bdSSven Schnelle #else
356d5de20bdSSven Schnelle void cpu_hppa_change_prot_id(CPUHPPAState *env);
357d5de20bdSSven Schnelle #endif
358d5de20bdSSven Schnelle
359a010bdbeSAlex Bennée int hppa_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
36061766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
36190c84c56SMarkus Armbruster void hppa_cpu_dump_state(CPUState *cs, FILE *f, int);
362860e0b96SRichard Henderson #ifndef CONFIG_USER_ONLY
363d7553f35SRichard Henderson void hppa_ptlbe(CPUHPPAState *env);
3646d2d454aSPhilippe Mathieu-Daudé hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr);
3653824e0d6SHelge Deller void hppa_set_ior_and_isr(CPUHPPAState *env, vaddr addr, bool mmu_disabled);
366*99746de6SRichard Henderson bool hppa_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out, vaddr addr,
3673c7bef03SRichard Henderson MMUAccessType access_type, int mmu_idx,
368*99746de6SRichard Henderson MemOp memop, int size, bool probe, uintptr_t ra);
36968fa1780SPhilippe Mathieu-Daudé void hppa_cpu_do_interrupt(CPUState *cpu);
37068fa1780SPhilippe Mathieu-Daudé bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req);
371650cdb2aSRichard Henderson int hppa_get_physical_address(CPUHPPAState *env, vaddr addr, int mmu_idx,
3724e6939c9SRichard Henderson int type, MemOp mop, hwaddr *pphys, int *pprot);
3739ccbe394SHelge Deller void hppa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
3749ccbe394SHelge Deller vaddr addr, unsigned size,
3759ccbe394SHelge Deller MMUAccessType access_type,
3769ccbe394SHelge Deller int mmu_idx, MemTxAttrs attrs,
3779ccbe394SHelge Deller MemTxResult response, uintptr_t retaddr);
3784f5f2548SRichard Henderson extern const MemoryRegionOps hppa_io_eir_ops;
3798a9358ccSMarkus Armbruster extern const VMStateDescription vmstate_hppa_cpu;
38049c29d6cSRichard Henderson void hppa_cpu_alarm_timer(void *);
381650cdb2aSRichard Henderson #endif
3828905770bSMarc-André Lureau G_NORETURN void hppa_dynamic_excp(CPUHPPAState *env, int excp, uintptr_t ra);
38361766fe9SRichard Henderson
384d3ae32d4SRichard Henderson #define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
385d3ae32d4SRichard Henderson
38661766fe9SRichard Henderson #endif /* HPPA_CPU_H */
387