xref: /qemu/target/hppa/cpu.h (revision 61766fe9e2d37ac4928119eabfe2250bd8f43b11)
1*61766fe9SRichard Henderson /*
2*61766fe9SRichard Henderson  * PA-RISC emulation cpu definitions for qemu.
3*61766fe9SRichard Henderson  *
4*61766fe9SRichard Henderson  * Copyright (c) 2016 Richard Henderson <rth@twiddle.net>
5*61766fe9SRichard Henderson  *
6*61766fe9SRichard Henderson  * This library is free software; you can redistribute it and/or
7*61766fe9SRichard Henderson  * modify it under the terms of the GNU Lesser General Public
8*61766fe9SRichard Henderson  * License as published by the Free Software Foundation; either
9*61766fe9SRichard Henderson  * version 2 of the License, or (at your option) any later version.
10*61766fe9SRichard Henderson  *
11*61766fe9SRichard Henderson  * This library is distributed in the hope that it will be useful,
12*61766fe9SRichard Henderson  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*61766fe9SRichard Henderson  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*61766fe9SRichard Henderson  * Lesser General Public License for more details.
15*61766fe9SRichard Henderson  *
16*61766fe9SRichard Henderson  * You should have received a copy of the GNU Lesser General Public
17*61766fe9SRichard Henderson  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*61766fe9SRichard Henderson  */
19*61766fe9SRichard Henderson 
20*61766fe9SRichard Henderson #ifndef HPPA_CPU_H
21*61766fe9SRichard Henderson #define HPPA_CPU_H
22*61766fe9SRichard Henderson 
23*61766fe9SRichard Henderson #include "qemu-common.h"
24*61766fe9SRichard Henderson #include "cpu-qom.h"
25*61766fe9SRichard Henderson 
26*61766fe9SRichard Henderson /* We only support hppa-linux-user at present, so 32-bit only.  */
27*61766fe9SRichard Henderson #define TARGET_LONG_BITS 32
28*61766fe9SRichard Henderson #define TARGET_PHYS_ADDR_SPACE_BITS  32
29*61766fe9SRichard Henderson #define TARGET_VIRT_ADDR_SPACE_BITS  32
30*61766fe9SRichard Henderson 
31*61766fe9SRichard Henderson #define CPUArchState struct CPUHPPAState
32*61766fe9SRichard Henderson 
33*61766fe9SRichard Henderson #include "exec/cpu-defs.h"
34*61766fe9SRichard Henderson #include "fpu/softfloat.h"
35*61766fe9SRichard Henderson 
36*61766fe9SRichard Henderson #define TARGET_PAGE_BITS 12
37*61766fe9SRichard Henderson 
38*61766fe9SRichard Henderson #define ALIGNED_ONLY
39*61766fe9SRichard Henderson #define NB_MMU_MODES     1
40*61766fe9SRichard Henderson #define MMU_USER_IDX     0
41*61766fe9SRichard Henderson #define TARGET_INSN_START_EXTRA_WORDS 1
42*61766fe9SRichard Henderson 
43*61766fe9SRichard Henderson #define EXCP_SYSCALL     1
44*61766fe9SRichard Henderson #define EXCP_SYSCALL_LWS 2
45*61766fe9SRichard Henderson #define EXCP_SIGSEGV     3
46*61766fe9SRichard Henderson #define EXCP_SIGILL      4
47*61766fe9SRichard Henderson #define EXCP_SIGFPE      5
48*61766fe9SRichard Henderson 
49*61766fe9SRichard Henderson typedef struct CPUHPPAState CPUHPPAState;
50*61766fe9SRichard Henderson 
51*61766fe9SRichard Henderson struct CPUHPPAState {
52*61766fe9SRichard Henderson     target_ulong gr[32];
53*61766fe9SRichard Henderson     uint64_t fr[32];
54*61766fe9SRichard Henderson 
55*61766fe9SRichard Henderson     target_ulong sar;
56*61766fe9SRichard Henderson     target_ulong cr26;
57*61766fe9SRichard Henderson     target_ulong cr27;
58*61766fe9SRichard Henderson 
59*61766fe9SRichard Henderson     target_ulong psw_n;      /* boolean */
60*61766fe9SRichard Henderson     target_long  psw_v;      /* in most significant bit */
61*61766fe9SRichard Henderson 
62*61766fe9SRichard Henderson     /* Splitting the carry-borrow field into the MSB and "the rest", allows
63*61766fe9SRichard Henderson      * for "the rest" to be deleted when it is unused, but the MSB is in use.
64*61766fe9SRichard Henderson      * In addition, it's easier to compute carry-in for bit B+1 than it is to
65*61766fe9SRichard Henderson      * compute carry-out for bit B (3 vs 4 insns for addition, assuming the
66*61766fe9SRichard Henderson      * host has the appropriate add-with-carry insn to compute the msb).
67*61766fe9SRichard Henderson      * Therefore the carry bits are stored as: cb_msb : cb & 0x11111110.
68*61766fe9SRichard Henderson      */
69*61766fe9SRichard Henderson     target_ulong psw_cb;     /* in least significant bit of next nibble */
70*61766fe9SRichard Henderson     target_ulong psw_cb_msb; /* boolean */
71*61766fe9SRichard Henderson 
72*61766fe9SRichard Henderson     target_ulong iaoq_f;     /* front */
73*61766fe9SRichard Henderson     target_ulong iaoq_b;     /* back, aka next instruction */
74*61766fe9SRichard Henderson 
75*61766fe9SRichard Henderson     target_ulong ior;        /* interrupt offset register */
76*61766fe9SRichard Henderson 
77*61766fe9SRichard Henderson     uint32_t fr0_shadow;     /* flags, c, ca/cq, rm, d, enables */
78*61766fe9SRichard Henderson     float_status fp_status;
79*61766fe9SRichard Henderson 
80*61766fe9SRichard Henderson     /* Those resources are used only in QEMU core */
81*61766fe9SRichard Henderson     CPU_COMMON
82*61766fe9SRichard Henderson };
83*61766fe9SRichard Henderson 
84*61766fe9SRichard Henderson /**
85*61766fe9SRichard Henderson  * HPPACPU:
86*61766fe9SRichard Henderson  * @env: #CPUHPPAState
87*61766fe9SRichard Henderson  *
88*61766fe9SRichard Henderson  * An HPPA CPU.
89*61766fe9SRichard Henderson  */
90*61766fe9SRichard Henderson struct HPPACPU {
91*61766fe9SRichard Henderson     /*< private >*/
92*61766fe9SRichard Henderson     CPUState parent_obj;
93*61766fe9SRichard Henderson     /*< public >*/
94*61766fe9SRichard Henderson 
95*61766fe9SRichard Henderson     CPUHPPAState env;
96*61766fe9SRichard Henderson };
97*61766fe9SRichard Henderson 
98*61766fe9SRichard Henderson static inline HPPACPU *hppa_env_get_cpu(CPUHPPAState *env)
99*61766fe9SRichard Henderson {
100*61766fe9SRichard Henderson     return container_of(env, HPPACPU, env);
101*61766fe9SRichard Henderson }
102*61766fe9SRichard Henderson 
103*61766fe9SRichard Henderson #define ENV_GET_CPU(e)  CPU(hppa_env_get_cpu(e))
104*61766fe9SRichard Henderson #define ENV_OFFSET      offsetof(HPPACPU, env)
105*61766fe9SRichard Henderson 
106*61766fe9SRichard Henderson #include "exec/cpu-all.h"
107*61766fe9SRichard Henderson 
108*61766fe9SRichard Henderson static inline int cpu_mmu_index(CPUHPPAState *env, bool ifetch)
109*61766fe9SRichard Henderson {
110*61766fe9SRichard Henderson     return 0;
111*61766fe9SRichard Henderson }
112*61766fe9SRichard Henderson 
113*61766fe9SRichard Henderson void hppa_translate_init(void);
114*61766fe9SRichard Henderson 
115*61766fe9SRichard Henderson HPPACPU *cpu_hppa_init(const char *cpu_model);
116*61766fe9SRichard Henderson 
117*61766fe9SRichard Henderson #define cpu_init(cpu_model) CPU(cpu_hppa_init(cpu_model))
118*61766fe9SRichard Henderson 
119*61766fe9SRichard Henderson void hppa_cpu_list(FILE *f, fprintf_function cpu_fprintf);
120*61766fe9SRichard Henderson 
121*61766fe9SRichard Henderson static inline void cpu_get_tb_cpu_state(CPUHPPAState *env, target_ulong *pc,
122*61766fe9SRichard Henderson                                         target_ulong *cs_base,
123*61766fe9SRichard Henderson                                         uint32_t *pflags)
124*61766fe9SRichard Henderson {
125*61766fe9SRichard Henderson     *pc = env->iaoq_f;
126*61766fe9SRichard Henderson     *cs_base = env->iaoq_b;
127*61766fe9SRichard Henderson     *pflags = env->psw_n;
128*61766fe9SRichard Henderson }
129*61766fe9SRichard Henderson 
130*61766fe9SRichard Henderson target_ulong cpu_hppa_get_psw(CPUHPPAState *env);
131*61766fe9SRichard Henderson void cpu_hppa_put_psw(CPUHPPAState *env, target_ulong);
132*61766fe9SRichard Henderson void cpu_hppa_loaded_fr0(CPUHPPAState *env);
133*61766fe9SRichard Henderson 
134*61766fe9SRichard Henderson #define cpu_signal_handler cpu_hppa_signal_handler
135*61766fe9SRichard Henderson 
136*61766fe9SRichard Henderson int cpu_hppa_signal_handler(int host_signum, void *pinfo, void *puc);
137*61766fe9SRichard Henderson int hppa_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw, int midx);
138*61766fe9SRichard Henderson int hppa_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
139*61766fe9SRichard Henderson int hppa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
140*61766fe9SRichard Henderson void hppa_cpu_do_interrupt(CPUState *cpu);
141*61766fe9SRichard Henderson bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req);
142*61766fe9SRichard Henderson void hppa_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function, int);
143*61766fe9SRichard Henderson 
144*61766fe9SRichard Henderson #endif /* HPPA_CPU_H */
145