xref: /qemu/target/tricore/cpu.h (revision 40a1f64b468ee247fca3b237f0b89f066e59626c)
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  */
1948e06fe0SBastian Koppelmann #if !defined(__TRICORE_CPU_H__)
2048e06fe0SBastian Koppelmann #define __TRICORE_CPU_H__
2148e06fe0SBastian Koppelmann 
2248e06fe0SBastian Koppelmann #include "tricore-defs.h"
2348e06fe0SBastian Koppelmann #include "config.h"
2448e06fe0SBastian Koppelmann #include "qemu-common.h"
2548e06fe0SBastian Koppelmann #include "exec/cpu-defs.h"
2648e06fe0SBastian Koppelmann #include "fpu/softfloat.h"
2748e06fe0SBastian Koppelmann 
2848e06fe0SBastian Koppelmann #define ELF_MACHINE     EM_TRICORE
2948e06fe0SBastian Koppelmann 
3048e06fe0SBastian Koppelmann #define CPUArchState struct CPUTriCoreState
3148e06fe0SBastian Koppelmann 
3248e06fe0SBastian Koppelmann struct CPUTriCoreState;
3348e06fe0SBastian Koppelmann 
3448e06fe0SBastian Koppelmann struct tricore_boot_info;
3548e06fe0SBastian Koppelmann 
3648e06fe0SBastian Koppelmann #define NB_MMU_MODES 3
3748e06fe0SBastian Koppelmann 
3848e06fe0SBastian Koppelmann typedef struct tricore_def_t tricore_def_t;
3948e06fe0SBastian Koppelmann 
4048e06fe0SBastian Koppelmann typedef struct CPUTriCoreState CPUTriCoreState;
4148e06fe0SBastian Koppelmann struct CPUTriCoreState {
4248e06fe0SBastian Koppelmann     /* GPR Register */
4348e06fe0SBastian Koppelmann     uint32_t gpr_a[16];
4448e06fe0SBastian Koppelmann     uint32_t gpr_d[16];
4548e06fe0SBastian Koppelmann     /* CSFR Register */
4648e06fe0SBastian Koppelmann     uint32_t PCXI;
4748e06fe0SBastian Koppelmann /* Frequently accessed PSW_USB bits are stored separately for efficiency.
4848e06fe0SBastian Koppelmann        This contains all the other bits.  Use psw_{read,write} to access
4948e06fe0SBastian Koppelmann        the whole PSW.  */
5048e06fe0SBastian Koppelmann     uint32_t PSW;
5148e06fe0SBastian Koppelmann 
5248e06fe0SBastian Koppelmann     /* PSW flag cache for faster execution
5348e06fe0SBastian Koppelmann     */
5448e06fe0SBastian Koppelmann     uint32_t PSW_USB_C;
5548e06fe0SBastian Koppelmann     uint32_t PSW_USB_V;   /* Only if bit 31 set, then flag is set  */
5648e06fe0SBastian Koppelmann     uint32_t PSW_USB_SV;  /* Only if bit 31 set, then flag is set  */
5748e06fe0SBastian Koppelmann     uint32_t PSW_USB_AV;  /* Only if bit 31 set, then flag is set. */
5848e06fe0SBastian Koppelmann     uint32_t PSW_USB_SAV; /* Only if bit 31 set, then flag is set. */
5948e06fe0SBastian Koppelmann 
6048e06fe0SBastian Koppelmann     uint32_t PC;
6148e06fe0SBastian Koppelmann     uint32_t SYSCON;
6248e06fe0SBastian Koppelmann     uint32_t CPU_ID;
6348e06fe0SBastian Koppelmann     uint32_t BIV;
6448e06fe0SBastian Koppelmann     uint32_t BTV;
6548e06fe0SBastian Koppelmann     uint32_t ISP;
6648e06fe0SBastian Koppelmann     uint32_t ICR;
6748e06fe0SBastian Koppelmann     uint32_t FCX;
6848e06fe0SBastian Koppelmann     uint32_t LCX;
6948e06fe0SBastian Koppelmann     uint32_t COMPAT;
7048e06fe0SBastian Koppelmann 
7148e06fe0SBastian Koppelmann     /* Mem Protection Register */
7248e06fe0SBastian Koppelmann     uint32_t DPR0_0L;
7348e06fe0SBastian Koppelmann     uint32_t DPR0_0U;
7448e06fe0SBastian Koppelmann     uint32_t DPR0_1L;
7548e06fe0SBastian Koppelmann     uint32_t DPR0_1U;
7648e06fe0SBastian Koppelmann     uint32_t DPR0_2L;
7748e06fe0SBastian Koppelmann     uint32_t DPR0_2U;
7848e06fe0SBastian Koppelmann     uint32_t DPR0_3L;
7948e06fe0SBastian Koppelmann     uint32_t DPR0_3U;
8048e06fe0SBastian Koppelmann 
8148e06fe0SBastian Koppelmann     uint32_t DPR1_0L;
8248e06fe0SBastian Koppelmann     uint32_t DPR1_0U;
8348e06fe0SBastian Koppelmann     uint32_t DPR1_1L;
8448e06fe0SBastian Koppelmann     uint32_t DPR1_1U;
8548e06fe0SBastian Koppelmann     uint32_t DPR1_2L;
8648e06fe0SBastian Koppelmann     uint32_t DPR1_2U;
8748e06fe0SBastian Koppelmann     uint32_t DPR1_3L;
8848e06fe0SBastian Koppelmann     uint32_t DPR1_3U;
8948e06fe0SBastian Koppelmann 
9048e06fe0SBastian Koppelmann     uint32_t DPR2_0L;
9148e06fe0SBastian Koppelmann     uint32_t DPR2_0U;
9248e06fe0SBastian Koppelmann     uint32_t DPR2_1L;
9348e06fe0SBastian Koppelmann     uint32_t DPR2_1U;
9448e06fe0SBastian Koppelmann     uint32_t DPR2_2L;
9548e06fe0SBastian Koppelmann     uint32_t DPR2_2U;
9648e06fe0SBastian Koppelmann     uint32_t DPR2_3L;
9748e06fe0SBastian Koppelmann     uint32_t DPR2_3U;
9848e06fe0SBastian Koppelmann 
9948e06fe0SBastian Koppelmann     uint32_t DPR3_0L;
10048e06fe0SBastian Koppelmann     uint32_t DPR3_0U;
10148e06fe0SBastian Koppelmann     uint32_t DPR3_1L;
10248e06fe0SBastian Koppelmann     uint32_t DPR3_1U;
10348e06fe0SBastian Koppelmann     uint32_t DPR3_2L;
10448e06fe0SBastian Koppelmann     uint32_t DPR3_2U;
10548e06fe0SBastian Koppelmann     uint32_t DPR3_3L;
10648e06fe0SBastian Koppelmann     uint32_t DPR3_3U;
10748e06fe0SBastian Koppelmann 
10848e06fe0SBastian Koppelmann     uint32_t CPR0_0L;
10948e06fe0SBastian Koppelmann     uint32_t CPR0_0U;
11048e06fe0SBastian Koppelmann     uint32_t CPR0_1L;
11148e06fe0SBastian Koppelmann     uint32_t CPR0_1U;
11248e06fe0SBastian Koppelmann     uint32_t CPR0_2L;
11348e06fe0SBastian Koppelmann     uint32_t CPR0_2U;
11448e06fe0SBastian Koppelmann     uint32_t CPR0_3L;
11548e06fe0SBastian Koppelmann     uint32_t CPR0_3U;
11648e06fe0SBastian Koppelmann 
11748e06fe0SBastian Koppelmann     uint32_t CPR1_0L;
11848e06fe0SBastian Koppelmann     uint32_t CPR1_0U;
11948e06fe0SBastian Koppelmann     uint32_t CPR1_1L;
12048e06fe0SBastian Koppelmann     uint32_t CPR1_1U;
12148e06fe0SBastian Koppelmann     uint32_t CPR1_2L;
12248e06fe0SBastian Koppelmann     uint32_t CPR1_2U;
12348e06fe0SBastian Koppelmann     uint32_t CPR1_3L;
12448e06fe0SBastian Koppelmann     uint32_t CPR1_3U;
12548e06fe0SBastian Koppelmann 
12648e06fe0SBastian Koppelmann     uint32_t CPR2_0L;
12748e06fe0SBastian Koppelmann     uint32_t CPR2_0U;
12848e06fe0SBastian Koppelmann     uint32_t CPR2_1L;
12948e06fe0SBastian Koppelmann     uint32_t CPR2_1U;
13048e06fe0SBastian Koppelmann     uint32_t CPR2_2L;
13148e06fe0SBastian Koppelmann     uint32_t CPR2_2U;
13248e06fe0SBastian Koppelmann     uint32_t CPR2_3L;
13348e06fe0SBastian Koppelmann     uint32_t CPR2_3U;
13448e06fe0SBastian Koppelmann 
13548e06fe0SBastian Koppelmann     uint32_t CPR3_0L;
13648e06fe0SBastian Koppelmann     uint32_t CPR3_0U;
13748e06fe0SBastian Koppelmann     uint32_t CPR3_1L;
13848e06fe0SBastian Koppelmann     uint32_t CPR3_1U;
13948e06fe0SBastian Koppelmann     uint32_t CPR3_2L;
14048e06fe0SBastian Koppelmann     uint32_t CPR3_2U;
14148e06fe0SBastian Koppelmann     uint32_t CPR3_3L;
14248e06fe0SBastian Koppelmann     uint32_t CPR3_3U;
14348e06fe0SBastian Koppelmann 
14448e06fe0SBastian Koppelmann     uint32_t DPM0;
14548e06fe0SBastian Koppelmann     uint32_t DPM1;
14648e06fe0SBastian Koppelmann     uint32_t DPM2;
14748e06fe0SBastian Koppelmann     uint32_t DPM3;
14848e06fe0SBastian Koppelmann 
14948e06fe0SBastian Koppelmann     uint32_t CPM0;
15048e06fe0SBastian Koppelmann     uint32_t CPM1;
15148e06fe0SBastian Koppelmann     uint32_t CPM2;
15248e06fe0SBastian Koppelmann     uint32_t CPM3;
15348e06fe0SBastian Koppelmann 
15448e06fe0SBastian Koppelmann     /* Memory Management Registers */
15548e06fe0SBastian Koppelmann     uint32_t MMU_CON;
15648e06fe0SBastian Koppelmann     uint32_t MMU_ASI;
15748e06fe0SBastian Koppelmann     uint32_t MMU_TVA;
15848e06fe0SBastian Koppelmann     uint32_t MMU_TPA;
15948e06fe0SBastian Koppelmann     uint32_t MMU_TPX;
16048e06fe0SBastian Koppelmann     uint32_t MMU_TFA;
16148e06fe0SBastian Koppelmann     /* {1.3.1 only */
16248e06fe0SBastian Koppelmann     uint32_t BMACON;
16348e06fe0SBastian Koppelmann     uint32_t SMACON;
16448e06fe0SBastian Koppelmann     uint32_t DIEAR;
16548e06fe0SBastian Koppelmann     uint32_t DIETR;
16648e06fe0SBastian Koppelmann     uint32_t CCDIER;
16748e06fe0SBastian Koppelmann     uint32_t MIECON;
16848e06fe0SBastian Koppelmann     uint32_t PIEAR;
16948e06fe0SBastian Koppelmann     uint32_t PIETR;
17048e06fe0SBastian Koppelmann     uint32_t CCPIER;
17148e06fe0SBastian Koppelmann     /*} */
17248e06fe0SBastian Koppelmann     /* Debug Registers */
17348e06fe0SBastian Koppelmann     uint32_t DBGSR;
17448e06fe0SBastian Koppelmann     uint32_t EXEVT;
17548e06fe0SBastian Koppelmann     uint32_t CREVT;
17648e06fe0SBastian Koppelmann     uint32_t SWEVT;
17748e06fe0SBastian Koppelmann     uint32_t TR0EVT;
17848e06fe0SBastian Koppelmann     uint32_t TR1EVT;
17948e06fe0SBastian Koppelmann     uint32_t DMS;
18048e06fe0SBastian Koppelmann     uint32_t DCX;
18148e06fe0SBastian Koppelmann     uint32_t DBGTCR;
18248e06fe0SBastian Koppelmann     uint32_t CCTRL;
18348e06fe0SBastian Koppelmann     uint32_t CCNT;
18448e06fe0SBastian Koppelmann     uint32_t ICNT;
18548e06fe0SBastian Koppelmann     uint32_t M1CNT;
18648e06fe0SBastian Koppelmann     uint32_t M2CNT;
18748e06fe0SBastian Koppelmann     uint32_t M3CNT;
18848e06fe0SBastian Koppelmann     /* Floating Point Registers */
18948e06fe0SBastian Koppelmann     /* XXX: */
19048e06fe0SBastian Koppelmann 
19148e06fe0SBastian Koppelmann     /* QEMU */
19248e06fe0SBastian Koppelmann     int error_code;
19348e06fe0SBastian Koppelmann     uint32_t hflags;    /* CPU State */
19448e06fe0SBastian Koppelmann 
19548e06fe0SBastian Koppelmann     CPU_COMMON
19648e06fe0SBastian Koppelmann 
19748e06fe0SBastian Koppelmann     /* Internal CPU feature flags.  */
19848e06fe0SBastian Koppelmann     uint64_t features;
19948e06fe0SBastian Koppelmann 
20048e06fe0SBastian Koppelmann     const tricore_def_t *cpu_model;
20148e06fe0SBastian Koppelmann     void *irq[8];
20248e06fe0SBastian Koppelmann     struct QEMUTimer *timer; /* Internal timer */
20348e06fe0SBastian Koppelmann };
20448e06fe0SBastian Koppelmann 
20548e06fe0SBastian Koppelmann #define MASK_PCXI_PCPN 0xff000000
20648e06fe0SBastian Koppelmann #define MASK_PCXI_PIE  0x00800000
20748e06fe0SBastian Koppelmann #define MASK_PCXI_UL   0x00400000
20848e06fe0SBastian Koppelmann #define MASK_PCXI_PCXS 0x000f0000
20948e06fe0SBastian Koppelmann #define MASK_PCXI_PCXO 0x0000ffff
21048e06fe0SBastian Koppelmann 
21148e06fe0SBastian Koppelmann #define MASK_PSW_USB 0xff000000
21248e06fe0SBastian Koppelmann #define MASK_USB_C   0x80000000
21348e06fe0SBastian Koppelmann #define MASK_USB_V   0x40000000
21448e06fe0SBastian Koppelmann #define MASK_USB_SV  0x20000000
21548e06fe0SBastian Koppelmann #define MASK_USB_AV  0x10000000
21648e06fe0SBastian Koppelmann #define MASK_USB_SAV 0x08000000
21748e06fe0SBastian Koppelmann #define MASK_PSW_PRS 0x00003000
21848e06fe0SBastian Koppelmann #define MASK_PSW_IO  0x00000c00
21948e06fe0SBastian Koppelmann #define MASK_PSW_IS  0x00000200
22048e06fe0SBastian Koppelmann #define MASK_PSW_GW  0x00000100
22148e06fe0SBastian Koppelmann #define MASK_PSW_CDE 0x00000080
22248e06fe0SBastian Koppelmann #define MASK_PSW_CDC 0x0000007f
22348e06fe0SBastian Koppelmann 
22448e06fe0SBastian Koppelmann #define MASK_SYSCON_PRO_TEN 0x2
22548e06fe0SBastian Koppelmann #define MASK_SYSCON_FCD_SF  0x1
22648e06fe0SBastian Koppelmann 
22748e06fe0SBastian Koppelmann #define MASK_CPUID_MOD     0xffff0000
22848e06fe0SBastian Koppelmann #define MASK_CPUID_MOD_32B 0x0000ff00
22948e06fe0SBastian Koppelmann #define MASK_CPUID_REV     0x000000ff
23048e06fe0SBastian Koppelmann 
23148e06fe0SBastian Koppelmann #define MASK_ICR_PIPN 0x00ff0000
23248e06fe0SBastian Koppelmann #define MASK_ICR_IE   0x00000100
23348e06fe0SBastian Koppelmann #define MASK_ICR_CCPN 0x000000ff
23448e06fe0SBastian Koppelmann 
23548e06fe0SBastian Koppelmann #define MASK_FCX_FCXS 0x000f0000
23648e06fe0SBastian Koppelmann #define MASK_FCX_FCXO 0x0000ffff
23748e06fe0SBastian Koppelmann 
23848e06fe0SBastian Koppelmann #define MASK_LCX_LCXS 0x000f0000
23948e06fe0SBastian Koppelmann #define MASK_LCX_LCX0 0x0000ffff
24048e06fe0SBastian Koppelmann 
24140a1f64bSBastian Koppelmann #define TRICORE_HFLAG_KUU     0x3
24248e06fe0SBastian Koppelmann #define TRICORE_HFLAG_UM0     0x00002 /* user mode-0 flag          */
24348e06fe0SBastian Koppelmann #define TRICORE_HFLAG_UM1     0x00001 /* user mode-1 flag          */
24448e06fe0SBastian Koppelmann #define TRICORE_HFLAG_SM      0x00000 /* kernel mode flag          */
24548e06fe0SBastian Koppelmann 
24648e06fe0SBastian Koppelmann enum tricore_features {
24748e06fe0SBastian Koppelmann     TRICORE_FEATURE_13,
24848e06fe0SBastian Koppelmann     TRICORE_FEATURE_131,
24948e06fe0SBastian Koppelmann     TRICORE_FEATURE_16,
25048e06fe0SBastian Koppelmann };
25148e06fe0SBastian Koppelmann 
25248e06fe0SBastian Koppelmann static inline int tricore_feature(CPUTriCoreState *env, int feature)
25348e06fe0SBastian Koppelmann {
25448e06fe0SBastian Koppelmann     return (env->features & (1ULL << feature)) != 0;
25548e06fe0SBastian Koppelmann }
25648e06fe0SBastian Koppelmann 
25748e06fe0SBastian Koppelmann /* TriCore Traps Classes*/
25848e06fe0SBastian Koppelmann enum {
25948e06fe0SBastian Koppelmann     TRAPC_NONE     = -1,
26048e06fe0SBastian Koppelmann     TRAPC_MMU      = 0,
26148e06fe0SBastian Koppelmann     TRAPC_PROT     = 1,
26248e06fe0SBastian Koppelmann     TRAPC_INSN_ERR = 2,
26348e06fe0SBastian Koppelmann     TRAPC_CTX_MNG  = 3,
26448e06fe0SBastian Koppelmann     TRAPC_SYSBUS   = 4,
26548e06fe0SBastian Koppelmann     TRAPC_ASSERT   = 5,
26648e06fe0SBastian Koppelmann     TRAPC_SYSCALL  = 6,
26748e06fe0SBastian Koppelmann     TRAPC_NMI      = 7,
26848e06fe0SBastian Koppelmann };
26948e06fe0SBastian Koppelmann 
27048e06fe0SBastian Koppelmann /* Class 0 TIN */
27148e06fe0SBastian Koppelmann enum {
27248e06fe0SBastian Koppelmann     TIN0_VAF = 0,
27348e06fe0SBastian Koppelmann     TIN0_VAP = 1,
27448e06fe0SBastian Koppelmann };
27548e06fe0SBastian Koppelmann 
27648e06fe0SBastian Koppelmann /* Class 1 TIN */
27748e06fe0SBastian Koppelmann enum {
27848e06fe0SBastian Koppelmann     TIN1_PRIV = 1,
27948e06fe0SBastian Koppelmann     TIN1_MPR  = 2,
28048e06fe0SBastian Koppelmann     TIN1_MPW  = 3,
28148e06fe0SBastian Koppelmann     TIN1_MPX  = 4,
28248e06fe0SBastian Koppelmann     TIN1_MPP  = 5,
28348e06fe0SBastian Koppelmann     TIN1_MPN  = 6,
28448e06fe0SBastian Koppelmann     TIN1_GRWP = 7,
28548e06fe0SBastian Koppelmann };
28648e06fe0SBastian Koppelmann 
28748e06fe0SBastian Koppelmann /* Class 2 TIN */
28848e06fe0SBastian Koppelmann enum {
28948e06fe0SBastian Koppelmann     TIN2_IOPC = 1,
29048e06fe0SBastian Koppelmann     TIN2_UOPC = 2,
29148e06fe0SBastian Koppelmann     TIN2_OPD  = 3,
29248e06fe0SBastian Koppelmann     TIN2_ALN  = 4,
29348e06fe0SBastian Koppelmann     TIN2_MEM  = 5,
29448e06fe0SBastian Koppelmann };
29548e06fe0SBastian Koppelmann 
29648e06fe0SBastian Koppelmann /* Class 3 TIN */
29748e06fe0SBastian Koppelmann enum {
29848e06fe0SBastian Koppelmann     TIN3_FCD  = 1,
29948e06fe0SBastian Koppelmann     TIN3_CDO  = 2,
30048e06fe0SBastian Koppelmann     TIN3_CDU  = 3,
30148e06fe0SBastian Koppelmann     TIN3_FCU  = 4,
30248e06fe0SBastian Koppelmann     TIN3_CSU  = 5,
30348e06fe0SBastian Koppelmann     TIN3_CTYP = 6,
30448e06fe0SBastian Koppelmann     TIN3_NEST = 7,
30548e06fe0SBastian Koppelmann };
30648e06fe0SBastian Koppelmann 
30748e06fe0SBastian Koppelmann /* Class 4 TIN */
30848e06fe0SBastian Koppelmann enum {
30948e06fe0SBastian Koppelmann     TIN4_PSE = 1,
31048e06fe0SBastian Koppelmann     TIN4_DSE = 2,
31148e06fe0SBastian Koppelmann     TIN4_DAE = 3,
31248e06fe0SBastian Koppelmann     TIN4_CAE = 4,
31348e06fe0SBastian Koppelmann     TIN4_PIE = 5,
31448e06fe0SBastian Koppelmann     TIN4_DIE = 6,
31548e06fe0SBastian Koppelmann };
31648e06fe0SBastian Koppelmann 
31748e06fe0SBastian Koppelmann /* Class 5 TIN */
31848e06fe0SBastian Koppelmann enum {
31948e06fe0SBastian Koppelmann     TIN5_OVF  = 1,
32048e06fe0SBastian Koppelmann     TIN5_SOVF = 1,
32148e06fe0SBastian Koppelmann };
32248e06fe0SBastian Koppelmann 
32348e06fe0SBastian Koppelmann /* Class 6 TIN
32448e06fe0SBastian Koppelmann  *
32548e06fe0SBastian Koppelmann  * Is always TIN6_SYS
32648e06fe0SBastian Koppelmann  */
32748e06fe0SBastian Koppelmann 
32848e06fe0SBastian Koppelmann /* Class 7 TIN */
32948e06fe0SBastian Koppelmann enum {
33048e06fe0SBastian Koppelmann     TIN7_NMI = 0,
33148e06fe0SBastian Koppelmann };
33248e06fe0SBastian Koppelmann 
33348e06fe0SBastian Koppelmann uint32_t psw_read(CPUTriCoreState *env);
33448e06fe0SBastian Koppelmann void psw_write(CPUTriCoreState *env, uint32_t val);
33548e06fe0SBastian Koppelmann 
33648e06fe0SBastian Koppelmann #include "cpu-qom.h"
33748e06fe0SBastian Koppelmann #define MMU_USER_IDX 2
33848e06fe0SBastian Koppelmann 
33948e06fe0SBastian Koppelmann void tricore_cpu_list(FILE *f, fprintf_function cpu_fprintf);
34048e06fe0SBastian Koppelmann 
34148e06fe0SBastian Koppelmann #define cpu_exec cpu_tricore_exec
34248e06fe0SBastian Koppelmann #define cpu_signal_handler cpu_tricore_signal_handler
34348e06fe0SBastian Koppelmann #define cpu_list tricore_cpu_list
34448e06fe0SBastian Koppelmann 
34548e06fe0SBastian Koppelmann static inline int cpu_mmu_index(CPUTriCoreState *env)
34648e06fe0SBastian Koppelmann {
34748e06fe0SBastian Koppelmann     return 0;
34848e06fe0SBastian Koppelmann }
34948e06fe0SBastian Koppelmann 
35048e06fe0SBastian Koppelmann 
35148e06fe0SBastian Koppelmann 
35248e06fe0SBastian Koppelmann #include "exec/cpu-all.h"
35348e06fe0SBastian Koppelmann 
35448e06fe0SBastian Koppelmann enum {
35548e06fe0SBastian Koppelmann     /* 1 bit to define user level / supervisor access */
35648e06fe0SBastian Koppelmann     ACCESS_USER  = 0x00,
35748e06fe0SBastian Koppelmann     ACCESS_SUPER = 0x01,
35848e06fe0SBastian Koppelmann     /* 1 bit to indicate direction */
35948e06fe0SBastian Koppelmann     ACCESS_STORE = 0x02,
36048e06fe0SBastian Koppelmann     /* Type of instruction that generated the access */
36148e06fe0SBastian Koppelmann     ACCESS_CODE  = 0x10, /* Code fetch access                */
36248e06fe0SBastian Koppelmann     ACCESS_INT   = 0x20, /* Integer load/store access        */
36348e06fe0SBastian Koppelmann     ACCESS_FLOAT = 0x30, /* floating point load/store access */
36448e06fe0SBastian Koppelmann };
36548e06fe0SBastian Koppelmann 
36648e06fe0SBastian Koppelmann void cpu_state_reset(CPUTriCoreState *s);
36748e06fe0SBastian Koppelmann int cpu_tricore_exec(CPUTriCoreState *s);
36848e06fe0SBastian Koppelmann void tricore_tcg_init(void);
36948e06fe0SBastian Koppelmann int cpu_tricore_signal_handler(int host_signum, void *pinfo, void *puc);
37048e06fe0SBastian Koppelmann 
37148e06fe0SBastian Koppelmann static inline void cpu_get_tb_cpu_state(CPUTriCoreState *env, target_ulong *pc,
37248e06fe0SBastian Koppelmann                                         target_ulong *cs_base, int *flags)
37348e06fe0SBastian Koppelmann {
37448e06fe0SBastian Koppelmann     *pc = env->PC;
37548e06fe0SBastian Koppelmann     *cs_base = 0;
37648e06fe0SBastian Koppelmann     *flags = 0;
37748e06fe0SBastian Koppelmann }
37848e06fe0SBastian Koppelmann 
37948e06fe0SBastian Koppelmann TriCoreCPU *cpu_tricore_init(const char *cpu_model);
38048e06fe0SBastian Koppelmann 
38148e06fe0SBastian Koppelmann static inline CPUTriCoreState *cpu_init(const char *cpu_model)
38248e06fe0SBastian Koppelmann {
38348e06fe0SBastian Koppelmann     TriCoreCPU *cpu = cpu_tricore_init(cpu_model);
38448e06fe0SBastian Koppelmann     if (cpu == NULL) {
38548e06fe0SBastian Koppelmann         return NULL;
38648e06fe0SBastian Koppelmann     }
38748e06fe0SBastian Koppelmann     return &cpu->env;
38848e06fe0SBastian Koppelmann 
38948e06fe0SBastian Koppelmann }
39048e06fe0SBastian Koppelmann 
39148e06fe0SBastian Koppelmann 
39248e06fe0SBastian Koppelmann /* helpers.c */
39348e06fe0SBastian Koppelmann int cpu_tricore_handle_mmu_fault(CPUState *cpu, target_ulong address,
39448e06fe0SBastian Koppelmann                                  int rw, int mmu_idx);
39548e06fe0SBastian Koppelmann #define cpu_handle_mmu_fault cpu_tricore_handle_mmu_fault
39648e06fe0SBastian Koppelmann 
39748e06fe0SBastian Koppelmann #include "exec/exec-all.h"
39848e06fe0SBastian Koppelmann 
39948e06fe0SBastian Koppelmann static inline void cpu_pc_from_tb(CPUTriCoreState *env, TranslationBlock *tb)
40048e06fe0SBastian Koppelmann {
40148e06fe0SBastian Koppelmann     env->PC = tb->pc;
40248e06fe0SBastian Koppelmann }
40348e06fe0SBastian Koppelmann 
40448e06fe0SBastian Koppelmann #endif /*__TRICORE_CPU_H__ */
405