3030#include "Zend/zend_observer.h"
3131#include "zend_smart_str.h"
3232#include "jit/zend_jit.h"
33+ #if __has_include (< sys /mman .h > )
34+ # include <sys/mman.h>
35+ #endif
3336
3437#ifdef HAVE_JIT
3538
@@ -115,6 +118,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_CCONV zend_runtime_jit(ZEND_O
115118static ZEND_OPCODE_HANDLER_RET ZEND_OPCODE_HANDLER_FUNC_CCONV zend_runtime_jit (ZEND_OPCODE_HANDLER_ARGS );
116119#endif
117120
121+ static void zend_jit_protect_init (void );
122+
118123static int zend_jit_trace_op_len (const zend_op * opline );
119124static int zend_jit_trace_may_exit (const zend_op_array * op_array , const zend_op * opline );
120125static uint32_t _zend_jit_trace_get_exit_point (const zend_op * to_opline , uint32_t flags ZEND_FILE_LINE_DC );
@@ -3526,6 +3531,68 @@ int zend_jit_script(zend_script *script)
35263531 return FAILURE ;
35273532}
35283533
3534+ static void zend_jit_protect_init (void )
3535+ {
3536+ #ifdef HAVE_MPROTECT
3537+ # ifdef ZEND_JIT_USE_PKEYS
3538+ pkey = pkey_alloc (0 , PKEY_DISABLE_WRITE );
3539+ if (pkey < 0 ) {
3540+ zend_accel_error (ACCEL_LOG_DEBUG , "pkey_alloc() failed [%d] %s" , errno , strerror (errno ));
3541+ pkey = 0 ;
3542+ }
3543+ # endif
3544+
3545+ # ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP
3546+ if (zend_write_protect ) {
3547+ pthread_jit_write_protect_np (1 );
3548+ }
3549+ # endif
3550+
3551+ if (JIT_G (debug ) & (ZEND_JIT_DEBUG_GDB |ZEND_JIT_DEBUG_PERF_DUMP )) {
3552+ if (mprotect (dasm_buf , dasm_size , PROT_READ | PROT_WRITE | PROT_EXEC ) != 0 ) {
3553+ fprintf (stderr , "mprotect() failed [%d] %s\n" , errno , strerror (errno ));
3554+ }
3555+ return ;
3556+ }
3557+
3558+ # ifdef ZEND_JIT_USE_PKEYS
3559+ if (pkey ) {
3560+ if (pkey_mprotect (dasm_buf , dasm_size , PROT_READ | PROT_WRITE | PROT_EXEC , pkey ) != 0 ) {
3561+ zend_accel_error (ACCEL_LOG_DEBUG , "pkey_mprotect() failed [%d] %s" , errno , strerror (errno ));
3562+ pkey = 0 ;
3563+ } else {
3564+ return ;
3565+ }
3566+ }
3567+ # endif
3568+
3569+ if (mprotect (dasm_buf , dasm_size , PROT_READ | PROT_EXEC ) != 0 ) {
3570+ fprintf (stderr , "mprotect() failed [%d] %s\n" , errno , strerror (errno ));
3571+ }
3572+
3573+ #elif defined(_WIN32 )
3574+ if (JIT_G (debug ) & (ZEND_JIT_DEBUG_GDB |ZEND_JIT_DEBUG_PERF_DUMP )) {
3575+ DWORD old ;
3576+
3577+ if (!VirtualProtect (dasm_buf , dasm_size , PAGE_EXECUTE_READWRITE , & old )) {
3578+ DWORD err = GetLastError ();
3579+ char * msg = php_win32_error_to_msg (err );
3580+ fprintf (stderr , "VirtualProtect() failed [%lu] %s\n" , err , msg );
3581+ php_win32_error_msg_free (msg );
3582+ }
3583+ } else {
3584+ DWORD old ;
3585+
3586+ if (!VirtualProtect (dasm_buf , dasm_size , PAGE_EXECUTE_READ , & old )) {
3587+ DWORD err = GetLastError ();
3588+ char * msg = php_win32_error_to_msg (err );
3589+ fprintf (stderr , "VirtualProtect() failed [%lu] %s\n" , err , msg );
3590+ php_win32_error_msg_free (msg );
3591+ }
3592+ }
3593+ #endif
3594+ }
3595+
35293596void zend_jit_unprotect (void )
35303597{
35313598#ifdef HAVE_MPROTECT
@@ -3538,10 +3605,9 @@ void zend_jit_unprotect(void)
35383605 int restrictions = PKEY_DISABLE_EXECUTE ;
35393606# endif
35403607 if (pkey_set (pkey , restrictions ) != 0 ) {
3541- fprintf (stderr , "pkey_set() failed [%d] %s\n" , errno , strerror (errno ));
3542- } else {
3543- return ;
3608+ ZEND_UNREACHABLE ();
35443609 }
3610+ return ;
35453611 }
35463612# endif
35473613
@@ -3583,10 +3649,9 @@ void zend_jit_protect(void)
35833649# ifdef ZEND_JIT_USE_PKEYS
35843650 if (pkey ) {
35853651 if (pkey_set (pkey , PKEY_DISABLE_WRITE ) != 0 ) {
3586- fprintf (stderr , "pkey_set() failed [%d] %s\n" , errno , strerror (errno ));
3587- } else {
3588- return ;
3652+ ZEND_UNREACHABLE ();
35893653 }
3654+ return ;
35903655 }
35913656# endif
35923657
@@ -3810,68 +3875,6 @@ int zend_jit_check_support(void)
38103875 return SUCCESS ;
38113876}
38123877
3813- static void zend_jit_startup_dasm_prot (void )
3814- {
3815- #ifdef HAVE_MPROTECT
3816- # ifdef ZEND_JIT_USE_PKEYS
3817- pkey = pkey_alloc (0 , PKEY_DISABLE_WRITE );
3818- if (pkey < 0 ) {
3819- pkey = 0 ;
3820- }
3821- # endif
3822- # ifdef HAVE_PTHREAD_JIT_WRITE_PROTECT_NP
3823- if (zend_write_protect ) {
3824- pthread_jit_write_protect_np (1 );
3825- }
3826- # endif
3827-
3828- if (JIT_G (debug ) & (ZEND_JIT_DEBUG_GDB |ZEND_JIT_DEBUG_PERF_DUMP )) {
3829- if (mprotect (dasm_buf , dasm_size , PROT_READ | PROT_WRITE | PROT_EXEC ) != 0 ) {
3830- fprintf (stderr , "mprotect() failed [%d] %s\n" , errno , strerror (errno ));
3831- }
3832- return ;
3833- }
3834-
3835- # if ZEND_JIT_USE_PKEYS
3836- if (pkey ) {
3837- if (pkey_mprotect (dasm_buf , dasm_size , PROT_READ | PROT_WRITE | PROT_EXEC , pkey ) != 0 ) {
3838- fprintf (stderr , "pkey_mprotect() failed [%d] %s\n" , errno , strerror (errno ));
3839- pkey = 0 ;
3840- } else {
3841- /* Fallback to mprotect(PROT_READ | PROT_EXEC) */
3842- return ;
3843- }
3844- }
3845-
3846- # endif
3847-
3848- if (mprotect (dasm_buf , dasm_size , PROT_READ | PROT_EXEC ) != 0 ) {
3849- fprintf (stderr , "mprotect() failed [%d] %s\n" , errno , strerror (errno ));
3850- }
3851-
3852- #elif defined(_WIN32 )
3853- if (JIT_G (debug ) & (ZEND_JIT_DEBUG_GDB |ZEND_JIT_DEBUG_PERF_DUMP )) {
3854- DWORD old ;
3855-
3856- if (!VirtualProtect (dasm_buf , dasm_size , PAGE_EXECUTE_READWRITE , & old )) {
3857- DWORD err = GetLastError ();
3858- char * msg = php_win32_error_to_msg (err );
3859- fprintf (stderr , "VirtualProtect() failed [%lu] %s\n" , err , msg );
3860- php_win32_error_msg_free (msg );
3861- }
3862- } else {
3863- DWORD old ;
3864-
3865- if (!VirtualProtect (dasm_buf , dasm_size , PAGE_EXECUTE_READ , & old )) {
3866- DWORD err = GetLastError ();
3867- char * msg = php_win32_error_to_msg (err );
3868- fprintf (stderr , "VirtualProtect() failed [%lu] %s\n" , err , msg );
3869- php_win32_error_msg_free (msg );
3870- }
3871- }
3872- #endif
3873- }
3874-
38753878void zend_jit_startup (void * buf , size_t size , bool reattached )
38763879{
38773880 zend_jit_halt_op = zend_get_halt_op ();
@@ -3885,7 +3888,7 @@ void zend_jit_startup(void *buf, size_t size, bool reattached)
38853888 dasm_size = size ;
38863889 dasm_ptr = dasm_end = (void * )(((char * )dasm_buf ) + size - sizeof (* dasm_ptr ) * 2 );
38873890
3888- zend_jit_startup_dasm_prot ();
3891+ zend_jit_protect_init ();
38893892
38903893 if (!reattached ) {
38913894 zend_jit_unprotect ();
0 commit comments