xref: /qemu/target/hppa/cpu.h (revision d5de20bd84ae3a6f6c194f0088cfcb4d4f6af602)
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
961766fe9SRichard Henderson  * version 2 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 "qemu-common.h"
2461766fe9SRichard Henderson #include "cpu-qom.h"
2561766fe9SRichard Henderson 
2686f8d05fSRichard Henderson #ifdef TARGET_HPPA64
2786f8d05fSRichard Henderson #define TARGET_LONG_BITS            64
2886f8d05fSRichard Henderson #define TARGET_VIRT_ADDR_SPACE_BITS 64
2986f8d05fSRichard Henderson #define TARGET_REGISTER_BITS        64
3086f8d05fSRichard Henderson #define TARGET_PHYS_ADDR_SPACE_BITS 64
3186f8d05fSRichard Henderson #elif defined(CONFIG_USER_ONLY)
3261766fe9SRichard Henderson #define TARGET_LONG_BITS            32
3361766fe9SRichard Henderson #define TARGET_VIRT_ADDR_SPACE_BITS 32
34eaa3783bSRichard Henderson #define TARGET_REGISTER_BITS        32
35eaa3783bSRichard Henderson #define TARGET_PHYS_ADDR_SPACE_BITS 32
3686f8d05fSRichard Henderson #else
3786f8d05fSRichard Henderson /* In order to form the GVA from space:offset,
3886f8d05fSRichard Henderson    we need a 64-bit virtual address space.  */
3986f8d05fSRichard Henderson #define TARGET_LONG_BITS            64
4086f8d05fSRichard Henderson #define TARGET_VIRT_ADDR_SPACE_BITS 64
4186f8d05fSRichard Henderson #define TARGET_REGISTER_BITS        32
4286f8d05fSRichard Henderson #define TARGET_PHYS_ADDR_SPACE_BITS 32
4386f8d05fSRichard Henderson #endif
4461766fe9SRichard Henderson 
457b93dab5SRichard Henderson /* PA-RISC 1.x processors have a strong memory model.  */
467b93dab5SRichard Henderson /* ??? While we do not yet implement PA-RISC 2.0, those processors have
477b93dab5SRichard Henderson    a weak memory model, but with TLB bits that force ordering on a per-page
487b93dab5SRichard Henderson    basis.  It's probably easier to fall back to a strong memory model.  */
497b93dab5SRichard Henderson #define TCG_GUEST_DEFAULT_MO        TCG_MO_ALL
507b93dab5SRichard Henderson 
5161766fe9SRichard Henderson #define CPUArchState struct CPUHPPAState
5261766fe9SRichard Henderson 
5361766fe9SRichard Henderson #include "exec/cpu-defs.h"
5461766fe9SRichard Henderson 
5561766fe9SRichard Henderson #define TARGET_PAGE_BITS 12
5661766fe9SRichard Henderson 
5761766fe9SRichard Henderson #define ALIGNED_ONLY
583d68ee7bSRichard Henderson #define NB_MMU_MODES     5
593d68ee7bSRichard Henderson #define MMU_KERNEL_IDX   0
603d68ee7bSRichard Henderson #define MMU_USER_IDX     3
613d68ee7bSRichard Henderson #define MMU_PHYS_IDX     4
6261766fe9SRichard Henderson #define TARGET_INSN_START_EXTRA_WORDS 1
6361766fe9SRichard Henderson 
642986721dSRichard Henderson /* Hardware exceptions, interupts, faults, and traps.  */
652986721dSRichard Henderson #define EXCP_HPMC                1  /* high priority machine check */
662986721dSRichard Henderson #define EXCP_POWER_FAIL          2
672986721dSRichard Henderson #define EXCP_RC                  3  /* recovery counter */
682986721dSRichard Henderson #define EXCP_EXT_INTERRUPT       4  /* external interrupt */
692986721dSRichard Henderson #define EXCP_LPMC                5  /* low priority machine check */
702986721dSRichard Henderson #define EXCP_ITLB_MISS           6  /* itlb miss / instruction page fault */
712986721dSRichard Henderson #define EXCP_IMP                 7  /* instruction memory protection trap */
722986721dSRichard Henderson #define EXCP_ILL                 8  /* illegal instruction trap */
732986721dSRichard Henderson #define EXCP_BREAK               9  /* break instruction */
742986721dSRichard Henderson #define EXCP_PRIV_OPR            10 /* privileged operation trap */
752986721dSRichard Henderson #define EXCP_PRIV_REG            11 /* privileged register trap */
762986721dSRichard Henderson #define EXCP_OVERFLOW            12 /* signed overflow trap */
772986721dSRichard Henderson #define EXCP_COND                13 /* trap-on-condition */
782986721dSRichard Henderson #define EXCP_ASSIST              14 /* assist exception trap */
792986721dSRichard Henderson #define EXCP_DTLB_MISS           15 /* dtlb miss / data page fault */
802986721dSRichard Henderson #define EXCP_NA_ITLB_MISS        16 /* non-access itlb miss */
812986721dSRichard Henderson #define EXCP_NA_DTLB_MISS        17 /* non-access dtlb miss */
822986721dSRichard Henderson #define EXCP_DMP                 18 /* data memory protection trap */
832986721dSRichard Henderson #define EXCP_DMB                 19 /* data memory break trap */
842986721dSRichard Henderson #define EXCP_TLB_DIRTY           20 /* tlb dirty bit trap */
852986721dSRichard Henderson #define EXCP_PAGE_REF            21 /* page reference trap */
862986721dSRichard Henderson #define EXCP_ASSIST_EMU          22 /* assist emulation trap */
872986721dSRichard Henderson #define EXCP_HPT                 23 /* high-privilege transfer trap */
882986721dSRichard Henderson #define EXCP_LPT                 24 /* low-privilege transfer trap */
892986721dSRichard Henderson #define EXCP_TB                  25 /* taken branch trap */
902986721dSRichard Henderson #define EXCP_DMAR                26 /* data memory access rights trap */
912986721dSRichard Henderson #define EXCP_DMPI                27 /* data memory protection id trap */
922986721dSRichard Henderson #define EXCP_UNALIGN             28 /* unaligned data reference trap */
932986721dSRichard Henderson #define EXCP_PER_INTERRUPT       29 /* performance monitor interrupt */
942986721dSRichard Henderson 
952986721dSRichard Henderson /* Exceptions for linux-user emulation.  */
962986721dSRichard Henderson #define EXCP_SYSCALL             30
972986721dSRichard Henderson #define EXCP_SYSCALL_LWS         31
9861766fe9SRichard Henderson 
99fa57e327SRichard Henderson /* Taken from Linux kernel: arch/parisc/include/asm/psw.h */
100fa57e327SRichard Henderson #define PSW_I            0x00000001
101fa57e327SRichard Henderson #define PSW_D            0x00000002
102fa57e327SRichard Henderson #define PSW_P            0x00000004
103fa57e327SRichard Henderson #define PSW_Q            0x00000008
104fa57e327SRichard Henderson #define PSW_R            0x00000010
105fa57e327SRichard Henderson #define PSW_F            0x00000020
106fa57e327SRichard Henderson #define PSW_G            0x00000040 /* PA1.x only */
107fa57e327SRichard Henderson #define PSW_O            0x00000080 /* PA2.0 only */
108fa57e327SRichard Henderson #define PSW_CB           0x0000ff00
109fa57e327SRichard Henderson #define PSW_M            0x00010000
110fa57e327SRichard Henderson #define PSW_V            0x00020000
111fa57e327SRichard Henderson #define PSW_C            0x00040000
112fa57e327SRichard Henderson #define PSW_B            0x00080000
113fa57e327SRichard Henderson #define PSW_X            0x00100000
114fa57e327SRichard Henderson #define PSW_N            0x00200000
115fa57e327SRichard Henderson #define PSW_L            0x00400000
116fa57e327SRichard Henderson #define PSW_H            0x00800000
117fa57e327SRichard Henderson #define PSW_T            0x01000000
118fa57e327SRichard Henderson #define PSW_S            0x02000000
119fa57e327SRichard Henderson #define PSW_E            0x04000000
120fa57e327SRichard Henderson #ifdef TARGET_HPPA64
121fa57e327SRichard Henderson #define PSW_W            0x08000000 /* PA2.0 only */
122fa57e327SRichard Henderson #else
123fa57e327SRichard Henderson #define PSW_W            0
124fa57e327SRichard Henderson #endif
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 #ifdef TARGET_HPPA64
138fa57e327SRichard Henderson #define PSW_SM_E         0x100
139fa57e327SRichard Henderson #define PSW_SM_W         0x200      /* PA2.0 only : Enable Wide Mode */
140fa57e327SRichard Henderson #else
141fa57e327SRichard Henderson #define PSW_SM_E         0
142fa57e327SRichard Henderson #define PSW_SM_W         0
143fa57e327SRichard Henderson #endif
144fa57e327SRichard Henderson 
14535136a77SRichard Henderson #define CR_RC            0
146*d5de20bdSSven Schnelle #define CR_PID1          8
147*d5de20bdSSven Schnelle #define CR_PID2          9
148*d5de20bdSSven Schnelle #define CR_PID3          12
149*d5de20bdSSven Schnelle #define CR_PID4          13
15035136a77SRichard Henderson #define CR_SCRCCR        10
15135136a77SRichard Henderson #define CR_SAR           11
15235136a77SRichard Henderson #define CR_IVA           14
15335136a77SRichard Henderson #define CR_EIEM          15
15435136a77SRichard Henderson #define CR_IT            16
15535136a77SRichard Henderson #define CR_IIASQ         17
15635136a77SRichard Henderson #define CR_IIAOQ         18
15735136a77SRichard Henderson #define CR_IIR           19
15835136a77SRichard Henderson #define CR_ISR           20
15935136a77SRichard Henderson #define CR_IOR           21
16035136a77SRichard Henderson #define CR_IPSW          22
16135136a77SRichard Henderson #define CR_EIRR          23
16235136a77SRichard Henderson 
16361766fe9SRichard Henderson typedef struct CPUHPPAState CPUHPPAState;
16461766fe9SRichard Henderson 
165eaa3783bSRichard Henderson #if TARGET_REGISTER_BITS == 32
166eaa3783bSRichard Henderson typedef uint32_t target_ureg;
167eaa3783bSRichard Henderson typedef int32_t  target_sreg;
168eaa3783bSRichard Henderson #define TREG_FMT_lx   "%08"PRIx32
169eaa3783bSRichard Henderson #define TREG_FMT_ld   "%"PRId32
170eaa3783bSRichard Henderson #else
171eaa3783bSRichard Henderson typedef uint64_t target_ureg;
172eaa3783bSRichard Henderson typedef int64_t  target_sreg;
173eaa3783bSRichard Henderson #define TREG_FMT_lx   "%016"PRIx64
174eaa3783bSRichard Henderson #define TREG_FMT_ld   "%"PRId64
175eaa3783bSRichard Henderson #endif
176eaa3783bSRichard Henderson 
177650cdb2aSRichard Henderson typedef struct {
178650cdb2aSRichard Henderson     uint64_t va_b;
179650cdb2aSRichard Henderson     uint64_t va_e;
180650cdb2aSRichard Henderson     target_ureg pa;
181650cdb2aSRichard Henderson     unsigned u : 1;
182650cdb2aSRichard Henderson     unsigned t : 1;
183650cdb2aSRichard Henderson     unsigned d : 1;
184650cdb2aSRichard Henderson     unsigned b : 1;
185650cdb2aSRichard Henderson     unsigned page_size : 4;
186650cdb2aSRichard Henderson     unsigned ar_type : 3;
187650cdb2aSRichard Henderson     unsigned ar_pl1 : 2;
188650cdb2aSRichard Henderson     unsigned ar_pl2 : 2;
189650cdb2aSRichard Henderson     unsigned entry_valid : 1;
190650cdb2aSRichard Henderson     unsigned access_id : 16;
191650cdb2aSRichard Henderson } hppa_tlb_entry;
192650cdb2aSRichard Henderson 
19361766fe9SRichard Henderson struct CPUHPPAState {
194eaa3783bSRichard Henderson     target_ureg gr[32];
19561766fe9SRichard Henderson     uint64_t fr[32];
19633423472SRichard Henderson     uint64_t sr[8];          /* stored shifted into place for gva */
19761766fe9SRichard Henderson 
198eaa3783bSRichard Henderson     target_ureg psw;         /* All psw bits except the following:  */
199eaa3783bSRichard Henderson     target_ureg psw_n;       /* boolean */
200eaa3783bSRichard Henderson     target_sreg psw_v;       /* in most significant bit */
20161766fe9SRichard Henderson 
20261766fe9SRichard Henderson     /* Splitting the carry-borrow field into the MSB and "the rest", allows
20361766fe9SRichard Henderson      * for "the rest" to be deleted when it is unused, but the MSB is in use.
20461766fe9SRichard Henderson      * In addition, it's easier to compute carry-in for bit B+1 than it is to
20561766fe9SRichard Henderson      * compute carry-out for bit B (3 vs 4 insns for addition, assuming the
20661766fe9SRichard Henderson      * host has the appropriate add-with-carry insn to compute the msb).
20761766fe9SRichard Henderson      * Therefore the carry bits are stored as: cb_msb : cb & 0x11111110.
20861766fe9SRichard Henderson      */
209eaa3783bSRichard Henderson     target_ureg psw_cb;      /* in least significant bit of next nibble */
210eaa3783bSRichard Henderson     target_ureg psw_cb_msb;  /* boolean */
21161766fe9SRichard Henderson 
212eaa3783bSRichard Henderson     target_ureg iaoq_f;      /* front */
213eaa3783bSRichard Henderson     target_ureg iaoq_b;      /* back, aka next instruction */
214c301f34eSRichard Henderson     uint64_t iasq_f;
215c301f34eSRichard Henderson     uint64_t iasq_b;
21661766fe9SRichard Henderson 
21761766fe9SRichard Henderson     uint32_t fr0_shadow;     /* flags, c, ca/cq, rm, d, enables */
21861766fe9SRichard Henderson     float_status fp_status;
21961766fe9SRichard Henderson 
22035136a77SRichard Henderson     target_ureg cr[32];      /* control registers */
22135136a77SRichard Henderson     target_ureg cr_back[2];  /* back of cr17/cr18 */
222f49b3537SRichard Henderson     target_ureg shadow[7];   /* shadow registers */
22335136a77SRichard Henderson 
22461766fe9SRichard Henderson     /* Those resources are used only in QEMU core */
22561766fe9SRichard Henderson     CPU_COMMON
226650cdb2aSRichard Henderson 
227650cdb2aSRichard Henderson     /* ??? The number of entries isn't specified by the architecture.  */
228650cdb2aSRichard Henderson     /* ??? Implement a unified itlb/dtlb for the moment.  */
229650cdb2aSRichard Henderson     /* ??? We should use a more intelligent data structure.  */
230650cdb2aSRichard Henderson     hppa_tlb_entry tlb[256];
231650cdb2aSRichard Henderson     uint32_t tlb_last;
23261766fe9SRichard Henderson };
23361766fe9SRichard Henderson 
23461766fe9SRichard Henderson /**
23561766fe9SRichard Henderson  * HPPACPU:
23661766fe9SRichard Henderson  * @env: #CPUHPPAState
23761766fe9SRichard Henderson  *
23861766fe9SRichard Henderson  * An HPPA CPU.
23961766fe9SRichard Henderson  */
24061766fe9SRichard Henderson struct HPPACPU {
24161766fe9SRichard Henderson     /*< private >*/
24261766fe9SRichard Henderson     CPUState parent_obj;
24361766fe9SRichard Henderson     /*< public >*/
24461766fe9SRichard Henderson 
24561766fe9SRichard Henderson     CPUHPPAState env;
24649c29d6cSRichard Henderson     QEMUTimer *alarm_timer;
24761766fe9SRichard Henderson };
24861766fe9SRichard Henderson 
24961766fe9SRichard Henderson static inline HPPACPU *hppa_env_get_cpu(CPUHPPAState *env)
25061766fe9SRichard Henderson {
25161766fe9SRichard Henderson     return container_of(env, HPPACPU, env);
25261766fe9SRichard Henderson }
25361766fe9SRichard Henderson 
25461766fe9SRichard Henderson #define ENV_GET_CPU(e)  CPU(hppa_env_get_cpu(e))
25561766fe9SRichard Henderson #define ENV_OFFSET      offsetof(HPPACPU, env)
25661766fe9SRichard Henderson 
25761766fe9SRichard Henderson #include "exec/cpu-all.h"
25861766fe9SRichard Henderson 
25961766fe9SRichard Henderson static inline int cpu_mmu_index(CPUHPPAState *env, bool ifetch)
26061766fe9SRichard Henderson {
2613d68ee7bSRichard Henderson #ifdef CONFIG_USER_ONLY
2623d68ee7bSRichard Henderson     return MMU_USER_IDX;
2633d68ee7bSRichard Henderson #else
2643d68ee7bSRichard Henderson     if (env->psw & (ifetch ? PSW_C : PSW_D)) {
2653d68ee7bSRichard Henderson         return env->iaoq_f & 3;
2663d68ee7bSRichard Henderson     }
2673d68ee7bSRichard Henderson     return MMU_PHYS_IDX;  /* mmu disabled */
2683d68ee7bSRichard Henderson #endif
26961766fe9SRichard Henderson }
27061766fe9SRichard Henderson 
27161766fe9SRichard Henderson void hppa_translate_init(void);
27261766fe9SRichard Henderson 
2730dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
27461766fe9SRichard Henderson 
27561766fe9SRichard Henderson void hppa_cpu_list(FILE *f, fprintf_function cpu_fprintf);
27661766fe9SRichard Henderson 
277c301f34eSRichard Henderson static inline target_ulong hppa_form_gva_psw(target_ureg psw, uint64_t spc,
278c301f34eSRichard Henderson                                              target_ureg off)
279c301f34eSRichard Henderson {
280c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY
281c301f34eSRichard Henderson     return off;
282c301f34eSRichard Henderson #else
283c301f34eSRichard Henderson     off &= (psw & PSW_W ? 0x3fffffffffffffffull : 0xffffffffull);
284c301f34eSRichard Henderson     return spc | off;
285c301f34eSRichard Henderson #endif
286c301f34eSRichard Henderson }
287c301f34eSRichard Henderson 
288c301f34eSRichard Henderson static inline target_ulong hppa_form_gva(CPUHPPAState *env, uint64_t spc,
289c301f34eSRichard Henderson                                          target_ureg off)
290c301f34eSRichard Henderson {
291c301f34eSRichard Henderson     return hppa_form_gva_psw(env->psw, spc, off);
292c301f34eSRichard Henderson }
293c301f34eSRichard Henderson 
294494737b7SRichard Henderson /* Since PSW_{I,CB} will never need to be in tb->flags, reuse them.
295494737b7SRichard Henderson  * TB_FLAG_SR_SAME indicates that SR4 through SR7 all contain the
296494737b7SRichard Henderson  * same value.
297494737b7SRichard Henderson  */
298494737b7SRichard Henderson #define TB_FLAG_SR_SAME     PSW_I
299c301f34eSRichard Henderson #define TB_FLAG_PRIV_SHIFT  8
300c301f34eSRichard Henderson 
30161766fe9SRichard Henderson static inline void cpu_get_tb_cpu_state(CPUHPPAState *env, target_ulong *pc,
30261766fe9SRichard Henderson                                         target_ulong *cs_base,
30361766fe9SRichard Henderson                                         uint32_t *pflags)
30461766fe9SRichard Henderson {
305c301f34eSRichard Henderson     uint32_t flags = env->psw_n * PSW_N;
306c301f34eSRichard Henderson 
307c301f34eSRichard Henderson     /* TB lookup assumes that PC contains the complete virtual address.
308c301f34eSRichard Henderson        If we leave space+offset separate, we'll get ITLB misses to an
309c301f34eSRichard Henderson        incomplete virtual address.  This also means that we must separate
310c301f34eSRichard Henderson        out current cpu priviledge from the low bits of IAOQ_F.  */
311c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY
312ebd0e151SRichard Henderson     *pc = env->iaoq_f & -4;
313ebd0e151SRichard Henderson     *cs_base = env->iaoq_b & -4;
314c301f34eSRichard Henderson #else
3153d68ee7bSRichard Henderson     /* ??? E, T, H, L, B, P bits need to be here, when implemented.  */
316c301f34eSRichard Henderson     flags |= env->psw & (PSW_W | PSW_C | PSW_D);
317c301f34eSRichard Henderson     flags |= (env->iaoq_f & 3) << TB_FLAG_PRIV_SHIFT;
318c301f34eSRichard Henderson 
319c301f34eSRichard Henderson     *pc = (env->psw & PSW_C
320c301f34eSRichard Henderson            ? hppa_form_gva_psw(env->psw, env->iasq_f, env->iaoq_f & -4)
321c301f34eSRichard Henderson            : env->iaoq_f & -4);
322c301f34eSRichard Henderson     *cs_base = env->iasq_f;
323c301f34eSRichard Henderson 
324c301f34eSRichard Henderson     /* Insert a difference between IAOQ_B and IAOQ_F within the otherwise zero
325c301f34eSRichard Henderson        low 32-bits of CS_BASE.  This will succeed for all direct branches,
326c301f34eSRichard Henderson        which is the primary case we care about -- using goto_tb within a page.
327c301f34eSRichard Henderson        Failure is indicated by a zero difference.  */
328c301f34eSRichard Henderson     if (env->iasq_f == env->iasq_b) {
329c301f34eSRichard Henderson         target_sreg diff = env->iaoq_b - env->iaoq_f;
330c301f34eSRichard Henderson         if (TARGET_REGISTER_BITS == 32 || diff == (int32_t)diff) {
331c301f34eSRichard Henderson             *cs_base |= (uint32_t)diff;
332c301f34eSRichard Henderson         }
333c301f34eSRichard Henderson     }
334494737b7SRichard Henderson     if ((env->sr[4] == env->sr[5])
335494737b7SRichard Henderson         & (env->sr[4] == env->sr[6])
336494737b7SRichard Henderson         & (env->sr[4] == env->sr[7])) {
337494737b7SRichard Henderson         flags |= TB_FLAG_SR_SAME;
338494737b7SRichard Henderson     }
339c301f34eSRichard Henderson #endif
340c301f34eSRichard Henderson 
341c301f34eSRichard Henderson     *pflags = flags;
34261766fe9SRichard Henderson }
34361766fe9SRichard Henderson 
344eaa3783bSRichard Henderson target_ureg cpu_hppa_get_psw(CPUHPPAState *env);
345eaa3783bSRichard Henderson void cpu_hppa_put_psw(CPUHPPAState *env, target_ureg);
34661766fe9SRichard Henderson void cpu_hppa_loaded_fr0(CPUHPPAState *env);
34761766fe9SRichard Henderson 
348*d5de20bdSSven Schnelle #ifdef CONFIG_USER_ONLY
349*d5de20bdSSven Schnelle static inline void cpu_hppa_change_prot_id(CPUHPPAState *env) { }
350*d5de20bdSSven Schnelle #else
351*d5de20bdSSven Schnelle void cpu_hppa_change_prot_id(CPUHPPAState *env);
352*d5de20bdSSven Schnelle #endif
353*d5de20bdSSven Schnelle 
35461766fe9SRichard Henderson #define cpu_signal_handler cpu_hppa_signal_handler
35561766fe9SRichard Henderson 
35661766fe9SRichard Henderson int cpu_hppa_signal_handler(int host_signum, void *pinfo, void *puc);
357813dff13SHelge Deller hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr);
35861766fe9SRichard Henderson int hppa_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
35961766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
36061766fe9SRichard Henderson void hppa_cpu_do_interrupt(CPUState *cpu);
36161766fe9SRichard Henderson bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req);
36261766fe9SRichard Henderson void hppa_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function, int);
363650cdb2aSRichard Henderson #ifdef CONFIG_USER_ONLY
364650cdb2aSRichard Henderson int hppa_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int size,
365650cdb2aSRichard Henderson                               int rw, int midx);
366650cdb2aSRichard Henderson #else
367650cdb2aSRichard Henderson int hppa_get_physical_address(CPUHPPAState *env, vaddr addr, int mmu_idx,
368650cdb2aSRichard Henderson                               int type, hwaddr *pphys, int *pprot);
3694f5f2548SRichard Henderson extern const MemoryRegionOps hppa_io_eir_ops;
370c643603aSRichard Henderson extern const struct VMStateDescription vmstate_hppa_cpu;
37149c29d6cSRichard Henderson void hppa_cpu_alarm_timer(void *);
37243e05652SRichard Henderson int hppa_artype_for_page(CPUHPPAState *env, target_ulong vaddr);
373650cdb2aSRichard Henderson #endif
3742dfcca9fSRichard Henderson void QEMU_NORETURN hppa_dynamic_excp(CPUHPPAState *env, int excp, uintptr_t ra);
37561766fe9SRichard Henderson 
37661766fe9SRichard Henderson #endif /* HPPA_CPU_H */
377