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 51f5b5c857SRichard Henderson #define TARGET_INSN_START_EXTRA_WORDS 2 5261766fe9SRichard Henderson 53451d993dSRichard Henderson /* No need to flush MMU_ABS*_IDX */ 5488b7ad10SHelge Deller #define HPPA_MMU_FLUSH_MASK \ 55bb67ec32SRichard Henderson (1 << MMU_KERNEL_IDX | 1 << MMU_KERNEL_P_IDX | \ 56bb67ec32SRichard Henderson 1 << MMU_PL1_IDX | 1 << MMU_PL1_P_IDX | \ 57bb67ec32SRichard Henderson 1 << MMU_PL2_IDX | 1 << MMU_PL2_P_IDX | \ 58bb67ec32SRichard Henderson 1 << MMU_USER_IDX | 1 << MMU_USER_P_IDX) 59bb67ec32SRichard Henderson 60385b3280SMichael Tokarev /* Indices to flush for access_id changes. */ 61bb67ec32SRichard Henderson #define HPPA_MMU_FLUSH_P_MASK \ 62bb67ec32SRichard Henderson (1 << MMU_KERNEL_P_IDX | 1 << MMU_PL1_P_IDX | \ 63bb67ec32SRichard Henderson 1 << MMU_PL2_P_IDX | 1 << MMU_USER_P_IDX) 6488b7ad10SHelge Deller 658b81968cSMichael Tokarev /* Hardware exceptions, interrupts, faults, and traps. */ 662986721dSRichard Henderson #define EXCP_HPMC 1 /* high priority machine check */ 672986721dSRichard Henderson #define EXCP_POWER_FAIL 2 682986721dSRichard Henderson #define EXCP_RC 3 /* recovery counter */ 692986721dSRichard Henderson #define EXCP_EXT_INTERRUPT 4 /* external interrupt */ 702986721dSRichard Henderson #define EXCP_LPMC 5 /* low priority machine check */ 712986721dSRichard Henderson #define EXCP_ITLB_MISS 6 /* itlb miss / instruction page fault */ 722986721dSRichard Henderson #define EXCP_IMP 7 /* instruction memory protection trap */ 732986721dSRichard Henderson #define EXCP_ILL 8 /* illegal instruction trap */ 742986721dSRichard Henderson #define EXCP_BREAK 9 /* break instruction */ 752986721dSRichard Henderson #define EXCP_PRIV_OPR 10 /* privileged operation trap */ 762986721dSRichard Henderson #define EXCP_PRIV_REG 11 /* privileged register trap */ 772986721dSRichard Henderson #define EXCP_OVERFLOW 12 /* signed overflow trap */ 782986721dSRichard Henderson #define EXCP_COND 13 /* trap-on-condition */ 792986721dSRichard Henderson #define EXCP_ASSIST 14 /* assist exception trap */ 802986721dSRichard Henderson #define EXCP_DTLB_MISS 15 /* dtlb miss / data page fault */ 812986721dSRichard Henderson #define EXCP_NA_ITLB_MISS 16 /* non-access itlb miss */ 822986721dSRichard Henderson #define EXCP_NA_DTLB_MISS 17 /* non-access dtlb miss */ 832986721dSRichard Henderson #define EXCP_DMP 18 /* data memory protection trap */ 842986721dSRichard Henderson #define EXCP_DMB 19 /* data memory break trap */ 852986721dSRichard Henderson #define EXCP_TLB_DIRTY 20 /* tlb dirty bit trap */ 862986721dSRichard Henderson #define EXCP_PAGE_REF 21 /* page reference trap */ 872986721dSRichard Henderson #define EXCP_ASSIST_EMU 22 /* assist emulation trap */ 882986721dSRichard Henderson #define EXCP_HPT 23 /* high-privilege transfer trap */ 892986721dSRichard Henderson #define EXCP_LPT 24 /* low-privilege transfer trap */ 902986721dSRichard Henderson #define EXCP_TB 25 /* taken branch trap */ 912986721dSRichard Henderson #define EXCP_DMAR 26 /* data memory access rights trap */ 922986721dSRichard Henderson #define EXCP_DMPI 27 /* data memory protection id trap */ 932986721dSRichard Henderson #define EXCP_UNALIGN 28 /* unaligned data reference trap */ 942986721dSRichard Henderson #define EXCP_PER_INTERRUPT 29 /* performance monitor interrupt */ 952986721dSRichard Henderson 962986721dSRichard Henderson /* Exceptions for linux-user emulation. */ 972986721dSRichard Henderson #define EXCP_SYSCALL 30 982986721dSRichard Henderson #define EXCP_SYSCALL_LWS 31 9961766fe9SRichard Henderson 1004a4554c6SHelge Deller /* Emulated hardware TOC button */ 1014a4554c6SHelge Deller #define EXCP_TOC 32 /* TOC = Transfer of control (NMI) */ 1024a4554c6SHelge Deller 1034a4554c6SHelge Deller #define CPU_INTERRUPT_NMI CPU_INTERRUPT_TGT_EXT_3 /* TOC */ 1044a4554c6SHelge Deller 105fa57e327SRichard Henderson /* Taken from Linux kernel: arch/parisc/include/asm/psw.h */ 106fa57e327SRichard Henderson #define PSW_I 0x00000001 107fa57e327SRichard Henderson #define PSW_D 0x00000002 108fa57e327SRichard Henderson #define PSW_P 0x00000004 109fa57e327SRichard Henderson #define PSW_Q 0x00000008 110fa57e327SRichard Henderson #define PSW_R 0x00000010 111fa57e327SRichard Henderson #define PSW_F 0x00000020 112fa57e327SRichard Henderson #define PSW_G 0x00000040 /* PA1.x only */ 113fa57e327SRichard Henderson #define PSW_O 0x00000080 /* PA2.0 only */ 114fa57e327SRichard Henderson #define PSW_CB 0x0000ff00 115fa57e327SRichard Henderson #define PSW_M 0x00010000 116fa57e327SRichard Henderson #define PSW_V 0x00020000 117fa57e327SRichard Henderson #define PSW_C 0x00040000 118fa57e327SRichard Henderson #define PSW_B 0x00080000 119fa57e327SRichard Henderson #define PSW_X 0x00100000 120fa57e327SRichard Henderson #define PSW_N 0x00200000 121fa57e327SRichard Henderson #define PSW_L 0x00400000 122fa57e327SRichard Henderson #define PSW_H 0x00800000 123fa57e327SRichard Henderson #define PSW_T 0x01000000 124fa57e327SRichard Henderson #define PSW_S 0x02000000 125fa57e327SRichard Henderson #define PSW_E 0x04000000 126fa57e327SRichard Henderson #define PSW_W 0x08000000 /* PA2.0 only */ 127fa57e327SRichard Henderson #define PSW_Z 0x40000000 /* PA1.x only */ 128fa57e327SRichard Henderson #define PSW_Y 0x80000000 /* PA1.x only */ 129fa57e327SRichard Henderson 130fa57e327SRichard Henderson #define PSW_SM (PSW_W | PSW_E | PSW_O | PSW_G | PSW_F \ 131fa57e327SRichard Henderson | PSW_R | PSW_Q | PSW_P | PSW_D | PSW_I) 132fa57e327SRichard Henderson 133fa57e327SRichard Henderson /* ssm/rsm instructions number PSW_W and PSW_E differently */ 134fa57e327SRichard Henderson #define PSW_SM_I PSW_I /* Enable External Interrupts */ 135fa57e327SRichard Henderson #define PSW_SM_D PSW_D 136fa57e327SRichard Henderson #define PSW_SM_P PSW_P 137fa57e327SRichard Henderson #define PSW_SM_Q PSW_Q /* Enable Interrupt State Collection */ 138fa57e327SRichard Henderson #define PSW_SM_R PSW_R /* Enable Recover Counter Trap */ 139fa57e327SRichard Henderson #define PSW_SM_E 0x100 140fa57e327SRichard Henderson #define PSW_SM_W 0x200 /* PA2.0 only : Enable Wide Mode */ 141fa57e327SRichard Henderson 14235136a77SRichard Henderson #define CR_RC 0 143ab9af359SHelge Deller #define CR_PSW_DEFAULT 6 /* see SeaBIOS PDC_PSW firmware call */ 144ab9af359SHelge Deller #define PDC_PSW_WIDE_BIT 2 145d5de20bdSSven Schnelle #define CR_PID1 8 146d5de20bdSSven Schnelle #define CR_PID2 9 147d5de20bdSSven Schnelle #define CR_PID3 12 148d5de20bdSSven Schnelle #define CR_PID4 13 14935136a77SRichard Henderson #define CR_SCRCCR 10 15035136a77SRichard Henderson #define CR_SAR 11 15135136a77SRichard Henderson #define CR_IVA 14 15235136a77SRichard Henderson #define CR_EIEM 15 15335136a77SRichard Henderson #define CR_IT 16 15435136a77SRichard Henderson #define CR_IIASQ 17 15535136a77SRichard Henderson #define CR_IIAOQ 18 15635136a77SRichard Henderson #define CR_IIR 19 15735136a77SRichard Henderson #define CR_ISR 20 15835136a77SRichard Henderson #define CR_IOR 21 15935136a77SRichard Henderson #define CR_IPSW 22 16035136a77SRichard Henderson #define CR_EIRR 23 16135136a77SRichard Henderson 162f33a22c1SRichard Henderson FIELD(FPSR, ENA_I, 0, 1) 163f33a22c1SRichard Henderson FIELD(FPSR, ENA_U, 1, 1) 164f33a22c1SRichard Henderson FIELD(FPSR, ENA_O, 2, 1) 165f33a22c1SRichard Henderson FIELD(FPSR, ENA_Z, 3, 1) 166f33a22c1SRichard Henderson FIELD(FPSR, ENA_V, 4, 1) 167f33a22c1SRichard Henderson FIELD(FPSR, ENABLES, 0, 5) 168f33a22c1SRichard Henderson FIELD(FPSR, D, 5, 1) 169f33a22c1SRichard Henderson FIELD(FPSR, T, 6, 1) 170f33a22c1SRichard Henderson FIELD(FPSR, RM, 9, 2) 171f33a22c1SRichard Henderson FIELD(FPSR, CQ, 11, 11) 172f33a22c1SRichard Henderson FIELD(FPSR, CQ0_6, 15, 7) 173f33a22c1SRichard Henderson FIELD(FPSR, CQ0_4, 17, 5) 174f33a22c1SRichard Henderson FIELD(FPSR, CQ0_2, 19, 3) 175f33a22c1SRichard Henderson FIELD(FPSR, CQ0, 21, 1) 176f33a22c1SRichard Henderson FIELD(FPSR, CA, 15, 7) 177f33a22c1SRichard Henderson FIELD(FPSR, CA0, 21, 1) 178f33a22c1SRichard Henderson FIELD(FPSR, C, 26, 1) 179f33a22c1SRichard Henderson FIELD(FPSR, FLG_I, 27, 1) 180f33a22c1SRichard Henderson FIELD(FPSR, FLG_U, 28, 1) 181f33a22c1SRichard Henderson FIELD(FPSR, FLG_O, 29, 1) 182f33a22c1SRichard Henderson FIELD(FPSR, FLG_Z, 30, 1) 183f33a22c1SRichard Henderson FIELD(FPSR, FLG_V, 31, 1) 184f33a22c1SRichard Henderson FIELD(FPSR, FLAGS, 27, 5) 185f33a22c1SRichard Henderson 186729cd350SRichard Henderson typedef struct HPPATLBEntry { 187d7553f35SRichard Henderson union { 18866866cc7SRichard Henderson IntervalTreeNode itree; 189d7553f35SRichard Henderson struct HPPATLBEntry *unused_next; 190d7553f35SRichard Henderson }; 19166866cc7SRichard Henderson 192c53e401eSRichard Henderson target_ulong pa; 193f8cda28bSRichard Henderson 194f8cda28bSRichard Henderson unsigned entry_valid : 1; 195f8cda28bSRichard Henderson 196650cdb2aSRichard Henderson unsigned u : 1; 197650cdb2aSRichard Henderson unsigned t : 1; 198650cdb2aSRichard Henderson unsigned d : 1; 199650cdb2aSRichard Henderson unsigned b : 1; 200650cdb2aSRichard Henderson unsigned ar_type : 3; 201650cdb2aSRichard Henderson unsigned ar_pl1 : 2; 202650cdb2aSRichard Henderson unsigned ar_pl2 : 2; 203650cdb2aSRichard Henderson unsigned access_id : 16; 204729cd350SRichard Henderson } HPPATLBEntry; 205650cdb2aSRichard Henderson 2061ea4a06aSPhilippe Mathieu-Daudé typedef struct CPUArchState { 207c53e401eSRichard Henderson target_ulong iaoq_f; /* front */ 208c53e401eSRichard Henderson target_ulong iaoq_b; /* back, aka next instruction */ 209f8c0fd98SHelge Deller 210c53e401eSRichard Henderson target_ulong gr[32]; 21161766fe9SRichard Henderson uint64_t fr[32]; 21233423472SRichard Henderson uint64_t sr[8]; /* stored shifted into place for gva */ 21361766fe9SRichard Henderson 214ebc9401aSRichard Henderson uint32_t psw; /* All psw bits except the following: */ 215ebc9401aSRichard Henderson uint32_t psw_xb; /* X and B, in their normal positions */ 216c53e401eSRichard Henderson target_ulong psw_n; /* boolean */ 217ead5078cSHelge Deller target_long psw_v; /* in bit 31 */ 21861766fe9SRichard Henderson 21961766fe9SRichard Henderson /* Splitting the carry-borrow field into the MSB and "the rest", allows 22061766fe9SRichard Henderson * for "the rest" to be deleted when it is unused, but the MSB is in use. 22161766fe9SRichard Henderson * In addition, it's easier to compute carry-in for bit B+1 than it is to 22261766fe9SRichard Henderson * compute carry-out for bit B (3 vs 4 insns for addition, assuming the 22361766fe9SRichard Henderson * host has the appropriate add-with-carry insn to compute the msb). 22461766fe9SRichard Henderson * Therefore the carry bits are stored as: cb_msb : cb & 0x11111110. 22561766fe9SRichard Henderson */ 226c53e401eSRichard Henderson target_ulong psw_cb; /* in least significant bit of next nibble */ 227c53e401eSRichard Henderson target_ulong psw_cb_msb; /* boolean */ 22861766fe9SRichard Henderson 229644ce5dfSHelge Deller uint64_t gva_offset_mask; /* cached address mask based on PSW and %dr2 */ 230c301f34eSRichard Henderson uint64_t iasq_f; 231c301f34eSRichard Henderson uint64_t iasq_b; 23261766fe9SRichard Henderson 23361766fe9SRichard Henderson uint32_t fr0_shadow; /* flags, c, ca/cq, rm, d, enables */ 23461766fe9SRichard Henderson float_status fp_status; 23561766fe9SRichard Henderson 236c53e401eSRichard Henderson target_ulong cr[32]; /* control registers */ 237c53e401eSRichard Henderson target_ulong cr_back[2]; /* back of cr17/cr18 */ 238c53e401eSRichard Henderson target_ulong shadow[7]; /* shadow registers */ 2398f2a1c59SHelge Deller target_ulong dr[32]; /* diagnose registers */ 24035136a77SRichard Henderson 2419cf2112bSRichard Henderson /* 242f5b5c857SRichard Henderson * During unwind of a memory insn, the base register of the address. 243f5b5c857SRichard Henderson * This is used to construct CR_IOR for pa2.0. 244f5b5c857SRichard Henderson */ 245f5b5c857SRichard Henderson uint32_t unwind_breg; 246f5b5c857SRichard Henderson 247f5b5c857SRichard Henderson /* 2489cf2112bSRichard Henderson * ??? The number of entries isn't specified by the architecture. 2499cf2112bSRichard Henderson * BTLBs are not supported in 64-bit machines. 2509cf2112bSRichard Henderson */ 2519cf2112bSRichard Henderson #define PA10_BTLB_FIXED 16 2529cf2112bSRichard Henderson #define PA10_BTLB_VARIABLE 0 253df5c6a50SHelge Deller #define HPPA_TLB_ENTRIES 256 254df5c6a50SHelge Deller 255d7553f35SRichard Henderson /* Index for round-robin tlb eviction. */ 256650cdb2aSRichard Henderson uint32_t tlb_last; 257d7553f35SRichard Henderson 258d7553f35SRichard Henderson /* 259d7553f35SRichard Henderson * For pa1.x, the partial initialized, still invalid tlb entry 260d7553f35SRichard Henderson * which has had ITLBA performed, but not yet ITLBP. 261d7553f35SRichard Henderson */ 262d7553f35SRichard Henderson HPPATLBEntry *tlb_partial; 263d7553f35SRichard Henderson 264d7553f35SRichard Henderson /* Linked list of all invalid (unused) tlb entries. */ 265d7553f35SRichard Henderson HPPATLBEntry *tlb_unused; 266d7553f35SRichard Henderson 267d7553f35SRichard Henderson /* Root of the search tree for all valid tlb entries. */ 268d7553f35SRichard Henderson IntervalTreeRoot tlb_root; 269d7553f35SRichard Henderson 270d7553f35SRichard Henderson HPPATLBEntry tlb[HPPA_TLB_ENTRIES]; 271f4f41731SHelge Deller 272f4f41731SHelge Deller /* Fields up to this point are cleared by a CPU reset */ 273f4f41731SHelge Deller struct {} end_reset_fields; 2745c27cbd7SHelge Deller 2755c27cbd7SHelge Deller bool is_pa20; 276c656f293SHelge Deller 277c656f293SHelge Deller target_ulong kernel_entry; /* Linux kernel was loaded here */ 278c656f293SHelge Deller target_ulong cmdline_or_bootorder; 279c656f293SHelge Deller target_ulong initrd_base, initrd_end; 2801ea4a06aSPhilippe Mathieu-Daudé } CPUHPPAState; 28161766fe9SRichard Henderson 28261766fe9SRichard Henderson /** 28361766fe9SRichard Henderson * HPPACPU: 28461766fe9SRichard Henderson * @env: #CPUHPPAState 28561766fe9SRichard Henderson * 28661766fe9SRichard Henderson * An HPPA CPU. 28761766fe9SRichard Henderson */ 288b36e239eSPhilippe Mathieu-Daudé struct ArchCPU { 28961766fe9SRichard Henderson CPUState parent_obj; 29061766fe9SRichard Henderson 29161766fe9SRichard Henderson CPUHPPAState env; 29249c29d6cSRichard Henderson QEMUTimer *alarm_timer; 29361766fe9SRichard Henderson }; 29461766fe9SRichard Henderson 2959348028eSPhilippe Mathieu-Daudé /** 2969348028eSPhilippe Mathieu-Daudé * HPPACPUClass: 2979348028eSPhilippe Mathieu-Daudé * @parent_realize: The parent class' realize handler. 298f4f41731SHelge Deller * @parent_phases: The parent class' reset phase handlers. 2999348028eSPhilippe Mathieu-Daudé * 3009348028eSPhilippe Mathieu-Daudé * An HPPA CPU model. 3019348028eSPhilippe Mathieu-Daudé */ 3029348028eSPhilippe Mathieu-Daudé struct HPPACPUClass { 3039348028eSPhilippe Mathieu-Daudé CPUClass parent_class; 3049348028eSPhilippe Mathieu-Daudé 3059348028eSPhilippe Mathieu-Daudé DeviceRealize parent_realize; 306f4f41731SHelge Deller ResettablePhases parent_phases; 3079348028eSPhilippe Mathieu-Daudé }; 3089348028eSPhilippe Mathieu-Daudé 30961766fe9SRichard Henderson #include "exec/cpu-all.h" 31061766fe9SRichard Henderson 3115c27cbd7SHelge Deller static inline bool hppa_is_pa20(const CPUHPPAState *env) 312bd6243a3SRichard Henderson { 3135c27cbd7SHelge Deller return env->is_pa20; 314bd6243a3SRichard Henderson } 315bd6243a3SRichard Henderson 3169cf2112bSRichard Henderson static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env) 3179cf2112bSRichard Henderson { 3189cf2112bSRichard Henderson return hppa_is_pa20(env) ? 0 : PA10_BTLB_FIXED + PA10_BTLB_VARIABLE; 3199cf2112bSRichard Henderson } 3209cf2112bSRichard Henderson 32161766fe9SRichard Henderson void hppa_translate_init(void); 322e4a8e093SRichard Henderson void hppa_translate_code(CPUState *cs, TranslationBlock *tb, 323e4a8e093SRichard Henderson int *max_insns, vaddr pc, void *host_pc); 32461766fe9SRichard Henderson 3250dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_HPPA_CPU 32661766fe9SRichard Henderson 327644ce5dfSHelge Deller static inline target_ulong hppa_form_gva_mask(uint64_t gva_offset_mask, 328644ce5dfSHelge Deller uint64_t spc, target_ulong off) 329c301f34eSRichard Henderson { 330c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY 331644ce5dfSHelge Deller return off & gva_offset_mask; 332c301f34eSRichard Henderson #else 333644ce5dfSHelge Deller return spc | (off & gva_offset_mask); 334c301f34eSRichard Henderson #endif 335c301f34eSRichard Henderson } 336c301f34eSRichard Henderson 337c301f34eSRichard Henderson static inline target_ulong hppa_form_gva(CPUHPPAState *env, uint64_t spc, 338c53e401eSRichard Henderson target_ulong off) 339c301f34eSRichard Henderson { 340644ce5dfSHelge Deller return hppa_form_gva_mask(env->gva_offset_mask, spc, off); 341c301f34eSRichard Henderson } 342c301f34eSRichard Henderson 343ccdf741cSRichard Henderson hwaddr hppa_abs_to_phys_pa2_w0(vaddr addr); 344ccdf741cSRichard Henderson hwaddr hppa_abs_to_phys_pa2_w1(vaddr addr); 345ccdf741cSRichard Henderson 346217d1a5eSRichard Henderson /* 347217d1a5eSRichard Henderson * Since PSW_{I,CB} will never need to be in tb->flags, reuse them. 348494737b7SRichard Henderson * TB_FLAG_SR_SAME indicates that SR4 through SR7 all contain the 349494737b7SRichard Henderson * same value. 350494737b7SRichard Henderson */ 351494737b7SRichard Henderson #define TB_FLAG_SR_SAME PSW_I 352c301f34eSRichard Henderson #define TB_FLAG_PRIV_SHIFT 8 353217d1a5eSRichard Henderson #define TB_FLAG_UNALIGN 0x400 354644ce5dfSHelge Deller #define TB_FLAG_SPHASH 0x800 3559dfcd243SRichard Henderson #define CS_BASE_DIFFPAGE (1 << 12) 3569dfcd243SRichard Henderson #define CS_BASE_DIFFSPACE (1 << 13) 357c301f34eSRichard Henderson 358b61603bfSRichard Henderson void cpu_get_tb_cpu_state(CPUHPPAState *env, vaddr *pc, 359b61603bfSRichard Henderson uint64_t *cs_base, uint32_t *pflags); 36061766fe9SRichard Henderson 361c53e401eSRichard Henderson target_ulong cpu_hppa_get_psw(CPUHPPAState *env); 362c53e401eSRichard Henderson void cpu_hppa_put_psw(CPUHPPAState *env, target_ulong); 363644ce5dfSHelge Deller void update_gva_offset_mask(CPUHPPAState *env); 36461766fe9SRichard Henderson void cpu_hppa_loaded_fr0(CPUHPPAState *env); 36561766fe9SRichard Henderson 366d5de20bdSSven Schnelle #ifdef CONFIG_USER_ONLY 367d5de20bdSSven Schnelle static inline void cpu_hppa_change_prot_id(CPUHPPAState *env) { } 368d5de20bdSSven Schnelle #else 369d5de20bdSSven Schnelle void cpu_hppa_change_prot_id(CPUHPPAState *env); 370d5de20bdSSven Schnelle #endif 371d5de20bdSSven Schnelle 372a010bdbeSAlex Bennée int hppa_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg); 37361766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); 37490c84c56SMarkus Armbruster void hppa_cpu_dump_state(CPUState *cs, FILE *f, int); 375860e0b96SRichard Henderson #ifndef CONFIG_USER_ONLY 376d7553f35SRichard Henderson void hppa_ptlbe(CPUHPPAState *env); 3776d2d454aSPhilippe Mathieu-Daudé hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr); 3783824e0d6SHelge Deller void hppa_set_ior_and_isr(CPUHPPAState *env, vaddr addr, bool mmu_disabled); 37999746de6SRichard Henderson bool hppa_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out, vaddr addr, 3803c7bef03SRichard Henderson MMUAccessType access_type, int mmu_idx, 38199746de6SRichard Henderson MemOp memop, int size, bool probe, uintptr_t ra); 38268fa1780SPhilippe Mathieu-Daudé void hppa_cpu_do_interrupt(CPUState *cpu); 38368fa1780SPhilippe Mathieu-Daudé bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req); 384650cdb2aSRichard Henderson int hppa_get_physical_address(CPUHPPAState *env, vaddr addr, int mmu_idx, 3854e6939c9SRichard Henderson int type, MemOp mop, hwaddr *pphys, int *pprot); 3869ccbe394SHelge Deller void hppa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, 3879ccbe394SHelge Deller vaddr addr, unsigned size, 3889ccbe394SHelge Deller MMUAccessType access_type, 3899ccbe394SHelge Deller int mmu_idx, MemTxAttrs attrs, 3909ccbe394SHelge Deller MemTxResult response, uintptr_t retaddr); 3914f5f2548SRichard Henderson extern const MemoryRegionOps hppa_io_eir_ops; 3928a9358ccSMarkus Armbruster extern const VMStateDescription vmstate_hppa_cpu; 39349c29d6cSRichard Henderson void hppa_cpu_alarm_timer(void *); 394650cdb2aSRichard Henderson #endif 3958905770bSMarc-André Lureau G_NORETURN void hppa_dynamic_excp(CPUHPPAState *env, int excp, uintptr_t ra); 39661766fe9SRichard Henderson 39761766fe9SRichard Henderson #endif /* HPPA_CPU_H */ 398