Index: src/trusted/validator_ragel/validator_internal.h |
=================================================================== |
--- src/trusted/validator_ragel/validator_internal.h (revision 11020) |
+++ src/trusted/validator_ragel/validator_internal.h (working copy) |
@@ -14,215 +14,142 @@ |
#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/validator.h" |
/* Maximum set of R-DFA allowable CPUID features. */ |
extern const NaClCPUFeaturesX86 kValidatorCPUIDFeatures; |
-/* Macroses to suppport CPUID handling. */ |
-#define SET_CPU_FEATURE(F) \ |
- if (!(F##_Allowed)) { \ |
+/* Macroses to support CPUID handling. */ |
+ |
+/* |
+ * Main macro: FEATURE parameter here is one of the macroses below, e.g. |
+ * SET_CPU_FEATURE(CPUFeature_AESAVX). |
+ */ |
+#define SET_CPU_FEATURE(FEATURE) \ |
+ if (!(FEATURE(kValidatorCPUIDFeatures.data))) { \ |
instruction_info_collected |= UNRECOGNIZED_INSTRUCTION; \ |
} \ |
- if (!(F)) { \ |
+ if (!(FEATURE(cpu_features->data))) { \ |
instruction_info_collected |= CPUID_UNSUPPORTED_INSTRUCTION; \ |
} |
-#define CPUFeature_3DNOW cpu_features->data[NaClCPUFeatureX86_3DNOW] |
/* |
- * AMD documentation claims it's always available if CPUFeature_LM is present, |
- * But Intel documentation does not even mention it! |
- * Keep it as 3DNow! instruction. |
+ * Macroses to access induvidual elements of NaClCPUFeaturesX86 structure, |
+ * e.g. CPUFeature_AESAVX(kValidatorCPUIDFeatures.data). |
*/ |
-#define CPUFeature_3DPRFTCH CPUFeature_3DNOW || CPUFeature_PRE |
-#define CPUFeature_AES cpu_features->data[NaClCPUFeatureX86_AES] |
-#define CPUFeature_AESAVX CPUFeature_AES && CPUFeature_AVX |
-#define CPUFeature_AVX cpu_features->data[NaClCPUFeatureX86_AVX] |
-#define CPUFeature_BMI1 cpu_features->data[NaClCPUFeatureX86_BMI1] |
-#define CPUFeature_CLFLUSH cpu_features->data[NaClCPUFeatureX86_CLFLUSH] |
-#define CPUFeature_CLMUL cpu_features->data[NaClCPUFeatureX86_CLMUL] |
-#define CPUFeature_CLMULAVX CPUFeature_CLMUL && CPUFeature_AVX |
-#define CPUFeature_CMOV cpu_features->data[NaClCPUFeatureX86_CMOV] |
-#define CPUFeature_CMOVx87 CPUFeature_CMOV && CPUFeature_x87 |
-#define CPUFeature_CX16 cpu_features->data[NaClCPUFeatureX86_CX16] |
-#define CPUFeature_CX8 cpu_features->data[NaClCPUFeatureX86_CX8] |
-#define CPUFeature_E3DNOW cpu_features->data[NaClCPUFeatureX86_E3DNOW] |
-#define CPUFeature_EMMX cpu_features->data[NaClCPUFeatureX86_EMMX] |
-#define CPUFeature_EMMXSSE CPUFeature_EMMX || CPUFeature_SSE |
-#define CPUFeature_F16C cpu_features->data[NaClCPUFeatureX86_F16C] |
-#define CPUFeature_FMA cpu_features->data[NaClCPUFeatureX86_FMA] |
-#define CPUFeature_FMA4 cpu_features->data[NaClCPUFeatureX86_FMA4] |
-#define CPUFeature_FXSR cpu_features->data[NaClCPUFeatureX86_FXSR] |
-#define CPUFeature_LAHF cpu_features->data[NaClCPUFeatureX86_LAHF] |
-#define CPUFeature_LM cpu_features->data[NaClCPUFeatureX86_LM] |
-#define CPUFeature_LWP cpu_features->data[NaClCPUFeatureX86_LWP] |
+#define CPUFeature_3DNOW(FEATURES) FEATURES[NaClCPUFeatureX86_3DNOW] |
/* |
- * We allow lzcnt unconditionally |
- * See http://code.google.com/p/nativeclient/issues/detail?id=2869 |
- */ |
-#define CPUFeature_LZCNT TRUE |
-#define CPUFeature_MMX cpu_features->data[NaClCPUFeatureX86_MMX] |
-#define CPUFeature_MON cpu_features->data[NaClCPUFeatureX86_MON] |
-#define CPUFeature_MOVBE cpu_features->data[NaClCPUFeatureX86_MOVBE] |
-#define CPUFeature_OSXSAVE cpu_features->data[NaClCPUFeatureX86_OSXSAVE] |
-#define CPUFeature_POPCNT cpu_features->data[NaClCPUFeatureX86_POPCNT] |
-#define CPUFeature_PRE cpu_features->data[NaClCPUFeatureX86_PRE] |
-#define CPUFeature_SSE cpu_features->data[NaClCPUFeatureX86_SSE] |
-#define CPUFeature_SSE2 cpu_features->data[NaClCPUFeatureX86_SSE2] |
-#define CPUFeature_SSE3 cpu_features->data[NaClCPUFeatureX86_SSE3] |
-#define CPUFeature_SSE41 cpu_features->data[NaClCPUFeatureX86_SSE41] |
-#define CPUFeature_SSE42 cpu_features->data[NaClCPUFeatureX86_SSE42] |
-#define CPUFeature_SSE4A cpu_features->data[NaClCPUFeatureX86_SSE4A] |
-#define CPUFeature_SSSE3 cpu_features->data[NaClCPUFeatureX86_SSSE3] |
-#define CPUFeature_TBM cpu_features->data[NaClCPUFeatureX86_TBM] |
-#define CPUFeature_TSC cpu_features->data[NaClCPUFeatureX86_TSC] |
-/* |
- * We allow tzcnt unconditionally |
- * See http://code.google.com/p/nativeclient/issues/detail?id=2869 |
- */ |
-#define CPUFeature_TZCNT TRUE |
-#define CPUFeature_x87 cpu_features->data[NaClCPUFeatureX86_x87] |
-#define CPUFeature_XOP cpu_features->data[NaClCPUFeatureX86_XOP] |
- |
-#define CPUFeature_3DNOW_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_3DNOW] |
-/* |
* AMD documentation claims it's always available if CPUFeature_LM is present, |
* But Intel documentation does not even mention it! |
* Keep it as 3DNow! instruction. |
*/ |
-#define CPUFeature_3DPRFTCH_Allowed \ |
- CPUFeature_3DNOW_Allowed || CPUFeature_PRE_Allowed |
-#define CPUFeature_AES_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_AES] |
-#define CPUFeature_AESAVX_Allowed \ |
- CPUFeature_AES_Allowed && CPUFeature_AVX_Allowed |
-#define CPUFeature_AVX_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_AVX] |
-#define CPUFeature_BMI1_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_BMI1] |
-#define CPUFeature_CLFLUSH_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_CLFLUSH] |
-#define CPUFeature_CLMUL_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_CLMUL] |
-#define CPUFeature_CLMULAVX_Allowed \ |
- CPUFeature_CLMUL_Allowed && CPUFeature_AVX_Allowed |
-#define CPUFeature_CMOV_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_CMOV] |
-#define CPUFeature_CMOVx87_Allowed \ |
- CPUFeature_CMOV_Allowed && CPUFeature_x87_Allowed |
-#define CPUFeature_CX16_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_CX16] |
-#define CPUFeature_CX8_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_CX8] |
-#define CPUFeature_E3DNOW_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_E3DNOW] |
-#define CPUFeature_EMMX_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_EMMX] |
-#define CPUFeature_EMMXSSE_Allowed \ |
- CPUFeature_EMMX_Allowed || CPUFeature_SSE_Allowed |
-#define CPUFeature_F16C_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_F16C] |
-#define CPUFeature_FMA_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_FMA] |
-#define CPUFeature_FMA4_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_FMA4] |
-#define CPUFeature_FXSR_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_FXSR] |
-#define CPUFeature_LAHF_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_LAHF] |
-#define CPUFeature_LM_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_LM] |
-#define CPUFeature_LWP_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_LWP] |
+#define CPUFeature_3DPRFTCH(FEATURES) \ |
+ (CPUFeature_3DNOW(FEATURES) || CPUFeature_PRE(FEATURES)) |
+#define CPUFeature_AES(FEATURES) FEATURES[NaClCPUFeatureX86_AES] |
+#define CPUFeature_AESAVX(FEATURES) \ |
+ (CPUFeature_AES(FEATURES) && CPUFeature_AVX(FEATURES)) |
+#define CPUFeature_AVX(FEATURES) FEATURES[NaClCPUFeatureX86_AVX] |
+#define CPUFeature_BMI1(FEATURES) FEATURES[NaClCPUFeatureX86_BMI1] |
+#define CPUFeature_CLFLUSH(FEATURES) FEATURES[NaClCPUFeatureX86_CLFLUSH] |
+#define CPUFeature_CLMUL(FEATURES) FEATURES[NaClCPUFeatureX86_CLMUL] |
+#define CPUFeature_CLMULAVX(FEATURES) \ |
+ (CPUFeature_CLMUL(FEATURES) && CPUFeature_AVX(FEATURES)) |
+#define CPUFeature_CMOV(FEATURES) FEATURES[NaClCPUFeatureX86_CMOV] |
+#define CPUFeature_CMOVx87(FEATURES) \ |
+ (CPUFeature_CMOV(FEATURES) && CPUFeature_x87(FEATURES)) |
+#define CPUFeature_CX16(FEATURES) FEATURES[NaClCPUFeatureX86_CX16] |
+#define CPUFeature_CX8(FEATURES) FEATURES[NaClCPUFeatureX86_CX8] |
+#define CPUFeature_E3DNOW(FEATURES) FEATURES[NaClCPUFeatureX86_E3DNOW] |
+#define CPUFeature_EMMX(FEATURES) FEATURES[NaClCPUFeatureX86_EMMX] |
+#define CPUFeature_EMMXSSE(FEATURES) \ |
+ (CPUFeature_EMMX(FEATURES) || CPUFeature_SSE(FEATURES)) |
+#define CPUFeature_F16C(FEATURES) FEATURES[NaClCPUFeatureX86_F16C] |
+#define CPUFeature_FMA(FEATURES) FEATURES[NaClCPUFeatureX86_FMA] |
+#define CPUFeature_FMA4(FEATURES) FEATURES[NaClCPUFeatureX86_FMA4] |
+#define CPUFeature_FXSR(FEATURES) FEATURES[NaClCPUFeatureX86_FXSR] |
+#define CPUFeature_LAHF(FEATURES) FEATURES[NaClCPUFeatureX86_LAHF] |
+#define CPUFeature_LM(FEATURES) FEATURES[NaClCPUFeatureX86_LM] |
+#define CPUFeature_LWP(FEATURES) FEATURES[NaClCPUFeatureX86_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 \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_MMX] |
-#define CPUFeature_MON_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_MON] |
-#define CPUFeature_MOVBE_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_MOVBE] |
-#define CPUFeature_OSXSAVE_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_OSXSAVE] |
-#define CPUFeature_POPCNT_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_POPCNT] |
-#define CPUFeature_PRE_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_PRE] |
-#define CPUFeature_SSE_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_SSE] |
-#define CPUFeature_SSE2_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_SSE2] |
-#define CPUFeature_SSE3_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_SSE3] |
-#define CPUFeature_SSE41_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_SSE41] |
-#define CPUFeature_SSE42_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_SSE42] |
-#define CPUFeature_SSE4A_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_SSE4A] |
-#define CPUFeature_SSSE3_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_SSSE3] |
-#define CPUFeature_TBM_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_TBM] |
-#define CPUFeature_TSC_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_TSC] |
+#define CPUFeature_LZCNT(FEATURES) TRUE |
+#define CPUFeature_MMX(FEATURES) FEATURES[NaClCPUFeatureX86_MMX] |
+#define CPUFeature_MON(FEATURES) FEATURES[NaClCPUFeatureX86_MON] |
+#define CPUFeature_MOVBE(FEATURES) FEATURES[NaClCPUFeatureX86_MOVBE] |
+#define CPUFeature_OSXSAVE(FEATURES) FEATURES[NaClCPUFeatureX86_OSXSAVE] |
+#define CPUFeature_POPCNT(FEATURES) FEATURES[NaClCPUFeatureX86_POPCNT] |
+#define CPUFeature_PRE(FEATURES) FEATURES[NaClCPUFeatureX86_PRE] |
+#define CPUFeature_SSE(FEATURES) FEATURES[NaClCPUFeatureX86_SSE] |
+#define CPUFeature_SSE2(FEATURES) FEATURES[NaClCPUFeatureX86_SSE2] |
+#define CPUFeature_SSE3(FEATURES) FEATURES[NaClCPUFeatureX86_SSE3] |
+#define CPUFeature_SSE41(FEATURES) FEATURES[NaClCPUFeatureX86_SSE41] |
+#define CPUFeature_SSE42(FEATURES) FEATURES[NaClCPUFeatureX86_SSE42] |
+#define CPUFeature_SSE4A(FEATURES) FEATURES[NaClCPUFeatureX86_SSE4A] |
+#define CPUFeature_SSSE3(FEATURES) FEATURES[NaClCPUFeatureX86_SSSE3] |
+#define CPUFeature_TBM(FEATURES) FEATURES[NaClCPUFeatureX86_TBM] |
+#define CPUFeature_TSC(FEATURES) FEATURES[NaClCPUFeatureX86_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 \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_x87] |
-#define CPUFeature_XOP_Allowed \ |
- kValidatorCPUIDFeatures.data[NaClCPUFeatureX86_XOP] |
+#define CPUFeature_TZCNT(FEATURES) TRUE |
+#define CPUFeature_x87(FEATURES) FEATURES[NaClCPUFeatureX86_x87] |
+#define CPUFeature_XOP(FEATURES) FEATURES[NaClCPUFeatureX86_XOP] |
/* Remember some information about instruction for further processing. */ |
#define GET_REX_PREFIX() rex_prefix |
-#define SET_REX_PREFIX(P) rex_prefix = (P) |
+#define SET_REX_PREFIX(PREFIX_BYTE) rex_prefix = (PREFIX_BYTE) |
#define GET_VEX_PREFIX2() vex_prefix2 |
-#define SET_VEX_PREFIX2(P) vex_prefix2 = (P) |
+#define SET_VEX_PREFIX2(PREFIX_BYTE) vex_prefix2 = (PREFIX_BYTE) |
#define GET_VEX_PREFIX3() vex_prefix3 |
-#define SET_VEX_PREFIX3(P) vex_prefix3 = (P) |
-#define SET_MODRM_BASE(N) base = (N) |
-#define SET_MODRM_INDEX(N) index = (N) |
+#define SET_VEX_PREFIX3(PREFIX_BYTE) vex_prefix3 = (PREFIX_BYTE) |
+#define SET_MODRM_BASE(REG_NUMBER) base = (REG_NUMBER) |
+#define SET_MODRM_INDEX(REG_NUMBER) index = (REG_NUMBER) |
/* Ignore this information for now. */ |
-#define SET_DATA16_PREFIX(S) |
-#define SET_REPZ_PREFIX(S) |
-#define SET_REPNZ_PREFIX(S) |
-#define SET_MODRM_SCALE(S) |
-#define SET_DISP_PTR(P) |
-#define SET_IMM_PTR(P) |
-#define SET_IMM2_PTR(P) |
+#define SET_DATA16_PREFIX(STATUS) |
+#define SET_REPZ_PREFIX(STATUS) |
+#define SET_REPNZ_PREFIX(STATUS) |
+#define SET_MODRM_SCALE(VALUE) |
+#define SET_DISPLACEMENT_POINTER(POINTER) |
+#define SET_IMMEDIATE_POINTER(POINTER) |
+#define SET_SECOND_IMMEDIATE_POINTER(POINTER) |
/* |
* Collect information about anyfields (offsets and immediates). |
* Note: we use += below instead of |=. This means two immediate fields will |
* be treated as one. It's not important for safety. |
*/ |
-#define SET_DISP_TYPE(T) SET_DISP_TYPE_##T |
-#define SET_DISP_TYPE_DISPNONE |
-#define SET_DISP_TYPE_DISP8 (instruction_info_collected += DISPLACEMENT_8BIT) |
-#define SET_DISP_TYPE_DISP32 (instruction_info_collected += DISPLACEMENT_32BIT) |
-#define SET_IMM_TYPE(T) SET_IMM_TYPE_##T |
-/* imm2 field is a flag, not accumulator, like with other immediates */ |
-#define SET_IMM_TYPE_IMM2 (instruction_info_collected |= IMMEDIATE_2BIT) |
-#define SET_IMM_TYPE_IMM8 (instruction_info_collected += IMMEDIATE_8BIT) |
-#define SET_IMM_TYPE_IMM16 (instruction_info_collected += IMMEDIATE_16BIT) |
-#define SET_IMM_TYPE_IMM32 (instruction_info_collected += IMMEDIATE_32BIT) |
-#define SET_IMM_TYPE_IMM64 (instruction_info_collected += IMMEDIATE_64BIT) |
-#define SET_IMM2_TYPE(T) SET_IMM2_TYPE_##T |
-#define SET_IMM2_TYPE_IMM8 \ |
+#define SET_DISPLACEMENT_FORMAT(FORMAT) SET_DISPLACEMENT_FORMAT_##FORMAT |
+#define SET_DISPLACEMENT_FORMAT_DISPNONE |
+#define SET_DISPLACEMENT_FORMAT_DISP8 \ |
+ (instruction_info_collected += DISPLACEMENT_8BIT) |
+#define SET_DISPLACEMENT_FORMAT_DISP32 \ |
+ (instruction_info_collected += DISPLACEMENT_32BIT) |
+#define SET_IMMEDIATE_FORMAT(FORMAT) SET_IMMEDIATE_FORMAT_##FORMAT |
+/* imm2 field is a flag, not accumulator, like other immediates */ |
+#define SET_IMMEDIATE_FORMAT_IMM2 \ |
+ (instruction_info_collected |= IMMEDIATE_2BIT) |
+#define SET_IMMEDIATE_FORMAT_IMM8 \ |
+ (instruction_info_collected += IMMEDIATE_8BIT) |
+#define SET_IMMEDIATE_FORMAT_IMM16 \ |
+ (instruction_info_collected += IMMEDIATE_16BIT) |
+#define SET_IMMEDIATE_FORMAT_IMM32 \ |
+ (instruction_info_collected += IMMEDIATE_32BIT) |
+#define SET_IMMEDIATE_FORMAT_IMM64 \ |
+ (instruction_info_collected += IMMEDIATE_64BIT) |
+#define SET_SECOND_IMMEDIATE_FORMAT(FORMAT) \ |
+ SET_SECOND_IMMEDIATE_FORMAT_##FORMAT |
+#define SET_SECOND_IMMEDIATE_FORMAT_IMM8 \ |
(instruction_info_collected += SECOND_IMMEDIATE_8BIT) |
-#define SET_IMM2_TYPE_IMM16 \ |
+#define SET_SECOND_IMMEDIATE_FORMAT_IMM16 \ |
(instruction_info_collected += SECOND_IMMEDIATE_16BIT) |
-/* 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. |
+/* |
+ * Mark the destination of a jump instruction and make an early validity check: |
+ * jump target outside of given code region must be aligned. |
* |
* Returns TRUE iff the jump passes the early validity check. |
*/ |
@@ -265,8 +192,12 @@ |
BitmapClearBits(valid_targets, address, bytes); |
} |
+/* |
+ * Compare valid_targets and jump_dests and call callback for any address in |
+ * jump_dests which is not present in valid_targets. |
+ */ |
static INLINE Bool ProcessInvalidJumpTargets( |
- const uint8_t *data, |
+ const uint8_t codeblock[], |
size_t size, |
bitmap_word *valid_targets, |
bitmap_word *jump_dests, |
@@ -276,15 +207,15 @@ |
size_t i, j; |
Bool result = TRUE; |
- for (i = 0; i < elements ; i++) { |
+ for (i = 0; i < elements; i++) { |
bitmap_word jump_dest_mask = jump_dests[i]; |
bitmap_word valid_target_mask = valid_targets[i]; |
if ((jump_dest_mask & ~valid_target_mask) != 0) { |
for (j = i * NACL_HOST_WORDSIZE; j < (i + 1) * NACL_HOST_WORDSIZE; j++) |
if (BitmapIsBitSet(jump_dests, j) && |
!BitmapIsBitSet(valid_targets, j)) { |
- result &= user_callback(data + j, |
- data + j, |
+ result &= user_callback(codeblock + j, |
+ codeblock + j, |
BAD_JUMP_TARGET, |
callback_data); |
} |
@@ -301,12 +232,12 @@ |
* in a current instruction. |
*/ |
static FORCEINLINE void Rel8Operand(const uint8_t *rip, |
- const uint8_t* codeblock_start, |
+ const uint8_t codeblock[], |
bitmap_word *jump_dests, |
size_t jumpdests_size, |
uint32_t *instruction_info_collected) { |
- int8_t offset = (uint8_t) (rip[-1]); |
- size_t jump_dest = offset + (rip - codeblock_start); |
+ int8_t offset = rip[-1]; |
+ size_t jump_dest = offset + (rip - codeblock); |
if (MarkJumpTarget(jump_dest, jump_dests, jumpdests_size)) |
*instruction_info_collected |= RELATIVE_8BIT; |
@@ -320,13 +251,13 @@ |
* in a current instruction. |
*/ |
static FORCEINLINE void Rel32Operand(const uint8_t *rip, |
- const uint8_t* codeblock_start, |
+ const uint8_t codeblock[], |
bitmap_word *jump_dests, |
size_t jumpdests_size, |
uint32_t *instruction_info_collected) { |
- int32_t offset = (rip[-4] + 256U * (rip[-3] + 256U * ( |
- rip[-2] + 256U * ((uint32_t) rip[-1])))); |
- size_t jump_dest = offset + (rip - codeblock_start); |
+ int32_t offset = |
+ rip[-4] + 256U * (rip[-3] + 256U * (rip[-2] + 256U * (rip[-1]))); |
+ size_t jump_dest = offset + (rip - codeblock); |
if (MarkJumpTarget(jump_dest, jump_dests, jumpdests_size)) |
*instruction_info_collected |= RELATIVE_32BIT; |