diff --git a/ext/opcache/jit/dynasm/dasm_x86.lua b/ext/opcache/jit/dynasm/dasm_x86.lua index fe2cf579b8141..d5eea69e485a7 100644 --- a/ext/opcache/jit/dynasm/dasm_x86.lua +++ b/ext/opcache/jit/dynasm/dasm_x86.lua @@ -1147,6 +1147,8 @@ local map_op = { rep_0 = "F3", repe_0 = "F3", repz_0 = "F3", + endbr32_0 = "F30F1EFB", + endbr64_0 = "F30F1EFA", -- F4: *hlt cmc_0 = "F5", -- F6: test... mb,i; div... mb diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index c33a4912d7b51..852d73473147a 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -1623,6 +1623,22 @@ static size_t tsrm_tls_offset; || } |.endmacro +|.macro ENDBR +||#if defined (__CET__) && (__CET__ & 1) != 0 +| .if X64 +| endbr64 +| .else +| endbr32 +| .endif +||#endif +|.endmacro + +#if defined (__CET__) && (__CET__ & 1) != 0 +# define ENDBR_PADDING 4 +#else +# define ENDBR_PADDING 0 +#endif + static bool reuse_ip = 0; static bool delayed_call_chain = 0; static uint32_t delayed_call_level = 0; @@ -2292,6 +2308,7 @@ static int zend_jit_hybrid_hot_code_stub(dasm_State **Dst) */ static int zend_jit_hybrid_hot_counter_stub(dasm_State **Dst, uint32_t cost) { + | ENDBR | mov r0, EX->func | mov r1, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] | mov r2, aword [r1 + offsetof(zend_jit_op_array_hot_extension, counter)] @@ -2362,6 +2379,7 @@ static int zend_jit_hybrid_hot_trace_stub(dasm_State **Dst) static int zend_jit_hybrid_trace_counter_stub(dasm_State **Dst, uint32_t cost) { + | ENDBR | mov r0, EX->func | mov r1, aword [r0 + offsetof(zend_op_array, reserved[zend_func_info_rid])] | mov r1, aword [r1 + offsetof(zend_jit_op_array_trace_extension, offset)] @@ -3049,6 +3067,7 @@ static int zend_jit_align_func(dasm_State **Dst) static int zend_jit_prologue(dasm_State **Dst) { + | ENDBR if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) { | SUB_HYBRID_SPAD } else if (GCC_GLOBAL_REGS) { @@ -3456,7 +3475,7 @@ static int zend_jit_trace_link_to_root(dasm_State **Dst, zend_jit_trace_info *t, prologue_size = 13; #endif } - link_addr = (const void*)((const char*)t->code_start + prologue_size); + link_addr = (const void*)((const char*)t->code_start + prologue_size + ENDBR_PADDING); if (timeout_exit_addr) { /* Check timeout for links to LOOP */