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