148e06fe0SBastian Koppelmann /* 248e06fe0SBastian Koppelmann * TriCore emulation for qemu: main CPU struct. 348e06fe0SBastian Koppelmann * 448e06fe0SBastian Koppelmann * Copyright (c) 2012-2014 Bastian Koppelmann C-Lab/University Paderborn 548e06fe0SBastian Koppelmann * 648e06fe0SBastian Koppelmann * This library is free software; you can redistribute it and/or 748e06fe0SBastian Koppelmann * modify it under the terms of the GNU Lesser General Public 848e06fe0SBastian Koppelmann * License as published by the Free Software Foundation; either 948e06fe0SBastian Koppelmann * version 2 of the License, or (at your option) any later version. 1048e06fe0SBastian Koppelmann * 1148e06fe0SBastian Koppelmann * This library is distributed in the hope that it will be useful, 1248e06fe0SBastian Koppelmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 1348e06fe0SBastian Koppelmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1448e06fe0SBastian Koppelmann * Lesser General Public License for more details. 1548e06fe0SBastian Koppelmann * 1648e06fe0SBastian Koppelmann * You should have received a copy of the GNU Lesser General Public 1748e06fe0SBastian Koppelmann * License along with this library; if not, see <http://www.gnu.org/licenses/>. 1848e06fe0SBastian Koppelmann */ 1907f5a258SMarkus Armbruster 2007f5a258SMarkus Armbruster #ifndef TRICORE_CPU_H 2107f5a258SMarkus Armbruster #define TRICORE_CPU_H 2248e06fe0SBastian Koppelmann 2348e06fe0SBastian Koppelmann #include "tricore-defs.h" 2448e06fe0SBastian Koppelmann #include "qemu-common.h" 25fc111b10SPaolo Bonzini #include "cpu-qom.h" 2648e06fe0SBastian Koppelmann #include "exec/cpu-defs.h" 2748e06fe0SBastian Koppelmann 2848e06fe0SBastian Koppelmann #define CPUArchState struct CPUTriCoreState 2948e06fe0SBastian Koppelmann 3048e06fe0SBastian Koppelmann struct CPUTriCoreState; 3148e06fe0SBastian Koppelmann 3248e06fe0SBastian Koppelmann struct tricore_boot_info; 3348e06fe0SBastian Koppelmann 3448e06fe0SBastian Koppelmann #define NB_MMU_MODES 3 3548e06fe0SBastian Koppelmann 3648e06fe0SBastian Koppelmann typedef struct tricore_def_t tricore_def_t; 3748e06fe0SBastian Koppelmann 3848e06fe0SBastian Koppelmann typedef struct CPUTriCoreState CPUTriCoreState; 3948e06fe0SBastian Koppelmann struct CPUTriCoreState { 4048e06fe0SBastian Koppelmann /* GPR Register */ 4148e06fe0SBastian Koppelmann uint32_t gpr_a[16]; 4248e06fe0SBastian Koppelmann uint32_t gpr_d[16]; 4348e06fe0SBastian Koppelmann /* CSFR Register */ 4448e06fe0SBastian Koppelmann uint32_t PCXI; 4548e06fe0SBastian Koppelmann /* Frequently accessed PSW_USB bits are stored separately for efficiency. 4648e06fe0SBastian Koppelmann This contains all the other bits. Use psw_{read,write} to access 4748e06fe0SBastian Koppelmann the whole PSW. */ 4848e06fe0SBastian Koppelmann uint32_t PSW; 4948e06fe0SBastian Koppelmann 5048e06fe0SBastian Koppelmann /* PSW flag cache for faster execution 5148e06fe0SBastian Koppelmann */ 5248e06fe0SBastian Koppelmann uint32_t PSW_USB_C; 5348e06fe0SBastian Koppelmann uint32_t PSW_USB_V; /* Only if bit 31 set, then flag is set */ 5448e06fe0SBastian Koppelmann uint32_t PSW_USB_SV; /* Only if bit 31 set, then flag is set */ 5548e06fe0SBastian Koppelmann uint32_t PSW_USB_AV; /* Only if bit 31 set, then flag is set. */ 5648e06fe0SBastian Koppelmann uint32_t PSW_USB_SAV; /* Only if bit 31 set, then flag is set. */ 5748e06fe0SBastian Koppelmann 5848e06fe0SBastian Koppelmann uint32_t PC; 5948e06fe0SBastian Koppelmann uint32_t SYSCON; 6048e06fe0SBastian Koppelmann uint32_t CPU_ID; 6104e62411SDavid Brenken uint32_t CORE_ID; 6248e06fe0SBastian Koppelmann uint32_t BIV; 6348e06fe0SBastian Koppelmann uint32_t BTV; 6448e06fe0SBastian Koppelmann uint32_t ISP; 6548e06fe0SBastian Koppelmann uint32_t ICR; 6648e06fe0SBastian Koppelmann uint32_t FCX; 6748e06fe0SBastian Koppelmann uint32_t LCX; 6848e06fe0SBastian Koppelmann uint32_t COMPAT; 6948e06fe0SBastian Koppelmann 7048e06fe0SBastian Koppelmann /* Mem Protection Register */ 7148e06fe0SBastian Koppelmann uint32_t DPR0_0L; 7248e06fe0SBastian Koppelmann uint32_t DPR0_0U; 7348e06fe0SBastian Koppelmann uint32_t DPR0_1L; 7448e06fe0SBastian Koppelmann uint32_t DPR0_1U; 7548e06fe0SBastian Koppelmann uint32_t DPR0_2L; 7648e06fe0SBastian Koppelmann uint32_t DPR0_2U; 7748e06fe0SBastian Koppelmann uint32_t DPR0_3L; 7848e06fe0SBastian Koppelmann uint32_t DPR0_3U; 7948e06fe0SBastian Koppelmann 8048e06fe0SBastian Koppelmann uint32_t DPR1_0L; 8148e06fe0SBastian Koppelmann uint32_t DPR1_0U; 8248e06fe0SBastian Koppelmann uint32_t DPR1_1L; 8348e06fe0SBastian Koppelmann uint32_t DPR1_1U; 8448e06fe0SBastian Koppelmann uint32_t DPR1_2L; 8548e06fe0SBastian Koppelmann uint32_t DPR1_2U; 8648e06fe0SBastian Koppelmann uint32_t DPR1_3L; 8748e06fe0SBastian Koppelmann uint32_t DPR1_3U; 8848e06fe0SBastian Koppelmann 8948e06fe0SBastian Koppelmann uint32_t DPR2_0L; 9048e06fe0SBastian Koppelmann uint32_t DPR2_0U; 9148e06fe0SBastian Koppelmann uint32_t DPR2_1L; 9248e06fe0SBastian Koppelmann uint32_t DPR2_1U; 9348e06fe0SBastian Koppelmann uint32_t DPR2_2L; 9448e06fe0SBastian Koppelmann uint32_t DPR2_2U; 9548e06fe0SBastian Koppelmann uint32_t DPR2_3L; 9648e06fe0SBastian Koppelmann uint32_t DPR2_3U; 9748e06fe0SBastian Koppelmann 9848e06fe0SBastian Koppelmann uint32_t DPR3_0L; 9948e06fe0SBastian Koppelmann uint32_t DPR3_0U; 10048e06fe0SBastian Koppelmann uint32_t DPR3_1L; 10148e06fe0SBastian Koppelmann uint32_t DPR3_1U; 10248e06fe0SBastian Koppelmann uint32_t DPR3_2L; 10348e06fe0SBastian Koppelmann uint32_t DPR3_2U; 10448e06fe0SBastian Koppelmann uint32_t DPR3_3L; 10548e06fe0SBastian Koppelmann uint32_t DPR3_3U; 10648e06fe0SBastian Koppelmann 10748e06fe0SBastian Koppelmann uint32_t CPR0_0L; 10848e06fe0SBastian Koppelmann uint32_t CPR0_0U; 10948e06fe0SBastian Koppelmann uint32_t CPR0_1L; 11048e06fe0SBastian Koppelmann uint32_t CPR0_1U; 11148e06fe0SBastian Koppelmann uint32_t CPR0_2L; 11248e06fe0SBastian Koppelmann uint32_t CPR0_2U; 11348e06fe0SBastian Koppelmann uint32_t CPR0_3L; 11448e06fe0SBastian Koppelmann uint32_t CPR0_3U; 11548e06fe0SBastian Koppelmann 11648e06fe0SBastian Koppelmann uint32_t CPR1_0L; 11748e06fe0SBastian Koppelmann uint32_t CPR1_0U; 11848e06fe0SBastian Koppelmann uint32_t CPR1_1L; 11948e06fe0SBastian Koppelmann uint32_t CPR1_1U; 12048e06fe0SBastian Koppelmann uint32_t CPR1_2L; 12148e06fe0SBastian Koppelmann uint32_t CPR1_2U; 12248e06fe0SBastian Koppelmann uint32_t CPR1_3L; 12348e06fe0SBastian Koppelmann uint32_t CPR1_3U; 12448e06fe0SBastian Koppelmann 12548e06fe0SBastian Koppelmann uint32_t CPR2_0L; 12648e06fe0SBastian Koppelmann uint32_t CPR2_0U; 12748e06fe0SBastian Koppelmann uint32_t CPR2_1L; 12848e06fe0SBastian Koppelmann uint32_t CPR2_1U; 12948e06fe0SBastian Koppelmann uint32_t CPR2_2L; 13048e06fe0SBastian Koppelmann uint32_t CPR2_2U; 13148e06fe0SBastian Koppelmann uint32_t CPR2_3L; 13248e06fe0SBastian Koppelmann uint32_t CPR2_3U; 13348e06fe0SBastian Koppelmann 13448e06fe0SBastian Koppelmann uint32_t CPR3_0L; 13548e06fe0SBastian Koppelmann uint32_t CPR3_0U; 13648e06fe0SBastian Koppelmann uint32_t CPR3_1L; 13748e06fe0SBastian Koppelmann uint32_t CPR3_1U; 13848e06fe0SBastian Koppelmann uint32_t CPR3_2L; 13948e06fe0SBastian Koppelmann uint32_t CPR3_2U; 14048e06fe0SBastian Koppelmann uint32_t CPR3_3L; 14148e06fe0SBastian Koppelmann uint32_t CPR3_3U; 14248e06fe0SBastian Koppelmann 14348e06fe0SBastian Koppelmann uint32_t DPM0; 14448e06fe0SBastian Koppelmann uint32_t DPM1; 14548e06fe0SBastian Koppelmann uint32_t DPM2; 14648e06fe0SBastian Koppelmann uint32_t DPM3; 14748e06fe0SBastian Koppelmann 14848e06fe0SBastian Koppelmann uint32_t CPM0; 14948e06fe0SBastian Koppelmann uint32_t CPM1; 15048e06fe0SBastian Koppelmann uint32_t CPM2; 15148e06fe0SBastian Koppelmann uint32_t CPM3; 15248e06fe0SBastian Koppelmann 15348e06fe0SBastian Koppelmann /* Memory Management Registers */ 15448e06fe0SBastian Koppelmann uint32_t MMU_CON; 15548e06fe0SBastian Koppelmann uint32_t MMU_ASI; 15648e06fe0SBastian Koppelmann uint32_t MMU_TVA; 15748e06fe0SBastian Koppelmann uint32_t MMU_TPA; 15848e06fe0SBastian Koppelmann uint32_t MMU_TPX; 15948e06fe0SBastian Koppelmann uint32_t MMU_TFA; 16048e06fe0SBastian Koppelmann /* {1.3.1 only */ 16148e06fe0SBastian Koppelmann uint32_t BMACON; 16248e06fe0SBastian Koppelmann uint32_t SMACON; 16348e06fe0SBastian Koppelmann uint32_t DIEAR; 16448e06fe0SBastian Koppelmann uint32_t DIETR; 16548e06fe0SBastian Koppelmann uint32_t CCDIER; 16648e06fe0SBastian Koppelmann uint32_t MIECON; 16748e06fe0SBastian Koppelmann uint32_t PIEAR; 16848e06fe0SBastian Koppelmann uint32_t PIETR; 16948e06fe0SBastian Koppelmann uint32_t CCPIER; 17048e06fe0SBastian Koppelmann /*} */ 17148e06fe0SBastian Koppelmann /* Debug Registers */ 17248e06fe0SBastian Koppelmann uint32_t DBGSR; 17348e06fe0SBastian Koppelmann uint32_t EXEVT; 17448e06fe0SBastian Koppelmann uint32_t CREVT; 17548e06fe0SBastian Koppelmann uint32_t SWEVT; 17648e06fe0SBastian Koppelmann uint32_t TR0EVT; 17748e06fe0SBastian Koppelmann uint32_t TR1EVT; 17848e06fe0SBastian Koppelmann uint32_t DMS; 17948e06fe0SBastian Koppelmann uint32_t DCX; 18048e06fe0SBastian Koppelmann uint32_t DBGTCR; 18148e06fe0SBastian Koppelmann uint32_t CCTRL; 18248e06fe0SBastian Koppelmann uint32_t CCNT; 18348e06fe0SBastian Koppelmann uint32_t ICNT; 18448e06fe0SBastian Koppelmann uint32_t M1CNT; 18548e06fe0SBastian Koppelmann uint32_t M2CNT; 18648e06fe0SBastian Koppelmann uint32_t M3CNT; 18748e06fe0SBastian Koppelmann /* Floating Point Registers */ 188996a729fSBastian Koppelmann float_status fp_status; 18948e06fe0SBastian Koppelmann /* QEMU */ 19048e06fe0SBastian Koppelmann int error_code; 19148e06fe0SBastian Koppelmann uint32_t hflags; /* CPU State */ 19248e06fe0SBastian Koppelmann 19348e06fe0SBastian Koppelmann CPU_COMMON 19448e06fe0SBastian Koppelmann 19548e06fe0SBastian Koppelmann /* Internal CPU feature flags. */ 19648e06fe0SBastian Koppelmann uint64_t features; 19748e06fe0SBastian Koppelmann 19848e06fe0SBastian Koppelmann const tricore_def_t *cpu_model; 19948e06fe0SBastian Koppelmann void *irq[8]; 20048e06fe0SBastian Koppelmann struct QEMUTimer *timer; /* Internal timer */ 20148e06fe0SBastian Koppelmann }; 20248e06fe0SBastian Koppelmann 203fc111b10SPaolo Bonzini /** 204fc111b10SPaolo Bonzini * TriCoreCPU: 205fc111b10SPaolo Bonzini * @env: #CPUTriCoreState 206fc111b10SPaolo Bonzini * 207fc111b10SPaolo Bonzini * A TriCore CPU. 208fc111b10SPaolo Bonzini */ 209fc111b10SPaolo Bonzini struct TriCoreCPU { 210fc111b10SPaolo Bonzini /*< private >*/ 211fc111b10SPaolo Bonzini CPUState parent_obj; 212fc111b10SPaolo Bonzini /*< public >*/ 213fc111b10SPaolo Bonzini 214fc111b10SPaolo Bonzini CPUTriCoreState env; 215fc111b10SPaolo Bonzini }; 216fc111b10SPaolo Bonzini 217fc111b10SPaolo Bonzini static inline TriCoreCPU *tricore_env_get_cpu(CPUTriCoreState *env) 218fc111b10SPaolo Bonzini { 219fc111b10SPaolo Bonzini return TRICORE_CPU(container_of(env, TriCoreCPU, env)); 220fc111b10SPaolo Bonzini } 221fc111b10SPaolo Bonzini 222fc111b10SPaolo Bonzini #define ENV_GET_CPU(e) CPU(tricore_env_get_cpu(e)) 223fc111b10SPaolo Bonzini 224fc111b10SPaolo Bonzini #define ENV_OFFSET offsetof(TriCoreCPU, env) 225fc111b10SPaolo Bonzini 226fc111b10SPaolo Bonzini hwaddr tricore_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); 227fc111b10SPaolo Bonzini void tricore_cpu_dump_state(CPUState *cpu, FILE *f, 228fc111b10SPaolo Bonzini fprintf_function cpu_fprintf, int flags); 229fc111b10SPaolo Bonzini 230fc111b10SPaolo Bonzini 23148e06fe0SBastian Koppelmann #define MASK_PCXI_PCPN 0xff000000 232*ce46335cSDavid Brenken #define MASK_PCXI_PIE_1_3 0x00800000 233*ce46335cSDavid Brenken #define MASK_PCXI_PIE_1_6 0x00200000 23448e06fe0SBastian Koppelmann #define MASK_PCXI_UL 0x00400000 23548e06fe0SBastian Koppelmann #define MASK_PCXI_PCXS 0x000f0000 23648e06fe0SBastian Koppelmann #define MASK_PCXI_PCXO 0x0000ffff 23748e06fe0SBastian Koppelmann 23848e06fe0SBastian Koppelmann #define MASK_PSW_USB 0xff000000 23948e06fe0SBastian Koppelmann #define MASK_USB_C 0x80000000 24048e06fe0SBastian Koppelmann #define MASK_USB_V 0x40000000 24148e06fe0SBastian Koppelmann #define MASK_USB_SV 0x20000000 24248e06fe0SBastian Koppelmann #define MASK_USB_AV 0x10000000 24348e06fe0SBastian Koppelmann #define MASK_USB_SAV 0x08000000 24448e06fe0SBastian Koppelmann #define MASK_PSW_PRS 0x00003000 24548e06fe0SBastian Koppelmann #define MASK_PSW_IO 0x00000c00 24648e06fe0SBastian Koppelmann #define MASK_PSW_IS 0x00000200 24748e06fe0SBastian Koppelmann #define MASK_PSW_GW 0x00000100 24848e06fe0SBastian Koppelmann #define MASK_PSW_CDE 0x00000080 24948e06fe0SBastian Koppelmann #define MASK_PSW_CDC 0x0000007f 250996a729fSBastian Koppelmann #define MASK_PSW_FPU_RM 0x3000000 25148e06fe0SBastian Koppelmann 25248e06fe0SBastian Koppelmann #define MASK_SYSCON_PRO_TEN 0x2 25348e06fe0SBastian Koppelmann #define MASK_SYSCON_FCD_SF 0x1 25448e06fe0SBastian Koppelmann 25548e06fe0SBastian Koppelmann #define MASK_CPUID_MOD 0xffff0000 25648e06fe0SBastian Koppelmann #define MASK_CPUID_MOD_32B 0x0000ff00 25748e06fe0SBastian Koppelmann #define MASK_CPUID_REV 0x000000ff 25848e06fe0SBastian Koppelmann 25948e06fe0SBastian Koppelmann #define MASK_ICR_PIPN 0x00ff0000 260d1cbc28aSDavid Brenken #define MASK_ICR_IE_1_3 0x00000100 261d1cbc28aSDavid Brenken #define MASK_ICR_IE_1_6 0x00008000 26248e06fe0SBastian Koppelmann #define MASK_ICR_CCPN 0x000000ff 26348e06fe0SBastian Koppelmann 26448e06fe0SBastian Koppelmann #define MASK_FCX_FCXS 0x000f0000 26548e06fe0SBastian Koppelmann #define MASK_FCX_FCXO 0x0000ffff 26648e06fe0SBastian Koppelmann 26748e06fe0SBastian Koppelmann #define MASK_LCX_LCXS 0x000f0000 26848e06fe0SBastian Koppelmann #define MASK_LCX_LCX0 0x0000ffff 26948e06fe0SBastian Koppelmann 270b724b012SBastian Koppelmann #define MASK_DBGSR_DE 0x1 271b724b012SBastian Koppelmann #define MASK_DBGSR_HALT 0x6 272b724b012SBastian Koppelmann #define MASK_DBGSR_SUSP 0x10 273b724b012SBastian Koppelmann #define MASK_DBGSR_PREVSUSP 0x20 274b724b012SBastian Koppelmann #define MASK_DBGSR_PEVT 0x40 275b724b012SBastian Koppelmann #define MASK_DBGSR_EVTSRC 0x1f00 276b724b012SBastian Koppelmann 27740a1f64bSBastian Koppelmann #define TRICORE_HFLAG_KUU 0x3 27848e06fe0SBastian Koppelmann #define TRICORE_HFLAG_UM0 0x00002 /* user mode-0 flag */ 27948e06fe0SBastian Koppelmann #define TRICORE_HFLAG_UM1 0x00001 /* user mode-1 flag */ 28048e06fe0SBastian Koppelmann #define TRICORE_HFLAG_SM 0x00000 /* kernel mode flag */ 28148e06fe0SBastian Koppelmann 28248e06fe0SBastian Koppelmann enum tricore_features { 28348e06fe0SBastian Koppelmann TRICORE_FEATURE_13, 28448e06fe0SBastian Koppelmann TRICORE_FEATURE_131, 28548e06fe0SBastian Koppelmann TRICORE_FEATURE_16, 2866d2afc8aSBastian Koppelmann TRICORE_FEATURE_161, 28748e06fe0SBastian Koppelmann }; 28848e06fe0SBastian Koppelmann 28948e06fe0SBastian Koppelmann static inline int tricore_feature(CPUTriCoreState *env, int feature) 29048e06fe0SBastian Koppelmann { 29148e06fe0SBastian Koppelmann return (env->features & (1ULL << feature)) != 0; 29248e06fe0SBastian Koppelmann } 29348e06fe0SBastian Koppelmann 29448e06fe0SBastian Koppelmann /* TriCore Traps Classes*/ 29548e06fe0SBastian Koppelmann enum { 29648e06fe0SBastian Koppelmann TRAPC_NONE = -1, 29748e06fe0SBastian Koppelmann TRAPC_MMU = 0, 29848e06fe0SBastian Koppelmann TRAPC_PROT = 1, 29948e06fe0SBastian Koppelmann TRAPC_INSN_ERR = 2, 30048e06fe0SBastian Koppelmann TRAPC_CTX_MNG = 3, 30148e06fe0SBastian Koppelmann TRAPC_SYSBUS = 4, 30248e06fe0SBastian Koppelmann TRAPC_ASSERT = 5, 30348e06fe0SBastian Koppelmann TRAPC_SYSCALL = 6, 30448e06fe0SBastian Koppelmann TRAPC_NMI = 7, 305518d7fd2SBastian Koppelmann TRAPC_IRQ = 8 30648e06fe0SBastian Koppelmann }; 30748e06fe0SBastian Koppelmann 30848e06fe0SBastian Koppelmann /* Class 0 TIN */ 30948e06fe0SBastian Koppelmann enum { 31048e06fe0SBastian Koppelmann TIN0_VAF = 0, 31148e06fe0SBastian Koppelmann TIN0_VAP = 1, 31248e06fe0SBastian Koppelmann }; 31348e06fe0SBastian Koppelmann 31448e06fe0SBastian Koppelmann /* Class 1 TIN */ 31548e06fe0SBastian Koppelmann enum { 31648e06fe0SBastian Koppelmann TIN1_PRIV = 1, 31748e06fe0SBastian Koppelmann TIN1_MPR = 2, 31848e06fe0SBastian Koppelmann TIN1_MPW = 3, 31948e06fe0SBastian Koppelmann TIN1_MPX = 4, 32048e06fe0SBastian Koppelmann TIN1_MPP = 5, 32148e06fe0SBastian Koppelmann TIN1_MPN = 6, 32248e06fe0SBastian Koppelmann TIN1_GRWP = 7, 32348e06fe0SBastian Koppelmann }; 32448e06fe0SBastian Koppelmann 32548e06fe0SBastian Koppelmann /* Class 2 TIN */ 32648e06fe0SBastian Koppelmann enum { 32748e06fe0SBastian Koppelmann TIN2_IOPC = 1, 32848e06fe0SBastian Koppelmann TIN2_UOPC = 2, 32948e06fe0SBastian Koppelmann TIN2_OPD = 3, 33048e06fe0SBastian Koppelmann TIN2_ALN = 4, 33148e06fe0SBastian Koppelmann TIN2_MEM = 5, 33248e06fe0SBastian Koppelmann }; 33348e06fe0SBastian Koppelmann 33448e06fe0SBastian Koppelmann /* Class 3 TIN */ 33548e06fe0SBastian Koppelmann enum { 33648e06fe0SBastian Koppelmann TIN3_FCD = 1, 33748e06fe0SBastian Koppelmann TIN3_CDO = 2, 33848e06fe0SBastian Koppelmann TIN3_CDU = 3, 33948e06fe0SBastian Koppelmann TIN3_FCU = 4, 34048e06fe0SBastian Koppelmann TIN3_CSU = 5, 34148e06fe0SBastian Koppelmann TIN3_CTYP = 6, 34248e06fe0SBastian Koppelmann TIN3_NEST = 7, 34348e06fe0SBastian Koppelmann }; 34448e06fe0SBastian Koppelmann 34548e06fe0SBastian Koppelmann /* Class 4 TIN */ 34648e06fe0SBastian Koppelmann enum { 34748e06fe0SBastian Koppelmann TIN4_PSE = 1, 34848e06fe0SBastian Koppelmann TIN4_DSE = 2, 34948e06fe0SBastian Koppelmann TIN4_DAE = 3, 35048e06fe0SBastian Koppelmann TIN4_CAE = 4, 35148e06fe0SBastian Koppelmann TIN4_PIE = 5, 35248e06fe0SBastian Koppelmann TIN4_DIE = 6, 35348e06fe0SBastian Koppelmann }; 35448e06fe0SBastian Koppelmann 35548e06fe0SBastian Koppelmann /* Class 5 TIN */ 35648e06fe0SBastian Koppelmann enum { 35748e06fe0SBastian Koppelmann TIN5_OVF = 1, 35848e06fe0SBastian Koppelmann TIN5_SOVF = 1, 35948e06fe0SBastian Koppelmann }; 36048e06fe0SBastian Koppelmann 36148e06fe0SBastian Koppelmann /* Class 6 TIN 36248e06fe0SBastian Koppelmann * 36348e06fe0SBastian Koppelmann * Is always TIN6_SYS 36448e06fe0SBastian Koppelmann */ 36548e06fe0SBastian Koppelmann 36648e06fe0SBastian Koppelmann /* Class 7 TIN */ 36748e06fe0SBastian Koppelmann enum { 36848e06fe0SBastian Koppelmann TIN7_NMI = 0, 36948e06fe0SBastian Koppelmann }; 37048e06fe0SBastian Koppelmann 37148e06fe0SBastian Koppelmann uint32_t psw_read(CPUTriCoreState *env); 37248e06fe0SBastian Koppelmann void psw_write(CPUTriCoreState *env, uint32_t val); 37348e06fe0SBastian Koppelmann 374996a729fSBastian Koppelmann void fpu_set_state(CPUTriCoreState *env); 375996a729fSBastian Koppelmann 37648e06fe0SBastian Koppelmann #define MMU_USER_IDX 2 37748e06fe0SBastian Koppelmann 37848e06fe0SBastian Koppelmann void tricore_cpu_list(FILE *f, fprintf_function cpu_fprintf); 37948e06fe0SBastian Koppelmann 38048e06fe0SBastian Koppelmann #define cpu_signal_handler cpu_tricore_signal_handler 38148e06fe0SBastian Koppelmann #define cpu_list tricore_cpu_list 38248e06fe0SBastian Koppelmann 38397ed5ccdSBenjamin Herrenschmidt static inline int cpu_mmu_index(CPUTriCoreState *env, bool ifetch) 38448e06fe0SBastian Koppelmann { 38548e06fe0SBastian Koppelmann return 0; 38648e06fe0SBastian Koppelmann } 38748e06fe0SBastian Koppelmann 38848e06fe0SBastian Koppelmann 38948e06fe0SBastian Koppelmann 39048e06fe0SBastian Koppelmann #include "exec/cpu-all.h" 39148e06fe0SBastian Koppelmann 39248e06fe0SBastian Koppelmann enum { 39348e06fe0SBastian Koppelmann /* 1 bit to define user level / supervisor access */ 39448e06fe0SBastian Koppelmann ACCESS_USER = 0x00, 39548e06fe0SBastian Koppelmann ACCESS_SUPER = 0x01, 39648e06fe0SBastian Koppelmann /* 1 bit to indicate direction */ 39748e06fe0SBastian Koppelmann ACCESS_STORE = 0x02, 39848e06fe0SBastian Koppelmann /* Type of instruction that generated the access */ 39948e06fe0SBastian Koppelmann ACCESS_CODE = 0x10, /* Code fetch access */ 40048e06fe0SBastian Koppelmann ACCESS_INT = 0x20, /* Integer load/store access */ 40148e06fe0SBastian Koppelmann ACCESS_FLOAT = 0x30, /* floating point load/store access */ 40248e06fe0SBastian Koppelmann }; 40348e06fe0SBastian Koppelmann 40448e06fe0SBastian Koppelmann void cpu_state_reset(CPUTriCoreState *s); 40548e06fe0SBastian Koppelmann void tricore_tcg_init(void); 40648e06fe0SBastian Koppelmann int cpu_tricore_signal_handler(int host_signum, void *pinfo, void *puc); 40748e06fe0SBastian Koppelmann 40848e06fe0SBastian Koppelmann static inline void cpu_get_tb_cpu_state(CPUTriCoreState *env, target_ulong *pc, 40989fee74aSEmilio G. Cota target_ulong *cs_base, uint32_t *flags) 41048e06fe0SBastian Koppelmann { 41148e06fe0SBastian Koppelmann *pc = env->PC; 41248e06fe0SBastian Koppelmann *cs_base = 0; 41348e06fe0SBastian Koppelmann *flags = 0; 41448e06fe0SBastian Koppelmann } 41548e06fe0SBastian Koppelmann 416a6977312SIgor Mammedov #define cpu_init(cpu_model) cpu_generic_init(TYPE_TRICORE_CPU, cpu_model) 41748e06fe0SBastian Koppelmann 418b9ad9d5bSIgor Mammedov #define TRICORE_CPU_TYPE_SUFFIX "-" TYPE_TRICORE_CPU 419b9ad9d5bSIgor Mammedov #define TRICORE_CPU_TYPE_NAME(model) model TRICORE_CPU_TYPE_SUFFIX 42048e06fe0SBastian Koppelmann 42148e06fe0SBastian Koppelmann /* helpers.c */ 42248e06fe0SBastian Koppelmann int cpu_tricore_handle_mmu_fault(CPUState *cpu, target_ulong address, 42348e06fe0SBastian Koppelmann int rw, int mmu_idx); 42448e06fe0SBastian Koppelmann #define cpu_handle_mmu_fault cpu_tricore_handle_mmu_fault 42548e06fe0SBastian Koppelmann 42607f5a258SMarkus Armbruster #endif /* TRICORE_CPU_H */ 427