xref: /qemu/target/hppa/cpu.h (revision 9cf2112be4fe84d41083435e44fa146d13d3f8d7)
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"
2761766fe9SRichard Henderson 
287b93dab5SRichard Henderson /* PA-RISC 1.x processors have a strong memory model.  */
297b93dab5SRichard Henderson /* ??? While we do not yet implement PA-RISC 2.0, those processors have
307b93dab5SRichard Henderson    a weak memory model, but with TLB bits that force ordering on a per-page
317b93dab5SRichard Henderson    basis.  It's probably easier to fall back to a strong memory model.  */
327b93dab5SRichard Henderson #define TCG_GUEST_DEFAULT_MO        TCG_MO_ALL
337b93dab5SRichard Henderson 
34bb67ec32SRichard Henderson #define MMU_KERNEL_IDX    7
35bb67ec32SRichard Henderson #define MMU_KERNEL_P_IDX  8
36bb67ec32SRichard Henderson #define MMU_PL1_IDX       9
37bb67ec32SRichard Henderson #define MMU_PL1_P_IDX     10
38bb67ec32SRichard Henderson #define MMU_PL2_IDX       11
39bb67ec32SRichard Henderson #define MMU_PL2_P_IDX     12
40bb67ec32SRichard Henderson #define MMU_USER_IDX      13
41bb67ec32SRichard Henderson #define MMU_USER_P_IDX    14
422ad04500SHelge Deller #define MMU_PHYS_IDX      15
43c400b6edSHelge Deller 
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 
4861766fe9SRichard Henderson #define TARGET_INSN_START_EXTRA_WORDS 1
4961766fe9SRichard Henderson 
5088b7ad10SHelge Deller /* No need to flush MMU_PHYS_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 
57bb67ec32SRichard Henderson /* Indicies 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 #ifdef TARGET_HPPA64
124fa57e327SRichard Henderson #define PSW_W            0x08000000 /* PA2.0 only */
125fa57e327SRichard Henderson #else
126fa57e327SRichard Henderson #define PSW_W            0
127fa57e327SRichard Henderson #endif
128fa57e327SRichard Henderson #define PSW_Z            0x40000000 /* PA1.x only */
129fa57e327SRichard Henderson #define PSW_Y            0x80000000 /* PA1.x only */
130fa57e327SRichard Henderson 
131fa57e327SRichard Henderson #define PSW_SM (PSW_W | PSW_E | PSW_O | PSW_G | PSW_F \
132fa57e327SRichard Henderson                | PSW_R | PSW_Q | PSW_P | PSW_D | PSW_I)
133fa57e327SRichard Henderson 
134fa57e327SRichard Henderson /* ssm/rsm instructions number PSW_W and PSW_E differently */
135fa57e327SRichard Henderson #define PSW_SM_I         PSW_I      /* Enable External Interrupts */
136fa57e327SRichard Henderson #define PSW_SM_D         PSW_D
137fa57e327SRichard Henderson #define PSW_SM_P         PSW_P
138fa57e327SRichard Henderson #define PSW_SM_Q         PSW_Q      /* Enable Interrupt State Collection */
139fa57e327SRichard Henderson #define PSW_SM_R         PSW_R      /* Enable Recover Counter Trap */
140fa57e327SRichard Henderson #ifdef TARGET_HPPA64
141fa57e327SRichard Henderson #define PSW_SM_E         0x100
142fa57e327SRichard Henderson #define PSW_SM_W         0x200      /* PA2.0 only : Enable Wide Mode */
143fa57e327SRichard Henderson #else
144fa57e327SRichard Henderson #define PSW_SM_E         0
145fa57e327SRichard Henderson #define PSW_SM_W         0
146fa57e327SRichard Henderson #endif
147fa57e327SRichard Henderson 
14835136a77SRichard Henderson #define CR_RC            0
149d5de20bdSSven Schnelle #define CR_PID1          8
150d5de20bdSSven Schnelle #define CR_PID2          9
151d5de20bdSSven Schnelle #define CR_PID3          12
152d5de20bdSSven Schnelle #define CR_PID4          13
15335136a77SRichard Henderson #define CR_SCRCCR        10
15435136a77SRichard Henderson #define CR_SAR           11
15535136a77SRichard Henderson #define CR_IVA           14
15635136a77SRichard Henderson #define CR_EIEM          15
15735136a77SRichard Henderson #define CR_IT            16
15835136a77SRichard Henderson #define CR_IIASQ         17
15935136a77SRichard Henderson #define CR_IIAOQ         18
16035136a77SRichard Henderson #define CR_IIR           19
16135136a77SRichard Henderson #define CR_ISR           20
16235136a77SRichard Henderson #define CR_IOR           21
16335136a77SRichard Henderson #define CR_IPSW          22
16435136a77SRichard Henderson #define CR_EIRR          23
16535136a77SRichard Henderson 
166eaa3783bSRichard Henderson #if TARGET_REGISTER_BITS == 32
167eaa3783bSRichard Henderson typedef uint32_t target_ureg;
168eaa3783bSRichard Henderson typedef int32_t  target_sreg;
169eaa3783bSRichard Henderson #define TREG_FMT_lx   "%08"PRIx32
170eaa3783bSRichard Henderson #define TREG_FMT_ld   "%"PRId32
171eaa3783bSRichard Henderson #else
172eaa3783bSRichard Henderson typedef uint64_t target_ureg;
173eaa3783bSRichard Henderson typedef int64_t  target_sreg;
174eaa3783bSRichard Henderson #define TREG_FMT_lx   "%016"PRIx64
175eaa3783bSRichard Henderson #define TREG_FMT_ld   "%"PRId64
176eaa3783bSRichard Henderson #endif
177eaa3783bSRichard Henderson 
178729cd350SRichard Henderson typedef struct HPPATLBEntry {
179d7553f35SRichard Henderson     union {
18066866cc7SRichard Henderson         IntervalTreeNode itree;
181d7553f35SRichard Henderson         struct HPPATLBEntry *unused_next;
182d7553f35SRichard Henderson     };
18366866cc7SRichard Henderson 
184650cdb2aSRichard Henderson     target_ureg pa;
185f8cda28bSRichard Henderson 
186f8cda28bSRichard Henderson     unsigned entry_valid : 1;
187f8cda28bSRichard Henderson 
188650cdb2aSRichard Henderson     unsigned u : 1;
189650cdb2aSRichard Henderson     unsigned t : 1;
190650cdb2aSRichard Henderson     unsigned d : 1;
191650cdb2aSRichard Henderson     unsigned b : 1;
192650cdb2aSRichard Henderson     unsigned ar_type : 3;
193650cdb2aSRichard Henderson     unsigned ar_pl1 : 2;
194650cdb2aSRichard Henderson     unsigned ar_pl2 : 2;
195650cdb2aSRichard Henderson     unsigned access_id : 16;
196729cd350SRichard Henderson } HPPATLBEntry;
197650cdb2aSRichard Henderson 
1981ea4a06aSPhilippe Mathieu-Daudé typedef struct CPUArchState {
199f8c0fd98SHelge Deller     target_ureg iaoq_f;      /* front */
200f8c0fd98SHelge Deller     target_ureg iaoq_b;      /* back, aka next instruction */
201f8c0fd98SHelge Deller 
202eaa3783bSRichard Henderson     target_ureg gr[32];
20361766fe9SRichard Henderson     uint64_t fr[32];
20433423472SRichard Henderson     uint64_t sr[8];          /* stored shifted into place for gva */
20561766fe9SRichard Henderson 
206eaa3783bSRichard Henderson     target_ureg psw;         /* All psw bits except the following:  */
207eaa3783bSRichard Henderson     target_ureg psw_n;       /* boolean */
208eaa3783bSRichard Henderson     target_sreg psw_v;       /* in most significant bit */
20961766fe9SRichard Henderson 
21061766fe9SRichard Henderson     /* Splitting the carry-borrow field into the MSB and "the rest", allows
21161766fe9SRichard Henderson      * for "the rest" to be deleted when it is unused, but the MSB is in use.
21261766fe9SRichard Henderson      * In addition, it's easier to compute carry-in for bit B+1 than it is to
21361766fe9SRichard Henderson      * compute carry-out for bit B (3 vs 4 insns for addition, assuming the
21461766fe9SRichard Henderson      * host has the appropriate add-with-carry insn to compute the msb).
21561766fe9SRichard Henderson      * Therefore the carry bits are stored as: cb_msb : cb & 0x11111110.
21661766fe9SRichard Henderson      */
217eaa3783bSRichard Henderson     target_ureg psw_cb;      /* in least significant bit of next nibble */
218eaa3783bSRichard Henderson     target_ureg psw_cb_msb;  /* boolean */
21961766fe9SRichard Henderson 
220c301f34eSRichard Henderson     uint64_t iasq_f;
221c301f34eSRichard Henderson     uint64_t iasq_b;
22261766fe9SRichard Henderson 
22361766fe9SRichard Henderson     uint32_t fr0_shadow;     /* flags, c, ca/cq, rm, d, enables */
22461766fe9SRichard Henderson     float_status fp_status;
22561766fe9SRichard Henderson 
22635136a77SRichard Henderson     target_ureg cr[32];      /* control registers */
22735136a77SRichard Henderson     target_ureg cr_back[2];  /* back of cr17/cr18 */
228f49b3537SRichard Henderson     target_ureg shadow[7];   /* shadow registers */
22935136a77SRichard Henderson 
230*9cf2112bSRichard Henderson     /*
231*9cf2112bSRichard Henderson      * ??? The number of entries isn't specified by the architecture.
232*9cf2112bSRichard Henderson      * BTLBs are not supported in 64-bit machines.
233*9cf2112bSRichard Henderson      */
234*9cf2112bSRichard Henderson #define PA10_BTLB_FIXED         16
235*9cf2112bSRichard Henderson #define PA10_BTLB_VARIABLE      0
236df5c6a50SHelge Deller #define HPPA_TLB_ENTRIES        256
237df5c6a50SHelge Deller 
238d7553f35SRichard Henderson     /* Index for round-robin tlb eviction. */
239650cdb2aSRichard Henderson     uint32_t tlb_last;
240d7553f35SRichard Henderson 
241d7553f35SRichard Henderson     /*
242d7553f35SRichard Henderson      * For pa1.x, the partial initialized, still invalid tlb entry
243d7553f35SRichard Henderson      * which has had ITLBA performed, but not yet ITLBP.
244d7553f35SRichard Henderson      */
245d7553f35SRichard Henderson     HPPATLBEntry *tlb_partial;
246d7553f35SRichard Henderson 
247d7553f35SRichard Henderson     /* Linked list of all invalid (unused) tlb entries. */
248d7553f35SRichard Henderson     HPPATLBEntry *tlb_unused;
249d7553f35SRichard Henderson 
250d7553f35SRichard Henderson     /* Root of the search tree for all valid tlb entries. */
251d7553f35SRichard Henderson     IntervalTreeRoot tlb_root;
252d7553f35SRichard Henderson 
253d7553f35SRichard Henderson     HPPATLBEntry tlb[HPPA_TLB_ENTRIES];
2541ea4a06aSPhilippe Mathieu-Daudé } CPUHPPAState;
25561766fe9SRichard Henderson 
25661766fe9SRichard Henderson /**
25761766fe9SRichard Henderson  * HPPACPU:
25861766fe9SRichard Henderson  * @env: #CPUHPPAState
25961766fe9SRichard Henderson  *
26061766fe9SRichard Henderson  * An HPPA CPU.
26161766fe9SRichard Henderson  */
262b36e239eSPhilippe Mathieu-Daudé struct ArchCPU {
26361766fe9SRichard Henderson     /*< private >*/
26461766fe9SRichard Henderson     CPUState parent_obj;
26561766fe9SRichard Henderson     /*< public >*/
26661766fe9SRichard Henderson 
26761766fe9SRichard Henderson     CPUHPPAState env;
26849c29d6cSRichard Henderson     QEMUTimer *alarm_timer;
26961766fe9SRichard Henderson };
27061766fe9SRichard Henderson 
27161766fe9SRichard Henderson #include "exec/cpu-all.h"
27261766fe9SRichard Henderson 
273bd6243a3SRichard Henderson static inline bool hppa_is_pa20(CPUHPPAState *env)
274bd6243a3SRichard Henderson {
275bd6243a3SRichard Henderson     return object_dynamic_cast(OBJECT(env_cpu(env)), TYPE_HPPA64_CPU) != NULL;
276bd6243a3SRichard Henderson }
277bd6243a3SRichard Henderson 
278*9cf2112bSRichard Henderson static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
279*9cf2112bSRichard Henderson {
280*9cf2112bSRichard Henderson     return hppa_is_pa20(env) ? 0 : PA10_BTLB_FIXED + PA10_BTLB_VARIABLE;
281*9cf2112bSRichard Henderson }
282*9cf2112bSRichard Henderson 
28361766fe9SRichard Henderson static inline int cpu_mmu_index(CPUHPPAState *env, bool ifetch)
28461766fe9SRichard Henderson {
2853d68ee7bSRichard Henderson #ifdef CONFIG_USER_ONLY
2863d68ee7bSRichard Henderson     return MMU_USER_IDX;
2873d68ee7bSRichard Henderson #else
2883d68ee7bSRichard Henderson     if (env->psw & (ifetch ? PSW_C : PSW_D)) {
289bb67ec32SRichard Henderson         return PRIV_P_TO_MMU_IDX(env->iaoq_f & 3, env->psw & PSW_P);
2903d68ee7bSRichard Henderson     }
2913d68ee7bSRichard Henderson     return MMU_PHYS_IDX;  /* mmu disabled */
2923d68ee7bSRichard Henderson #endif
29361766fe9SRichard Henderson }
29461766fe9SRichard Henderson 
29561766fe9SRichard Henderson void hppa_translate_init(void);
29661766fe9SRichard Henderson 
2970dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
29861766fe9SRichard Henderson 
299c301f34eSRichard Henderson static inline target_ulong hppa_form_gva_psw(target_ureg psw, uint64_t spc,
300c301f34eSRichard Henderson                                              target_ureg off)
301c301f34eSRichard Henderson {
302c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY
303c301f34eSRichard Henderson     return off;
304c301f34eSRichard Henderson #else
305c301f34eSRichard Henderson     off &= (psw & PSW_W ? 0x3fffffffffffffffull : 0xffffffffull);
306c301f34eSRichard Henderson     return spc | off;
307c301f34eSRichard Henderson #endif
308c301f34eSRichard Henderson }
309c301f34eSRichard Henderson 
310c301f34eSRichard Henderson static inline target_ulong hppa_form_gva(CPUHPPAState *env, uint64_t spc,
311c301f34eSRichard Henderson                                          target_ureg off)
312c301f34eSRichard Henderson {
313c301f34eSRichard Henderson     return hppa_form_gva_psw(env->psw, spc, off);
314c301f34eSRichard Henderson }
315c301f34eSRichard Henderson 
316217d1a5eSRichard Henderson /*
317217d1a5eSRichard Henderson  * Since PSW_{I,CB} will never need to be in tb->flags, reuse them.
318494737b7SRichard Henderson  * TB_FLAG_SR_SAME indicates that SR4 through SR7 all contain the
319494737b7SRichard Henderson  * same value.
320494737b7SRichard Henderson  */
321494737b7SRichard Henderson #define TB_FLAG_SR_SAME     PSW_I
322c301f34eSRichard Henderson #define TB_FLAG_PRIV_SHIFT  8
323217d1a5eSRichard Henderson #define TB_FLAG_UNALIGN     0x400
324c301f34eSRichard Henderson 
325bb5de525SAnton Johansson static inline void cpu_get_tb_cpu_state(CPUHPPAState *env, vaddr *pc,
326bb5de525SAnton Johansson                                         uint64_t *cs_base, uint32_t *pflags)
32761766fe9SRichard Henderson {
328c301f34eSRichard Henderson     uint32_t flags = env->psw_n * PSW_N;
329c301f34eSRichard Henderson 
330c301f34eSRichard Henderson     /* TB lookup assumes that PC contains the complete virtual address.
331c301f34eSRichard Henderson        If we leave space+offset separate, we'll get ITLB misses to an
332c301f34eSRichard Henderson        incomplete virtual address.  This also means that we must separate
3338b81968cSMichael Tokarev        out current cpu privilege from the low bits of IAOQ_F.  */
334c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY
335ebd0e151SRichard Henderson     *pc = env->iaoq_f & -4;
336ebd0e151SRichard Henderson     *cs_base = env->iaoq_b & -4;
337217d1a5eSRichard Henderson     flags |= TB_FLAG_UNALIGN * !env_cpu(env)->prctl_unalign_sigbus;
338c301f34eSRichard Henderson #else
339bb67ec32SRichard Henderson     /* ??? E, T, H, L, B bits need to be here, when implemented.  */
340bb67ec32SRichard Henderson     flags |= env->psw & (PSW_W | PSW_C | PSW_D | PSW_P);
341c301f34eSRichard Henderson     flags |= (env->iaoq_f & 3) << TB_FLAG_PRIV_SHIFT;
342c301f34eSRichard Henderson 
343c301f34eSRichard Henderson     *pc = (env->psw & PSW_C
344c301f34eSRichard Henderson            ? hppa_form_gva_psw(env->psw, env->iasq_f, env->iaoq_f & -4)
345c301f34eSRichard Henderson            : env->iaoq_f & -4);
346c301f34eSRichard Henderson     *cs_base = env->iasq_f;
347c301f34eSRichard Henderson 
348c301f34eSRichard Henderson     /* Insert a difference between IAOQ_B and IAOQ_F within the otherwise zero
349c301f34eSRichard Henderson        low 32-bits of CS_BASE.  This will succeed for all direct branches,
350c301f34eSRichard Henderson        which is the primary case we care about -- using goto_tb within a page.
351c301f34eSRichard Henderson        Failure is indicated by a zero difference.  */
352c301f34eSRichard Henderson     if (env->iasq_f == env->iasq_b) {
353c301f34eSRichard Henderson         target_sreg diff = env->iaoq_b - env->iaoq_f;
354c301f34eSRichard Henderson         if (TARGET_REGISTER_BITS == 32 || diff == (int32_t)diff) {
355c301f34eSRichard Henderson             *cs_base |= (uint32_t)diff;
356c301f34eSRichard Henderson         }
357c301f34eSRichard Henderson     }
358494737b7SRichard Henderson     if ((env->sr[4] == env->sr[5])
359494737b7SRichard Henderson         & (env->sr[4] == env->sr[6])
360494737b7SRichard Henderson         & (env->sr[4] == env->sr[7])) {
361494737b7SRichard Henderson         flags |= TB_FLAG_SR_SAME;
362494737b7SRichard Henderson     }
363c301f34eSRichard Henderson #endif
364c301f34eSRichard Henderson 
365c301f34eSRichard Henderson     *pflags = flags;
36661766fe9SRichard Henderson }
36761766fe9SRichard Henderson 
368eaa3783bSRichard Henderson target_ureg cpu_hppa_get_psw(CPUHPPAState *env);
369eaa3783bSRichard Henderson void cpu_hppa_put_psw(CPUHPPAState *env, target_ureg);
37061766fe9SRichard Henderson void cpu_hppa_loaded_fr0(CPUHPPAState *env);
37161766fe9SRichard Henderson 
372d5de20bdSSven Schnelle #ifdef CONFIG_USER_ONLY
373d5de20bdSSven Schnelle static inline void cpu_hppa_change_prot_id(CPUHPPAState *env) { }
374d5de20bdSSven Schnelle #else
375d5de20bdSSven Schnelle void cpu_hppa_change_prot_id(CPUHPPAState *env);
376d5de20bdSSven Schnelle #endif
377d5de20bdSSven Schnelle 
378a010bdbeSAlex Bennée int hppa_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
37961766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
38090c84c56SMarkus Armbruster void hppa_cpu_dump_state(CPUState *cs, FILE *f, int);
381860e0b96SRichard Henderson #ifndef CONFIG_USER_ONLY
382d7553f35SRichard Henderson void hppa_ptlbe(CPUHPPAState *env);
3836d2d454aSPhilippe Mathieu-Daudé hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr);
3843c7bef03SRichard Henderson bool hppa_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
3853c7bef03SRichard Henderson                        MMUAccessType access_type, int mmu_idx,
3863c7bef03SRichard Henderson                        bool probe, uintptr_t retaddr);
38768fa1780SPhilippe Mathieu-Daudé void hppa_cpu_do_interrupt(CPUState *cpu);
38868fa1780SPhilippe Mathieu-Daudé bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req);
389650cdb2aSRichard Henderson int hppa_get_physical_address(CPUHPPAState *env, vaddr addr, int mmu_idx,
390fa824d99SHelge Deller                               int type, hwaddr *pphys, int *pprot,
391729cd350SRichard Henderson                               HPPATLBEntry **tlb_entry);
3924f5f2548SRichard Henderson extern const MemoryRegionOps hppa_io_eir_ops;
3938a9358ccSMarkus Armbruster extern const VMStateDescription vmstate_hppa_cpu;
39449c29d6cSRichard Henderson void hppa_cpu_alarm_timer(void *);
39543e05652SRichard Henderson int hppa_artype_for_page(CPUHPPAState *env, target_ulong vaddr);
396650cdb2aSRichard Henderson #endif
3978905770bSMarc-André Lureau G_NORETURN void hppa_dynamic_excp(CPUHPPAState *env, int excp, uintptr_t ra);
39861766fe9SRichard Henderson 
39961766fe9SRichard Henderson #endif /* HPPA_CPU_H */
400