xref: /qemu/target/tricore/cpu.h (revision 5b146dc716cfd247f99556c04e6e46fbd67565a0)
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
902754acdSThomas Huth  * version 2.1 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 "qemu-common.h"
24fc111b10SPaolo Bonzini #include "cpu-qom.h"
2548e06fe0SBastian Koppelmann #include "exec/cpu-defs.h"
2674433bf0SRichard Henderson #include "tricore-defs.h"
2748e06fe0SBastian Koppelmann 
2848e06fe0SBastian Koppelmann struct tricore_boot_info;
2948e06fe0SBastian Koppelmann 
3048e06fe0SBastian Koppelmann typedef struct tricore_def_t tricore_def_t;
3148e06fe0SBastian Koppelmann 
3248e06fe0SBastian Koppelmann typedef struct CPUTriCoreState CPUTriCoreState;
3348e06fe0SBastian Koppelmann struct CPUTriCoreState {
3448e06fe0SBastian Koppelmann     /* GPR Register */
3548e06fe0SBastian Koppelmann     uint32_t gpr_a[16];
3648e06fe0SBastian Koppelmann     uint32_t gpr_d[16];
3748e06fe0SBastian Koppelmann     /* CSFR Register */
3848e06fe0SBastian Koppelmann     uint32_t PCXI;
3948e06fe0SBastian Koppelmann /* Frequently accessed PSW_USB bits are stored separately for efficiency.
4048e06fe0SBastian Koppelmann        This contains all the other bits.  Use psw_{read,write} to access
4148e06fe0SBastian Koppelmann        the whole PSW.  */
4248e06fe0SBastian Koppelmann     uint32_t PSW;
4348e06fe0SBastian Koppelmann 
4448e06fe0SBastian Koppelmann     /* PSW flag cache for faster execution
4548e06fe0SBastian Koppelmann     */
4648e06fe0SBastian Koppelmann     uint32_t PSW_USB_C;
4748e06fe0SBastian Koppelmann     uint32_t PSW_USB_V;   /* Only if bit 31 set, then flag is set  */
4848e06fe0SBastian Koppelmann     uint32_t PSW_USB_SV;  /* Only if bit 31 set, then flag is set  */
4948e06fe0SBastian Koppelmann     uint32_t PSW_USB_AV;  /* Only if bit 31 set, then flag is set. */
5048e06fe0SBastian Koppelmann     uint32_t PSW_USB_SAV; /* Only if bit 31 set, then flag is set. */
5148e06fe0SBastian Koppelmann 
5248e06fe0SBastian Koppelmann     uint32_t PC;
5348e06fe0SBastian Koppelmann     uint32_t SYSCON;
5448e06fe0SBastian Koppelmann     uint32_t CPU_ID;
5504e62411SDavid Brenken     uint32_t CORE_ID;
5648e06fe0SBastian Koppelmann     uint32_t BIV;
5748e06fe0SBastian Koppelmann     uint32_t BTV;
5848e06fe0SBastian Koppelmann     uint32_t ISP;
5948e06fe0SBastian Koppelmann     uint32_t ICR;
6048e06fe0SBastian Koppelmann     uint32_t FCX;
6148e06fe0SBastian Koppelmann     uint32_t LCX;
6248e06fe0SBastian Koppelmann     uint32_t COMPAT;
6348e06fe0SBastian Koppelmann 
6448e06fe0SBastian Koppelmann     /* Mem Protection Register */
6548e06fe0SBastian Koppelmann     uint32_t DPR0_0L;
6648e06fe0SBastian Koppelmann     uint32_t DPR0_0U;
6748e06fe0SBastian Koppelmann     uint32_t DPR0_1L;
6848e06fe0SBastian Koppelmann     uint32_t DPR0_1U;
6948e06fe0SBastian Koppelmann     uint32_t DPR0_2L;
7048e06fe0SBastian Koppelmann     uint32_t DPR0_2U;
7148e06fe0SBastian Koppelmann     uint32_t DPR0_3L;
7248e06fe0SBastian Koppelmann     uint32_t DPR0_3U;
7348e06fe0SBastian Koppelmann 
7448e06fe0SBastian Koppelmann     uint32_t DPR1_0L;
7548e06fe0SBastian Koppelmann     uint32_t DPR1_0U;
7648e06fe0SBastian Koppelmann     uint32_t DPR1_1L;
7748e06fe0SBastian Koppelmann     uint32_t DPR1_1U;
7848e06fe0SBastian Koppelmann     uint32_t DPR1_2L;
7948e06fe0SBastian Koppelmann     uint32_t DPR1_2U;
8048e06fe0SBastian Koppelmann     uint32_t DPR1_3L;
8148e06fe0SBastian Koppelmann     uint32_t DPR1_3U;
8248e06fe0SBastian Koppelmann 
8348e06fe0SBastian Koppelmann     uint32_t DPR2_0L;
8448e06fe0SBastian Koppelmann     uint32_t DPR2_0U;
8548e06fe0SBastian Koppelmann     uint32_t DPR2_1L;
8648e06fe0SBastian Koppelmann     uint32_t DPR2_1U;
8748e06fe0SBastian Koppelmann     uint32_t DPR2_2L;
8848e06fe0SBastian Koppelmann     uint32_t DPR2_2U;
8948e06fe0SBastian Koppelmann     uint32_t DPR2_3L;
9048e06fe0SBastian Koppelmann     uint32_t DPR2_3U;
9148e06fe0SBastian Koppelmann 
9248e06fe0SBastian Koppelmann     uint32_t DPR3_0L;
9348e06fe0SBastian Koppelmann     uint32_t DPR3_0U;
9448e06fe0SBastian Koppelmann     uint32_t DPR3_1L;
9548e06fe0SBastian Koppelmann     uint32_t DPR3_1U;
9648e06fe0SBastian Koppelmann     uint32_t DPR3_2L;
9748e06fe0SBastian Koppelmann     uint32_t DPR3_2U;
9848e06fe0SBastian Koppelmann     uint32_t DPR3_3L;
9948e06fe0SBastian Koppelmann     uint32_t DPR3_3U;
10048e06fe0SBastian Koppelmann 
10148e06fe0SBastian Koppelmann     uint32_t CPR0_0L;
10248e06fe0SBastian Koppelmann     uint32_t CPR0_0U;
10348e06fe0SBastian Koppelmann     uint32_t CPR0_1L;
10448e06fe0SBastian Koppelmann     uint32_t CPR0_1U;
10548e06fe0SBastian Koppelmann     uint32_t CPR0_2L;
10648e06fe0SBastian Koppelmann     uint32_t CPR0_2U;
10748e06fe0SBastian Koppelmann     uint32_t CPR0_3L;
10848e06fe0SBastian Koppelmann     uint32_t CPR0_3U;
10948e06fe0SBastian Koppelmann 
11048e06fe0SBastian Koppelmann     uint32_t CPR1_0L;
11148e06fe0SBastian Koppelmann     uint32_t CPR1_0U;
11248e06fe0SBastian Koppelmann     uint32_t CPR1_1L;
11348e06fe0SBastian Koppelmann     uint32_t CPR1_1U;
11448e06fe0SBastian Koppelmann     uint32_t CPR1_2L;
11548e06fe0SBastian Koppelmann     uint32_t CPR1_2U;
11648e06fe0SBastian Koppelmann     uint32_t CPR1_3L;
11748e06fe0SBastian Koppelmann     uint32_t CPR1_3U;
11848e06fe0SBastian Koppelmann 
11948e06fe0SBastian Koppelmann     uint32_t CPR2_0L;
12048e06fe0SBastian Koppelmann     uint32_t CPR2_0U;
12148e06fe0SBastian Koppelmann     uint32_t CPR2_1L;
12248e06fe0SBastian Koppelmann     uint32_t CPR2_1U;
12348e06fe0SBastian Koppelmann     uint32_t CPR2_2L;
12448e06fe0SBastian Koppelmann     uint32_t CPR2_2U;
12548e06fe0SBastian Koppelmann     uint32_t CPR2_3L;
12648e06fe0SBastian Koppelmann     uint32_t CPR2_3U;
12748e06fe0SBastian Koppelmann 
12848e06fe0SBastian Koppelmann     uint32_t CPR3_0L;
12948e06fe0SBastian Koppelmann     uint32_t CPR3_0U;
13048e06fe0SBastian Koppelmann     uint32_t CPR3_1L;
13148e06fe0SBastian Koppelmann     uint32_t CPR3_1U;
13248e06fe0SBastian Koppelmann     uint32_t CPR3_2L;
13348e06fe0SBastian Koppelmann     uint32_t CPR3_2U;
13448e06fe0SBastian Koppelmann     uint32_t CPR3_3L;
13548e06fe0SBastian Koppelmann     uint32_t CPR3_3U;
13648e06fe0SBastian Koppelmann 
13748e06fe0SBastian Koppelmann     uint32_t DPM0;
13848e06fe0SBastian Koppelmann     uint32_t DPM1;
13948e06fe0SBastian Koppelmann     uint32_t DPM2;
14048e06fe0SBastian Koppelmann     uint32_t DPM3;
14148e06fe0SBastian Koppelmann 
14248e06fe0SBastian Koppelmann     uint32_t CPM0;
14348e06fe0SBastian Koppelmann     uint32_t CPM1;
14448e06fe0SBastian Koppelmann     uint32_t CPM2;
14548e06fe0SBastian Koppelmann     uint32_t CPM3;
14648e06fe0SBastian Koppelmann 
14748e06fe0SBastian Koppelmann     /* Memory Management Registers */
14848e06fe0SBastian Koppelmann     uint32_t MMU_CON;
14948e06fe0SBastian Koppelmann     uint32_t MMU_ASI;
15048e06fe0SBastian Koppelmann     uint32_t MMU_TVA;
15148e06fe0SBastian Koppelmann     uint32_t MMU_TPA;
15248e06fe0SBastian Koppelmann     uint32_t MMU_TPX;
15348e06fe0SBastian Koppelmann     uint32_t MMU_TFA;
15448e06fe0SBastian Koppelmann     /* {1.3.1 only */
15548e06fe0SBastian Koppelmann     uint32_t BMACON;
15648e06fe0SBastian Koppelmann     uint32_t SMACON;
15748e06fe0SBastian Koppelmann     uint32_t DIEAR;
15848e06fe0SBastian Koppelmann     uint32_t DIETR;
15948e06fe0SBastian Koppelmann     uint32_t CCDIER;
16048e06fe0SBastian Koppelmann     uint32_t MIECON;
16148e06fe0SBastian Koppelmann     uint32_t PIEAR;
16248e06fe0SBastian Koppelmann     uint32_t PIETR;
16348e06fe0SBastian Koppelmann     uint32_t CCPIER;
16448e06fe0SBastian Koppelmann     /*} */
16548e06fe0SBastian Koppelmann     /* Debug Registers */
16648e06fe0SBastian Koppelmann     uint32_t DBGSR;
16748e06fe0SBastian Koppelmann     uint32_t EXEVT;
16848e06fe0SBastian Koppelmann     uint32_t CREVT;
16948e06fe0SBastian Koppelmann     uint32_t SWEVT;
17048e06fe0SBastian Koppelmann     uint32_t TR0EVT;
17148e06fe0SBastian Koppelmann     uint32_t TR1EVT;
17248e06fe0SBastian Koppelmann     uint32_t DMS;
17348e06fe0SBastian Koppelmann     uint32_t DCX;
17448e06fe0SBastian Koppelmann     uint32_t DBGTCR;
17548e06fe0SBastian Koppelmann     uint32_t CCTRL;
17648e06fe0SBastian Koppelmann     uint32_t CCNT;
17748e06fe0SBastian Koppelmann     uint32_t ICNT;
17848e06fe0SBastian Koppelmann     uint32_t M1CNT;
17948e06fe0SBastian Koppelmann     uint32_t M2CNT;
18048e06fe0SBastian Koppelmann     uint32_t M3CNT;
18148e06fe0SBastian Koppelmann     /* Floating Point Registers */
182996a729fSBastian Koppelmann     float_status fp_status;
18348e06fe0SBastian Koppelmann     /* QEMU */
18448e06fe0SBastian Koppelmann     int error_code;
18548e06fe0SBastian Koppelmann     uint32_t hflags;    /* CPU State */
18648e06fe0SBastian Koppelmann 
18748e06fe0SBastian Koppelmann     CPU_COMMON
18848e06fe0SBastian Koppelmann 
18948e06fe0SBastian Koppelmann     /* Internal CPU feature flags.  */
19048e06fe0SBastian Koppelmann     uint64_t features;
19148e06fe0SBastian Koppelmann 
19248e06fe0SBastian Koppelmann     const tricore_def_t *cpu_model;
19348e06fe0SBastian Koppelmann     void *irq[8];
19448e06fe0SBastian Koppelmann     struct QEMUTimer *timer; /* Internal timer */
19548e06fe0SBastian Koppelmann };
19648e06fe0SBastian Koppelmann 
197fc111b10SPaolo Bonzini /**
198fc111b10SPaolo Bonzini  * TriCoreCPU:
199fc111b10SPaolo Bonzini  * @env: #CPUTriCoreState
200fc111b10SPaolo Bonzini  *
201fc111b10SPaolo Bonzini  * A TriCore CPU.
202fc111b10SPaolo Bonzini  */
203fc111b10SPaolo Bonzini struct TriCoreCPU {
204fc111b10SPaolo Bonzini     /*< private >*/
205fc111b10SPaolo Bonzini     CPUState parent_obj;
206fc111b10SPaolo Bonzini     /*< public >*/
207fc111b10SPaolo Bonzini 
208*5b146dc7SRichard Henderson     CPUNegativeOffsetState neg;
209fc111b10SPaolo Bonzini     CPUTriCoreState env;
210fc111b10SPaolo Bonzini };
211fc111b10SPaolo Bonzini 
212fc111b10SPaolo Bonzini 
213fc111b10SPaolo Bonzini hwaddr tricore_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
21490c84c56SMarkus Armbruster void tricore_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
215fc111b10SPaolo Bonzini 
216fc111b10SPaolo Bonzini 
21748e06fe0SBastian Koppelmann #define MASK_PCXI_PCPN 0xff000000
218ce46335cSDavid Brenken #define MASK_PCXI_PIE_1_3  0x00800000
219ce46335cSDavid Brenken #define MASK_PCXI_PIE_1_6  0x00200000
22048e06fe0SBastian Koppelmann #define MASK_PCXI_UL   0x00400000
22148e06fe0SBastian Koppelmann #define MASK_PCXI_PCXS 0x000f0000
22248e06fe0SBastian Koppelmann #define MASK_PCXI_PCXO 0x0000ffff
22348e06fe0SBastian Koppelmann 
22448e06fe0SBastian Koppelmann #define MASK_PSW_USB 0xff000000
22548e06fe0SBastian Koppelmann #define MASK_USB_C   0x80000000
22648e06fe0SBastian Koppelmann #define MASK_USB_V   0x40000000
22748e06fe0SBastian Koppelmann #define MASK_USB_SV  0x20000000
22848e06fe0SBastian Koppelmann #define MASK_USB_AV  0x10000000
22948e06fe0SBastian Koppelmann #define MASK_USB_SAV 0x08000000
23048e06fe0SBastian Koppelmann #define MASK_PSW_PRS 0x00003000
23148e06fe0SBastian Koppelmann #define MASK_PSW_IO  0x00000c00
23248e06fe0SBastian Koppelmann #define MASK_PSW_IS  0x00000200
23348e06fe0SBastian Koppelmann #define MASK_PSW_GW  0x00000100
23448e06fe0SBastian Koppelmann #define MASK_PSW_CDE 0x00000080
23548e06fe0SBastian Koppelmann #define MASK_PSW_CDC 0x0000007f
236996a729fSBastian Koppelmann #define MASK_PSW_FPU_RM 0x3000000
23748e06fe0SBastian Koppelmann 
23848e06fe0SBastian Koppelmann #define MASK_SYSCON_PRO_TEN 0x2
23948e06fe0SBastian Koppelmann #define MASK_SYSCON_FCD_SF  0x1
24048e06fe0SBastian Koppelmann 
24148e06fe0SBastian Koppelmann #define MASK_CPUID_MOD     0xffff0000
24248e06fe0SBastian Koppelmann #define MASK_CPUID_MOD_32B 0x0000ff00
24348e06fe0SBastian Koppelmann #define MASK_CPUID_REV     0x000000ff
24448e06fe0SBastian Koppelmann 
24548e06fe0SBastian Koppelmann #define MASK_ICR_PIPN 0x00ff0000
246d1cbc28aSDavid Brenken #define MASK_ICR_IE_1_3   0x00000100
247d1cbc28aSDavid Brenken #define MASK_ICR_IE_1_6   0x00008000
24848e06fe0SBastian Koppelmann #define MASK_ICR_CCPN 0x000000ff
24948e06fe0SBastian Koppelmann 
25048e06fe0SBastian Koppelmann #define MASK_FCX_FCXS 0x000f0000
25148e06fe0SBastian Koppelmann #define MASK_FCX_FCXO 0x0000ffff
25248e06fe0SBastian Koppelmann 
25348e06fe0SBastian Koppelmann #define MASK_LCX_LCXS 0x000f0000
25448e06fe0SBastian Koppelmann #define MASK_LCX_LCX0 0x0000ffff
25548e06fe0SBastian Koppelmann 
256b724b012SBastian Koppelmann #define MASK_DBGSR_DE 0x1
257b724b012SBastian Koppelmann #define MASK_DBGSR_HALT 0x6
258b724b012SBastian Koppelmann #define MASK_DBGSR_SUSP 0x10
259b724b012SBastian Koppelmann #define MASK_DBGSR_PREVSUSP 0x20
260b724b012SBastian Koppelmann #define MASK_DBGSR_PEVT 0x40
261b724b012SBastian Koppelmann #define MASK_DBGSR_EVTSRC 0x1f00
262b724b012SBastian Koppelmann 
26340a1f64bSBastian Koppelmann #define TRICORE_HFLAG_KUU     0x3
26448e06fe0SBastian Koppelmann #define TRICORE_HFLAG_UM0     0x00002 /* user mode-0 flag          */
26548e06fe0SBastian Koppelmann #define TRICORE_HFLAG_UM1     0x00001 /* user mode-1 flag          */
26648e06fe0SBastian Koppelmann #define TRICORE_HFLAG_SM      0x00000 /* kernel mode flag          */
26748e06fe0SBastian Koppelmann 
26848e06fe0SBastian Koppelmann enum tricore_features {
26948e06fe0SBastian Koppelmann     TRICORE_FEATURE_13,
27048e06fe0SBastian Koppelmann     TRICORE_FEATURE_131,
27148e06fe0SBastian Koppelmann     TRICORE_FEATURE_16,
2726d2afc8aSBastian Koppelmann     TRICORE_FEATURE_161,
27348e06fe0SBastian Koppelmann };
27448e06fe0SBastian Koppelmann 
27548e06fe0SBastian Koppelmann static inline int tricore_feature(CPUTriCoreState *env, int feature)
27648e06fe0SBastian Koppelmann {
27748e06fe0SBastian Koppelmann     return (env->features & (1ULL << feature)) != 0;
27848e06fe0SBastian Koppelmann }
27948e06fe0SBastian Koppelmann 
28048e06fe0SBastian Koppelmann /* TriCore Traps Classes*/
28148e06fe0SBastian Koppelmann enum {
28248e06fe0SBastian Koppelmann     TRAPC_NONE     = -1,
28348e06fe0SBastian Koppelmann     TRAPC_MMU      = 0,
28448e06fe0SBastian Koppelmann     TRAPC_PROT     = 1,
28548e06fe0SBastian Koppelmann     TRAPC_INSN_ERR = 2,
28648e06fe0SBastian Koppelmann     TRAPC_CTX_MNG  = 3,
28748e06fe0SBastian Koppelmann     TRAPC_SYSBUS   = 4,
28848e06fe0SBastian Koppelmann     TRAPC_ASSERT   = 5,
28948e06fe0SBastian Koppelmann     TRAPC_SYSCALL  = 6,
29048e06fe0SBastian Koppelmann     TRAPC_NMI      = 7,
291518d7fd2SBastian Koppelmann     TRAPC_IRQ      = 8
29248e06fe0SBastian Koppelmann };
29348e06fe0SBastian Koppelmann 
29448e06fe0SBastian Koppelmann /* Class 0 TIN */
29548e06fe0SBastian Koppelmann enum {
29648e06fe0SBastian Koppelmann     TIN0_VAF = 0,
29748e06fe0SBastian Koppelmann     TIN0_VAP = 1,
29848e06fe0SBastian Koppelmann };
29948e06fe0SBastian Koppelmann 
30048e06fe0SBastian Koppelmann /* Class 1 TIN */
30148e06fe0SBastian Koppelmann enum {
30248e06fe0SBastian Koppelmann     TIN1_PRIV = 1,
30348e06fe0SBastian Koppelmann     TIN1_MPR  = 2,
30448e06fe0SBastian Koppelmann     TIN1_MPW  = 3,
30548e06fe0SBastian Koppelmann     TIN1_MPX  = 4,
30648e06fe0SBastian Koppelmann     TIN1_MPP  = 5,
30748e06fe0SBastian Koppelmann     TIN1_MPN  = 6,
30848e06fe0SBastian Koppelmann     TIN1_GRWP = 7,
30948e06fe0SBastian Koppelmann };
31048e06fe0SBastian Koppelmann 
31148e06fe0SBastian Koppelmann /* Class 2 TIN */
31248e06fe0SBastian Koppelmann enum {
31348e06fe0SBastian Koppelmann     TIN2_IOPC = 1,
31448e06fe0SBastian Koppelmann     TIN2_UOPC = 2,
31548e06fe0SBastian Koppelmann     TIN2_OPD  = 3,
31648e06fe0SBastian Koppelmann     TIN2_ALN  = 4,
31748e06fe0SBastian Koppelmann     TIN2_MEM  = 5,
31848e06fe0SBastian Koppelmann };
31948e06fe0SBastian Koppelmann 
32048e06fe0SBastian Koppelmann /* Class 3 TIN */
32148e06fe0SBastian Koppelmann enum {
32248e06fe0SBastian Koppelmann     TIN3_FCD  = 1,
32348e06fe0SBastian Koppelmann     TIN3_CDO  = 2,
32448e06fe0SBastian Koppelmann     TIN3_CDU  = 3,
32548e06fe0SBastian Koppelmann     TIN3_FCU  = 4,
32648e06fe0SBastian Koppelmann     TIN3_CSU  = 5,
32748e06fe0SBastian Koppelmann     TIN3_CTYP = 6,
32848e06fe0SBastian Koppelmann     TIN3_NEST = 7,
32948e06fe0SBastian Koppelmann };
33048e06fe0SBastian Koppelmann 
33148e06fe0SBastian Koppelmann /* Class 4 TIN */
33248e06fe0SBastian Koppelmann enum {
33348e06fe0SBastian Koppelmann     TIN4_PSE = 1,
33448e06fe0SBastian Koppelmann     TIN4_DSE = 2,
33548e06fe0SBastian Koppelmann     TIN4_DAE = 3,
33648e06fe0SBastian Koppelmann     TIN4_CAE = 4,
33748e06fe0SBastian Koppelmann     TIN4_PIE = 5,
33848e06fe0SBastian Koppelmann     TIN4_DIE = 6,
33948e06fe0SBastian Koppelmann };
34048e06fe0SBastian Koppelmann 
34148e06fe0SBastian Koppelmann /* Class 5 TIN */
34248e06fe0SBastian Koppelmann enum {
34348e06fe0SBastian Koppelmann     TIN5_OVF  = 1,
34448e06fe0SBastian Koppelmann     TIN5_SOVF = 1,
34548e06fe0SBastian Koppelmann };
34648e06fe0SBastian Koppelmann 
34748e06fe0SBastian Koppelmann /* Class 6 TIN
34848e06fe0SBastian Koppelmann  *
34948e06fe0SBastian Koppelmann  * Is always TIN6_SYS
35048e06fe0SBastian Koppelmann  */
35148e06fe0SBastian Koppelmann 
35248e06fe0SBastian Koppelmann /* Class 7 TIN */
35348e06fe0SBastian Koppelmann enum {
35448e06fe0SBastian Koppelmann     TIN7_NMI = 0,
35548e06fe0SBastian Koppelmann };
35648e06fe0SBastian Koppelmann 
35748e06fe0SBastian Koppelmann uint32_t psw_read(CPUTriCoreState *env);
35848e06fe0SBastian Koppelmann void psw_write(CPUTriCoreState *env, uint32_t val);
35948e06fe0SBastian Koppelmann 
360996a729fSBastian Koppelmann void fpu_set_state(CPUTriCoreState *env);
361996a729fSBastian Koppelmann 
36248e06fe0SBastian Koppelmann #define MMU_USER_IDX 2
36348e06fe0SBastian Koppelmann 
3640442428aSMarkus Armbruster void tricore_cpu_list(void);
36548e06fe0SBastian Koppelmann 
36648e06fe0SBastian Koppelmann #define cpu_signal_handler cpu_tricore_signal_handler
36748e06fe0SBastian Koppelmann #define cpu_list tricore_cpu_list
36848e06fe0SBastian Koppelmann 
36997ed5ccdSBenjamin Herrenschmidt static inline int cpu_mmu_index(CPUTriCoreState *env, bool ifetch)
37048e06fe0SBastian Koppelmann {
37148e06fe0SBastian Koppelmann     return 0;
37248e06fe0SBastian Koppelmann }
37348e06fe0SBastian Koppelmann 
3744f7c64b3SRichard Henderson typedef CPUTriCoreState CPUArchState;
3752161a612SRichard Henderson typedef TriCoreCPU ArchCPU;
37648e06fe0SBastian Koppelmann 
37748e06fe0SBastian Koppelmann #include "exec/cpu-all.h"
37848e06fe0SBastian Koppelmann 
37948e06fe0SBastian Koppelmann enum {
38048e06fe0SBastian Koppelmann     /* 1 bit to define user level / supervisor access */
38148e06fe0SBastian Koppelmann     ACCESS_USER  = 0x00,
38248e06fe0SBastian Koppelmann     ACCESS_SUPER = 0x01,
38348e06fe0SBastian Koppelmann     /* 1 bit to indicate direction */
38448e06fe0SBastian Koppelmann     ACCESS_STORE = 0x02,
38548e06fe0SBastian Koppelmann     /* Type of instruction that generated the access */
38648e06fe0SBastian Koppelmann     ACCESS_CODE  = 0x10, /* Code fetch access                */
38748e06fe0SBastian Koppelmann     ACCESS_INT   = 0x20, /* Integer load/store access        */
38848e06fe0SBastian Koppelmann     ACCESS_FLOAT = 0x30, /* floating point load/store access */
38948e06fe0SBastian Koppelmann };
39048e06fe0SBastian Koppelmann 
39148e06fe0SBastian Koppelmann void cpu_state_reset(CPUTriCoreState *s);
39248e06fe0SBastian Koppelmann void tricore_tcg_init(void);
39348e06fe0SBastian Koppelmann int cpu_tricore_signal_handler(int host_signum, void *pinfo, void *puc);
39448e06fe0SBastian Koppelmann 
39548e06fe0SBastian Koppelmann static inline void cpu_get_tb_cpu_state(CPUTriCoreState *env, target_ulong *pc,
39689fee74aSEmilio G. Cota                                         target_ulong *cs_base, uint32_t *flags)
39748e06fe0SBastian Koppelmann {
39848e06fe0SBastian Koppelmann     *pc = env->PC;
39948e06fe0SBastian Koppelmann     *cs_base = 0;
40048e06fe0SBastian Koppelmann     *flags = 0;
40148e06fe0SBastian Koppelmann }
40248e06fe0SBastian Koppelmann 
403b9ad9d5bSIgor Mammedov #define TRICORE_CPU_TYPE_SUFFIX "-" TYPE_TRICORE_CPU
404b9ad9d5bSIgor Mammedov #define TRICORE_CPU_TYPE_NAME(model) model TRICORE_CPU_TYPE_SUFFIX
4050dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_TRICORE_CPU
40648e06fe0SBastian Koppelmann 
40748e06fe0SBastian Koppelmann /* helpers.c */
40868d6eee7SRichard Henderson bool tricore_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
40968d6eee7SRichard Henderson                           MMUAccessType access_type, int mmu_idx,
41068d6eee7SRichard Henderson                           bool probe, uintptr_t retaddr);
41148e06fe0SBastian Koppelmann 
41207f5a258SMarkus Armbruster #endif /* TRICORE_CPU_H */
413