xref: /qemu/target/alpha/cpu.h (revision 0442428a8976b4f94e04d24b5db9eb1b678d82c4)
14c9649a9Sj_mayer /*
24c9649a9Sj_mayer  *  Alpha emulation cpu definitions for qemu.
34c9649a9Sj_mayer  *
44c9649a9Sj_mayer  *  Copyright (c) 2007 Jocelyn Mayer
54c9649a9Sj_mayer  *
64c9649a9Sj_mayer  * This library is free software; you can redistribute it and/or
74c9649a9Sj_mayer  * modify it under the terms of the GNU Lesser General Public
84c9649a9Sj_mayer  * License as published by the Free Software Foundation; either
94c9649a9Sj_mayer  * version 2 of the License, or (at your option) any later version.
104c9649a9Sj_mayer  *
114c9649a9Sj_mayer  * This library is distributed in the hope that it will be useful,
124c9649a9Sj_mayer  * but WITHOUT ANY WARRANTY; without even the implied warranty of
134c9649a9Sj_mayer  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
144c9649a9Sj_mayer  * Lesser General Public License for more details.
154c9649a9Sj_mayer  *
164c9649a9Sj_mayer  * You should have received a copy of the GNU Lesser General Public
178167ee88SBlue Swirl  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
184c9649a9Sj_mayer  */
194c9649a9Sj_mayer 
2007f5a258SMarkus Armbruster #ifndef ALPHA_CPU_H
2107f5a258SMarkus Armbruster #define ALPHA_CPU_H
224c9649a9Sj_mayer 
232c976297SStefan Weil #include "qemu-common.h"
241dc8e6b7SPaolo Bonzini #include "cpu-qom.h"
254c9649a9Sj_mayer 
264c9649a9Sj_mayer #define TARGET_LONG_BITS 64
27d94f0a8eSPaolo Bonzini #define ALIGNED_ONLY
284c9649a9Sj_mayer 
299349b4f9SAndreas Färber #define CPUArchState struct CPUAlphaState
30c2764719Spbrook 
315ee4f3c2SRichard Henderson /* Alpha processors have a weak memory model */
325ee4f3c2SRichard Henderson #define TCG_GUEST_DEFAULT_MO      (0)
335ee4f3c2SRichard Henderson 
34022c62cbSPaolo Bonzini #include "exec/cpu-defs.h"
354c9649a9Sj_mayer 
364c9649a9Sj_mayer #define ICACHE_LINE_SIZE 32
374c9649a9Sj_mayer #define DCACHE_LINE_SIZE 32
384c9649a9Sj_mayer 
39b09d9d46Saurel32 #define TARGET_PAGE_BITS 13
404c9649a9Sj_mayer 
4176393642SRichard Henderson #ifdef CONFIG_USER_ONLY
4276393642SRichard Henderson /* ??? The kernel likes to give addresses in high memory.  If the host has
4376393642SRichard Henderson    more virtual address space than the guest, this can lead to impossible
4476393642SRichard Henderson    allocations.  Honor the long-standing assumption that only kernel addrs
4576393642SRichard Henderson    are negative, but otherwise allow allocations anywhere.  This could lead
4676393642SRichard Henderson    to tricky emulation problems for programs doing tagged addressing, but
4776393642SRichard Henderson    that's far fewer than encounter the impossible allocation problem.  */
4876393642SRichard Henderson #define TARGET_PHYS_ADDR_SPACE_BITS  63
4976393642SRichard Henderson #define TARGET_VIRT_ADDR_SPACE_BITS  63
5076393642SRichard Henderson #else
5152705890SRichard Henderson /* ??? EV4 has 34 phys addr bits, EV5 has 40, EV6 has 44.  */
5252705890SRichard Henderson #define TARGET_PHYS_ADDR_SPACE_BITS  44
5352705890SRichard Henderson #define TARGET_VIRT_ADDR_SPACE_BITS  (30 + TARGET_PAGE_BITS)
5476393642SRichard Henderson #endif
554c9649a9Sj_mayer 
564c9649a9Sj_mayer /* Alpha major type */
574c9649a9Sj_mayer enum {
584c9649a9Sj_mayer     ALPHA_EV3  = 1,
594c9649a9Sj_mayer     ALPHA_EV4  = 2,
604c9649a9Sj_mayer     ALPHA_SIM  = 3,
614c9649a9Sj_mayer     ALPHA_LCA  = 4,
624c9649a9Sj_mayer     ALPHA_EV5  = 5, /* 21164 */
634c9649a9Sj_mayer     ALPHA_EV45 = 6, /* 21064A */
644c9649a9Sj_mayer     ALPHA_EV56 = 7, /* 21164A */
654c9649a9Sj_mayer };
664c9649a9Sj_mayer 
674c9649a9Sj_mayer /* EV4 minor type */
684c9649a9Sj_mayer enum {
694c9649a9Sj_mayer     ALPHA_EV4_2 = 0,
704c9649a9Sj_mayer     ALPHA_EV4_3 = 1,
714c9649a9Sj_mayer };
724c9649a9Sj_mayer 
734c9649a9Sj_mayer /* LCA minor type */
744c9649a9Sj_mayer enum {
754c9649a9Sj_mayer     ALPHA_LCA_1 = 1, /* 21066 */
764c9649a9Sj_mayer     ALPHA_LCA_2 = 2, /* 20166 */
774c9649a9Sj_mayer     ALPHA_LCA_3 = 3, /* 21068 */
784c9649a9Sj_mayer     ALPHA_LCA_4 = 4, /* 21068 */
794c9649a9Sj_mayer     ALPHA_LCA_5 = 5, /* 21066A */
804c9649a9Sj_mayer     ALPHA_LCA_6 = 6, /* 21068A */
814c9649a9Sj_mayer };
824c9649a9Sj_mayer 
834c9649a9Sj_mayer /* EV5 minor type */
844c9649a9Sj_mayer enum {
854c9649a9Sj_mayer     ALPHA_EV5_1 = 1, /* Rev BA, CA */
864c9649a9Sj_mayer     ALPHA_EV5_2 = 2, /* Rev DA, EA */
874c9649a9Sj_mayer     ALPHA_EV5_3 = 3, /* Pass 3 */
884c9649a9Sj_mayer     ALPHA_EV5_4 = 4, /* Pass 3.2 */
894c9649a9Sj_mayer     ALPHA_EV5_5 = 5, /* Pass 4 */
904c9649a9Sj_mayer };
914c9649a9Sj_mayer 
924c9649a9Sj_mayer /* EV45 minor type */
934c9649a9Sj_mayer enum {
944c9649a9Sj_mayer     ALPHA_EV45_1 = 1, /* Pass 1 */
954c9649a9Sj_mayer     ALPHA_EV45_2 = 2, /* Pass 1.1 */
964c9649a9Sj_mayer     ALPHA_EV45_3 = 3, /* Pass 2 */
974c9649a9Sj_mayer };
984c9649a9Sj_mayer 
994c9649a9Sj_mayer /* EV56 minor type */
1004c9649a9Sj_mayer enum {
1014c9649a9Sj_mayer     ALPHA_EV56_1 = 1, /* Pass 1 */
1024c9649a9Sj_mayer     ALPHA_EV56_2 = 2, /* Pass 2 */
1034c9649a9Sj_mayer };
1044c9649a9Sj_mayer 
1054c9649a9Sj_mayer enum {
1064c9649a9Sj_mayer     IMPLVER_2106x = 0, /* EV4, EV45 & LCA45 */
1074c9649a9Sj_mayer     IMPLVER_21164 = 1, /* EV5, EV56 & PCA45 */
1084c9649a9Sj_mayer     IMPLVER_21264 = 2, /* EV6, EV67 & EV68x */
1094c9649a9Sj_mayer     IMPLVER_21364 = 3, /* EV7 & EV79 */
1104c9649a9Sj_mayer };
1114c9649a9Sj_mayer 
1124c9649a9Sj_mayer enum {
1134c9649a9Sj_mayer     AMASK_BWX      = 0x00000001,
1144c9649a9Sj_mayer     AMASK_FIX      = 0x00000002,
1154c9649a9Sj_mayer     AMASK_CIX      = 0x00000004,
1164c9649a9Sj_mayer     AMASK_MVI      = 0x00000100,
1174c9649a9Sj_mayer     AMASK_TRAP     = 0x00000200,
1184c9649a9Sj_mayer     AMASK_PREFETCH = 0x00001000,
1194c9649a9Sj_mayer };
1204c9649a9Sj_mayer 
1214c9649a9Sj_mayer enum {
1224c9649a9Sj_mayer     VAX_ROUND_NORMAL = 0,
1234c9649a9Sj_mayer     VAX_ROUND_CHOPPED,
1244c9649a9Sj_mayer };
1254c9649a9Sj_mayer 
1264c9649a9Sj_mayer enum {
1274c9649a9Sj_mayer     IEEE_ROUND_NORMAL = 0,
1284c9649a9Sj_mayer     IEEE_ROUND_DYNAMIC,
1294c9649a9Sj_mayer     IEEE_ROUND_PLUS,
1304c9649a9Sj_mayer     IEEE_ROUND_MINUS,
1314c9649a9Sj_mayer     IEEE_ROUND_CHOPPED,
1324c9649a9Sj_mayer };
1334c9649a9Sj_mayer 
1344c9649a9Sj_mayer /* IEEE floating-point operations encoding */
1354c9649a9Sj_mayer /* Trap mode */
1364c9649a9Sj_mayer enum {
1374c9649a9Sj_mayer     FP_TRAP_I   = 0x0,
1384c9649a9Sj_mayer     FP_TRAP_U   = 0x1,
1394c9649a9Sj_mayer     FP_TRAP_S  = 0x4,
1404c9649a9Sj_mayer     FP_TRAP_SU  = 0x5,
1414c9649a9Sj_mayer     FP_TRAP_SUI = 0x7,
1424c9649a9Sj_mayer };
1434c9649a9Sj_mayer 
1444c9649a9Sj_mayer /* Rounding mode */
1454c9649a9Sj_mayer enum {
1464c9649a9Sj_mayer     FP_ROUND_CHOPPED = 0x0,
1474c9649a9Sj_mayer     FP_ROUND_MINUS   = 0x1,
1484c9649a9Sj_mayer     FP_ROUND_NORMAL  = 0x2,
1494c9649a9Sj_mayer     FP_ROUND_DYNAMIC = 0x3,
1504c9649a9Sj_mayer };
1514c9649a9Sj_mayer 
152f3d3aad4SRichard Henderson /* FPCR bits -- right-shifted 32 so we can use a uint32_t.  */
153f3d3aad4SRichard Henderson #define FPCR_SUM                (1U << (63 - 32))
154f3d3aad4SRichard Henderson #define FPCR_INED               (1U << (62 - 32))
155f3d3aad4SRichard Henderson #define FPCR_UNFD               (1U << (61 - 32))
156f3d3aad4SRichard Henderson #define FPCR_UNDZ               (1U << (60 - 32))
157f3d3aad4SRichard Henderson #define FPCR_DYN_SHIFT          (58 - 32)
158f3d3aad4SRichard Henderson #define FPCR_DYN_CHOPPED        (0U << FPCR_DYN_SHIFT)
159f3d3aad4SRichard Henderson #define FPCR_DYN_MINUS          (1U << FPCR_DYN_SHIFT)
160f3d3aad4SRichard Henderson #define FPCR_DYN_NORMAL         (2U << FPCR_DYN_SHIFT)
161f3d3aad4SRichard Henderson #define FPCR_DYN_PLUS           (3U << FPCR_DYN_SHIFT)
162f3d3aad4SRichard Henderson #define FPCR_DYN_MASK           (3U << FPCR_DYN_SHIFT)
163f3d3aad4SRichard Henderson #define FPCR_IOV                (1U << (57 - 32))
164f3d3aad4SRichard Henderson #define FPCR_INE                (1U << (56 - 32))
165f3d3aad4SRichard Henderson #define FPCR_UNF                (1U << (55 - 32))
166f3d3aad4SRichard Henderson #define FPCR_OVF                (1U << (54 - 32))
167f3d3aad4SRichard Henderson #define FPCR_DZE                (1U << (53 - 32))
168f3d3aad4SRichard Henderson #define FPCR_INV                (1U << (52 - 32))
169f3d3aad4SRichard Henderson #define FPCR_OVFD               (1U << (51 - 32))
170f3d3aad4SRichard Henderson #define FPCR_DZED               (1U << (50 - 32))
171f3d3aad4SRichard Henderson #define FPCR_INVD               (1U << (49 - 32))
172f3d3aad4SRichard Henderson #define FPCR_DNZ                (1U << (48 - 32))
173f3d3aad4SRichard Henderson #define FPCR_DNOD               (1U << (47 - 32))
174ba0e276dSRichard Henderson #define FPCR_STATUS_MASK        (FPCR_IOV | FPCR_INE | FPCR_UNF \
175ba0e276dSRichard Henderson                                  | FPCR_OVF | FPCR_DZE | FPCR_INV)
176ba0e276dSRichard Henderson 
177ba0e276dSRichard Henderson /* The silly software trap enables implemented by the kernel emulation.
178ba0e276dSRichard Henderson    These are more or less architecturally required, since the real hardware
179ba0e276dSRichard Henderson    has read-as-zero bits in the FPCR when the features aren't implemented.
180ba0e276dSRichard Henderson    For the purposes of QEMU, we pretend the FPCR can hold everything.  */
181f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_INV    (1U << 1)
182f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_DZE    (1U << 2)
183f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_OVF    (1U << 3)
184f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_UNF    (1U << 4)
185f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_INE    (1U << 5)
186f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_DNO    (1U << 6)
187f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_MASK   ((1U << 7) - (1U << 1))
188ba0e276dSRichard Henderson 
189f3d3aad4SRichard Henderson #define SWCR_MAP_DMZ            (1U << 12)
190f3d3aad4SRichard Henderson #define SWCR_MAP_UMZ            (1U << 13)
191ba0e276dSRichard Henderson #define SWCR_MAP_MASK           (SWCR_MAP_DMZ | SWCR_MAP_UMZ)
192ba0e276dSRichard Henderson 
193f3d3aad4SRichard Henderson #define SWCR_STATUS_INV         (1U << 17)
194f3d3aad4SRichard Henderson #define SWCR_STATUS_DZE         (1U << 18)
195f3d3aad4SRichard Henderson #define SWCR_STATUS_OVF         (1U << 19)
196f3d3aad4SRichard Henderson #define SWCR_STATUS_UNF         (1U << 20)
197f3d3aad4SRichard Henderson #define SWCR_STATUS_INE         (1U << 21)
198f3d3aad4SRichard Henderson #define SWCR_STATUS_DNO         (1U << 22)
199f3d3aad4SRichard Henderson #define SWCR_STATUS_MASK        ((1U << 23) - (1U << 17))
200ba0e276dSRichard Henderson 
201ba0e276dSRichard Henderson #define SWCR_MASK  (SWCR_TRAP_ENABLE_MASK | SWCR_MAP_MASK | SWCR_STATUS_MASK)
202ba0e276dSRichard Henderson 
2038417845eSRichard Henderson /* MMU modes definitions */
2044c9649a9Sj_mayer 
2056a73ecf5SRichard Henderson /* Alpha has 5 MMU modes: PALcode, Kernel, Executive, Supervisor, and User.
2068417845eSRichard Henderson    The Unix PALcode only exposes the kernel and user modes; presumably
2078417845eSRichard Henderson    executive and supervisor are used by VMS.
2088417845eSRichard Henderson 
2098417845eSRichard Henderson    PALcode itself uses physical mode for code and kernel mode for data;
2108417845eSRichard Henderson    there are PALmode instructions that can access data via physical mode
2118417845eSRichard Henderson    or via an os-installed "alternate mode", which is one of the 4 above.
2128417845eSRichard Henderson 
2136a73ecf5SRichard Henderson    That said, we're only emulating Unix PALcode, and not attempting VMS,
2146a73ecf5SRichard Henderson    so we don't need to implement Executive and Supervisor.  QEMU's own
2156a73ecf5SRichard Henderson    PALcode cheats and usees the KSEG mapping for its code+data rather than
2166a73ecf5SRichard Henderson    physical addresses.  */
2178417845eSRichard Henderson 
2186a73ecf5SRichard Henderson #define NB_MMU_MODES 3
2198417845eSRichard Henderson 
2208417845eSRichard Henderson #define MMU_MODE0_SUFFIX _kernel
2218417845eSRichard Henderson #define MMU_MODE1_SUFFIX _user
2228417845eSRichard Henderson #define MMU_KERNEL_IDX   0
2238417845eSRichard Henderson #define MMU_USER_IDX     1
2246a73ecf5SRichard Henderson #define MMU_PHYS_IDX     2
2258417845eSRichard Henderson 
2268417845eSRichard Henderson typedef struct CPUAlphaState CPUAlphaState;
2276ebbf390Sj_mayer 
2284c9649a9Sj_mayer struct CPUAlphaState {
2294c9649a9Sj_mayer     uint64_t ir[31];
2304c9649a9Sj_mayer     float64 fir[31];
2314c9649a9Sj_mayer     uint64_t pc;
2324c9649a9Sj_mayer     uint64_t unique;
2336910b8f6SRichard Henderson     uint64_t lock_addr;
2346910b8f6SRichard Henderson     uint64_t lock_value;
235f3d3aad4SRichard Henderson 
236f3d3aad4SRichard Henderson     /* The FPCR, and disassembled portions thereof.  */
237f3d3aad4SRichard Henderson     uint32_t fpcr;
238f3d3aad4SRichard Henderson     uint32_t fpcr_exc_enable;
2398443effbSRichard Henderson     float_status fp_status;
2408443effbSRichard Henderson     uint8_t fpcr_dyn_round;
2418443effbSRichard Henderson     uint8_t fpcr_flush_to_zero;
2428443effbSRichard Henderson 
243bcd2625dSRichard Henderson     /* Mask of PALmode, Processor State et al.  Most of this gets copied
244bcd2625dSRichard Henderson        into the TranslatorBlock flags and controls code generation.  */
245bcd2625dSRichard Henderson     uint32_t flags;
24626b46094SRichard Henderson 
247bcd2625dSRichard Henderson     /* The high 32-bits of the processor cycle counter.  */
24826b46094SRichard Henderson     uint32_t pcc_ofs;
249129d8aa5SRichard Henderson 
250129d8aa5SRichard Henderson     /* These pass data from the exception logic in the translator and
251129d8aa5SRichard Henderson        helpers to the OS entry point.  This is used for both system
252129d8aa5SRichard Henderson        emulation and user-mode.  */
253129d8aa5SRichard Henderson     uint64_t trap_arg0;
254129d8aa5SRichard Henderson     uint64_t trap_arg1;
255129d8aa5SRichard Henderson     uint64_t trap_arg2;
2564c9649a9Sj_mayer 
25726b46094SRichard Henderson #if !defined(CONFIG_USER_ONLY)
25826b46094SRichard Henderson     /* The internal data required by our emulation of the Unix PALcode.  */
25926b46094SRichard Henderson     uint64_t exc_addr;
26026b46094SRichard Henderson     uint64_t palbr;
26126b46094SRichard Henderson     uint64_t ptbr;
26226b46094SRichard Henderson     uint64_t vptptr;
26326b46094SRichard Henderson     uint64_t sysval;
26426b46094SRichard Henderson     uint64_t usp;
26526b46094SRichard Henderson     uint64_t shadow[8];
26626b46094SRichard Henderson     uint64_t scratch[24];
26726b46094SRichard Henderson #endif
26826b46094SRichard Henderson 
269c781cf96SRichard Henderson     /* This alarm doesn't exist in real hardware; we wish it did.  */
270c781cf96SRichard Henderson     uint64_t alarm_expire;
271c781cf96SRichard Henderson 
2725cbdb3a3SStefan Weil     /* Those resources are used only in QEMU core */
2734c9649a9Sj_mayer     CPU_COMMON
2744c9649a9Sj_mayer 
2754c9649a9Sj_mayer     int error_code;
2764c9649a9Sj_mayer 
2774c9649a9Sj_mayer     uint32_t features;
2784c9649a9Sj_mayer     uint32_t amask;
2794c9649a9Sj_mayer     int implver;
2804c9649a9Sj_mayer };
2814c9649a9Sj_mayer 
2821dc8e6b7SPaolo Bonzini /**
2831dc8e6b7SPaolo Bonzini  * AlphaCPU:
2841dc8e6b7SPaolo Bonzini  * @env: #CPUAlphaState
2851dc8e6b7SPaolo Bonzini  *
2861dc8e6b7SPaolo Bonzini  * An Alpha CPU.
2871dc8e6b7SPaolo Bonzini  */
2881dc8e6b7SPaolo Bonzini struct AlphaCPU {
2891dc8e6b7SPaolo Bonzini     /*< private >*/
2901dc8e6b7SPaolo Bonzini     CPUState parent_obj;
2911dc8e6b7SPaolo Bonzini     /*< public >*/
2921dc8e6b7SPaolo Bonzini 
2931dc8e6b7SPaolo Bonzini     CPUAlphaState env;
2941dc8e6b7SPaolo Bonzini 
2951dc8e6b7SPaolo Bonzini     /* This alarm doesn't exist in real hardware; we wish it did.  */
2961dc8e6b7SPaolo Bonzini     QEMUTimer *alarm_timer;
2971dc8e6b7SPaolo Bonzini };
2981dc8e6b7SPaolo Bonzini 
2991dc8e6b7SPaolo Bonzini static inline AlphaCPU *alpha_env_get_cpu(CPUAlphaState *env)
3001dc8e6b7SPaolo Bonzini {
3011dc8e6b7SPaolo Bonzini     return container_of(env, AlphaCPU, env);
3021dc8e6b7SPaolo Bonzini }
3031dc8e6b7SPaolo Bonzini 
3041dc8e6b7SPaolo Bonzini #define ENV_GET_CPU(e) CPU(alpha_env_get_cpu(e))
3051dc8e6b7SPaolo Bonzini 
3061dc8e6b7SPaolo Bonzini #define ENV_OFFSET offsetof(AlphaCPU, env)
3071dc8e6b7SPaolo Bonzini 
3081dc8e6b7SPaolo Bonzini #ifndef CONFIG_USER_ONLY
3091dc8e6b7SPaolo Bonzini extern const struct VMStateDescription vmstate_alpha_cpu;
3101dc8e6b7SPaolo Bonzini #endif
3111dc8e6b7SPaolo Bonzini 
3121dc8e6b7SPaolo Bonzini void alpha_cpu_do_interrupt(CPUState *cpu);
3131dc8e6b7SPaolo Bonzini bool alpha_cpu_exec_interrupt(CPUState *cpu, int int_req);
3141dc8e6b7SPaolo Bonzini void alpha_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
3151dc8e6b7SPaolo Bonzini                           int flags);
3161dc8e6b7SPaolo Bonzini hwaddr alpha_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
3171dc8e6b7SPaolo Bonzini int alpha_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
3181dc8e6b7SPaolo Bonzini int alpha_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
3191dc8e6b7SPaolo Bonzini void alpha_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
320b35399bbSSergey Sorokin                                    MMUAccessType access_type,
321b35399bbSSergey Sorokin                                    int mmu_idx, uintptr_t retaddr);
3221dc8e6b7SPaolo Bonzini 
323494342b3SAndreas Färber #define cpu_list alpha_cpu_list
3249467d44cSths #define cpu_signal_handler cpu_alpha_signal_handler
3259467d44cSths 
326022c62cbSPaolo Bonzini #include "exec/cpu-all.h"
3274c9649a9Sj_mayer 
3284c9649a9Sj_mayer enum {
3294c9649a9Sj_mayer     FEATURE_ASN    = 0x00000001,
3304c9649a9Sj_mayer     FEATURE_SPS    = 0x00000002,
3314c9649a9Sj_mayer     FEATURE_VIRBND = 0x00000004,
3324c9649a9Sj_mayer     FEATURE_TBCHK  = 0x00000008,
3334c9649a9Sj_mayer };
3344c9649a9Sj_mayer 
3354c9649a9Sj_mayer enum {
33607b6c13bSRichard Henderson     EXCP_RESET,
33707b6c13bSRichard Henderson     EXCP_MCHK,
33807b6c13bSRichard Henderson     EXCP_SMP_INTERRUPT,
33907b6c13bSRichard Henderson     EXCP_CLK_INTERRUPT,
34007b6c13bSRichard Henderson     EXCP_DEV_INTERRUPT,
34107b6c13bSRichard Henderson     EXCP_MMFAULT,
34207b6c13bSRichard Henderson     EXCP_UNALIGN,
34307b6c13bSRichard Henderson     EXCP_OPCDEC,
34407b6c13bSRichard Henderson     EXCP_ARITH,
34507b6c13bSRichard Henderson     EXCP_FEN,
34607b6c13bSRichard Henderson     EXCP_CALL_PAL,
3474c9649a9Sj_mayer };
3484c9649a9Sj_mayer 
3496a80e088SRichard Henderson /* Alpha-specific interrupt pending bits.  */
3506a80e088SRichard Henderson #define CPU_INTERRUPT_TIMER	CPU_INTERRUPT_TGT_EXT_0
3516a80e088SRichard Henderson #define CPU_INTERRUPT_SMP	CPU_INTERRUPT_TGT_EXT_1
3526a80e088SRichard Henderson #define CPU_INTERRUPT_MCHK	CPU_INTERRUPT_TGT_EXT_2
3536a80e088SRichard Henderson 
354a3b9af16SRichard Henderson /* OSF/1 Page table bits.  */
355a3b9af16SRichard Henderson enum {
356a3b9af16SRichard Henderson     PTE_VALID = 0x0001,
357a3b9af16SRichard Henderson     PTE_FOR   = 0x0002,  /* used for page protection (fault on read) */
358a3b9af16SRichard Henderson     PTE_FOW   = 0x0004,  /* used for page protection (fault on write) */
359a3b9af16SRichard Henderson     PTE_FOE   = 0x0008,  /* used for page protection (fault on exec) */
360a3b9af16SRichard Henderson     PTE_ASM   = 0x0010,
361a3b9af16SRichard Henderson     PTE_KRE   = 0x0100,
362a3b9af16SRichard Henderson     PTE_URE   = 0x0200,
363a3b9af16SRichard Henderson     PTE_KWE   = 0x1000,
364a3b9af16SRichard Henderson     PTE_UWE   = 0x2000
365a3b9af16SRichard Henderson };
366a3b9af16SRichard Henderson 
367ea879fc7SRichard Henderson /* Hardware interrupt (entInt) constants.  */
368ea879fc7SRichard Henderson enum {
369ea879fc7SRichard Henderson     INT_K_IP,
370ea879fc7SRichard Henderson     INT_K_CLK,
371ea879fc7SRichard Henderson     INT_K_MCHK,
372ea879fc7SRichard Henderson     INT_K_DEV,
373ea879fc7SRichard Henderson     INT_K_PERF,
374ea879fc7SRichard Henderson };
375ea879fc7SRichard Henderson 
376ea879fc7SRichard Henderson /* Memory management (entMM) constants.  */
377ea879fc7SRichard Henderson enum {
378ea879fc7SRichard Henderson     MM_K_TNV,
379ea879fc7SRichard Henderson     MM_K_ACV,
380ea879fc7SRichard Henderson     MM_K_FOR,
381ea879fc7SRichard Henderson     MM_K_FOE,
382ea879fc7SRichard Henderson     MM_K_FOW
383ea879fc7SRichard Henderson };
384ea879fc7SRichard Henderson 
385ea879fc7SRichard Henderson /* Arithmetic exception (entArith) constants.  */
386ea879fc7SRichard Henderson enum {
387ea879fc7SRichard Henderson     EXC_M_SWC = 1,      /* Software completion */
388ea879fc7SRichard Henderson     EXC_M_INV = 2,      /* Invalid operation */
389ea879fc7SRichard Henderson     EXC_M_DZE = 4,      /* Division by zero */
390ea879fc7SRichard Henderson     EXC_M_FOV = 8,      /* Overflow */
391ea879fc7SRichard Henderson     EXC_M_UNF = 16,     /* Underflow */
392ea879fc7SRichard Henderson     EXC_M_INE = 32,     /* Inexact result */
393ea879fc7SRichard Henderson     EXC_M_IOV = 64      /* Integer Overflow */
394ea879fc7SRichard Henderson };
395ea879fc7SRichard Henderson 
396ea879fc7SRichard Henderson /* Processor status constants.  */
397ea879fc7SRichard Henderson /* Low 3 bits are interrupt mask level.  */
398bcd2625dSRichard Henderson #define PS_INT_MASK   7u
399ea879fc7SRichard Henderson 
400ea879fc7SRichard Henderson /* Bits 4 and 5 are the mmu mode.  The VMS PALcode uses all 4 modes;
401ea879fc7SRichard Henderson    The Unix PALcode only uses bit 4.  */
402bcd2625dSRichard Henderson #define PS_USER_MODE  8u
403bcd2625dSRichard Henderson 
404bcd2625dSRichard Henderson /* CPUAlphaState->flags constants.  These are layed out so that we
405bcd2625dSRichard Henderson    can set or reset the pieces individually by assigning to the byte,
406bcd2625dSRichard Henderson    or manipulated as a whole.  */
407bcd2625dSRichard Henderson 
408bcd2625dSRichard Henderson #define ENV_FLAG_PAL_SHIFT    0
409bcd2625dSRichard Henderson #define ENV_FLAG_PS_SHIFT     8
410bcd2625dSRichard Henderson #define ENV_FLAG_RX_SHIFT     16
411bcd2625dSRichard Henderson #define ENV_FLAG_FEN_SHIFT    24
412bcd2625dSRichard Henderson 
413bcd2625dSRichard Henderson #define ENV_FLAG_PAL_MODE     (1u << ENV_FLAG_PAL_SHIFT)
414bcd2625dSRichard Henderson #define ENV_FLAG_PS_USER      (PS_USER_MODE << ENV_FLAG_PS_SHIFT)
415bcd2625dSRichard Henderson #define ENV_FLAG_RX_FLAG      (1u << ENV_FLAG_RX_SHIFT)
416bcd2625dSRichard Henderson #define ENV_FLAG_FEN          (1u << ENV_FLAG_FEN_SHIFT)
417bcd2625dSRichard Henderson 
418bcd2625dSRichard Henderson #define ENV_FLAG_TB_MASK \
419bcd2625dSRichard Henderson     (ENV_FLAG_PAL_MODE | ENV_FLAG_PS_USER | ENV_FLAG_FEN)
420ea879fc7SRichard Henderson 
42197ed5ccdSBenjamin Herrenschmidt static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
422ea879fc7SRichard Henderson {
423bcd2625dSRichard Henderson     int ret = env->flags & ENV_FLAG_PS_USER ? MMU_USER_IDX : MMU_KERNEL_IDX;
424bcd2625dSRichard Henderson     if (env->flags & ENV_FLAG_PAL_MODE) {
425bcd2625dSRichard Henderson         ret = MMU_KERNEL_IDX;
426bba9bdceSRichard Henderson     }
427bcd2625dSRichard Henderson     return ret;
428ea879fc7SRichard Henderson }
4294c9649a9Sj_mayer 
4304c9649a9Sj_mayer enum {
4314c9649a9Sj_mayer     IR_V0   = 0,
4324c9649a9Sj_mayer     IR_T0   = 1,
4334c9649a9Sj_mayer     IR_T1   = 2,
4344c9649a9Sj_mayer     IR_T2   = 3,
4354c9649a9Sj_mayer     IR_T3   = 4,
4364c9649a9Sj_mayer     IR_T4   = 5,
4374c9649a9Sj_mayer     IR_T5   = 6,
4384c9649a9Sj_mayer     IR_T6   = 7,
4394c9649a9Sj_mayer     IR_T7   = 8,
4404c9649a9Sj_mayer     IR_S0   = 9,
4414c9649a9Sj_mayer     IR_S1   = 10,
4424c9649a9Sj_mayer     IR_S2   = 11,
4434c9649a9Sj_mayer     IR_S3   = 12,
4444c9649a9Sj_mayer     IR_S4   = 13,
4454c9649a9Sj_mayer     IR_S5   = 14,
4464c9649a9Sj_mayer     IR_S6   = 15,
447a4b388ffSRichard Henderson     IR_FP   = IR_S6,
4484c9649a9Sj_mayer     IR_A0   = 16,
4494c9649a9Sj_mayer     IR_A1   = 17,
4504c9649a9Sj_mayer     IR_A2   = 18,
4514c9649a9Sj_mayer     IR_A3   = 19,
4524c9649a9Sj_mayer     IR_A4   = 20,
4534c9649a9Sj_mayer     IR_A5   = 21,
4544c9649a9Sj_mayer     IR_T8   = 22,
4554c9649a9Sj_mayer     IR_T9   = 23,
4564c9649a9Sj_mayer     IR_T10  = 24,
4574c9649a9Sj_mayer     IR_T11  = 25,
4584c9649a9Sj_mayer     IR_RA   = 26,
4594c9649a9Sj_mayer     IR_T12  = 27,
460a4b388ffSRichard Henderson     IR_PV   = IR_T12,
4614c9649a9Sj_mayer     IR_AT   = 28,
4624c9649a9Sj_mayer     IR_GP   = 29,
4634c9649a9Sj_mayer     IR_SP   = 30,
4644c9649a9Sj_mayer     IR_ZERO = 31,
4654c9649a9Sj_mayer };
4664c9649a9Sj_mayer 
4670c28246fSAndreas Färber void alpha_translate_init(void);
4680c28246fSAndreas Färber 
46973a25e83SIgor Mammedov #define ALPHA_CPU_TYPE_SUFFIX "-" TYPE_ALPHA_CPU
47073a25e83SIgor Mammedov #define ALPHA_CPU_TYPE_NAME(model) model ALPHA_CPU_TYPE_SUFFIX
4710dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_ALPHA_CPU
47273a25e83SIgor Mammedov 
473*0442428aSMarkus Armbruster void alpha_cpu_list(void);
474e96efcfcSj_mayer /* you can call this signal handler from your SIGBUS and SIGSEGV
475e96efcfcSj_mayer    signal handlers to inform the virtual CPU of exceptions. non zero
476e96efcfcSj_mayer    is returned if the signal was handled by the virtual CPU.  */
477e96efcfcSj_mayer int cpu_alpha_signal_handler(int host_signum, void *pinfo,
478e96efcfcSj_mayer                              void *puc);
47998670d47SLaurent Vivier int alpha_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int size, int rw,
48097b348e7SBlue Swirl                                int mmu_idx);
48120503968SBlue Swirl void QEMU_NORETURN dynamic_excp(CPUAlphaState *, uintptr_t, int, int);
48220503968SBlue Swirl void QEMU_NORETURN arith_excp(CPUAlphaState *, uintptr_t, int, uint64_t);
48395870356Saurel32 
4844d5712f1SAndreas Färber uint64_t cpu_alpha_load_fpcr (CPUAlphaState *env);
4854d5712f1SAndreas Färber void cpu_alpha_store_fpcr (CPUAlphaState *env, uint64_t val);
48659124384SRichard Henderson uint64_t cpu_alpha_load_gr(CPUAlphaState *env, unsigned reg);
48759124384SRichard Henderson void cpu_alpha_store_gr(CPUAlphaState *env, unsigned reg, uint64_t val);
4885b450407SRichard Henderson #ifndef CONFIG_USER_ONLY
4896ad4d7eeSPeter Maydell void alpha_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
4906ad4d7eeSPeter Maydell                                      vaddr addr, unsigned size,
4916ad4d7eeSPeter Maydell                                      MMUAccessType access_type,
4926ad4d7eeSPeter Maydell                                      int mmu_idx, MemTxAttrs attrs,
4936ad4d7eeSPeter Maydell                                      MemTxResult response, uintptr_t retaddr);
4945b450407SRichard Henderson #endif
4954c9649a9Sj_mayer 
4964d5712f1SAndreas Färber static inline void cpu_get_tb_cpu_state(CPUAlphaState *env, target_ulong *pc,
49789fee74aSEmilio G. Cota                                         target_ulong *cs_base, uint32_t *pflags)
4986b917547Saliguori {
4996b917547Saliguori     *pc = env->pc;
5006b917547Saliguori     *cs_base = 0;
501bcd2625dSRichard Henderson     *pflags = env->flags & ENV_FLAG_TB_MASK;
5026b917547Saliguori }
5036b917547Saliguori 
50407f5a258SMarkus Armbruster #endif /* ALPHA_CPU_H */
505