kernel: separate state for trace-deferred syscalls
state is usually not in p_reg any more with sysenter/syscall trap entries, so when saving/restarting do_ipc invocations the state has to be remembered explicitly.
This commit is contained in:
parent
7f1018b145
commit
51a3e84a97
3 changed files with 11 additions and 1 deletions
|
@ -491,8 +491,9 @@ void arch_do_syscall(struct proc *proc)
|
|||
/* do_ipc assumes that it's running because of the current process */
|
||||
assert(proc == get_cpulocal_var(proc_ptr));
|
||||
/* Make the system call, for real this time. */
|
||||
assert(proc->p_misc_flags & MF_SC_DEFER);
|
||||
proc->p_reg.retreg =
|
||||
do_ipc(proc->p_reg.cx, proc->p_reg.retreg, proc->p_reg.bx);
|
||||
do_ipc(proc->p_defer.r1, proc->p_defer.r2, proc->p_defer.r3);
|
||||
}
|
||||
|
||||
struct proc * arch_finish_switch_to_user(void)
|
||||
|
|
|
@ -546,7 +546,11 @@ int do_ipc(reg_t r1, reg_t r2, reg_t r3)
|
|||
* input message. Postpone the entire system call.
|
||||
*/
|
||||
caller_ptr->p_misc_flags &= ~MF_SC_TRACE;
|
||||
assert(!(caller_ptr->p_misc_flags & MF_SC_DEFER));
|
||||
caller_ptr->p_misc_flags |= MF_SC_DEFER;
|
||||
caller_ptr->p_defer.r1 = r1;
|
||||
caller_ptr->p_defer.r2 = r2;
|
||||
caller_ptr->p_defer.r3 = r3;
|
||||
|
||||
/* Signal the "enter system call" event. Block the process. */
|
||||
cause_sig(proc_nr(caller_ptr), SIGTRAP);
|
||||
|
|
|
@ -121,6 +121,11 @@ struct proc {
|
|||
int p_found; /* consistency checking variables */
|
||||
int p_magic; /* check validity of proc pointers */
|
||||
|
||||
/* if MF_SC_DEFER is set, this struct is valid and contains the
|
||||
* do_ipc() arguments that are still to be executed
|
||||
*/
|
||||
struct { reg_t r1, r2, r3; } p_defer;
|
||||
|
||||
#if DEBUG_TRACE
|
||||
int p_schedules;
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue