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" 2574433bf0SRichard Henderson #include "exec/cpu-defs.h" 264c9649a9Sj_mayer 27d94f0a8eSPaolo Bonzini #define ALIGNED_ONLY 284c9649a9Sj_mayer 295ee4f3c2SRichard Henderson /* Alpha processors have a weak memory model */ 305ee4f3c2SRichard Henderson #define TCG_GUEST_DEFAULT_MO (0) 315ee4f3c2SRichard Henderson 324c9649a9Sj_mayer #define ICACHE_LINE_SIZE 32 334c9649a9Sj_mayer #define DCACHE_LINE_SIZE 32 344c9649a9Sj_mayer 354c9649a9Sj_mayer /* Alpha major type */ 364c9649a9Sj_mayer enum { 374c9649a9Sj_mayer ALPHA_EV3 = 1, 384c9649a9Sj_mayer ALPHA_EV4 = 2, 394c9649a9Sj_mayer ALPHA_SIM = 3, 404c9649a9Sj_mayer ALPHA_LCA = 4, 414c9649a9Sj_mayer ALPHA_EV5 = 5, /* 21164 */ 424c9649a9Sj_mayer ALPHA_EV45 = 6, /* 21064A */ 434c9649a9Sj_mayer ALPHA_EV56 = 7, /* 21164A */ 444c9649a9Sj_mayer }; 454c9649a9Sj_mayer 464c9649a9Sj_mayer /* EV4 minor type */ 474c9649a9Sj_mayer enum { 484c9649a9Sj_mayer ALPHA_EV4_2 = 0, 494c9649a9Sj_mayer ALPHA_EV4_3 = 1, 504c9649a9Sj_mayer }; 514c9649a9Sj_mayer 524c9649a9Sj_mayer /* LCA minor type */ 534c9649a9Sj_mayer enum { 544c9649a9Sj_mayer ALPHA_LCA_1 = 1, /* 21066 */ 554c9649a9Sj_mayer ALPHA_LCA_2 = 2, /* 20166 */ 564c9649a9Sj_mayer ALPHA_LCA_3 = 3, /* 21068 */ 574c9649a9Sj_mayer ALPHA_LCA_4 = 4, /* 21068 */ 584c9649a9Sj_mayer ALPHA_LCA_5 = 5, /* 21066A */ 594c9649a9Sj_mayer ALPHA_LCA_6 = 6, /* 21068A */ 604c9649a9Sj_mayer }; 614c9649a9Sj_mayer 624c9649a9Sj_mayer /* EV5 minor type */ 634c9649a9Sj_mayer enum { 644c9649a9Sj_mayer ALPHA_EV5_1 = 1, /* Rev BA, CA */ 654c9649a9Sj_mayer ALPHA_EV5_2 = 2, /* Rev DA, EA */ 664c9649a9Sj_mayer ALPHA_EV5_3 = 3, /* Pass 3 */ 674c9649a9Sj_mayer ALPHA_EV5_4 = 4, /* Pass 3.2 */ 684c9649a9Sj_mayer ALPHA_EV5_5 = 5, /* Pass 4 */ 694c9649a9Sj_mayer }; 704c9649a9Sj_mayer 714c9649a9Sj_mayer /* EV45 minor type */ 724c9649a9Sj_mayer enum { 734c9649a9Sj_mayer ALPHA_EV45_1 = 1, /* Pass 1 */ 744c9649a9Sj_mayer ALPHA_EV45_2 = 2, /* Pass 1.1 */ 754c9649a9Sj_mayer ALPHA_EV45_3 = 3, /* Pass 2 */ 764c9649a9Sj_mayer }; 774c9649a9Sj_mayer 784c9649a9Sj_mayer /* EV56 minor type */ 794c9649a9Sj_mayer enum { 804c9649a9Sj_mayer ALPHA_EV56_1 = 1, /* Pass 1 */ 814c9649a9Sj_mayer ALPHA_EV56_2 = 2, /* Pass 2 */ 824c9649a9Sj_mayer }; 834c9649a9Sj_mayer 844c9649a9Sj_mayer enum { 854c9649a9Sj_mayer IMPLVER_2106x = 0, /* EV4, EV45 & LCA45 */ 864c9649a9Sj_mayer IMPLVER_21164 = 1, /* EV5, EV56 & PCA45 */ 874c9649a9Sj_mayer IMPLVER_21264 = 2, /* EV6, EV67 & EV68x */ 884c9649a9Sj_mayer IMPLVER_21364 = 3, /* EV7 & EV79 */ 894c9649a9Sj_mayer }; 904c9649a9Sj_mayer 914c9649a9Sj_mayer enum { 924c9649a9Sj_mayer AMASK_BWX = 0x00000001, 934c9649a9Sj_mayer AMASK_FIX = 0x00000002, 944c9649a9Sj_mayer AMASK_CIX = 0x00000004, 954c9649a9Sj_mayer AMASK_MVI = 0x00000100, 964c9649a9Sj_mayer AMASK_TRAP = 0x00000200, 974c9649a9Sj_mayer AMASK_PREFETCH = 0x00001000, 984c9649a9Sj_mayer }; 994c9649a9Sj_mayer 1004c9649a9Sj_mayer enum { 1014c9649a9Sj_mayer VAX_ROUND_NORMAL = 0, 1024c9649a9Sj_mayer VAX_ROUND_CHOPPED, 1034c9649a9Sj_mayer }; 1044c9649a9Sj_mayer 1054c9649a9Sj_mayer enum { 1064c9649a9Sj_mayer IEEE_ROUND_NORMAL = 0, 1074c9649a9Sj_mayer IEEE_ROUND_DYNAMIC, 1084c9649a9Sj_mayer IEEE_ROUND_PLUS, 1094c9649a9Sj_mayer IEEE_ROUND_MINUS, 1104c9649a9Sj_mayer IEEE_ROUND_CHOPPED, 1114c9649a9Sj_mayer }; 1124c9649a9Sj_mayer 1134c9649a9Sj_mayer /* IEEE floating-point operations encoding */ 1144c9649a9Sj_mayer /* Trap mode */ 1154c9649a9Sj_mayer enum { 1164c9649a9Sj_mayer FP_TRAP_I = 0x0, 1174c9649a9Sj_mayer FP_TRAP_U = 0x1, 1184c9649a9Sj_mayer FP_TRAP_S = 0x4, 1194c9649a9Sj_mayer FP_TRAP_SU = 0x5, 1204c9649a9Sj_mayer FP_TRAP_SUI = 0x7, 1214c9649a9Sj_mayer }; 1224c9649a9Sj_mayer 1234c9649a9Sj_mayer /* Rounding mode */ 1244c9649a9Sj_mayer enum { 1254c9649a9Sj_mayer FP_ROUND_CHOPPED = 0x0, 1264c9649a9Sj_mayer FP_ROUND_MINUS = 0x1, 1274c9649a9Sj_mayer FP_ROUND_NORMAL = 0x2, 1284c9649a9Sj_mayer FP_ROUND_DYNAMIC = 0x3, 1294c9649a9Sj_mayer }; 1304c9649a9Sj_mayer 131f3d3aad4SRichard Henderson /* FPCR bits -- right-shifted 32 so we can use a uint32_t. */ 132f3d3aad4SRichard Henderson #define FPCR_SUM (1U << (63 - 32)) 133f3d3aad4SRichard Henderson #define FPCR_INED (1U << (62 - 32)) 134f3d3aad4SRichard Henderson #define FPCR_UNFD (1U << (61 - 32)) 135f3d3aad4SRichard Henderson #define FPCR_UNDZ (1U << (60 - 32)) 136f3d3aad4SRichard Henderson #define FPCR_DYN_SHIFT (58 - 32) 137f3d3aad4SRichard Henderson #define FPCR_DYN_CHOPPED (0U << FPCR_DYN_SHIFT) 138f3d3aad4SRichard Henderson #define FPCR_DYN_MINUS (1U << FPCR_DYN_SHIFT) 139f3d3aad4SRichard Henderson #define FPCR_DYN_NORMAL (2U << FPCR_DYN_SHIFT) 140f3d3aad4SRichard Henderson #define FPCR_DYN_PLUS (3U << FPCR_DYN_SHIFT) 141f3d3aad4SRichard Henderson #define FPCR_DYN_MASK (3U << FPCR_DYN_SHIFT) 142f3d3aad4SRichard Henderson #define FPCR_IOV (1U << (57 - 32)) 143f3d3aad4SRichard Henderson #define FPCR_INE (1U << (56 - 32)) 144f3d3aad4SRichard Henderson #define FPCR_UNF (1U << (55 - 32)) 145f3d3aad4SRichard Henderson #define FPCR_OVF (1U << (54 - 32)) 146f3d3aad4SRichard Henderson #define FPCR_DZE (1U << (53 - 32)) 147f3d3aad4SRichard Henderson #define FPCR_INV (1U << (52 - 32)) 148f3d3aad4SRichard Henderson #define FPCR_OVFD (1U << (51 - 32)) 149f3d3aad4SRichard Henderson #define FPCR_DZED (1U << (50 - 32)) 150f3d3aad4SRichard Henderson #define FPCR_INVD (1U << (49 - 32)) 151f3d3aad4SRichard Henderson #define FPCR_DNZ (1U << (48 - 32)) 152f3d3aad4SRichard Henderson #define FPCR_DNOD (1U << (47 - 32)) 153ba0e276dSRichard Henderson #define FPCR_STATUS_MASK (FPCR_IOV | FPCR_INE | FPCR_UNF \ 154ba0e276dSRichard Henderson | FPCR_OVF | FPCR_DZE | FPCR_INV) 155ba0e276dSRichard Henderson 156ba0e276dSRichard Henderson /* The silly software trap enables implemented by the kernel emulation. 157ba0e276dSRichard Henderson These are more or less architecturally required, since the real hardware 158ba0e276dSRichard Henderson has read-as-zero bits in the FPCR when the features aren't implemented. 159ba0e276dSRichard Henderson For the purposes of QEMU, we pretend the FPCR can hold everything. */ 160f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_INV (1U << 1) 161f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_DZE (1U << 2) 162f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_OVF (1U << 3) 163f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_UNF (1U << 4) 164f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_INE (1U << 5) 165f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_DNO (1U << 6) 166f3d3aad4SRichard Henderson #define SWCR_TRAP_ENABLE_MASK ((1U << 7) - (1U << 1)) 167ba0e276dSRichard Henderson 168f3d3aad4SRichard Henderson #define SWCR_MAP_DMZ (1U << 12) 169f3d3aad4SRichard Henderson #define SWCR_MAP_UMZ (1U << 13) 170ba0e276dSRichard Henderson #define SWCR_MAP_MASK (SWCR_MAP_DMZ | SWCR_MAP_UMZ) 171ba0e276dSRichard Henderson 172f3d3aad4SRichard Henderson #define SWCR_STATUS_INV (1U << 17) 173f3d3aad4SRichard Henderson #define SWCR_STATUS_DZE (1U << 18) 174f3d3aad4SRichard Henderson #define SWCR_STATUS_OVF (1U << 19) 175f3d3aad4SRichard Henderson #define SWCR_STATUS_UNF (1U << 20) 176f3d3aad4SRichard Henderson #define SWCR_STATUS_INE (1U << 21) 177f3d3aad4SRichard Henderson #define SWCR_STATUS_DNO (1U << 22) 178f3d3aad4SRichard Henderson #define SWCR_STATUS_MASK ((1U << 23) - (1U << 17)) 179ba0e276dSRichard Henderson 18021ba8564SRichard Henderson #define SWCR_STATUS_TO_EXCSUM_SHIFT 16 18121ba8564SRichard Henderson 182ba0e276dSRichard Henderson #define SWCR_MASK (SWCR_TRAP_ENABLE_MASK | SWCR_MAP_MASK | SWCR_STATUS_MASK) 183ba0e276dSRichard Henderson 1848417845eSRichard Henderson /* MMU modes definitions */ 1854c9649a9Sj_mayer 1866a73ecf5SRichard Henderson /* Alpha has 5 MMU modes: PALcode, Kernel, Executive, Supervisor, and User. 1878417845eSRichard Henderson The Unix PALcode only exposes the kernel and user modes; presumably 1888417845eSRichard Henderson executive and supervisor are used by VMS. 1898417845eSRichard Henderson 1908417845eSRichard Henderson PALcode itself uses physical mode for code and kernel mode for data; 1918417845eSRichard Henderson there are PALmode instructions that can access data via physical mode 1928417845eSRichard Henderson or via an os-installed "alternate mode", which is one of the 4 above. 1938417845eSRichard Henderson 1946a73ecf5SRichard Henderson That said, we're only emulating Unix PALcode, and not attempting VMS, 1956a73ecf5SRichard Henderson so we don't need to implement Executive and Supervisor. QEMU's own 1966a73ecf5SRichard Henderson PALcode cheats and usees the KSEG mapping for its code+data rather than 1976a73ecf5SRichard Henderson physical addresses. */ 1988417845eSRichard Henderson 1998417845eSRichard Henderson #define MMU_MODE0_SUFFIX _kernel 2008417845eSRichard Henderson #define MMU_MODE1_SUFFIX _user 2018417845eSRichard Henderson #define MMU_KERNEL_IDX 0 2028417845eSRichard Henderson #define MMU_USER_IDX 1 2036a73ecf5SRichard Henderson #define MMU_PHYS_IDX 2 2048417845eSRichard Henderson 2058417845eSRichard Henderson typedef struct CPUAlphaState CPUAlphaState; 2066ebbf390Sj_mayer 2074c9649a9Sj_mayer struct CPUAlphaState { 2084c9649a9Sj_mayer uint64_t ir[31]; 2094c9649a9Sj_mayer float64 fir[31]; 2104c9649a9Sj_mayer uint64_t pc; 2114c9649a9Sj_mayer uint64_t unique; 2126910b8f6SRichard Henderson uint64_t lock_addr; 2136910b8f6SRichard Henderson uint64_t lock_value; 214f3d3aad4SRichard Henderson 215f3d3aad4SRichard Henderson /* The FPCR, and disassembled portions thereof. */ 216f3d3aad4SRichard Henderson uint32_t fpcr; 21721ba8564SRichard Henderson #ifdef CONFIG_USER_ONLY 21821ba8564SRichard Henderson uint32_t swcr; 21921ba8564SRichard Henderson #endif 220f3d3aad4SRichard Henderson uint32_t fpcr_exc_enable; 2218443effbSRichard Henderson float_status fp_status; 2228443effbSRichard Henderson uint8_t fpcr_dyn_round; 2238443effbSRichard Henderson uint8_t fpcr_flush_to_zero; 2248443effbSRichard Henderson 225bcd2625dSRichard Henderson /* Mask of PALmode, Processor State et al. Most of this gets copied 226bcd2625dSRichard Henderson into the TranslatorBlock flags and controls code generation. */ 227bcd2625dSRichard Henderson uint32_t flags; 22826b46094SRichard Henderson 229bcd2625dSRichard Henderson /* The high 32-bits of the processor cycle counter. */ 23026b46094SRichard Henderson uint32_t pcc_ofs; 231129d8aa5SRichard Henderson 232129d8aa5SRichard Henderson /* These pass data from the exception logic in the translator and 233129d8aa5SRichard Henderson helpers to the OS entry point. This is used for both system 234129d8aa5SRichard Henderson emulation and user-mode. */ 235129d8aa5SRichard Henderson uint64_t trap_arg0; 236129d8aa5SRichard Henderson uint64_t trap_arg1; 237129d8aa5SRichard Henderson uint64_t trap_arg2; 2384c9649a9Sj_mayer 23926b46094SRichard Henderson #if !defined(CONFIG_USER_ONLY) 24026b46094SRichard Henderson /* The internal data required by our emulation of the Unix PALcode. */ 24126b46094SRichard Henderson uint64_t exc_addr; 24226b46094SRichard Henderson uint64_t palbr; 24326b46094SRichard Henderson uint64_t ptbr; 24426b46094SRichard Henderson uint64_t vptptr; 24526b46094SRichard Henderson uint64_t sysval; 24626b46094SRichard Henderson uint64_t usp; 24726b46094SRichard Henderson uint64_t shadow[8]; 24826b46094SRichard Henderson uint64_t scratch[24]; 24926b46094SRichard Henderson #endif 25026b46094SRichard Henderson 251c781cf96SRichard Henderson /* This alarm doesn't exist in real hardware; we wish it did. */ 252c781cf96SRichard Henderson uint64_t alarm_expire; 253c781cf96SRichard Henderson 2545cbdb3a3SStefan Weil /* Those resources are used only in QEMU core */ 2554c9649a9Sj_mayer CPU_COMMON 2564c9649a9Sj_mayer 2574c9649a9Sj_mayer int error_code; 2584c9649a9Sj_mayer 2594c9649a9Sj_mayer uint32_t features; 2604c9649a9Sj_mayer uint32_t amask; 2614c9649a9Sj_mayer int implver; 2624c9649a9Sj_mayer }; 2634c9649a9Sj_mayer 2641dc8e6b7SPaolo Bonzini /** 2651dc8e6b7SPaolo Bonzini * AlphaCPU: 2661dc8e6b7SPaolo Bonzini * @env: #CPUAlphaState 2671dc8e6b7SPaolo Bonzini * 2681dc8e6b7SPaolo Bonzini * An Alpha CPU. 2691dc8e6b7SPaolo Bonzini */ 2701dc8e6b7SPaolo Bonzini struct AlphaCPU { 2711dc8e6b7SPaolo Bonzini /*< private >*/ 2721dc8e6b7SPaolo Bonzini CPUState parent_obj; 2731dc8e6b7SPaolo Bonzini /*< public >*/ 2741dc8e6b7SPaolo Bonzini 275*5b146dc7SRichard Henderson CPUNegativeOffsetState neg; 2761dc8e6b7SPaolo Bonzini CPUAlphaState env; 2771dc8e6b7SPaolo Bonzini 2781dc8e6b7SPaolo Bonzini /* This alarm doesn't exist in real hardware; we wish it did. */ 2791dc8e6b7SPaolo Bonzini QEMUTimer *alarm_timer; 2801dc8e6b7SPaolo Bonzini }; 2811dc8e6b7SPaolo Bonzini 2821dc8e6b7SPaolo Bonzini 2831dc8e6b7SPaolo Bonzini #ifndef CONFIG_USER_ONLY 2841dc8e6b7SPaolo Bonzini extern const struct VMStateDescription vmstate_alpha_cpu; 2851dc8e6b7SPaolo Bonzini #endif 2861dc8e6b7SPaolo Bonzini 2871dc8e6b7SPaolo Bonzini void alpha_cpu_do_interrupt(CPUState *cpu); 2881dc8e6b7SPaolo Bonzini bool alpha_cpu_exec_interrupt(CPUState *cpu, int int_req); 28990c84c56SMarkus Armbruster void alpha_cpu_dump_state(CPUState *cs, FILE *f, int flags); 2901dc8e6b7SPaolo Bonzini hwaddr alpha_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); 2911dc8e6b7SPaolo Bonzini int alpha_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); 2921dc8e6b7SPaolo Bonzini int alpha_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); 2931dc8e6b7SPaolo Bonzini void alpha_cpu_do_unaligned_access(CPUState *cpu, vaddr addr, 294b35399bbSSergey Sorokin MMUAccessType access_type, 295b35399bbSSergey Sorokin int mmu_idx, uintptr_t retaddr); 2961dc8e6b7SPaolo Bonzini 297494342b3SAndreas Färber #define cpu_list alpha_cpu_list 2989467d44cSths #define cpu_signal_handler cpu_alpha_signal_handler 2999467d44cSths 3004f7c64b3SRichard Henderson typedef CPUAlphaState CPUArchState; 3012161a612SRichard Henderson typedef AlphaCPU ArchCPU; 3024f7c64b3SRichard Henderson 303022c62cbSPaolo Bonzini #include "exec/cpu-all.h" 3044c9649a9Sj_mayer 3054c9649a9Sj_mayer enum { 3064c9649a9Sj_mayer FEATURE_ASN = 0x00000001, 3074c9649a9Sj_mayer FEATURE_SPS = 0x00000002, 3084c9649a9Sj_mayer FEATURE_VIRBND = 0x00000004, 3094c9649a9Sj_mayer FEATURE_TBCHK = 0x00000008, 3104c9649a9Sj_mayer }; 3114c9649a9Sj_mayer 3124c9649a9Sj_mayer enum { 31307b6c13bSRichard Henderson EXCP_RESET, 31407b6c13bSRichard Henderson EXCP_MCHK, 31507b6c13bSRichard Henderson EXCP_SMP_INTERRUPT, 31607b6c13bSRichard Henderson EXCP_CLK_INTERRUPT, 31707b6c13bSRichard Henderson EXCP_DEV_INTERRUPT, 31807b6c13bSRichard Henderson EXCP_MMFAULT, 31907b6c13bSRichard Henderson EXCP_UNALIGN, 32007b6c13bSRichard Henderson EXCP_OPCDEC, 32107b6c13bSRichard Henderson EXCP_ARITH, 32207b6c13bSRichard Henderson EXCP_FEN, 32307b6c13bSRichard Henderson EXCP_CALL_PAL, 3244c9649a9Sj_mayer }; 3254c9649a9Sj_mayer 3266a80e088SRichard Henderson /* Alpha-specific interrupt pending bits. */ 3276a80e088SRichard Henderson #define CPU_INTERRUPT_TIMER CPU_INTERRUPT_TGT_EXT_0 3286a80e088SRichard Henderson #define CPU_INTERRUPT_SMP CPU_INTERRUPT_TGT_EXT_1 3296a80e088SRichard Henderson #define CPU_INTERRUPT_MCHK CPU_INTERRUPT_TGT_EXT_2 3306a80e088SRichard Henderson 331a3b9af16SRichard Henderson /* OSF/1 Page table bits. */ 332a3b9af16SRichard Henderson enum { 333a3b9af16SRichard Henderson PTE_VALID = 0x0001, 334a3b9af16SRichard Henderson PTE_FOR = 0x0002, /* used for page protection (fault on read) */ 335a3b9af16SRichard Henderson PTE_FOW = 0x0004, /* used for page protection (fault on write) */ 336a3b9af16SRichard Henderson PTE_FOE = 0x0008, /* used for page protection (fault on exec) */ 337a3b9af16SRichard Henderson PTE_ASM = 0x0010, 338a3b9af16SRichard Henderson PTE_KRE = 0x0100, 339a3b9af16SRichard Henderson PTE_URE = 0x0200, 340a3b9af16SRichard Henderson PTE_KWE = 0x1000, 341a3b9af16SRichard Henderson PTE_UWE = 0x2000 342a3b9af16SRichard Henderson }; 343a3b9af16SRichard Henderson 344ea879fc7SRichard Henderson /* Hardware interrupt (entInt) constants. */ 345ea879fc7SRichard Henderson enum { 346ea879fc7SRichard Henderson INT_K_IP, 347ea879fc7SRichard Henderson INT_K_CLK, 348ea879fc7SRichard Henderson INT_K_MCHK, 349ea879fc7SRichard Henderson INT_K_DEV, 350ea879fc7SRichard Henderson INT_K_PERF, 351ea879fc7SRichard Henderson }; 352ea879fc7SRichard Henderson 353ea879fc7SRichard Henderson /* Memory management (entMM) constants. */ 354ea879fc7SRichard Henderson enum { 355ea879fc7SRichard Henderson MM_K_TNV, 356ea879fc7SRichard Henderson MM_K_ACV, 357ea879fc7SRichard Henderson MM_K_FOR, 358ea879fc7SRichard Henderson MM_K_FOE, 359ea879fc7SRichard Henderson MM_K_FOW 360ea879fc7SRichard Henderson }; 361ea879fc7SRichard Henderson 362ea879fc7SRichard Henderson /* Arithmetic exception (entArith) constants. */ 363ea879fc7SRichard Henderson enum { 364ea879fc7SRichard Henderson EXC_M_SWC = 1, /* Software completion */ 365ea879fc7SRichard Henderson EXC_M_INV = 2, /* Invalid operation */ 366ea879fc7SRichard Henderson EXC_M_DZE = 4, /* Division by zero */ 367ea879fc7SRichard Henderson EXC_M_FOV = 8, /* Overflow */ 368ea879fc7SRichard Henderson EXC_M_UNF = 16, /* Underflow */ 369ea879fc7SRichard Henderson EXC_M_INE = 32, /* Inexact result */ 370ea879fc7SRichard Henderson EXC_M_IOV = 64 /* Integer Overflow */ 371ea879fc7SRichard Henderson }; 372ea879fc7SRichard Henderson 373ea879fc7SRichard Henderson /* Processor status constants. */ 374ea879fc7SRichard Henderson /* Low 3 bits are interrupt mask level. */ 375bcd2625dSRichard Henderson #define PS_INT_MASK 7u 376ea879fc7SRichard Henderson 377ea879fc7SRichard Henderson /* Bits 4 and 5 are the mmu mode. The VMS PALcode uses all 4 modes; 378ea879fc7SRichard Henderson The Unix PALcode only uses bit 4. */ 379bcd2625dSRichard Henderson #define PS_USER_MODE 8u 380bcd2625dSRichard Henderson 381bcd2625dSRichard Henderson /* CPUAlphaState->flags constants. These are layed out so that we 382bcd2625dSRichard Henderson can set or reset the pieces individually by assigning to the byte, 383bcd2625dSRichard Henderson or manipulated as a whole. */ 384bcd2625dSRichard Henderson 385bcd2625dSRichard Henderson #define ENV_FLAG_PAL_SHIFT 0 386bcd2625dSRichard Henderson #define ENV_FLAG_PS_SHIFT 8 387bcd2625dSRichard Henderson #define ENV_FLAG_RX_SHIFT 16 388bcd2625dSRichard Henderson #define ENV_FLAG_FEN_SHIFT 24 389bcd2625dSRichard Henderson 390bcd2625dSRichard Henderson #define ENV_FLAG_PAL_MODE (1u << ENV_FLAG_PAL_SHIFT) 391bcd2625dSRichard Henderson #define ENV_FLAG_PS_USER (PS_USER_MODE << ENV_FLAG_PS_SHIFT) 392bcd2625dSRichard Henderson #define ENV_FLAG_RX_FLAG (1u << ENV_FLAG_RX_SHIFT) 393bcd2625dSRichard Henderson #define ENV_FLAG_FEN (1u << ENV_FLAG_FEN_SHIFT) 394bcd2625dSRichard Henderson 395bcd2625dSRichard Henderson #define ENV_FLAG_TB_MASK \ 396bcd2625dSRichard Henderson (ENV_FLAG_PAL_MODE | ENV_FLAG_PS_USER | ENV_FLAG_FEN) 397ea879fc7SRichard Henderson 39897ed5ccdSBenjamin Herrenschmidt static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch) 399ea879fc7SRichard Henderson { 400bcd2625dSRichard Henderson int ret = env->flags & ENV_FLAG_PS_USER ? MMU_USER_IDX : MMU_KERNEL_IDX; 401bcd2625dSRichard Henderson if (env->flags & ENV_FLAG_PAL_MODE) { 402bcd2625dSRichard Henderson ret = MMU_KERNEL_IDX; 403bba9bdceSRichard Henderson } 404bcd2625dSRichard Henderson return ret; 405ea879fc7SRichard Henderson } 4064c9649a9Sj_mayer 4074c9649a9Sj_mayer enum { 4084c9649a9Sj_mayer IR_V0 = 0, 4094c9649a9Sj_mayer IR_T0 = 1, 4104c9649a9Sj_mayer IR_T1 = 2, 4114c9649a9Sj_mayer IR_T2 = 3, 4124c9649a9Sj_mayer IR_T3 = 4, 4134c9649a9Sj_mayer IR_T4 = 5, 4144c9649a9Sj_mayer IR_T5 = 6, 4154c9649a9Sj_mayer IR_T6 = 7, 4164c9649a9Sj_mayer IR_T7 = 8, 4174c9649a9Sj_mayer IR_S0 = 9, 4184c9649a9Sj_mayer IR_S1 = 10, 4194c9649a9Sj_mayer IR_S2 = 11, 4204c9649a9Sj_mayer IR_S3 = 12, 4214c9649a9Sj_mayer IR_S4 = 13, 4224c9649a9Sj_mayer IR_S5 = 14, 4234c9649a9Sj_mayer IR_S6 = 15, 424a4b388ffSRichard Henderson IR_FP = IR_S6, 4254c9649a9Sj_mayer IR_A0 = 16, 4264c9649a9Sj_mayer IR_A1 = 17, 4274c9649a9Sj_mayer IR_A2 = 18, 4284c9649a9Sj_mayer IR_A3 = 19, 4294c9649a9Sj_mayer IR_A4 = 20, 4304c9649a9Sj_mayer IR_A5 = 21, 4314c9649a9Sj_mayer IR_T8 = 22, 4324c9649a9Sj_mayer IR_T9 = 23, 4334c9649a9Sj_mayer IR_T10 = 24, 4344c9649a9Sj_mayer IR_T11 = 25, 4354c9649a9Sj_mayer IR_RA = 26, 4364c9649a9Sj_mayer IR_T12 = 27, 437a4b388ffSRichard Henderson IR_PV = IR_T12, 4384c9649a9Sj_mayer IR_AT = 28, 4394c9649a9Sj_mayer IR_GP = 29, 4404c9649a9Sj_mayer IR_SP = 30, 4414c9649a9Sj_mayer IR_ZERO = 31, 4424c9649a9Sj_mayer }; 4434c9649a9Sj_mayer 4440c28246fSAndreas Färber void alpha_translate_init(void); 4450c28246fSAndreas Färber 44673a25e83SIgor Mammedov #define ALPHA_CPU_TYPE_SUFFIX "-" TYPE_ALPHA_CPU 44773a25e83SIgor Mammedov #define ALPHA_CPU_TYPE_NAME(model) model ALPHA_CPU_TYPE_SUFFIX 4480dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_ALPHA_CPU 44973a25e83SIgor Mammedov 4500442428aSMarkus Armbruster void alpha_cpu_list(void); 451e96efcfcSj_mayer /* you can call this signal handler from your SIGBUS and SIGSEGV 452e96efcfcSj_mayer signal handlers to inform the virtual CPU of exceptions. non zero 453e96efcfcSj_mayer is returned if the signal was handled by the virtual CPU. */ 454e96efcfcSj_mayer int cpu_alpha_signal_handler(int host_signum, void *pinfo, 455e96efcfcSj_mayer void *puc); 456e41c9452SRichard Henderson bool alpha_cpu_tlb_fill(CPUState *cs, vaddr address, int size, 457e41c9452SRichard Henderson MMUAccessType access_type, int mmu_idx, 458e41c9452SRichard Henderson bool probe, uintptr_t retaddr); 45920503968SBlue Swirl void QEMU_NORETURN dynamic_excp(CPUAlphaState *, uintptr_t, int, int); 46020503968SBlue Swirl void QEMU_NORETURN arith_excp(CPUAlphaState *, uintptr_t, int, uint64_t); 46195870356Saurel32 4624d5712f1SAndreas Färber uint64_t cpu_alpha_load_fpcr (CPUAlphaState *env); 4634d5712f1SAndreas Färber void cpu_alpha_store_fpcr (CPUAlphaState *env, uint64_t val); 46459124384SRichard Henderson uint64_t cpu_alpha_load_gr(CPUAlphaState *env, unsigned reg); 46559124384SRichard Henderson void cpu_alpha_store_gr(CPUAlphaState *env, unsigned reg, uint64_t val); 4665b450407SRichard Henderson #ifndef CONFIG_USER_ONLY 4676ad4d7eeSPeter Maydell void alpha_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, 4686ad4d7eeSPeter Maydell vaddr addr, unsigned size, 4696ad4d7eeSPeter Maydell MMUAccessType access_type, 4706ad4d7eeSPeter Maydell int mmu_idx, MemTxAttrs attrs, 4716ad4d7eeSPeter Maydell MemTxResult response, uintptr_t retaddr); 4725b450407SRichard Henderson #endif 4734c9649a9Sj_mayer 4744d5712f1SAndreas Färber static inline void cpu_get_tb_cpu_state(CPUAlphaState *env, target_ulong *pc, 47589fee74aSEmilio G. Cota target_ulong *cs_base, uint32_t *pflags) 4766b917547Saliguori { 4776b917547Saliguori *pc = env->pc; 4786b917547Saliguori *cs_base = 0; 479bcd2625dSRichard Henderson *pflags = env->flags & ENV_FLAG_TB_MASK; 4806b917547Saliguori } 4816b917547Saliguori 48221ba8564SRichard Henderson #ifdef CONFIG_USER_ONLY 48321ba8564SRichard Henderson /* Copied from linux ieee_swcr_to_fpcr. */ 48421ba8564SRichard Henderson static inline uint64_t alpha_ieee_swcr_to_fpcr(uint64_t swcr) 48521ba8564SRichard Henderson { 48621ba8564SRichard Henderson uint64_t fpcr = 0; 48721ba8564SRichard Henderson 48821ba8564SRichard Henderson fpcr |= (swcr & SWCR_STATUS_MASK) << 35; 48921ba8564SRichard Henderson fpcr |= (swcr & SWCR_MAP_DMZ) << 36; 49021ba8564SRichard Henderson fpcr |= (~swcr & (SWCR_TRAP_ENABLE_INV 49121ba8564SRichard Henderson | SWCR_TRAP_ENABLE_DZE 49221ba8564SRichard Henderson | SWCR_TRAP_ENABLE_OVF)) << 48; 49321ba8564SRichard Henderson fpcr |= (~swcr & (SWCR_TRAP_ENABLE_UNF 49421ba8564SRichard Henderson | SWCR_TRAP_ENABLE_INE)) << 57; 49521ba8564SRichard Henderson fpcr |= (swcr & SWCR_MAP_UMZ ? FPCR_UNDZ | FPCR_UNFD : 0); 49621ba8564SRichard Henderson fpcr |= (~swcr & SWCR_TRAP_ENABLE_DNO) << 41; 49721ba8564SRichard Henderson 49821ba8564SRichard Henderson return fpcr; 49921ba8564SRichard Henderson } 50021ba8564SRichard Henderson 50121ba8564SRichard Henderson /* Copied from linux ieee_fpcr_to_swcr. */ 50221ba8564SRichard Henderson static inline uint64_t alpha_ieee_fpcr_to_swcr(uint64_t fpcr) 50321ba8564SRichard Henderson { 50421ba8564SRichard Henderson uint64_t swcr = 0; 50521ba8564SRichard Henderson 50621ba8564SRichard Henderson swcr |= (fpcr >> 35) & SWCR_STATUS_MASK; 50721ba8564SRichard Henderson swcr |= (fpcr >> 36) & SWCR_MAP_DMZ; 50821ba8564SRichard Henderson swcr |= (~fpcr >> 48) & (SWCR_TRAP_ENABLE_INV 50921ba8564SRichard Henderson | SWCR_TRAP_ENABLE_DZE 51021ba8564SRichard Henderson | SWCR_TRAP_ENABLE_OVF); 51121ba8564SRichard Henderson swcr |= (~fpcr >> 57) & (SWCR_TRAP_ENABLE_UNF | SWCR_TRAP_ENABLE_INE); 51221ba8564SRichard Henderson swcr |= (fpcr >> 47) & SWCR_MAP_UMZ; 51321ba8564SRichard Henderson swcr |= (~fpcr >> 41) & SWCR_TRAP_ENABLE_DNO; 51421ba8564SRichard Henderson 51521ba8564SRichard Henderson return swcr; 51621ba8564SRichard Henderson } 51721ba8564SRichard Henderson #endif /* CONFIG_USER_ONLY */ 51821ba8564SRichard Henderson 51907f5a258SMarkus Armbruster #endif /* ALPHA_CPU_H */ 520