18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ARM virtual CPU header
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *  Copyright (c) 2003 Fabrice Bellard
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This library is free software; you can redistribute it and/or
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * modify it under the terms of the GNU Lesser General Public
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * License as published by the Free Software Foundation; either
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * version 2 of the License, or (at your option) any later version.
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This library is distributed in the hope that it will be useful,
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Lesser General Public License for more details.
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * You should have received a copy of the GNU Lesser General Public
176a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner * License along with this library; if not, see <http://www.gnu.org/licenses/>.
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef CPU_ARM_H
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPU_ARM_H
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TARGET_LONG_BITS 32
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ELF_MACHINE	EM_ARM
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define CPUState struct CPUARMState
275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
2845c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#include "config.h"
2945c3be00d4c1f85ba8bbf34827c024fbc636725fDavid 'Digit' Turner#include "qemu-common.h"
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cpu-defs.h"
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "softfloat.h"
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TARGET_HAS_ICE 1
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_UDEF            1   /* undefined instruction */
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_SWI             2   /* software interrupt */
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_PREFETCH_ABORT  3
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_DATA_ABORT      4
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_IRQ             5
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_FIQ             6
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_BKPT            7
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_EXCEPTION_EXIT  8   /* Return from v7M exception.  */
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define EXCP_KERNEL_TRAP     9   /* Jumped to kernel code page.  */
456a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#define EXCP_STREX          10
465285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define EXCP_SMC            11   /* secure monitor call */
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_RESET   1
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_NMI     2
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_HARD    3
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_MEM     4
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_BUS     5
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_USAGE   6
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_SVC     11
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_DEBUG   12
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_PENDSV  14
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARMV7M_EXCP_SYSTICK 15
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
595285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* ARM-specific interrupt pending bits.  */
605285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_INTERRUPT_FIQ   CPU_INTERRUPT_TGT_EXT_1
615285864985be9077e58e42235af6582dee72e841David 'Digit' Turner
625285864985be9077e58e42235af6582dee72e841David 'Digit' Turner
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void ARMWriteCPFunc(void *opaque, int cp_info,
645285864985be9077e58e42235af6582dee72e841David 'Digit' Turner                            int srcreg, int operand, uint32_t value,
655285864985be9077e58e42235af6582dee72e841David 'Digit' Turner                            void *retaddr);
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef uint32_t ARMReadCPFunc(void *opaque, int cp_info,
675285864985be9077e58e42235af6582dee72e841David 'Digit' Turner                               int dstreg, int operand,
685285864985be9077e58e42235af6582dee72e841David 'Digit' Turner                               void *retaddr);
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct arm_boot_info;
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define NB_MMU_MODES 2
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* We currently assume float and double are IEEE single and double
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   precision respectively.
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   Doing runtime conversions is tricky because VFP registers may contain
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   integer values (eg. as the result of a FTOSI instruction).
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   s<2n> maps to the least significant half of d<n>
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   s<2n+1> maps to the most significant half of d<n>
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct CPUARMState {
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Regs for current mode.  */
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t regs[16];
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Frequently accessed CPSR bits are stored separately for efficiently.
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       This contains all the other bits.  Use cpsr_{read,write} to access
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       the whole CPSR.  */
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t uncached_cpsr;
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t spsr;
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Banked registers.  */
925285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t banked_spsr[7];
935285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t banked_r13[7];
945285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t banked_r14[7];
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* These hold r8-r12.  */
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t usr_regs[5];
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t fiq_regs[5];
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* cpsr flag cache for faster execution */
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t CF; /* 0 or 1 */
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t VF; /* V is the bit 31. All other bits are undefined */
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t NF; /* N is bit 31. All other bits are undefined.  */
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t ZF; /* Z set if zero.  */
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t QF; /* 0 or 1 */
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t GE; /* cpsr[19:16] */
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t thumb; /* cpsr[5]. 0 = arm mode, 1 = thumb mode. */
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t condexec_bits; /* IT bits.  cpsr[15:10,26:25].  */
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* System control coprocessor (cp15) */
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct {
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c0_cpuid;
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c0_cachetype;
1145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        uint32_t c0_ccsid[16]; /* Cache size.  */
1155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        uint32_t c0_clid; /* Cache level.  */
1165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        uint32_t c0_cssel; /* Cache size selection.  */
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c0_c1[8]; /* Feature registers.  */
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c0_c2[8]; /* Instruction set registers.  */
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c1_sys; /* System control register.  */
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c1_coproc; /* Coprocessor access register.  */
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c1_xscaleauxcr; /* XScale auxiliary control register.  */
1225285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c1_secfg; /* Secure configuration register. */
1235285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c1_sedbg; /* Secure debug enable register. */
1245285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c1_nseac; /* Non-secure access control register. */
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c2_base0; /* MMU translation table base 0.  */
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c2_base1; /* MMU translation table base 1.  */
1275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        uint32_t c2_control; /* MMU translation table base control.  */
1285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        uint32_t c2_mask; /* MMU translation table base selection mask.  */
1295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        uint32_t c2_base_mask; /* MMU translation table base 0 mask. */
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c2_data; /* MPU data cachable bits.  */
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c2_insn; /* MPU instruction cachable bits.  */
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c3; /* MMU domain access control register
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        MPU write buffer control.  */
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c5_insn; /* Fault status registers.  */
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c5_data;
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c6_region[8]; /* MPU base/size registers.  */
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c6_insn; /* Fault address registers.  */
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c6_data;
1395285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c7_par;  /* Translation result. */
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c9_insn; /* Cache lockdown registers.  */
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c9_data;
1425285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c9_pmcr_data; /* Performance Monitor Control Register */
1435285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c9_useren; /* user enable register */
1445285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c9_inten; /* interrupt enable set/clear register */
1455285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c12_vbar; /* secure/nonsecure vector base address register. */
1465285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        uint32_t c12_mvbar; /* monitor vector base address register. */
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c13_fcse; /* FCSE PID.  */
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c13_context; /* Context ID.  */
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c13_tls1; /* User RW Thread register.  */
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c13_tls2; /* User RO Thread register.  */
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c13_tls3; /* Privileged Thread register.  */
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c15_cpar; /* XScale Coprocessor Access Register */
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c15_ticonfig; /* TI925T configuration byte.  */
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c15_i_max; /* Maximum D-cache dirty line index.  */
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c15_i_min; /* Minimum D-cache dirty line index.  */
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t c15_threadid; /* TI debugger thread-ID.  */
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } cp15;
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct {
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t other_sp;
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t vecbase;
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t basepri;
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t control;
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int current_sp;
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int exception;
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int pending_exception;
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } v7m;
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1695285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    /* Minimal set of debug coprocessor state (cp14) */
1705285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t cp14_dbgdidr;
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    /* Thumb-2 EE state.  */
1735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    uint32_t teecr;
1745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    uint32_t teehbr;
1755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Internal CPU feature flags.  */
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t features;
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* VFP coprocessor state.  */
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct {
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        float64 regs[32];
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t xregs[16];
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* We store these fpcsr fields separately for convenience.  */
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int vec_len;
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int vec_stride;
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* scratch space when Tn are not sufficient.  */
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t scratch[8];
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1915285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        /* fp_status is the "normal" fp status. standard_fp_status retains
1925285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * values corresponding to the ARM "Standard FPSCR Value", ie
1935285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * default-NaN, flush-to-zero, round-to-nearest and is used by
1945285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * any operations (generally Neon) which the architecture defines
1955285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * as controlled by the standard FPSCR value rather than the FPSCR.
1965285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         *
1975285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * To avoid having to transfer exception bits around, we simply
1985285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * say that the FPSCR cumulative exception flags are the logical
1995285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * OR of the flags in the two fp statuses. This relies on the
2005285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * only thing which needs to read the exception flags being
2015285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         * an explicit FPSCR read.
2025285864985be9077e58e42235af6582dee72e841David 'Digit' Turner         */
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        float_status fp_status;
2045285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        float_status standard_fp_status;
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } vfp;
2065285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t exclusive_addr;
2075285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t exclusive_val;
2085285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t exclusive_high;
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_USER_ONLY)
2105285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t exclusive_test;
2115285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    uint32_t exclusive_info;
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* iwMMXt coprocessor state.  */
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct {
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint64_t regs[16];
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint64_t val;
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        uint32_t cregs[16];
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } iwmmxt;
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_USER_ONLY)
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* For usermode syscall translation.  */
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int eabi;
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CPU_COMMON
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* These fields after the common ones so they are preserved on reset.  */
2305285864985be9077e58e42235af6582dee72e841David 'Digit' Turner
2315285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    /* Coprocessor IO used by peripherals */
2325285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    struct {
2335285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        ARMReadCPFunc *cp_read;
2345285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        ARMWriteCPFunc *cp_write;
2355285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        void *opaque;
2365285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    } cp[15];
2375285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    void *nvic;
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct arm_boot_info *boot_info;
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} CPUARMState;
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectCPUARMState *cpu_arm_init(const char *cpu_model);
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid arm_translate_init(void);
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_arm_exec(CPUARMState *s);
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_arm_close(CPUARMState *s);
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid do_interrupt(CPUARMState *);
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid switch_mode(CPUARMState *, int);
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t do_arm_semihosting(CPUARMState *env);
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* you can call this signal handler from your SIGBUS and SIGSEGV
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   signal handlers to inform the virtual CPU of exceptions. non zero
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   is returned if the signal was handled by the virtual CPU.  */
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_arm_signal_handler(int host_signum, void *pinfo,
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           void *puc);
2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint cpu_arm_handle_mmu_fault (CPUARMState *env, target_ulong address, int rw,
2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                              int mmu_idx, int is_softmuu);
2565285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define cpu_handle_mmu_fault cpu_arm_handle_mmu_fault
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  env->cp15.c13_tls2 = newtls;
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_M (0x1f)
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_T (1 << 5)
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_F (1 << 6)
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_I (1 << 7)
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_A (1 << 8)
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_E (1 << 9)
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_IT_2_7 (0xfc00)
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_GE (0xf << 16)
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_RESERVED (0xf << 20)
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_J (1 << 24)
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_IT_0_1 (3 << 25)
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_Q (1 << 27)
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_V (1 << 28)
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_C (1 << 29)
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_Z (1 << 30)
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_N (1 << 31)
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_NZCV (CPSR_N | CPSR_Z | CPSR_C | CPSR_V)
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_IT (CPSR_IT_0_1 | CPSR_IT_2_7)
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CACHED_CPSR_BITS (CPSR_T | CPSR_GE | CPSR_IT | CPSR_Q | CPSR_NZCV)
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Bits writable in user mode.  */
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_USER (CPSR_NZCV | CPSR_Q | CPSR_GE)
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Execution state bits.  MRS read as zero, MSR writes ignored.  */
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define CPSR_EXEC (CPSR_T | CPSR_IT | CPSR_J)
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Return the current CPSR value.  */
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t cpsr_read(CPUARMState *env);
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Set the CPSR.  Note that some bits of mask must be all-set or all-clear.  */
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask);
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Return the current xPSR value.  */
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline uint32_t xpsr_read(CPUARMState *env)
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int ZF;
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ZF = (env->ZF == 0);
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return (env->NF & 0x80000000) | (ZF << 30)
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        | (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        | (env->thumb << 24) | ((env->condexec_bits & 3) << 25)
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        | ((env->condexec_bits & 0xfc) << 8)
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        | env->v7m.exception;
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Set the xPSR.  Note that some bits of mask must be all-set or all-clear.  */
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (mask & CPSR_NZCV) {
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->ZF = (~val) & CPSR_Z;
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->NF = val;
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->CF = (val >> 29) & 1;
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->VF = (val << 3) & 0x80000000;
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (mask & CPSR_Q)
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->QF = ((val & CPSR_Q) != 0);
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (mask & (1 << 24))
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->thumb = ((val & (1 << 24)) != 0);
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (mask & CPSR_IT_0_1) {
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->condexec_bits &= ~3;
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->condexec_bits |= (val >> 25) & 3;
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (mask & CPSR_IT_2_7) {
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->condexec_bits &= 3;
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->condexec_bits |= (val >> 8) & 0xfc;
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (mask & 0x1ff) {
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->v7m.exception = val & 0x1ff;
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3315285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Return the current FPSCR value.  */
3325285864985be9077e58e42235af6582dee72e841David 'Digit' Turneruint32_t vfp_get_fpscr(CPUARMState *env);
3335285864985be9077e58e42235af6582dee72e841David 'Digit' Turnervoid vfp_set_fpscr(CPUARMState *env, uint32_t val);
3345285864985be9077e58e42235af6582dee72e841David 'Digit' Turner
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectenum arm_cpu_mode {
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ARM_CPU_MODE_USR = 0x10,
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ARM_CPU_MODE_FIQ = 0x11,
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ARM_CPU_MODE_IRQ = 0x12,
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ARM_CPU_MODE_SVC = 0x13,
3405285864985be9077e58e42235af6582dee72e841David 'Digit' Turner  ARM_CPU_MODE_SMC = 0x16,
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ARM_CPU_MODE_ABT = 0x17,
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ARM_CPU_MODE_UND = 0x1b,
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ARM_CPU_MODE_SYS = 0x1f
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* VFP system registers.  */
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_VFP_FPSID   0
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_VFP_FPSCR   1
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_VFP_MVFR1   6
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_VFP_MVFR0   7
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_VFP_FPEXC   8
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_VFP_FPINST  9
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_VFP_FPINST2 10
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* iwMMXt coprocessor control registers.  */
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_IWMMXT_wCID		0
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_IWMMXT_wCon		1
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_IWMMXT_wCSSF	2
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_IWMMXT_wCASF	3
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_IWMMXT_wCGR0	8
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_IWMMXT_wCGR1	9
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_IWMMXT_wCGR2	10
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_IWMMXT_wCGR3	11
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectenum arm_features {
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_VFP,
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_AUXCR,  /* ARM1026 Auxiliary control register.  */
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_XSCALE, /* Intel XScale extensions.  */
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_IWMMXT, /* Intel iwMMXt extension.  */
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_V6,
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_V6K,
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_V7,
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_THUMB2,
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_MPU,    /* Only has Memory Protection Unit, not full MMU.  */
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_VFP3,
3765285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ARM_FEATURE_VFP_FP16,
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_NEON,
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_DIV,
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ARM_FEATURE_M, /* Microcontroller profile.  */
3805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    ARM_FEATURE_OMAPCP, /* OMAP specific CP15 ops handling.  */
3815285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ARM_FEATURE_THUMB2EE,
3825285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ARM_FEATURE_V7MP,    /* v7 Multiprocessing Extensions */
3835285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ARM_FEATURE_V4T,
3845285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ARM_FEATURE_V5,
3855285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ARM_FEATURE_STRONGARM,
3865285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    ARM_FEATURE_TRUSTZONE, /* TrustZone Security Extensions. */
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline int arm_feature(CPUARMState *env, int feature)
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return (env->features & (1u << feature)) != 0;
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3945285864985be9077e58e42235af6582dee72e841David 'Digit' Turnervoid arm_cpu_list(FILE *f, fprintf_function cpu_fprintf);
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Interface between CPU and Interrupt controller.  */
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid armv7m_nvic_set_pending(void *opaque, int irq);
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint armv7m_nvic_acknowledge_irq(void *opaque);
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid armv7m_nvic_complete_irq(void *opaque, int irq);
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_arm_set_cp_io(CPUARMState *env, int cpnum,
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       ARMReadCPFunc *cp_read, ARMWriteCPFunc *cp_write,
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       void *opaque);
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Does the core conform to the the "MicroController" profile. e.g. Cortex-M3.
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   Note the M in older cores (eg. ARM7TDMI) stands for Multiply. These are
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   conventional cores (ie. Application or Realtime profile).  */
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IS_M(env) arm_feature(env, ARM_FEATURE_M)
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID(env) (env->cp15.c0_cpuid)
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_ARM1026     0x4106a262
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_ARM926      0x41069265
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_ARM946      0x41059461
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_TI915T      0x54029152
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_TI925T      0x54029252
4175285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_CPUID_SA1100      0x4401A11B
4185285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_CPUID_SA1110      0x6901B119
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA250      0x69052100
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA255      0x69052d00
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA260      0x69052903
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA261      0x69052d05
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA262      0x69052d06
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA270      0x69054110
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA270_A0   0x69054110
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA270_A1   0x69054111
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA270_B0   0x69054112
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA270_B1   0x69054113
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA270_C0   0x69054114
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_PXA270_C5   0x69054117
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_ARM1136     0x4117b363
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_ARM1136_R2  0x4107b362
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_ARM11MPCORE 0x410fb022
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_CORTEXA8    0x410fc080
4355285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_CPUID_CORTEXA8_R2 0x412fc083
4366a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#define ARM_CPUID_CORTEXA9    0x410fc090
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_CORTEXM3    0x410fc231
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARM_CPUID_ANY         0xffffffff
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_USER_ONLY)
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TARGET_PAGE_BITS 12
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* The ARM MMU allows 1k pages.  */
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* ??? Linux doesn't actually use these, and they're deprecated in recent
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   architecture revisions.  Maybe a configure option to disable them.  */
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define TARGET_PAGE_BITS 10
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4495285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define TARGET_PHYS_ADDR_SPACE_BITS 32
4505285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define TARGET_VIRT_ADDR_SPACE_BITS 32
4515285864985be9077e58e42235af6582dee72e841David 'Digit' Turner
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define cpu_init cpu_arm_init
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define cpu_exec cpu_arm_exec
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define cpu_gen_code cpu_arm_gen_code
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define cpu_signal_handler cpu_arm_signal_handler
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define cpu_list arm_cpu_list
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4585285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define CPU_SAVE_VERSION 3
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* MMU modes definitions */
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MMU_MODE0_SUFFIX _kernel
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MMU_MODE1_SUFFIX _user
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MMU_USER_IDX 1
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline int cpu_mmu_index (CPUState *env)
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return (env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR ? 1 : 0;
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4695389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkinestatic inline int is_cpu_user (CPUState *env)
4705389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine{
4715389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_USER_ONLY
4725389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    return 1;
4735389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#else
4745389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    return (env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_USR;
4755389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif  // CONFIG_USER_ONLY
4765389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine}
4775389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(CONFIG_USER_ONLY)
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (newsp)
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->regs[13] = newsp;
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    env->regs[0] = 0;
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cpu-all.h"
4885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
4895285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Bit usage in the TB flags field: */
4905285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_THUMB_SHIFT      0
4915285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_THUMB_MASK       (1 << ARM_TBFLAG_THUMB_SHIFT)
4925285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VECLEN_SHIFT     1
4935285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VECLEN_MASK      (0x7 << ARM_TBFLAG_VECLEN_SHIFT)
4945285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VECSTRIDE_SHIFT  4
4955285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VECSTRIDE_MASK   (0x3 << ARM_TBFLAG_VECSTRIDE_SHIFT)
4965285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_PRIV_SHIFT       6
4975285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_PRIV_MASK        (1 << ARM_TBFLAG_PRIV_SHIFT)
4985285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VFPEN_SHIFT      7
4995285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VFPEN_MASK       (1 << ARM_TBFLAG_VFPEN_SHIFT)
5005285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_CONDEXEC_SHIFT   8
5015285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_CONDEXEC_MASK    (0xff << ARM_TBFLAG_CONDEXEC_SHIFT)
5025285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* Bits 31..16 are currently unused. */
5035285864985be9077e58e42235af6582dee72e841David 'Digit' Turner
5045285864985be9077e58e42235af6582dee72e841David 'Digit' Turner/* some convenience accessor macros */
5055285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_THUMB(F) \
5065285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    (((F) & ARM_TBFLAG_THUMB_MASK) >> ARM_TBFLAG_THUMB_SHIFT)
5075285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VECLEN(F) \
5085285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    (((F) & ARM_TBFLAG_VECLEN_MASK) >> ARM_TBFLAG_VECLEN_SHIFT)
5095285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VECSTRIDE(F) \
5105285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    (((F) & ARM_TBFLAG_VECSTRIDE_MASK) >> ARM_TBFLAG_VECSTRIDE_SHIFT)
5115285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_PRIV(F) \
5125285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    (((F) & ARM_TBFLAG_PRIV_MASK) >> ARM_TBFLAG_PRIV_SHIFT)
5135285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_VFPEN(F) \
5145285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    (((F) & ARM_TBFLAG_VFPEN_MASK) >> ARM_TBFLAG_VFPEN_SHIFT)
5155285864985be9077e58e42235af6582dee72e841David 'Digit' Turner#define ARM_TBFLAG_CONDEXEC(F) \
5165285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    (((F) & ARM_TBFLAG_CONDEXEC_MASK) >> ARM_TBFLAG_CONDEXEC_SHIFT)
5175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
5185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
5195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                                        target_ulong *cs_base, int *flags)
5205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
5215285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    int privmode;
5225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    *pc = env->regs[15];
5235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    *cs_base = 0;
5245285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    *flags = (env->thumb << ARM_TBFLAG_THUMB_SHIFT)
5255285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        | (env->vfp.vec_len << ARM_TBFLAG_VECLEN_SHIFT)
5265285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        | (env->vfp.vec_stride << ARM_TBFLAG_VECSTRIDE_SHIFT)
5275285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        | (env->condexec_bits << ARM_TBFLAG_CONDEXEC_SHIFT);
5285285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    if (arm_feature(env, ARM_FEATURE_M)) {
5295285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        privmode = !((env->v7m.exception == 0) && (env->v7m.control & 1));
5305285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    } else {
5315285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        privmode = (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR;
5325285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    }
5335285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    if (privmode) {
5345285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        *flags |= ARM_TBFLAG_PRIV_MASK;
5355285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    }
5365285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)) {
5375285864985be9077e58e42235af6582dee72e841David 'Digit' Turner        *flags |= ARM_TBFLAG_VFPEN_MASK;
5385285864985be9077e58e42235af6582dee72e841David 'Digit' Turner    }
5395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
542