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 14635136a77SRichard Henderson #define CR_SCRCCR 10 14735136a77SRichard Henderson #define CR_SAR 11 14835136a77SRichard Henderson #define CR_IVA 14 14935136a77SRichard Henderson #define CR_EIEM 15 15035136a77SRichard Henderson #define CR_IT 16 15135136a77SRichard Henderson #define CR_IIASQ 17 15235136a77SRichard Henderson #define CR_IIAOQ 18 15335136a77SRichard Henderson #define CR_IIR 19 15435136a77SRichard Henderson #define CR_ISR 20 15535136a77SRichard Henderson #define CR_IOR 21 15635136a77SRichard Henderson #define CR_IPSW 22 15735136a77SRichard Henderson #define CR_EIRR 23 15835136a77SRichard Henderson 15961766fe9SRichard Henderson typedef struct CPUHPPAState CPUHPPAState; 16061766fe9SRichard Henderson 161eaa3783bSRichard Henderson #if TARGET_REGISTER_BITS == 32 162eaa3783bSRichard Henderson typedef uint32_t target_ureg; 163eaa3783bSRichard Henderson typedef int32_t target_sreg; 164eaa3783bSRichard Henderson #define TREG_FMT_lx "%08"PRIx32 165eaa3783bSRichard Henderson #define TREG_FMT_ld "%"PRId32 166eaa3783bSRichard Henderson #else 167eaa3783bSRichard Henderson typedef uint64_t target_ureg; 168eaa3783bSRichard Henderson typedef int64_t target_sreg; 169eaa3783bSRichard Henderson #define TREG_FMT_lx "%016"PRIx64 170eaa3783bSRichard Henderson #define TREG_FMT_ld "%"PRId64 171eaa3783bSRichard Henderson #endif 172eaa3783bSRichard Henderson 173650cdb2aSRichard Henderson typedef struct { 174650cdb2aSRichard Henderson uint64_t va_b; 175650cdb2aSRichard Henderson uint64_t va_e; 176650cdb2aSRichard Henderson target_ureg pa; 177650cdb2aSRichard Henderson unsigned u : 1; 178650cdb2aSRichard Henderson unsigned t : 1; 179650cdb2aSRichard Henderson unsigned d : 1; 180650cdb2aSRichard Henderson unsigned b : 1; 181650cdb2aSRichard Henderson unsigned page_size : 4; 182650cdb2aSRichard Henderson unsigned ar_type : 3; 183650cdb2aSRichard Henderson unsigned ar_pl1 : 2; 184650cdb2aSRichard Henderson unsigned ar_pl2 : 2; 185650cdb2aSRichard Henderson unsigned entry_valid : 1; 186650cdb2aSRichard Henderson unsigned access_id : 16; 187650cdb2aSRichard Henderson } hppa_tlb_entry; 188650cdb2aSRichard Henderson 18961766fe9SRichard Henderson struct CPUHPPAState { 190eaa3783bSRichard Henderson target_ureg gr[32]; 19161766fe9SRichard Henderson uint64_t fr[32]; 19233423472SRichard Henderson uint64_t sr[8]; /* stored shifted into place for gva */ 19361766fe9SRichard Henderson 194eaa3783bSRichard Henderson target_ureg psw; /* All psw bits except the following: */ 195eaa3783bSRichard Henderson target_ureg psw_n; /* boolean */ 196eaa3783bSRichard Henderson target_sreg psw_v; /* in most significant bit */ 19761766fe9SRichard Henderson 19861766fe9SRichard Henderson /* Splitting the carry-borrow field into the MSB and "the rest", allows 19961766fe9SRichard Henderson * for "the rest" to be deleted when it is unused, but the MSB is in use. 20061766fe9SRichard Henderson * In addition, it's easier to compute carry-in for bit B+1 than it is to 20161766fe9SRichard Henderson * compute carry-out for bit B (3 vs 4 insns for addition, assuming the 20261766fe9SRichard Henderson * host has the appropriate add-with-carry insn to compute the msb). 20361766fe9SRichard Henderson * Therefore the carry bits are stored as: cb_msb : cb & 0x11111110. 20461766fe9SRichard Henderson */ 205eaa3783bSRichard Henderson target_ureg psw_cb; /* in least significant bit of next nibble */ 206eaa3783bSRichard Henderson target_ureg psw_cb_msb; /* boolean */ 20761766fe9SRichard Henderson 208eaa3783bSRichard Henderson target_ureg iaoq_f; /* front */ 209eaa3783bSRichard Henderson target_ureg iaoq_b; /* back, aka next instruction */ 210c301f34eSRichard Henderson uint64_t iasq_f; 211c301f34eSRichard Henderson uint64_t iasq_b; 21261766fe9SRichard Henderson 21361766fe9SRichard Henderson uint32_t fr0_shadow; /* flags, c, ca/cq, rm, d, enables */ 21461766fe9SRichard Henderson float_status fp_status; 21561766fe9SRichard Henderson 21635136a77SRichard Henderson target_ureg cr[32]; /* control registers */ 21735136a77SRichard Henderson target_ureg cr_back[2]; /* back of cr17/cr18 */ 218f49b3537SRichard Henderson target_ureg shadow[7]; /* shadow registers */ 21935136a77SRichard Henderson 22061766fe9SRichard Henderson /* Those resources are used only in QEMU core */ 22161766fe9SRichard Henderson CPU_COMMON 222650cdb2aSRichard Henderson 223650cdb2aSRichard Henderson /* ??? The number of entries isn't specified by the architecture. */ 224650cdb2aSRichard Henderson /* ??? Implement a unified itlb/dtlb for the moment. */ 225650cdb2aSRichard Henderson /* ??? We should use a more intelligent data structure. */ 226650cdb2aSRichard Henderson hppa_tlb_entry tlb[256]; 227650cdb2aSRichard Henderson uint32_t tlb_last; 22861766fe9SRichard Henderson }; 22961766fe9SRichard Henderson 23061766fe9SRichard Henderson /** 23161766fe9SRichard Henderson * HPPACPU: 23261766fe9SRichard Henderson * @env: #CPUHPPAState 23361766fe9SRichard Henderson * 23461766fe9SRichard Henderson * An HPPA CPU. 23561766fe9SRichard Henderson */ 23661766fe9SRichard Henderson struct HPPACPU { 23761766fe9SRichard Henderson /*< private >*/ 23861766fe9SRichard Henderson CPUState parent_obj; 23961766fe9SRichard Henderson /*< public >*/ 24061766fe9SRichard Henderson 24161766fe9SRichard Henderson CPUHPPAState env; 24249c29d6cSRichard Henderson QEMUTimer *alarm_timer; 24361766fe9SRichard Henderson }; 24461766fe9SRichard Henderson 24561766fe9SRichard Henderson static inline HPPACPU *hppa_env_get_cpu(CPUHPPAState *env) 24661766fe9SRichard Henderson { 24761766fe9SRichard Henderson return container_of(env, HPPACPU, env); 24861766fe9SRichard Henderson } 24961766fe9SRichard Henderson 25061766fe9SRichard Henderson #define ENV_GET_CPU(e) CPU(hppa_env_get_cpu(e)) 25161766fe9SRichard Henderson #define ENV_OFFSET offsetof(HPPACPU, env) 25261766fe9SRichard Henderson 25361766fe9SRichard Henderson #include "exec/cpu-all.h" 25461766fe9SRichard Henderson 25561766fe9SRichard Henderson static inline int cpu_mmu_index(CPUHPPAState *env, bool ifetch) 25661766fe9SRichard Henderson { 2573d68ee7bSRichard Henderson #ifdef CONFIG_USER_ONLY 2583d68ee7bSRichard Henderson return MMU_USER_IDX; 2593d68ee7bSRichard Henderson #else 2603d68ee7bSRichard Henderson if (env->psw & (ifetch ? PSW_C : PSW_D)) { 2613d68ee7bSRichard Henderson return env->iaoq_f & 3; 2623d68ee7bSRichard Henderson } 2633d68ee7bSRichard Henderson return MMU_PHYS_IDX; /* mmu disabled */ 2643d68ee7bSRichard Henderson #endif 26561766fe9SRichard Henderson } 26661766fe9SRichard Henderson 26761766fe9SRichard Henderson void hppa_translate_init(void); 26861766fe9SRichard Henderson 2698fc24ad5SIgor Mammedov #define cpu_init(cpu_model) cpu_generic_init(TYPE_HPPA_CPU, cpu_model) 270*0dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_HPPA_CPU 27161766fe9SRichard Henderson 27261766fe9SRichard Henderson void hppa_cpu_list(FILE *f, fprintf_function cpu_fprintf); 27361766fe9SRichard Henderson 274c301f34eSRichard Henderson static inline target_ulong hppa_form_gva_psw(target_ureg psw, uint64_t spc, 275c301f34eSRichard Henderson target_ureg off) 276c301f34eSRichard Henderson { 277c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY 278c301f34eSRichard Henderson return off; 279c301f34eSRichard Henderson #else 280c301f34eSRichard Henderson off &= (psw & PSW_W ? 0x3fffffffffffffffull : 0xffffffffull); 281c301f34eSRichard Henderson return spc | off; 282c301f34eSRichard Henderson #endif 283c301f34eSRichard Henderson } 284c301f34eSRichard Henderson 285c301f34eSRichard Henderson static inline target_ulong hppa_form_gva(CPUHPPAState *env, uint64_t spc, 286c301f34eSRichard Henderson target_ureg off) 287c301f34eSRichard Henderson { 288c301f34eSRichard Henderson return hppa_form_gva_psw(env->psw, spc, off); 289c301f34eSRichard Henderson } 290c301f34eSRichard Henderson 291494737b7SRichard Henderson /* Since PSW_{I,CB} will never need to be in tb->flags, reuse them. 292494737b7SRichard Henderson * TB_FLAG_SR_SAME indicates that SR4 through SR7 all contain the 293494737b7SRichard Henderson * same value. 294494737b7SRichard Henderson */ 295494737b7SRichard Henderson #define TB_FLAG_SR_SAME PSW_I 296c301f34eSRichard Henderson #define TB_FLAG_PRIV_SHIFT 8 297c301f34eSRichard Henderson 29861766fe9SRichard Henderson static inline void cpu_get_tb_cpu_state(CPUHPPAState *env, target_ulong *pc, 29961766fe9SRichard Henderson target_ulong *cs_base, 30061766fe9SRichard Henderson uint32_t *pflags) 30161766fe9SRichard Henderson { 302c301f34eSRichard Henderson uint32_t flags = env->psw_n * PSW_N; 303c301f34eSRichard Henderson 304c301f34eSRichard Henderson /* TB lookup assumes that PC contains the complete virtual address. 305c301f34eSRichard Henderson If we leave space+offset separate, we'll get ITLB misses to an 306c301f34eSRichard Henderson incomplete virtual address. This also means that we must separate 307c301f34eSRichard Henderson out current cpu priviledge from the low bits of IAOQ_F. */ 308c301f34eSRichard Henderson #ifdef CONFIG_USER_ONLY 30961766fe9SRichard Henderson *pc = env->iaoq_f; 31061766fe9SRichard Henderson *cs_base = env->iaoq_b; 311c301f34eSRichard Henderson #else 3123d68ee7bSRichard Henderson /* ??? E, T, H, L, B, P bits need to be here, when implemented. */ 313c301f34eSRichard Henderson flags |= env->psw & (PSW_W | PSW_C | PSW_D); 314c301f34eSRichard Henderson flags |= (env->iaoq_f & 3) << TB_FLAG_PRIV_SHIFT; 315c301f34eSRichard Henderson 316c301f34eSRichard Henderson *pc = (env->psw & PSW_C 317c301f34eSRichard Henderson ? hppa_form_gva_psw(env->psw, env->iasq_f, env->iaoq_f & -4) 318c301f34eSRichard Henderson : env->iaoq_f & -4); 319c301f34eSRichard Henderson *cs_base = env->iasq_f; 320c301f34eSRichard Henderson 321c301f34eSRichard Henderson /* Insert a difference between IAOQ_B and IAOQ_F within the otherwise zero 322c301f34eSRichard Henderson low 32-bits of CS_BASE. This will succeed for all direct branches, 323c301f34eSRichard Henderson which is the primary case we care about -- using goto_tb within a page. 324c301f34eSRichard Henderson Failure is indicated by a zero difference. */ 325c301f34eSRichard Henderson if (env->iasq_f == env->iasq_b) { 326c301f34eSRichard Henderson target_sreg diff = env->iaoq_b - env->iaoq_f; 327c301f34eSRichard Henderson if (TARGET_REGISTER_BITS == 32 || diff == (int32_t)diff) { 328c301f34eSRichard Henderson *cs_base |= (uint32_t)diff; 329c301f34eSRichard Henderson } 330c301f34eSRichard Henderson } 331494737b7SRichard Henderson if ((env->sr[4] == env->sr[5]) 332494737b7SRichard Henderson & (env->sr[4] == env->sr[6]) 333494737b7SRichard Henderson & (env->sr[4] == env->sr[7])) { 334494737b7SRichard Henderson flags |= TB_FLAG_SR_SAME; 335494737b7SRichard Henderson } 336c301f34eSRichard Henderson #endif 337c301f34eSRichard Henderson 338c301f34eSRichard Henderson *pflags = flags; 33961766fe9SRichard Henderson } 34061766fe9SRichard Henderson 341eaa3783bSRichard Henderson target_ureg cpu_hppa_get_psw(CPUHPPAState *env); 342eaa3783bSRichard Henderson void cpu_hppa_put_psw(CPUHPPAState *env, target_ureg); 34361766fe9SRichard Henderson void cpu_hppa_loaded_fr0(CPUHPPAState *env); 34461766fe9SRichard Henderson 34561766fe9SRichard Henderson #define cpu_signal_handler cpu_hppa_signal_handler 34661766fe9SRichard Henderson 34761766fe9SRichard Henderson int cpu_hppa_signal_handler(int host_signum, void *pinfo, void *puc); 348813dff13SHelge Deller hwaddr hppa_cpu_get_phys_page_debug(CPUState *cs, vaddr addr); 34961766fe9SRichard Henderson int hppa_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); 35061766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); 35161766fe9SRichard Henderson void hppa_cpu_do_interrupt(CPUState *cpu); 35261766fe9SRichard Henderson bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req); 35361766fe9SRichard Henderson void hppa_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function, int); 354650cdb2aSRichard Henderson #ifdef CONFIG_USER_ONLY 355650cdb2aSRichard Henderson int hppa_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int size, 356650cdb2aSRichard Henderson int rw, int midx); 357650cdb2aSRichard Henderson #else 358650cdb2aSRichard Henderson int hppa_get_physical_address(CPUHPPAState *env, vaddr addr, int mmu_idx, 359650cdb2aSRichard Henderson int type, hwaddr *pphys, int *pprot); 3604f5f2548SRichard Henderson extern const MemoryRegionOps hppa_io_eir_ops; 361c643603aSRichard Henderson extern const struct VMStateDescription vmstate_hppa_cpu; 36249c29d6cSRichard Henderson void hppa_cpu_alarm_timer(void *); 36343e05652SRichard Henderson int hppa_artype_for_page(CPUHPPAState *env, target_ulong vaddr); 364650cdb2aSRichard Henderson #endif 3652dfcca9fSRichard Henderson void QEMU_NORETURN hppa_dynamic_excp(CPUHPPAState *env, int excp, uintptr_t ra); 36661766fe9SRichard Henderson 36761766fe9SRichard Henderson #endif /* HPPA_CPU_H */ 368