Index: src/trusted/validator_ragel/validator_internal.h |
=================================================================== |
--- src/trusted/validator_ragel/validator_internal.h (revision 9911) |
+++ src/trusted/validator_ragel/validator_internal.h (working copy) |
@@ -14,11 +14,11 @@ |
#include "native_client/src/shared/platform/nacl_check.h" |
#include "native_client/src/shared/utils/types.h" |
-#include "native_client/src/trusted/validator_ragel/unreviewed/decoding.h" |
+#include "native_client/src/trusted/validator_ragel/decoding.h" |
#include "native_client/src/trusted/validator_ragel/unreviewed/validator.h" |
/* Maximum set of R-DFA allowable CPUID features. */ |
-extern const NaClCPUFeaturesX86 validator_cpuid_features; |
+extern const NaClCPUFeaturesX86 kValidatorCPUIDFeatures; |
/* Macroses to suppport CPUID handling. */ |
#define SET_CPU_FEATURE(F) \ |
@@ -85,7 +85,7 @@ |
#define CPUFeature_XOP cpu_features->data[NaClCPUFeature_XOP] |
#define CPUFeature_3DNOW_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_3DNOW] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_3DNOW] |
/* |
* AMD documentation claims it's always available if CPUFeature_LM is present, |
* But Intel documentation does not even mention it! |
@@ -94,91 +94,91 @@ |
#define CPUFeature_3DPRFTCH_Allowed \ |
CPUFeature_3DNOW_Allowed || CPUFeature_PRE_Allowed |
#define CPUFeature_AES_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_AES] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_AES] |
#define CPUFeature_AESAVX_Allowed \ |
CPUFeature_AES_Allowed && CPUFeature_AVX_Allowed |
#define CPUFeature_AVX_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_AVX] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_AVX] |
#define CPUFeature_BMI1_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_BMI1] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_BMI1] |
#define CPUFeature_CLFLUSH_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_CLFLUSH] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_CLFLUSH] |
#define CPUFeature_CLMUL_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_CLMUL] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_CLMUL] |
#define CPUFeature_CLMULAVX_Allowed \ |
CPUFeature_CLMUL_Allowed && CPUFeature_AVX_Allowed |
#define CPUFeature_CMOV_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_CMOV] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_CMOV] |
#define CPUFeature_CMOVx87_Allowed \ |
CPUFeature_CMOV_Allowed && CPUFeature_x87_Allowed |
#define CPUFeature_CX16_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_CX16] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_CX16] |
#define CPUFeature_CX8_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_CX8] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_CX8] |
#define CPUFeature_E3DNOW_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_E3DNOW] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_E3DNOW] |
#define CPUFeature_EMMX_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_EMMX] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_EMMX] |
#define CPUFeature_EMMXSSE_Allowed \ |
CPUFeature_EMMX_Allowed || CPUFeature_SSE_Allowed |
#define CPUFeature_F16C_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_F16C] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_F16C] |
#define CPUFeature_FMA_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_FMA] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_FMA] |
#define CPUFeature_FMA4_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_FMA4] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_FMA4] |
#define CPUFeature_FXSR_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_FXSR] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_FXSR] |
#define CPUFeature_LAHF_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_LAHF] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_LAHF] |
#define CPUFeature_LM_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_LM] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_LM] |
#define CPUFeature_LWP_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_LWP] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_LWP] |
/* |
* We allow lzcnt unconditionally |
* See http://code.google.com/p/nativeclient/issues/detail?id=2869 |
*/ |
#define CPUFeature_LZCNT_Allowed TRUE |
#define CPUFeature_MMX_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_MMX] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_MMX] |
#define CPUFeature_MON_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_MON] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_MON] |
#define CPUFeature_MOVBE_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_MOVBE] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_MOVBE] |
#define CPUFeature_OSXSAVE_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_OSXSAVE] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_OSXSAVE] |
#define CPUFeature_POPCNT_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_POPCNT] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_POPCNT] |
#define CPUFeature_PRE_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_PRE] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_PRE] |
#define CPUFeature_SSE_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_SSE] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_SSE] |
#define CPUFeature_SSE2_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_SSE2] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_SSE2] |
#define CPUFeature_SSE3_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_SSE3] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_SSE3] |
#define CPUFeature_SSE41_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_SSE41] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_SSE41] |
#define CPUFeature_SSE42_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_SSE42] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_SSE42] |
#define CPUFeature_SSE4A_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_SSE4A] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_SSE4A] |
#define CPUFeature_SSSE3_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_SSSE3] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_SSSE3] |
#define CPUFeature_TBM_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_TBM] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_TBM] |
#define CPUFeature_TSC_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_TSC] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_TSC] |
/* |
* We allow tzcnt unconditionally |
* See http://code.google.com/p/nativeclient/issues/detail?id=2869 |
*/ |
#define CPUFeature_TZCNT_Allowed TRUE |
#define CPUFeature_x87_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_x87] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_x87] |
#define CPUFeature_XOP_Allowed \ |
- validator_cpuid_features.data[NaClCPUFeature_XOP] |
+ kValidatorCPUIDFeatures.data[NaClCPUFeature_XOP] |
/* Remember some information about instruction for further processing. */ |
#define GET_REX_PREFIX() rex_prefix |
@@ -213,13 +213,13 @@ |
#define SET_OPERAND_NAME(N, S) operand_states |= ((S) << ((N) << 3)) |
#define SET_OPERAND_TYPE(N, T) SET_OPERAND_TYPE_ ## T(N) |
-#define SET_OPERAND_TYPE_OPERAND_SIZE_8_BIT(N) \ |
+#define SET_OPERAND_TYPE_OPERAND_TYPE_8_BIT(N) \ |
operand_states |= OperandSandbox8bit << (5 + ((N) << 3)) |
-#define SET_OPERAND_TYPE_OPERAND_SIZE_16_BIT(N) \ |
+#define SET_OPERAND_TYPE_OPERAND_TYPE_16_BIT(N) \ |
operand_states |= OperandSandboxUnrestricted << (5 + ((N) << 3)) |
-#define SET_OPERAND_TYPE_OPERAND_SIZE_32_BIT(N) \ |
+#define SET_OPERAND_TYPE_OPERAND_TYPE_32_BIT(N) \ |
operand_states |= OperandSandboxRestricted << (5 + ((N) << 3)) |
-#define SET_OPERAND_TYPE_OPERAND_SIZE_64_BIT(N) \ |
+#define SET_OPERAND_TYPE_OPERAND_TYPE_64_BIT(N) \ |
operand_states |= OperandSandboxUnrestricted << (5 + ((N) << 3)) |
#define CHECK_OPERAND(N, S, T) \ |
((operand_states & (0xff << ((N) << 3))) == ((S | (T << 5)) << ((N) << 3))) |
@@ -304,7 +304,8 @@ |
((((bitmap_word)1) << bits) - 1) << (index % NACL_HOST_WORDSIZE); |
} |
-/* Mark the destination of a jump instruction and make an early validity check: |
+/* |
+ * Mark the destination of a jump instruction and make an early validity check: |
* to jump outside given code region, the target address must be aligned. |
* |
* Returns TRUE iff the jump passes the early validity check. |
@@ -322,13 +323,28 @@ |
return TRUE; |
} |
+/* |
+ * Mark the gived address as valid jump target address. |
+ */ |
+static FORCEINLINE void MakeJumpTargetValid(size_t address, |
+ bitmap_word *valid_targets) { |
+ BitmapSetBit(valid_targets, address); |
+} |
+/* |
+ * Mark the gived address as invalid jump target address. |
+ */ |
+static FORCEINLINE void MakeJumpTargetInvalid(size_t address, |
+ bitmap_word *valid_targets) { |
+ BitmapClearBit(valid_targets, address); |
+} |
+ |
static INLINE Bool ProcessInvalidJumpTargets( |
const uint8_t *data, |
size_t size, |
bitmap_word *valid_targets, |
bitmap_word *jump_dests, |
- validation_callback_func user_callback, |
+ ValidationCallbackFunc user_callback, |
void *callback_data) { |
size_t elements = (size + NACL_HOST_WORDSIZE - 1) / NACL_HOST_WORDSIZE; |
size_t i, j; |
@@ -393,8 +409,8 @@ |
} |
static INLINE void check_access(ptrdiff_t instruction_start, |
- enum register_name base, |
- enum register_name index, |
+ enum OperandName base, |
+ enum OperandName index, |
uint8_t restricted_register, |
bitmap_word *valid_targets, |
uint32_t *instruction_info_collected) { |
@@ -413,7 +429,7 @@ |
} |
-static INLINE void process_0_operands(enum register_name *restricted_register, |
+static INLINE void process_0_operands(enum OperandName *restricted_register, |
uint32_t *instruction_info_collected) { |
/* Restricted %rsp or %rbp must be processed by appropriate nacl-special |
* instruction, not with regular instruction. */ |
@@ -425,7 +441,7 @@ |
*restricted_register = NO_REG; |
} |
-static INLINE void process_1_operand(enum register_name *restricted_register, |
+static INLINE void process_1_operand(enum OperandName *restricted_register, |
uint32_t *instruction_info_collected, |
uint8_t rex_prefix, |
uint32_t operand_states) { |
@@ -453,7 +469,7 @@ |
} |
static INLINE void process_1_operand_zero_extends( |
- enum register_name *restricted_register, |
+ enum OperandName *restricted_register, |
uint32_t *instruction_info_collected, uint8_t rex_prefix, |
uint32_t operand_states) { |
/* Restricted %rsp or %rbp must be processed by appropriate nacl-special |
@@ -481,7 +497,7 @@ |
} |
} |
-static INLINE void process_2_operands(enum register_name *restricted_register, |
+static INLINE void process_2_operands(enum OperandName *restricted_register, |
uint32_t *instruction_info_collected, |
uint8_t rex_prefix, |
uint32_t operand_states) { |
@@ -518,7 +534,7 @@ |
} |
static INLINE void process_2_operands_zero_extends( |
- enum register_name *restricted_register, |
+ enum OperandName *restricted_register, |
uint32_t *instruction_info_collected, |
uint8_t rex_prefix, uint32_t operand_states) { |
/* Restricted %rsp or %rbp must be processed by appropriate nacl-special |