mirror of
https://github.com/php/php-src.git
synced 2024-09-21 09:57:23 +00:00
JIT: Add IBT support (#8636)
Indirect Branch Tracking (IBT) is part of Intel's Control-Flow Enforcement Technology (CET). IBT is hardware based, forward edge Control-Flow-Integrity mechanism where any indirect CALL/JMP must target an ENDBR instruction or suffer #CP. This commit adds IBT support for JIT: 1. Add endbr32/64 instruction in Dynasm. 2. Insert endbr32/64 in indirect branch target for jitted code. gcc support CET since v8.1 and set it to default since gcc 11. With this commit, endbr is inserted in jitted code if PHP is compiled with "gcc -fcf-protection=full/branch". Signed-off-by: Chen, Hu <hu1.chen@intel.com>
This commit is contained in:
parent
2d1a320ba9
commit
c1fcd45eeb
@ -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
|
||||
|
@ -1623,6 +1623,16 @@ static size_t tsrm_tls_offset;
|
||||
|| }
|
||||
|.endmacro
|
||||
|
||||
|.macro ENDBR
|
||||
||#if defined (__CET__) && (__CET__ & 1) != 0
|
||||
| .if X64
|
||||
| endbr64
|
||||
| .else
|
||||
| endbr32
|
||||
| .endif
|
||||
||#endif
|
||||
|.endmacro
|
||||
|
||||
static bool reuse_ip = 0;
|
||||
static bool delayed_call_chain = 0;
|
||||
static uint32_t delayed_call_level = 0;
|
||||
@ -2292,6 +2302,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 +2373,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 +3061,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) {
|
||||
|
Loading…
Reference in New Issue
Block a user