xref: /qemu/target/tricore/cpu.h (revision 878d1b6a90173d61859f1b5083266d2bbc3db17c)
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 
23fc111b10SPaolo Bonzini #include "cpu-qom.h"
24343cdf2cSBastian Koppelmann #include "hw/registerfields.h"
2548e06fe0SBastian Koppelmann #include "exec/cpu-defs.h"
2669242e7eSMarc-André Lureau #include "qemu/cpu-float.h"
2774433bf0SRichard Henderson #include "tricore-defs.h"
2848e06fe0SBastian Koppelmann 
291ea4a06aSPhilippe Mathieu-Daudé typedef struct CPUArchState {
3048e06fe0SBastian Koppelmann     /* GPR Register */
3148e06fe0SBastian Koppelmann     uint32_t gpr_a[16];
3248e06fe0SBastian Koppelmann     uint32_t gpr_d[16];
3348e06fe0SBastian Koppelmann     /* CSFR Register */
3448e06fe0SBastian Koppelmann     uint32_t PCXI;
3548e06fe0SBastian Koppelmann /* Frequently accessed PSW_USB bits are stored separately for efficiency.
3648e06fe0SBastian Koppelmann        This contains all the other bits.  Use psw_{read,write} to access
3748e06fe0SBastian Koppelmann        the whole PSW.  */
3848e06fe0SBastian Koppelmann     uint32_t PSW;
3948e06fe0SBastian Koppelmann 
4048e06fe0SBastian Koppelmann     /* PSW flag cache for faster execution
4148e06fe0SBastian Koppelmann     */
4248e06fe0SBastian Koppelmann     uint32_t PSW_USB_C;
4348e06fe0SBastian Koppelmann     uint32_t PSW_USB_V;   /* Only if bit 31 set, then flag is set  */
4448e06fe0SBastian Koppelmann     uint32_t PSW_USB_SV;  /* Only if bit 31 set, then flag is set  */
4548e06fe0SBastian Koppelmann     uint32_t PSW_USB_AV;  /* Only if bit 31 set, then flag is set. */
4648e06fe0SBastian Koppelmann     uint32_t PSW_USB_SAV; /* Only if bit 31 set, then flag is set. */
4748e06fe0SBastian Koppelmann 
4848e06fe0SBastian Koppelmann     uint32_t PC;
4948e06fe0SBastian Koppelmann     uint32_t SYSCON;
5048e06fe0SBastian Koppelmann     uint32_t CPU_ID;
5104e62411SDavid Brenken     uint32_t CORE_ID;
5248e06fe0SBastian Koppelmann     uint32_t BIV;
5348e06fe0SBastian Koppelmann     uint32_t BTV;
5448e06fe0SBastian Koppelmann     uint32_t ISP;
5548e06fe0SBastian Koppelmann     uint32_t ICR;
5648e06fe0SBastian Koppelmann     uint32_t FCX;
5748e06fe0SBastian Koppelmann     uint32_t LCX;
5848e06fe0SBastian Koppelmann     uint32_t COMPAT;
5948e06fe0SBastian Koppelmann 
6048e06fe0SBastian Koppelmann     /* Mem Protection Register */
6148e06fe0SBastian Koppelmann     uint32_t DPR0_0L;
6248e06fe0SBastian Koppelmann     uint32_t DPR0_0U;
6348e06fe0SBastian Koppelmann     uint32_t DPR0_1L;
6448e06fe0SBastian Koppelmann     uint32_t DPR0_1U;
6548e06fe0SBastian Koppelmann     uint32_t DPR0_2L;
6648e06fe0SBastian Koppelmann     uint32_t DPR0_2U;
6748e06fe0SBastian Koppelmann     uint32_t DPR0_3L;
6848e06fe0SBastian Koppelmann     uint32_t DPR0_3U;
6948e06fe0SBastian Koppelmann 
7048e06fe0SBastian Koppelmann     uint32_t DPR1_0L;
7148e06fe0SBastian Koppelmann     uint32_t DPR1_0U;
7248e06fe0SBastian Koppelmann     uint32_t DPR1_1L;
7348e06fe0SBastian Koppelmann     uint32_t DPR1_1U;
7448e06fe0SBastian Koppelmann     uint32_t DPR1_2L;
7548e06fe0SBastian Koppelmann     uint32_t DPR1_2U;
7648e06fe0SBastian Koppelmann     uint32_t DPR1_3L;
7748e06fe0SBastian Koppelmann     uint32_t DPR1_3U;
7848e06fe0SBastian Koppelmann 
7948e06fe0SBastian Koppelmann     uint32_t DPR2_0L;
8048e06fe0SBastian Koppelmann     uint32_t DPR2_0U;
8148e06fe0SBastian Koppelmann     uint32_t DPR2_1L;
8248e06fe0SBastian Koppelmann     uint32_t DPR2_1U;
8348e06fe0SBastian Koppelmann     uint32_t DPR2_2L;
8448e06fe0SBastian Koppelmann     uint32_t DPR2_2U;
8548e06fe0SBastian Koppelmann     uint32_t DPR2_3L;
8648e06fe0SBastian Koppelmann     uint32_t DPR2_3U;
8748e06fe0SBastian Koppelmann 
8848e06fe0SBastian Koppelmann     uint32_t DPR3_0L;
8948e06fe0SBastian Koppelmann     uint32_t DPR3_0U;
9048e06fe0SBastian Koppelmann     uint32_t DPR3_1L;
9148e06fe0SBastian Koppelmann     uint32_t DPR3_1U;
9248e06fe0SBastian Koppelmann     uint32_t DPR3_2L;
9348e06fe0SBastian Koppelmann     uint32_t DPR3_2U;
9448e06fe0SBastian Koppelmann     uint32_t DPR3_3L;
9548e06fe0SBastian Koppelmann     uint32_t DPR3_3U;
9648e06fe0SBastian Koppelmann 
9748e06fe0SBastian Koppelmann     uint32_t CPR0_0L;
9848e06fe0SBastian Koppelmann     uint32_t CPR0_0U;
9948e06fe0SBastian Koppelmann     uint32_t CPR0_1L;
10048e06fe0SBastian Koppelmann     uint32_t CPR0_1U;
10148e06fe0SBastian Koppelmann     uint32_t CPR0_2L;
10248e06fe0SBastian Koppelmann     uint32_t CPR0_2U;
10348e06fe0SBastian Koppelmann     uint32_t CPR0_3L;
10448e06fe0SBastian Koppelmann     uint32_t CPR0_3U;
10548e06fe0SBastian Koppelmann 
10648e06fe0SBastian Koppelmann     uint32_t CPR1_0L;
10748e06fe0SBastian Koppelmann     uint32_t CPR1_0U;
10848e06fe0SBastian Koppelmann     uint32_t CPR1_1L;
10948e06fe0SBastian Koppelmann     uint32_t CPR1_1U;
11048e06fe0SBastian Koppelmann     uint32_t CPR1_2L;
11148e06fe0SBastian Koppelmann     uint32_t CPR1_2U;
11248e06fe0SBastian Koppelmann     uint32_t CPR1_3L;
11348e06fe0SBastian Koppelmann     uint32_t CPR1_3U;
11448e06fe0SBastian Koppelmann 
11548e06fe0SBastian Koppelmann     uint32_t CPR2_0L;
11648e06fe0SBastian Koppelmann     uint32_t CPR2_0U;
11748e06fe0SBastian Koppelmann     uint32_t CPR2_1L;
11848e06fe0SBastian Koppelmann     uint32_t CPR2_1U;
11948e06fe0SBastian Koppelmann     uint32_t CPR2_2L;
12048e06fe0SBastian Koppelmann     uint32_t CPR2_2U;
12148e06fe0SBastian Koppelmann     uint32_t CPR2_3L;
12248e06fe0SBastian Koppelmann     uint32_t CPR2_3U;
12348e06fe0SBastian Koppelmann 
12448e06fe0SBastian Koppelmann     uint32_t CPR3_0L;
12548e06fe0SBastian Koppelmann     uint32_t CPR3_0U;
12648e06fe0SBastian Koppelmann     uint32_t CPR3_1L;
12748e06fe0SBastian Koppelmann     uint32_t CPR3_1U;
12848e06fe0SBastian Koppelmann     uint32_t CPR3_2L;
12948e06fe0SBastian Koppelmann     uint32_t CPR3_2U;
13048e06fe0SBastian Koppelmann     uint32_t CPR3_3L;
13148e06fe0SBastian Koppelmann     uint32_t CPR3_3U;
13248e06fe0SBastian Koppelmann 
13348e06fe0SBastian Koppelmann     uint32_t DPM0;
13448e06fe0SBastian Koppelmann     uint32_t DPM1;
13548e06fe0SBastian Koppelmann     uint32_t DPM2;
13648e06fe0SBastian Koppelmann     uint32_t DPM3;
13748e06fe0SBastian Koppelmann 
13848e06fe0SBastian Koppelmann     uint32_t CPM0;
13948e06fe0SBastian Koppelmann     uint32_t CPM1;
14048e06fe0SBastian Koppelmann     uint32_t CPM2;
14148e06fe0SBastian Koppelmann     uint32_t CPM3;
14248e06fe0SBastian Koppelmann 
14348e06fe0SBastian Koppelmann     /* Memory Management Registers */
14448e06fe0SBastian Koppelmann     uint32_t MMU_CON;
14548e06fe0SBastian Koppelmann     uint32_t MMU_ASI;
14648e06fe0SBastian Koppelmann     uint32_t MMU_TVA;
14748e06fe0SBastian Koppelmann     uint32_t MMU_TPA;
14848e06fe0SBastian Koppelmann     uint32_t MMU_TPX;
14948e06fe0SBastian Koppelmann     uint32_t MMU_TFA;
15048e06fe0SBastian Koppelmann     /* {1.3.1 only */
15148e06fe0SBastian Koppelmann     uint32_t BMACON;
15248e06fe0SBastian Koppelmann     uint32_t SMACON;
15348e06fe0SBastian Koppelmann     uint32_t DIEAR;
15448e06fe0SBastian Koppelmann     uint32_t DIETR;
15548e06fe0SBastian Koppelmann     uint32_t CCDIER;
15648e06fe0SBastian Koppelmann     uint32_t MIECON;
15748e06fe0SBastian Koppelmann     uint32_t PIEAR;
15848e06fe0SBastian Koppelmann     uint32_t PIETR;
15948e06fe0SBastian Koppelmann     uint32_t CCPIER;
16048e06fe0SBastian Koppelmann     /*} */
16148e06fe0SBastian Koppelmann     /* Debug Registers */
16248e06fe0SBastian Koppelmann     uint32_t DBGSR;
16348e06fe0SBastian Koppelmann     uint32_t EXEVT;
16448e06fe0SBastian Koppelmann     uint32_t CREVT;
16548e06fe0SBastian Koppelmann     uint32_t SWEVT;
16648e06fe0SBastian Koppelmann     uint32_t TR0EVT;
16748e06fe0SBastian Koppelmann     uint32_t TR1EVT;
16848e06fe0SBastian Koppelmann     uint32_t DMS;
16948e06fe0SBastian Koppelmann     uint32_t DCX;
17048e06fe0SBastian Koppelmann     uint32_t DBGTCR;
17148e06fe0SBastian Koppelmann     uint32_t CCTRL;
17248e06fe0SBastian Koppelmann     uint32_t CCNT;
17348e06fe0SBastian Koppelmann     uint32_t ICNT;
17448e06fe0SBastian Koppelmann     uint32_t M1CNT;
17548e06fe0SBastian Koppelmann     uint32_t M2CNT;
17648e06fe0SBastian Koppelmann     uint32_t M3CNT;
17748e06fe0SBastian Koppelmann     /* Floating Point Registers */
178996a729fSBastian Koppelmann     float_status fp_status;
17948e06fe0SBastian Koppelmann 
18048e06fe0SBastian Koppelmann     /* Internal CPU feature flags.  */
18148e06fe0SBastian Koppelmann     uint64_t features;
1821ea4a06aSPhilippe Mathieu-Daudé } CPUTriCoreState;
18348e06fe0SBastian Koppelmann 
184fc111b10SPaolo Bonzini /**
185fc111b10SPaolo Bonzini  * TriCoreCPU:
186fc111b10SPaolo Bonzini  * @env: #CPUTriCoreState
187fc111b10SPaolo Bonzini  *
188fc111b10SPaolo Bonzini  * A TriCore CPU.
189fc111b10SPaolo Bonzini  */
190b36e239eSPhilippe Mathieu-Daudé struct ArchCPU {
191fc111b10SPaolo Bonzini     /*< private >*/
192fc111b10SPaolo Bonzini     CPUState parent_obj;
193fc111b10SPaolo Bonzini     /*< public >*/
194fc111b10SPaolo Bonzini 
1955b146dc7SRichard Henderson     CPUNegativeOffsetState neg;
196fc111b10SPaolo Bonzini     CPUTriCoreState env;
197fc111b10SPaolo Bonzini };
198fc111b10SPaolo Bonzini 
199fc111b10SPaolo Bonzini 
200fc111b10SPaolo Bonzini hwaddr tricore_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
20190c84c56SMarkus Armbruster void tricore_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
202fc111b10SPaolo Bonzini 
203343cdf2cSBastian Koppelmann FIELD(PCXI, PCPN_13, 24, 8)
204343cdf2cSBastian Koppelmann FIELD(PCXI, PCPN_161, 22, 8)
205343cdf2cSBastian Koppelmann FIELD(PCXI, PIE_13, 23, 1)
206343cdf2cSBastian Koppelmann FIELD(PCXI, PIE_161, 21, 1)
207343cdf2cSBastian Koppelmann FIELD(PCXI, UL_13, 22, 1)
208343cdf2cSBastian Koppelmann FIELD(PCXI, UL_161, 20, 1)
209343cdf2cSBastian Koppelmann FIELD(PCXI, PCXS, 16, 4)
210343cdf2cSBastian Koppelmann FIELD(PCXI, PCXO, 0, 16)
211343cdf2cSBastian Koppelmann uint32_t pcxi_get_ul(CPUTriCoreState *env);
212343cdf2cSBastian Koppelmann uint32_t pcxi_get_pie(CPUTriCoreState *env);
213343cdf2cSBastian Koppelmann uint32_t pcxi_get_pcpn(CPUTriCoreState *env);
214343cdf2cSBastian Koppelmann uint32_t pcxi_get_pcxs(CPUTriCoreState *env);
215343cdf2cSBastian Koppelmann uint32_t pcxi_get_pcxo(CPUTriCoreState *env);
216343cdf2cSBastian Koppelmann void pcxi_set_ul(CPUTriCoreState *env, uint32_t val);
217343cdf2cSBastian Koppelmann void pcxi_set_pie(CPUTriCoreState *env, uint32_t val);
218343cdf2cSBastian Koppelmann void pcxi_set_pcpn(CPUTriCoreState *env, uint32_t val);
219fc111b10SPaolo Bonzini 
220343cdf2cSBastian Koppelmann FIELD(ICR, IE_161, 15, 1)
221343cdf2cSBastian Koppelmann FIELD(ICR, IE_13, 8, 1)
222343cdf2cSBastian Koppelmann FIELD(ICR, PIPN, 16, 8)
223343cdf2cSBastian Koppelmann FIELD(ICR, CCPN, 0, 8)
224343cdf2cSBastian Koppelmann 
225343cdf2cSBastian Koppelmann uint32_t icr_get_ie(CPUTriCoreState *env);
226343cdf2cSBastian Koppelmann uint32_t icr_get_ccpn(CPUTriCoreState *env);
227343cdf2cSBastian Koppelmann 
228343cdf2cSBastian Koppelmann void icr_set_ccpn(CPUTriCoreState *env, uint32_t val);
229343cdf2cSBastian Koppelmann void icr_set_ie(CPUTriCoreState *env, uint32_t val);
23048e06fe0SBastian Koppelmann 
23148e06fe0SBastian Koppelmann #define MASK_PSW_USB 0xff000000
23248e06fe0SBastian Koppelmann #define MASK_USB_C   0x80000000
23348e06fe0SBastian Koppelmann #define MASK_USB_V   0x40000000
23448e06fe0SBastian Koppelmann #define MASK_USB_SV  0x20000000
23548e06fe0SBastian Koppelmann #define MASK_USB_AV  0x10000000
23648e06fe0SBastian Koppelmann #define MASK_USB_SAV 0x08000000
23748e06fe0SBastian Koppelmann #define MASK_PSW_PRS 0x00003000
23848e06fe0SBastian Koppelmann #define MASK_PSW_IO  0x00000c00
23948e06fe0SBastian Koppelmann #define MASK_PSW_IS  0x00000200
24048e06fe0SBastian Koppelmann #define MASK_PSW_GW  0x00000100
24148e06fe0SBastian Koppelmann #define MASK_PSW_CDE 0x00000080
24248e06fe0SBastian Koppelmann #define MASK_PSW_CDC 0x0000007f
243996a729fSBastian Koppelmann #define MASK_PSW_FPU_RM 0x3000000
24448e06fe0SBastian Koppelmann 
24548e06fe0SBastian Koppelmann #define MASK_SYSCON_PRO_TEN 0x2
24648e06fe0SBastian Koppelmann #define MASK_SYSCON_FCD_SF  0x1
24748e06fe0SBastian Koppelmann 
24848e06fe0SBastian Koppelmann #define MASK_CPUID_MOD     0xffff0000
24948e06fe0SBastian Koppelmann #define MASK_CPUID_MOD_32B 0x0000ff00
25048e06fe0SBastian Koppelmann #define MASK_CPUID_REV     0x000000ff
25148e06fe0SBastian Koppelmann 
25248e06fe0SBastian Koppelmann 
25348e06fe0SBastian Koppelmann #define MASK_FCX_FCXS 0x000f0000
25448e06fe0SBastian Koppelmann #define MASK_FCX_FCXO 0x0000ffff
25548e06fe0SBastian Koppelmann 
25648e06fe0SBastian Koppelmann #define MASK_LCX_LCXS 0x000f0000
25748e06fe0SBastian Koppelmann #define MASK_LCX_LCX0 0x0000ffff
25848e06fe0SBastian Koppelmann 
259b724b012SBastian Koppelmann #define MASK_DBGSR_DE 0x1
260b724b012SBastian Koppelmann #define MASK_DBGSR_HALT 0x6
261b724b012SBastian Koppelmann #define MASK_DBGSR_SUSP 0x10
262b724b012SBastian Koppelmann #define MASK_DBGSR_PREVSUSP 0x20
263b724b012SBastian Koppelmann #define MASK_DBGSR_PEVT 0x40
264b724b012SBastian Koppelmann #define MASK_DBGSR_EVTSRC 0x1f00
265b724b012SBastian Koppelmann 
266*878d1b6aSBastian Koppelmann enum tricore_priv_levels {
267*878d1b6aSBastian Koppelmann     TRICORE_PRIV_UM0 = 0x0, /* user mode-0 flag */
268*878d1b6aSBastian Koppelmann     TRICORE_PRIV_UM1 = 0x1, /* user mode-1 flag */
269*878d1b6aSBastian Koppelmann     TRICORE_PRIV_SM  = 0x2, /* kernel mode flag */
270*878d1b6aSBastian Koppelmann };
27148e06fe0SBastian Koppelmann 
27248e06fe0SBastian Koppelmann enum tricore_features {
27348e06fe0SBastian Koppelmann     TRICORE_FEATURE_13,
27448e06fe0SBastian Koppelmann     TRICORE_FEATURE_131,
27548e06fe0SBastian Koppelmann     TRICORE_FEATURE_16,
2766d2afc8aSBastian Koppelmann     TRICORE_FEATURE_161,
2774d2b2e76SBastian Koppelmann     TRICORE_FEATURE_162,
27848e06fe0SBastian Koppelmann };
27948e06fe0SBastian Koppelmann 
28048e06fe0SBastian Koppelmann static inline int tricore_feature(CPUTriCoreState *env, int feature)
28148e06fe0SBastian Koppelmann {
28248e06fe0SBastian Koppelmann     return (env->features & (1ULL << feature)) != 0;
28348e06fe0SBastian Koppelmann }
28448e06fe0SBastian Koppelmann 
28548e06fe0SBastian Koppelmann /* TriCore Traps Classes*/
28648e06fe0SBastian Koppelmann enum {
28748e06fe0SBastian Koppelmann     TRAPC_NONE     = -1,
28848e06fe0SBastian Koppelmann     TRAPC_MMU      = 0,
28948e06fe0SBastian Koppelmann     TRAPC_PROT     = 1,
29048e06fe0SBastian Koppelmann     TRAPC_INSN_ERR = 2,
29148e06fe0SBastian Koppelmann     TRAPC_CTX_MNG  = 3,
29248e06fe0SBastian Koppelmann     TRAPC_SYSBUS   = 4,
29348e06fe0SBastian Koppelmann     TRAPC_ASSERT   = 5,
29448e06fe0SBastian Koppelmann     TRAPC_SYSCALL  = 6,
29548e06fe0SBastian Koppelmann     TRAPC_NMI      = 7,
296518d7fd2SBastian Koppelmann     TRAPC_IRQ      = 8
29748e06fe0SBastian Koppelmann };
29848e06fe0SBastian Koppelmann 
29948e06fe0SBastian Koppelmann /* Class 0 TIN */
30048e06fe0SBastian Koppelmann enum {
30148e06fe0SBastian Koppelmann     TIN0_VAF = 0,
30248e06fe0SBastian Koppelmann     TIN0_VAP = 1,
30348e06fe0SBastian Koppelmann };
30448e06fe0SBastian Koppelmann 
30548e06fe0SBastian Koppelmann /* Class 1 TIN */
30648e06fe0SBastian Koppelmann enum {
30748e06fe0SBastian Koppelmann     TIN1_PRIV = 1,
30848e06fe0SBastian Koppelmann     TIN1_MPR  = 2,
30948e06fe0SBastian Koppelmann     TIN1_MPW  = 3,
31048e06fe0SBastian Koppelmann     TIN1_MPX  = 4,
31148e06fe0SBastian Koppelmann     TIN1_MPP  = 5,
31248e06fe0SBastian Koppelmann     TIN1_MPN  = 6,
31348e06fe0SBastian Koppelmann     TIN1_GRWP = 7,
31448e06fe0SBastian Koppelmann };
31548e06fe0SBastian Koppelmann 
31648e06fe0SBastian Koppelmann /* Class 2 TIN */
31748e06fe0SBastian Koppelmann enum {
31848e06fe0SBastian Koppelmann     TIN2_IOPC = 1,
31948e06fe0SBastian Koppelmann     TIN2_UOPC = 2,
32048e06fe0SBastian Koppelmann     TIN2_OPD  = 3,
32148e06fe0SBastian Koppelmann     TIN2_ALN  = 4,
32248e06fe0SBastian Koppelmann     TIN2_MEM  = 5,
32348e06fe0SBastian Koppelmann };
32448e06fe0SBastian Koppelmann 
32548e06fe0SBastian Koppelmann /* Class 3 TIN */
32648e06fe0SBastian Koppelmann enum {
32748e06fe0SBastian Koppelmann     TIN3_FCD  = 1,
32848e06fe0SBastian Koppelmann     TIN3_CDO  = 2,
32948e06fe0SBastian Koppelmann     TIN3_CDU  = 3,
33048e06fe0SBastian Koppelmann     TIN3_FCU  = 4,
33148e06fe0SBastian Koppelmann     TIN3_CSU  = 5,
33248e06fe0SBastian Koppelmann     TIN3_CTYP = 6,
33348e06fe0SBastian Koppelmann     TIN3_NEST = 7,
33448e06fe0SBastian Koppelmann };
33548e06fe0SBastian Koppelmann 
33648e06fe0SBastian Koppelmann /* Class 4 TIN */
33748e06fe0SBastian Koppelmann enum {
33848e06fe0SBastian Koppelmann     TIN4_PSE = 1,
33948e06fe0SBastian Koppelmann     TIN4_DSE = 2,
34048e06fe0SBastian Koppelmann     TIN4_DAE = 3,
34148e06fe0SBastian Koppelmann     TIN4_CAE = 4,
34248e06fe0SBastian Koppelmann     TIN4_PIE = 5,
34348e06fe0SBastian Koppelmann     TIN4_DIE = 6,
34448e06fe0SBastian Koppelmann };
34548e06fe0SBastian Koppelmann 
34648e06fe0SBastian Koppelmann /* Class 5 TIN */
34748e06fe0SBastian Koppelmann enum {
34848e06fe0SBastian Koppelmann     TIN5_OVF  = 1,
34948e06fe0SBastian Koppelmann     TIN5_SOVF = 1,
35048e06fe0SBastian Koppelmann };
35148e06fe0SBastian Koppelmann 
35248e06fe0SBastian Koppelmann /* Class 6 TIN
35348e06fe0SBastian Koppelmann  *
35448e06fe0SBastian Koppelmann  * Is always TIN6_SYS
35548e06fe0SBastian Koppelmann  */
35648e06fe0SBastian Koppelmann 
35748e06fe0SBastian Koppelmann /* Class 7 TIN */
35848e06fe0SBastian Koppelmann enum {
35948e06fe0SBastian Koppelmann     TIN7_NMI = 0,
36048e06fe0SBastian Koppelmann };
36148e06fe0SBastian Koppelmann 
36248e06fe0SBastian Koppelmann uint32_t psw_read(CPUTriCoreState *env);
36348e06fe0SBastian Koppelmann void psw_write(CPUTriCoreState *env, uint32_t val);
364d127de3bSBastian Koppelmann int tricore_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n);
365d127de3bSBastian Koppelmann int tricore_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n);
36648e06fe0SBastian Koppelmann 
367996a729fSBastian Koppelmann void fpu_set_state(CPUTriCoreState *env);
368996a729fSBastian Koppelmann 
36948e06fe0SBastian Koppelmann #define MMU_USER_IDX 2
37048e06fe0SBastian Koppelmann 
3710442428aSMarkus Armbruster void tricore_cpu_list(void);
37248e06fe0SBastian Koppelmann 
37348e06fe0SBastian Koppelmann #define cpu_list tricore_cpu_list
37448e06fe0SBastian Koppelmann 
37597ed5ccdSBenjamin Herrenschmidt static inline int cpu_mmu_index(CPUTriCoreState *env, bool ifetch)
37648e06fe0SBastian Koppelmann {
37748e06fe0SBastian Koppelmann     return 0;
37848e06fe0SBastian Koppelmann }
37948e06fe0SBastian Koppelmann 
38048e06fe0SBastian Koppelmann #include "exec/cpu-all.h"
38148e06fe0SBastian Koppelmann 
382*878d1b6aSBastian Koppelmann FIELD(TB_FLAGS, PRIV, 0, 2)
383*878d1b6aSBastian Koppelmann 
38448e06fe0SBastian Koppelmann void cpu_state_reset(CPUTriCoreState *s);
38548e06fe0SBastian Koppelmann void tricore_tcg_init(void);
38648e06fe0SBastian Koppelmann 
38748e06fe0SBastian Koppelmann static inline void cpu_get_tb_cpu_state(CPUTriCoreState *env, target_ulong *pc,
38889fee74aSEmilio G. Cota                                         target_ulong *cs_base, uint32_t *flags)
38948e06fe0SBastian Koppelmann {
390*878d1b6aSBastian Koppelmann     uint32_t new_flags = 0;
39148e06fe0SBastian Koppelmann     *pc = env->PC;
39248e06fe0SBastian Koppelmann     *cs_base = 0;
393*878d1b6aSBastian Koppelmann 
394*878d1b6aSBastian Koppelmann     new_flags |= FIELD_DP32(new_flags, TB_FLAGS, PRIV,
395*878d1b6aSBastian Koppelmann             extract32(env->PSW, 10, 2));
396*878d1b6aSBastian Koppelmann     *flags = new_flags;
39748e06fe0SBastian Koppelmann }
39848e06fe0SBastian Koppelmann 
399b9ad9d5bSIgor Mammedov #define TRICORE_CPU_TYPE_SUFFIX "-" TYPE_TRICORE_CPU
400b9ad9d5bSIgor Mammedov #define TRICORE_CPU_TYPE_NAME(model) model TRICORE_CPU_TYPE_SUFFIX
4010dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_TRICORE_CPU
40248e06fe0SBastian Koppelmann 
40348e06fe0SBastian Koppelmann /* helpers.c */
40468d6eee7SRichard Henderson bool tricore_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
40568d6eee7SRichard Henderson                           MMUAccessType access_type, int mmu_idx,
40668d6eee7SRichard Henderson                           bool probe, uintptr_t retaddr);
40748e06fe0SBastian Koppelmann 
40807f5a258SMarkus Armbruster #endif /* TRICORE_CPU_H */
409