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