1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- begin                                libvex_guest_arm.h ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Valgrind, a dynamic binary instrumentation
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   framework.
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2004-2013 OpenWorks LLP
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      info@open-works.net
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02110-1301, USA.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __LIBVEX_PUB_GUEST_ARM_H
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __LIBVEX_PUB_GUEST_ARM_H
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "libvex_basictypes.h"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Vex's representation of the ARM CPU state.              ---*/
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct {
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* 0 */
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Event check fail addr and counter. */
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt host_EvC_FAILADDR; /* 0 */
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt host_EvC_COUNTER;  /* 4 */
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R0;
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R1;
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R2;
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R3;
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R4;
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R5;
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R6;
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R7;
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R8;
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R9;
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R10;
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R11;
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R12;
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R13;     /* stack pointer */
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R14;     /* link register */
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_R15T;
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* program counter[31:1] ++ [T], encoding both the current
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         instruction address and the ARM vs Thumb state of the
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         machine.  T==1 is Thumb, T==0 is ARM.  Hence values of the
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         form X--(31)--X1 denote a Thumb instruction at location
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         X--(31)--X0, values of the form X--(30)--X00 denote an ARM
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         instruction at precisely that address, and values of the form
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         X--(30)--10 are invalid since they would imply an ARM
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         instruction at a non-4-aligned address. */
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* 4-word thunk used to calculate N(sign) Z(zero) C(carry,
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         unsigned overflow) and V(signed overflow) flags. */
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* 72 */
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_CC_OP;
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_CC_DEP1;
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_CC_DEP2;
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_CC_NDEP;
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* A 32-bit value which is used to compute the APSR.Q (sticky
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         saturation) flag, when necessary.  If the value stored here
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         is zero, APSR.Q is currently zero.  If it is any other value,
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         APSR.Q is currently one. */
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_QFLAG32;
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* 32-bit values to represent APSR.GE0 .. GE3.  Same
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         zero-vs-nonzero scheme as for QFLAG32. */
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_GEFLAG0;
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_GEFLAG1;
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_GEFLAG2;
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_GEFLAG3;
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Various pseudo-regs mandated by Vex or Valgrind. */
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Emulation notes */
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt guest_EMNOTE;
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
97eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      /* For clinval/clflush: record start and length of area */
98eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      UInt guest_CMSTART;
99eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      UInt guest_CMLEN;
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Used to record the unredirected guest address at the start of
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         a translation whose start has been redirected.  By reading
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         this pseudo-register shortly afterwards, the translation can
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         find out what the corresponding no-redirection address was.
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Note, this is only set for wrap-style redirects, not for
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         replace-style ones. */
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_NRADDR;
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Needed for Darwin (but mandated for all guest architectures):
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         program counter at the last syscall insn (int 0x80/81/82,
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         sysenter, syscall, svc).  Used when backing up to restart a
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         syscall that has been interrupted by a signal. */
113663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* 124 */
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_IP_AT_SYSCALL;
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* VFP state.  D0 .. D15 must be 8-aligned. */
117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* 128 */
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D0;
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D1;
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D2;
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D3;
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D4;
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D5;
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D6;
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D7;
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D8;
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D9;
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D10;
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D11;
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D12;
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D13;
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D14;
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D15;
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D16;
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D17;
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D18;
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D19;
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D20;
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D21;
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D22;
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D23;
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D24;
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D25;
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D26;
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D27;
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D28;
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D29;
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D30;
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      ULong guest_D31;
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt  guest_FPSCR;
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Not a town in Cornwall, but instead the TPIDRURO, on of the
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Thread ID registers present in CP15 (the system control
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         coprocessor), register set "c13", register 3 (the User
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Read-only Thread ID Register).  arm-linux apparently uses it
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         to hold the TLS pointer for the thread.  It's read-only in
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         user space.  On Linux it is set in user space by various
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         thread-related syscalls. */
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_TPIDRURO;
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      /* Representation of the Thumb IT state.  ITSTATE is a 32-bit
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         value with 4 8-bit lanes.  [7:0] pertain to the next insn to
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         execute, [15:8] for the one after that, etc.  The per-insn
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         update to ITSTATE is to unsignedly shift it right 8 bits,
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         hence introducing a zero byte for the furthest ahead
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         instruction.  As per the next para, a zero byte denotes the
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         condition ALWAYS.
168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Each byte lane has one of the two following formats:
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         cccc 0001  for an insn which is part of an IT block.  cccc is
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    the guarding condition (standard ARM condition
173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    code) XORd with 0xE, so as to cause 'cccc == 0'
174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    to encode the condition ALWAYS.
175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         0000 0000  for an insn which is not part of an IT block.
177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         If the bottom 4 bits are zero then the top 4 must be too.
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         Given the byte lane for an instruction, the guarding
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         condition for the instruction is (((lane >> 4) & 0xF) ^ 0xE).
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         This is not as stupid as it sounds, because the front end
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         elides the shift.  And the am-I-in-an-IT-block check is
184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         (lane != 0).
185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         In the case where (by whatever means) we know at JIT time
187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         that an instruction is not in an IT block, we can prefix its
188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         IR with assignments ITSTATE = 0 and hence have iropt fold out
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         the testing code.
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         The condition "is outside or last in IT block" corresponds
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown         to the top 24 bits of ITSTATE being zero.
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      */
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt guest_ITSTATE;
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Padding to make it have an 16-aligned size */
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      UInt padding1;
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   VexGuestARMState;
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Utility functions for ARM guest stuff.                  ---*/
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* ALL THE FOLLOWING ARE VISIBLE TO LIBRARY CLIENT */
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Initialise all guest ARM state. */
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid LibVEX_GuestARM_initialise ( /*OUT*/VexGuestARMState* vex_state );
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Calculate the ARM flag state from the saved data. */
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern
216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovUInt LibVEX_GuestARM_get_cpsr ( /*IN*/const VexGuestARMState* vex_state );
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* ndef __LIBVEX_PUB_GUEST_ARM_H */
220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                      libvex_guest_arm.h ---*/
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---------------------------------------------------------------*/
225