@ -228,6 +228,7 @@ typedef struct ARMPACKey {
/* See the commentary above the TBFLAG field definitions. */
typedef struct CPUARMTBFlags {
uint32_t flags ;
target_ulong flags2 ;
} CPUARMTBFlags ;
typedef struct CPUARMState {
@ -3381,20 +3382,26 @@ typedef ARMCPU ArchCPU;
# include "exec/cpu-all.h"
/*
* Bit usage in the TB flags field : bit 31 indicates whether we are
* in 32 or 64 bit mode . The meaning of the other bits depends on that .
* We put flags which are shared between 32 and 64 bit mode at the top
* of the word , and flags which apply to only one mode at the bottom .
* We have more than 32 - bits worth of state per TB , so we split the data
* between tb - > flags and tb - > cs_base , which is otherwise unused for ARM .
* We collect these two parts in CPUARMTBFlags where they are named
* flags and flags2 respectively .
*
* 31 20 18 14 9 0
* + - - - - - - - - - - - - - - + - - - - - + - - - - - + - - - - - - - - - - + - - - - - - - - - - - - - - +
* | | | TBFLAG_A32 | |
* | | + - - - - - + - - - - - - - - - - + TBFLAG_AM32 |
* | TBFLAG_ANY | | TBFLAG_M32 | |
* | + - - - - - - - - - - - + - - - - - - - - - - + - - - - - - - - - - - - - - |
* | | TBFLAG_A64 |
* + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* 31 20 0
* The flags that are shared between all execution modes , TBFLAG_ANY ,
* are stored in flags . The flags that are specific to a given mode
* are stores in flags2 . Since cs_base is sized on the configured
* address size , flags2 always has 64 - bits for A64 , and a minimum of
* 32 - bits for A32 and M32 .
*
* The bits for 32 - bit A - profile and M - profile partially overlap :
*
* 18 9 0
* + - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - +
* | TBFLAG_A32 | |
* + - - - - - + - - - - - - - - - - + TBFLAG_AM32 |
* | | TBFLAG_M32 | |
* + - - - - - + - - - - - - - - - - + - - - - - - - - - - - - - - +
* 14 9 0
*
* Unless otherwise noted , these bits are cached in env - > hflags .
*/
@ -3472,19 +3479,19 @@ FIELD(TBFLAG_A64, MTE0_ACTIVE, 19, 1)
# define DP_TBFLAG_ANY(DST, WHICH, VAL) \
( DST . flags = FIELD_DP32 ( DST . flags , TBFLAG_ANY , WHICH , VAL ) )
# define DP_TBFLAG_A64(DST, WHICH, VAL) \
( DST . flags = FIELD_DP32 ( DST . flags , TBFLAG_A64 , WHICH , VAL ) )
( DST . flags2 = FIELD_DP32 ( DST . flags2 , TBFLAG_A64 , WHICH , VAL ) )
# define DP_TBFLAG_A32(DST, WHICH, VAL) \
( DST . flags = FIELD_DP32 ( DST . flags , TBFLAG_A32 , WHICH , VAL ) )
( DST . flags2 = FIELD_DP32 ( DST . flags2 , TBFLAG_A32 , WHICH , VAL ) )
# define DP_TBFLAG_M32(DST, WHICH, VAL) \
( DST . flags = FIELD_DP32 ( DST . flags , TBFLAG_M32 , WHICH , VAL ) )
( DST . flags2 = FIELD_DP32 ( DST . flags2 , TBFLAG_M32 , WHICH , VAL ) )
# define DP_TBFLAG_AM32(DST, WHICH, VAL) \
( DST . flags = FIELD_DP32 ( DST . flags , TBFLAG_AM32 , WHICH , VAL ) )
( DST . flags2 = FIELD_DP32 ( DST . flags2 , TBFLAG_AM32 , WHICH , VAL ) )
# define EX_TBFLAG_ANY(IN, WHICH) FIELD_EX32(IN.flags, TBFLAG_ANY, WHICH)
# define EX_TBFLAG_A64(IN, WHICH) FIELD_EX32(IN.flags, TBFLAG_A64, WHICH)
# define EX_TBFLAG_A32(IN, WHICH) FIELD_EX32(IN.flags, TBFLAG_A32, WHICH)
# define EX_TBFLAG_M32(IN, WHICH) FIELD_EX32(IN.flags, TBFLAG_M32, WHICH)
# define EX_TBFLAG_AM32(IN, WHICH) FIELD_EX32(IN.flags, TBFLAG_AM32, WHICH)
# define EX_TBFLAG_A64(IN, WHICH) FIELD_EX32(IN.flags2 , TBFLAG_A64, WHICH)
# define EX_TBFLAG_A32(IN, WHICH) FIELD_EX32(IN.flags2 , TBFLAG_A32, WHICH)
# define EX_TBFLAG_M32(IN, WHICH) FIELD_EX32(IN.flags2 , TBFLAG_M32, WHICH)
# define EX_TBFLAG_AM32(IN, WHICH) FIELD_EX32(IN.flags2 , TBFLAG_AM32, WHICH)
/**
* cpu_mmu_index :