xref: /qemu/target/tricore/cpu.h (revision ce46335c9f31f9eea1736d9c2d3a11d3a8c2cb6b)
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