diff options
| author | Po Lu | 2024-07-01 18:11:58 +0800 |
|---|---|---|
| committer | Po Lu | 2024-07-01 18:11:58 +0800 |
| commit | ebf5bcb9f0b6adeb97a3918b8f3845844c9091b0 (patch) | |
| tree | f7660b9380f715d48dfe4ff30a57e12965b6166d /exec/exec.h | |
| parent | 7c8d4e96ba6db19bdca20a87bafed024a84eb517 (diff) | |
| download | emacs-ebf5bcb9f0b6adeb97a3918b8f3845844c9091b0.tar.gz emacs-ebf5bcb9f0b6adeb97a3918b8f3845844c9091b0.zip | |
Optimize process execution on Android
* exec/configure.ac (REENTRANT): Remove option for reentrancy.
(PROGRAM_COUNTER, HAVE_SECCOMP): Define register providing the
program counter and enable seccomp if its headers are available.
* exec/exec.c (write_load_command): Avoid defining unused
variable.
(exec_0): Remove code specific to REENTRANT configurations.
* exec/exec.h (struct exec_tracee) <exec_data, data_size>: New
fields for loader instructions and their size.
* exec/exec1.c (main): Call exec_init before forking.
* exec/mipsel-user.h (ELF_NGREG): Delete definition.
(struct mipsel_regs): Reduce number of gregs to 32, but
introduce separate fields for special registers.
* exec/trace.c (use_seccomp_p): New variable; defile to false if
!HAVE_SECCOMP.
(remove_tracee): Cease providing for non-reentrant
configurations. Release executable data if present.
(handle_clone_prepare): Likewise. Resume process with
PTRACE_CONT if seccomp-based interception is enabled.
(handle_clone, check_signal): Resume processes as above.
(handle_exec): Divide into two functions, with only rewriting
the system call and generating instructions for the loader
remaining in the first, and copying such instructions into the
loader's stack removed into a new function, `finish_exec'.
(finish_exec): New function.
(handle_readlinkat, handle_openat): Abolish non-REENTRANT
configurations.
(process_system_call): Divide exec system calls into two phases,
disambiguated by the value of tracee->waiting_for_syscall. Typo
fixes. Accommodate syscall-exit-stops where the signal was
initially intercepted by `seccomp_system_call'.
(interesting_syscalls): New array.
(ARRAYELTS): New macro.
(seccomp_system_call, establish_seccomp_filter): New function.
(tracing_execve) [HAVE_SECCOMP]: Establish a seccomp filter if
this is to be enabled.
(after_fork): Provide PTRACE_O_TRACESECCOMP. Resume process
with PTRACE_CONT if seccomp-based interception is enabled.
(exec_waitpid): Resume process with PTRACE_CONT if seccomp-based
interception is enabled. Dispatch stops identifying as
PTRACE_EVENT_SECCOMP to `seccomp_system_call'.
(exec_init): Establish whether it is possible to enable seccomp.
Diffstat (limited to 'exec/exec.h')
| -rw-r--r-- | exec/exec.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/exec/exec.h b/exec/exec.h index 3ce06c35311..59963587573 100644 --- a/exec/exec.h +++ b/exec/exec.h | |||
| @@ -152,6 +152,16 @@ struct exec_tracee | |||
| 152 | completion. */ | 152 | completion. */ |
| 153 | USER_WORD sp; | 153 | USER_WORD sp; |
| 154 | 154 | ||
| 155 | /* Name of the executable being run. */ | ||
| 156 | char *exec_file; | ||
| 157 | |||
| 158 | /* Pointer to a storage area holding instructions for loading an | ||
| 159 | executable if an `exec' system call is outstanding, or NULL. */ | ||
| 160 | char *exec_data; | ||
| 161 | |||
| 162 | /* Number of bytes in exec_data. */ | ||
| 163 | size_t data_size; | ||
| 164 | |||
| 155 | /* The thread ID of this process. */ | 165 | /* The thread ID of this process. */ |
| 156 | pid_t pid; | 166 | pid_t pid; |
| 157 | 167 | ||
| @@ -162,11 +172,6 @@ struct exec_tracee | |||
| 162 | /* Whether or not the tracee has been created but is not yet | 172 | /* Whether or not the tracee has been created but is not yet |
| 163 | processed by `handle_clone'. */ | 173 | processed by `handle_clone'. */ |
| 164 | bool new_child : 1; | 174 | bool new_child : 1; |
| 165 | |||
| 166 | #ifndef REENTRANT | ||
| 167 | /* Name of the executable being run. */ | ||
| 168 | char *exec_file; | ||
| 169 | #endif /* !REENTRANT */ | ||
| 170 | }; | 175 | }; |
| 171 | 176 | ||
| 172 | 177 | ||