xref: /qemu/target/hppa/cpu.h (revision 7cef6d686309e2792186504ae17cf4f3eb57ef68)
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"
24*d97c3b06SPierrick Bouvier #include "exec/cpu-common.h"
2574433bf0SRichard Henderson #include "exec/cpu-defs.h"
2622a7c2f2SPierrick Bouvier #include "exec/cpu-interrupt.h"
27342e313dSPierrick Bouvier #include "system/memory.h"
2869242e7eSMarc-André Lureau #include "qemu/cpu-float.h"
2966866cc7SRichard Henderson #include "qemu/interval-tree.h"
30f33a22c1SRichard Henderson #include "hw/registerfields.h"
3161766fe9SRichard Henderson 
32451d993dSRichard Henderson #define MMU_ABS_W_IDX     6
33451d993dSRichard Henderson #define MMU_ABS_IDX       7
34451d993dSRichard Henderson #define MMU_KERNEL_IDX    8
35451d993dSRichard Henderson #define MMU_KERNEL_P_IDX  9
36451d993dSRichard Henderson #define MMU_PL1_IDX       10
37451d993dSRichard Henderson #define MMU_PL1_P_IDX     11
38451d993dSRichard Henderson #define MMU_PL2_IDX       12
39451d993dSRichard Henderson #define MMU_PL2_P_IDX     13
40451d993dSRichard Henderson #define MMU_USER_IDX      14
41451d993dSRichard Henderson #define MMU_USER_P_IDX    15
42c400b6edSHelge Deller 
43451d993dSRichard Henderson #define MMU_IDX_MMU_DISABLED(MIDX)  ((MIDX) < MMU_KERNEL_IDX)
44bb67ec32SRichard Henderson #define MMU_IDX_TO_PRIV(MIDX)       (((MIDX) - MMU_KERNEL_IDX) / 2)
45bb67ec32SRichard Henderson #define MMU_IDX_TO_P(MIDX)          (((MIDX) - MMU_KERNEL_IDX) & 1)
46bb67ec32SRichard Henderson #define PRIV_P_TO_MMU_IDX(PRIV, P)  ((PRIV) * 2 + !!(P) + MMU_KERNEL_IDX)
47c01e5dfbSHelge Deller 
483c13b0ffSRichard Henderson #define PRIV_KERNEL       0
493c13b0ffSRichard Henderson #define PRIV_USER         3
503c13b0ffSRichard Henderson 
51451d993dSRichard Henderson /* No need to flush MMU_ABS*_IDX  */
5288b7ad10SHelge Deller #define HPPA_MMU_FLUSH_MASK                             \
53bb67ec32SRichard Henderson         (1 << MMU_KERNEL_IDX | 1 << MMU_KERNEL_P_IDX |  \
54bb67ec32SRichard Henderson          1 << MMU_PL1_IDX    | 1 << MMU_PL1_P_IDX    |  \
55bb67ec32SRichard Henderson          1 << MMU_PL2_IDX    | 1 << MMU_PL2_P_IDX    |  \
56bb67ec32SRichard Henderson          1 << MMU_USER_IDX   | 1 << MMU_USER_P_IDX)
57bb67ec32SRichard Henderson 
58385b3280SMichael Tokarev /* Indices to flush for access_id changes. */
59bb67ec32SRichard Henderson #define HPPA_MMU_FLUSH_P_MASK \
60bb67ec32SRichard Henderson         (1 << MMU_KERNEL_P_IDX | 1 << MMU_PL1_P_IDX  |  \
61bb67ec32SRichard Henderson          1 << MMU_PL2_P_IDX    | 1 << MMU_USER_P_IDX)
6288b7ad10SHelge Deller 
638b81968cSMichael Tokarev /* Hardware exceptions, interrupts, faults, and traps.  */
642986721dSRichard Henderson #define EXCP_HPMC                1  /* high priority machine check */
652986721dSRichard Henderson #define EXCP_POWER_FAIL          2
662986721dSRichard Henderson #define EXCP_RC                  3  /* recovery counter */
672986721dSRichard Henderson #define EXCP_EXT_INTERRUPT       4  /* external interrupt */
682986721dSRichard Henderson #define EXCP_LPMC                5  /* low priority machine check */
692986721dSRichard Henderson #define EXCP_ITLB_MISS           6  /* itlb miss / instruction page fault */
702986721dSRichard Henderson #define EXCP_IMP                 7  /* instruction memory protection trap */
712986721dSRichard Henderson #define EXCP_ILL                 8  /* illegal instruction trap */
722986721dSRichard Henderson #define EXCP_BREAK               9  /* break instruction */
732986721dSRichard Henderson #define EXCP_PRIV_OPR            10 /* privileged operation trap */
742986721dSRichard Henderson #define EXCP_PRIV_REG            11 /* privileged register trap */
752986721dSRichard Henderson #define EXCP_OVERFLOW            12 /* signed overflow trap */
762986721dSRichard Henderson #define EXCP_COND                13 /* trap-on-condition */
772986721dSRichard Henderson #define EXCP_ASSIST              14 /* assist exception trap */
782986721dSRichard Henderson #define EXCP_DTLB_MISS           15 /* dtlb miss / data page fault */
792986721dSRichard Henderson #define EXCP_NA_ITLB_MISS        16 /* non-access itlb miss */
802986721dSRichard Henderson #define EXCP_NA_DTLB_MISS        17 /* non-access dtlb miss */
812986721dSRichard Henderson #define EXCP_DMP                 18 /* data memory protection trap */
822986721dSRichard Henderson #define EXCP_DMB                 19 /* data memory break trap */
832986721dSRichard Henderson #define EXCP_TLB_DIRTY           20 /* tlb dirty bit trap */
842986721dSRichard Henderson #define EXCP_PAGE_REF            21 /* page reference trap */
852986721dSRichard Henderson #define EXCP_ASSIST_EMU          22 /* assist emulation trap */
862986721dSRichard Henderson #define EXCP_HPT                 23 /* high-privilege transfer trap */
872986721dSRichard Henderson #define EXCP_LPT                 24 /* low-privilege transfer trap */
882986721dSRichard Henderson #define EXCP_TB                  25 /* taken branch trap */
892986721dSRichard Henderson #define EXCP_DMAR                26 /* data memory access rights trap */
902986721dSRichard Henderson #define EXCP_DMPI                27 /* data memory protection id trap */
912986721dSRichard Henderson #define EXCP_UNALIGN             28 /* unaligned data reference trap */
922986721dSRichard Henderson #define EXCP_PER_INTERRUPT       29 /* performance monitor interrupt */
932986721dSRichard Henderson 
942986721dSRichard Henderson /* Exceptions for linux-user emulation.  */
952986721dSRichard Henderson #define EXCP_SYSCALL             30
962986721dSRichard Henderson #define EXCP_SYSCALL_LWS         31
9761766fe9SRichard Henderson 
984a4554c6SHelge Deller /* Emulated hardware TOC button */
994a4554c6SHelge Deller #define EXCP_TOC                 32 /* TOC = Transfer of control (NMI) */
1004a4554c6SHelge Deller 
1014a4554c6SHelge Deller #define CPU_INTERRUPT_NMI       CPU_INTERRUPT_TGT_EXT_3         /* TOC */
1024a4554c6SHelge Deller 
103fa57e327SRichard Henderson /* Taken from Linux kernel: arch/parisc/include/asm/psw.h */
104fa57e327SRichard Henderson #define PSW_I            0x00000001
105fa57e327SRichard Henderson #define PSW_D            0x00000002
106fa57e327SRichard Henderson #define PSW_P            0x00000004
107fa57e327SRichard Henderson #define PSW_Q            0x00000008
108fa57e327SRichard Henderson #define PSW_R            0x00000010
109fa57e327SRichard Henderson #define PSW_F            0x00000020
110fa57e327SRichard Henderson #define PSW_G            0x00000040 /* PA1.x only */
111fa57e327SRichard Henderson #define PSW_O            0x00000080 /* PA2.0 only */
112fa57e327SRichard Henderson #define PSW_CB           0x0000ff00
113fa57e327SRichard Henderson #define PSW_M            0x00010000
114fa57e327SRichard Henderson #define PSW_V            0x00020000
115fa57e327SRichard Henderson #define PSW_C            0x00040000
116fa57e327SRichard Henderson #define PSW_B            0x00080000
117fa57e327SRichard Henderson #define PSW_X            0x00100000
118fa57e327SRichard Henderson #define PSW_N            0x00200000
119fa57e327SRichard Henderson #define PSW_L            0x00400000
120fa57e327SRichard Henderson #define PSW_H            0x00800000
121fa57e327SRichard Henderson #define PSW_T            0x01000000
122fa57e327SRichard Henderson #define PSW_S            0x02000000
123fa57e327SRichard Henderson #define PSW_E            0x04000000
124fa57e327SRichard Henderson #define PSW_W            0x08000000 /* PA2.0 only */
125fa57e327SRichard Henderson #define PSW_Z            0x40000000 /* PA1.x only */
126fa57e327SRichard Henderson #define PSW_Y            0x80000000 /* PA1.x only */
127fa57e327SRichard Henderson 
128fa57e327SRichard Henderson #define PSW_SM (PSW_W | PSW_E | PSW_O | PSW_G | PSW_F \
129fa57e327SRichard Henderson                | PSW_R | PSW_Q | PSW_P | PSW_D | PSW_I)
130fa57e327SRichard Henderson 
131fa57e327SRichard Henderson /* ssm/rsm instructions number PSW_W and PSW_E differently */
132fa57e327SRichard Henderson #define PSW_SM_I         PSW_I      /* Enable External Interrupts */
133fa57e327SRichard Henderson #define PSW_SM_D         PSW_D
134fa57e327SRichard Henderson #define PSW_SM_P         PSW_P
135fa57e327SRichard Henderson #define PSW_SM_Q         PSW_Q      /* Enable Interrupt State Collection */
136fa57e327SRichard Henderson #define PSW_SM_R         PSW_R      /* Enable Recover Counter Trap */
137fa57e327SRichard Henderson #define PSW_SM_E         0x100
138fa57e327SRichard Henderson #define PSW_SM_W         0x200      /* PA2.0 only : Enable Wide Mode */
139fa57e327SRichard Henderson 
14035136a77SRichard Henderson #define CR_RC            0
141ab9af359SHelge Deller #define CR_PSW_DEFAULT   6          /* see SeaBIOS PDC_PSW firmware call */
142ab9af359SHelge Deller #define  PDC_PSW_WIDE_BIT 2
143d5de20bdSSven Schnelle #define CR_PID1          8
144d5de20bdSSven Schnelle #define CR_PID2          9
145d5de20bdSSven Schnelle #define CR_PID3          12
146d5de20bdSSven Schnelle #define CR_PID4          13
14735136a77SRichard Henderson #define CR_SCRCCR        10
14835136a77SRichard Henderson #define CR_SAR           11
14935136a77SRichard Henderson #define CR_IVA           14
15035136a77SRichard Henderson #define CR_EIEM          15
15135136a77SRichard Henderson #define CR_IT            16
15235136a77SRichard Henderson #define CR_IIASQ         17
15335136a77SRichard Henderson #define CR_IIAOQ         18
15435136a77SRichard Henderson #define CR_IIR           19
15535136a77SRichard Henderson #define CR_ISR           20
15635136a77SRichard Henderson #define CR_IOR           21
15735136a77SRichard Henderson #define CR_IPSW          22
15835136a77SRichard Henderson #define CR_EIRR          23
15935136a77SRichard Henderson 
160f33a22c1SRichard Henderson FIELD(FPSR, ENA_I, 0, 1)
161f33a22c1SRichard Henderson FIELD(FPSR, ENA_U, 1, 1)
162f33a22c1SRichard Henderson FIELD(FPSR, ENA_O, 2, 1)
163f33a22c1SRichard Henderson FIELD(FPSR, ENA_Z, 3, 1)
164f33a22c1SRichard Henderson FIELD(FPSR, ENA_V, 4, 1)
165f33a22c1SRichard Henderson FIELD(FPSR, ENABLES, 0, 5)
166f33a22c1SRichard Henderson FIELD(FPSR, D, 5, 1)
167f33a22c1SRichard Henderson FIELD(FPSR, T, 6, 1)
168f33a22c1SRichard Henderson FIELD(FPSR, RM, 9, 2)
169f33a22c1SRichard Henderson FIELD(FPSR, CQ, 11, 11)
170f33a22c1SRichard Henderson FIELD(FPSR, CQ0_6, 15, 7)
171f33a22c1SRichard Henderson FIELD(FPSR, CQ0_4, 17, 5)
172f33a22c1SRichard Henderson FIELD(FPSR, CQ0_2, 19, 3)
173f33a22c1SRichard Henderson FIELD(FPSR, CQ0, 21, 1)
174f33a22c1SRichard Henderson FIELD(FPSR, CA, 15, 7)
175f33a22c1SRichard Henderson FIELD(FPSR, CA0, 21, 1)
176f33a22c1SRichard Henderson FIELD(FPSR, C, 26, 1)
177f33a22c1SRichard Henderson FIELD(FPSR, FLG_I, 27, 1)
178f33a22c1SRichard Henderson FIELD(FPSR, FLG_U, 28, 1)
179f33a22c1SRichard Henderson FIELD(FPSR, FLG_O, 29, 1)
180f33a22c1SRichard Henderson FIELD(FPSR, FLG_Z, 30, 1)
181f33a22c1SRichard Henderson FIELD(FPSR, FLG_V, 31, 1)
182f33a22c1SRichard Henderson FIELD(FPSR, FLAGS, 27, 5)
183f33a22c1SRichard Henderson 
184729cd350SRichard Henderson typedef struct HPPATLBEntry {
185d7553f35SRichard Henderson     union {
18666866cc7SRichard Henderson         IntervalTreeNode itree;
187d7553f35SRichard Henderson         struct HPPATLBEntry *unused_next;
188d7553f35SRichard Henderson     };
18966866cc7SRichard Henderson 
190c53e401eSRichard Henderson     target_ulong pa;
191f8cda28bSRichard Henderson 
192f8cda28bSRichard Henderson     unsigned entry_valid : 1;
193f8cda28bSRichard Henderson 
194650cdb2aSRichard Henderson     unsigned u : 1;
195650cdb2aSRichard Henderson     unsigned t : 1;
196650cdb2aSRichard Henderson     unsigned d : 1;
197650cdb2aSRichard Henderson     unsigned b : 1;
198650cdb2aSRichard Henderson     unsigned ar_type : 3;
199650cdb2aSRichard Henderson     unsigned ar_pl1 : 2;
200650cdb2aSRichard Henderson     unsigned ar_pl2 : 2;
201650cdb2aSRichard Henderson     unsigned access_id : 16;
202729cd350SRichard Henderson } HPPATLBEntry;
203650cdb2aSRichard Henderson 
2041ea4a06aSPhilippe Mathieu-Daudé typedef struct CPUArchState {
205c53e401eSRichard Henderson     target_ulong iaoq_f;     /* front */
206c53e401eSRichard Henderson     target_ulong iaoq_b;     /* back, aka next instruction */
207f8c0fd98SHelge Deller 
208c53e401eSRichard Henderson     target_ulong gr[32];
20961766fe9SRichard Henderson     uint64_t fr[32];
21033423472SRichard Henderson     uint64_t sr[8];          /* stored shifted into place for gva */
21161766fe9SRichard Henderson 
212ebc9401aSRichard Henderson     uint32_t psw;            /* All psw bits except the following:  */
213ebc9401aSRichard Henderson     uint32_t psw_xb;         /* X and B, in their normal positions */
214c53e401eSRichard Henderson     target_ulong psw_n;      /* boolean */
215ead5078cSHelge Deller     target_long psw_v;       /* in bit 31 */
21661766fe9SRichard Henderson 
21761766fe9SRichard Henderson     /* Splitting the carry-borrow field into the MSB and "the rest", allows
21861766fe9SRichard Henderson      * for "the rest" to be deleted when it is unused, but the MSB is in use.
21961766fe9SRichard Henderson      * In addition, it's easier to compute carry-in for bit B+1 than it is to
22061766fe9SRichard Henderson      * compute carry-out for bit B (3 vs 4 insns for addition, assuming the
22161766fe9SRichard Henderson      * host has the appropriate add-with-carry insn to compute the msb).
22261766fe9SRichard Henderson      * Therefore the carry bits are stored as: cb_msb : cb & 0x11111110.
22361766fe9SRichard Henderson      */
224c53e401eSRichard Henderson     target_ulong psw_cb;     /* in least significant bit of next nibble */
225c53e401eSRichard Henderson     target_ulong psw_cb_msb; /* boolean */
22661766fe9SRichard Henderson 
227644ce5dfSHelge Deller     uint64_t gva_offset_mask; /* cached address mask based on PSW and %dr2 */
228c301f34eSRichard Henderson     uint64_t iasq_f;
229c301f34eSRichard Henderson     uint64_t iasq_b;
23061766fe9SRichard Henderson 
23161766fe9SRichard Henderson     uint32_t fr0_shadow;     /* flags, c, ca/cq, rm, d, enables */
23261766fe9SRichard Henderson     float_status fp_status;
23361766fe9SRichard Henderson 
234c53e401eSRichard Henderson     target_ulong cr[32];     /* control registers */
235c53e401eSRichard Henderson     target_ulong cr_back[2]; /* back of cr17/cr18 */
236c53e401eSRichard Henderson     target_ulong shadow[7];  /* shadow registers */
2378f2a1c59SHelge Deller     target_ulong dr[32];     /* diagnose registers */
23835136a77SRichard Henderson 
2399cf2112bSRichard Henderson     /*
240f5b5c857SRichard Henderson      * During unwind of a memory insn, the base register of the address.
241f5b5c857SRichard Henderson      * This is used to construct CR_IOR for pa2.0.
242f5b5c857SRichard Henderson      */
243f5b5c857SRichard Henderson     uint32_t unwind_breg;
244f5b5c857SRichard Henderson 
245f5b5c857SRichard Henderson     /*
2469cf2112bSRichard Henderson      * ??? The number of entries isn't specified by the architecture.
2479cf2112bSRichard Henderson      * BTLBs are not supported in 64-bit machines.
2489cf2112bSRichard Henderson      */
2499cf2112bSRichard Henderson #define PA10_BTLB_FIXED         16
2509cf2112bSRichard Henderson #define PA10_BTLB_VARIABLE      0
251df5c6a50SHelge Deller #define HPPA_TLB_ENTRIES        256
252df5c6a50SHelge Deller 
253d7553f35SRichard Henderson     /* Index for round-robin tlb eviction. */
254650cdb2aSRichard Henderson     uint32_t tlb_last;
255d7553f35SRichard Henderson 
256d7553f35SRichard Henderson     /*
257d7553f35SRichard Henderson      * For pa1.x, the partial initialized, still invalid tlb entry
258d7553f35SRichard Henderson      * which has had ITLBA performed, but not yet ITLBP.
259d7553f35SRichard Henderson      */
260d7553f35SRichard Henderson     HPPATLBEntry *tlb_partial;
261d7553f35SRichard Henderson 
262d7553f35SRichard Henderson     /* Linked list of all invalid (unused) tlb entries. */
263d7553f35SRichard Henderson     HPPATLBEntry *tlb_unused;
264d7553f35SRichard Henderson 
265d7553f35SRichard Henderson     /* Root of the search tree for all valid tlb entries. */
266d7553f35SRichard Henderson     IntervalTreeRoot tlb_root;
267d7553f35SRichard Henderson 
268d7553f35SRichard Henderson     HPPATLBEntry tlb[HPPA_TLB_ENTRIES];
269f4f41731SHelge Deller 
270f4f41731SHelge Deller     /* Fields up to this point are cleared by a CPU reset */
271f4f41731SHelge Deller     struct {} end_reset_fields;
2725c27cbd7SHelge Deller 
2735c27cbd7SHelge Deller     bool is_pa20;
274c656f293SHelge Deller 
275c656f293SHelge Deller     target_ulong kernel_entry; /* Linux kernel was loaded here */
276c656f293SHelge Deller     target_ulong cmdline_or_bootorder;
277c656f293SHelge Deller     target_ulong initrd_base, initrd_end;
2781ea4a06aSPhilippe Mathieu-Daudé } CPUHPPAState;
27961766fe9SRichard Henderson 
28061766fe9SRichard Henderson /**
28161766fe9SRichard Henderson  * HPPACPU:
28261766fe9SRichard Henderson  * @env: #CPUHPPAState
28361766fe9SRichard Henderson  *
28461766fe9SRichard Henderson  * An HPPA CPU.
28561766fe9SRichard Henderson  */
286b36e239eSPhilippe Mathieu-Daudé struct ArchCPU {
28761766fe9SRichard Henderson     CPUState parent_obj;
28861766fe9SRichard Henderson 
28961766fe9SRichard Henderson     CPUHPPAState env;
29049c29d6cSRichard Henderson     QEMUTimer *alarm_timer;
29161766fe9SRichard Henderson };
29261766fe9SRichard Henderson 
2939348028eSPhilippe Mathieu-Daudé /**
2949348028eSPhilippe Mathieu-Daudé  * HPPACPUClass:
2959348028eSPhilippe Mathieu-Daudé  * @parent_realize: The parent class' realize handler.
296f4f41731SHelge Deller  * @parent_phases: The parent class' reset phase handlers.
2979348028eSPhilippe Mathieu-Daudé  *
2989348028eSPhilippe Mathieu-Daudé  * An HPPA CPU model.
2999348028eSPhilippe Mathieu-Daudé  */
3009348028eSPhilippe Mathieu-Daudé struct HPPACPUClass {
3019348028eSPhilippe Mathieu-Daudé     CPUClass parent_class;
3029348028eSPhilippe Mathieu-Daudé 
3039348028eSPhilippe Mathieu-Daudé     DeviceRealize parent_realize;
304f4f41731SHelge Deller     ResettablePhases parent_phases;
3059348028eSPhilippe Mathieu-Daudé };
3069348028eSPhilippe Mathieu-Daudé 
hppa_is_pa20(const CPUHPPAState * env)3075c27cbd7SHelge Deller static inline bool hppa_is_pa20(const CPUHPPAState *env)
308bd6243a3SRichard Henderson {
3095c27cbd7SHelge Deller     return env->is_pa20;
310bd6243a3SRichard Henderson }
311bd6243a3SRichard Henderson 
HPPA_BTLB_ENTRIES(CPUHPPAState * env)3129cf2112bSRichard Henderson static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
3139cf2112bSRichard Henderson {
3149cf2112bSRichard Henderson     return hppa_is_pa20(env) ? 0 : PA10_BTLB_FIXED + PA10_BTLB_VARIABLE;
3159cf2112bSRichard Henderson }
3169cf2112bSRichard Henderson 
31761766fe9SRichard Henderson void hppa_translate_init(void);
318e4a8e093SRichard Henderson void hppa_translate_code(CPUState *cs, TranslationBlock *tb,
319e4a8e093SRichard Henderson                          int *max_insns, vaddr pc, void *host_pc);
32061766fe9SRichard Henderson 
3210dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
32261766fe9SRichard Henderson 
hppa_form_gva_mask(uint64_t gva_offset_mask,uint64_t spc,target_ulong off)323644ce5dfSHelge Deller static inline target_ulong hppa_form_gva_mask(uint64_t gva_offset_mask,
324644ce5dfSHelge Deller                                         uint64_t spc, target_ulong off)
325c301f34eSRichard Henderson {
326c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY
327644ce5dfSHelge Deller     return off & gva_offset_mask;
328c301f34eSRichard Henderson #else
329644ce5dfSHelge Deller     return spc | (off & gva_offset_mask);
330c301f34eSRichard Henderson #endif
331c301f34eSRichard Henderson }
332c301f34eSRichard Henderson 
hppa_form_gva(CPUHPPAState * env,uint64_t spc,target_ulong off)333c301f34eSRichard Henderson static inline target_ulong hppa_form_gva(CPUHPPAState *env, uint64_t spc,
334c53e401eSRichard Henderson                                          target_ulong off)
335c301f34eSRichard Henderson {
336644ce5dfSHelge Deller     return hppa_form_gva_mask(env->gva_offset_mask, spc, off);
337c301f34eSRichard Henderson }
338c301f34eSRichard Henderson 
339ccdf741cSRichard Henderson hwaddr hppa_abs_to_phys_pa2_w0(vaddr addr);
340ccdf741cSRichard Henderson hwaddr hppa_abs_to_phys_pa2_w1(vaddr addr);
341ccdf741cSRichard Henderson 
342217d1a5eSRichard Henderson /*
343217d1a5eSRichard Henderson  * Since PSW_{I,CB} will never need to be in tb->flags, reuse them.
344494737b7SRichard Henderson  * TB_FLAG_SR_SAME indicates that SR4 through SR7 all contain the
345494737b7SRichard Henderson  * same value.
346494737b7SRichard Henderson  */
347494737b7SRichard Henderson #define TB_FLAG_SR_SAME     PSW_I
348c301f34eSRichard Henderson #define TB_FLAG_PRIV_SHIFT  8
349217d1a5eSRichard Henderson #define TB_FLAG_UNALIGN     0x400
350644ce5dfSHelge Deller #define TB_FLAG_SPHASH      0x800
3519dfcd243SRichard Henderson #define CS_BASE_DIFFPAGE    (1 << 12)
3529dfcd243SRichard Henderson #define CS_BASE_DIFFSPACE   (1 << 13)
353c301f34eSRichard Henderson 
354c53e401eSRichard Henderson target_ulong cpu_hppa_get_psw(CPUHPPAState *env);
355c53e401eSRichard Henderson void cpu_hppa_put_psw(CPUHPPAState *env, target_ulong);
356644ce5dfSHelge Deller void update_gva_offset_mask(CPUHPPAState *env);
35761766fe9SRichard Henderson void cpu_hppa_loaded_fr0(CPUHPPAState *env);
35861766fe9SRichard Henderson 
359d5de20bdSSven Schnelle #ifdef CONFIG_USER_ONLY
cpu_hppa_change_prot_id(CPUHPPAState * env)360d5de20bdSSven Schnelle static inline void cpu_hppa_change_prot_id(CPUHPPAState *env) { }
361d5de20bdSSven Schnelle #else
362d5de20bdSSven Schnelle void cpu_hppa_change_prot_id(CPUHPPAState *env);
363d5de20bdSSven Schnelle #endif
364d5de20bdSSven Schnelle 
365a010bdbeSAlex Bennée int hppa_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
36661766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
36790c84c56SMarkus Armbruster void hppa_cpu_dump_state(CPUState *cs, FILE *f, int);
368860e0b96SRichard Henderson #ifndef CONFIG_USER_ONLY
369d7553f35SRichard Henderson void hppa_ptlbe(CPUHPPAState *env);
3706d2d454aSPhilippe Mathieu-Daudé hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr);
3713824e0d6SHelge Deller void hppa_set_ior_and_isr(CPUHPPAState *env, vaddr addr, bool mmu_disabled);
37299746de6SRichard Henderson bool hppa_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out, vaddr addr,
3733c7bef03SRichard Henderson                              MMUAccessType access_type, int mmu_idx,
37499746de6SRichard Henderson                              MemOp memop, int size, bool probe, uintptr_t ra);
37568fa1780SPhilippe Mathieu-Daudé void hppa_cpu_do_interrupt(CPUState *cpu);
37668fa1780SPhilippe Mathieu-Daudé bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req);
377650cdb2aSRichard Henderson int hppa_get_physical_address(CPUHPPAState *env, vaddr addr, int mmu_idx,
3784e6939c9SRichard Henderson                               int type, MemOp mop, hwaddr *pphys, int *pprot);
3799ccbe394SHelge Deller void hppa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
3809ccbe394SHelge Deller                                      vaddr addr, unsigned size,
3819ccbe394SHelge Deller                                      MMUAccessType access_type,
3829ccbe394SHelge Deller                                      int mmu_idx, MemTxAttrs attrs,
3839ccbe394SHelge Deller                                      MemTxResult response, uintptr_t retaddr);
3844f5f2548SRichard Henderson extern const MemoryRegionOps hppa_io_eir_ops;
3858a9358ccSMarkus Armbruster extern const VMStateDescription vmstate_hppa_cpu;
38649c29d6cSRichard Henderson void hppa_cpu_alarm_timer(void *);
387650cdb2aSRichard Henderson #endif
3888905770bSMarc-André Lureau G_NORETURN void hppa_dynamic_excp(CPUHPPAState *env, int excp, uintptr_t ra);
38961766fe9SRichard Henderson 
39061766fe9SRichard Henderson #endif /* HPPA_CPU_H */
391