mirror of https://gitee.com/openkylin/qemu.git
linux-user: Provide new force_sig_fault() function
In many places in the linux-user code we need to queue a signal for the guest using the QEMU_SI_FAULT si_type. This requires that the caller sets up and passes us a target_siginfo, including setting the appropriate part of the _sifields union for the si_type. In a number of places the code forgets to set the _sifields union field. Provide a new force_sig_fault() function, which does the same thing as the Linux kernel function of that name -- it takes the signal number, the si_code value and the address to use in _sifields._sigfault, and assembles the target_siginfo itself. This makes the callsites simpler and means it's harder to forget to pass in an address value. We follow force_sig() and the kernel's force_sig_fault() in not requiring the caller to pass in the CPU pointer but always acting on the CPU of the current thread. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210813131809.28655-6-peter.maydell@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
819121b9b0
commit
af7969605e
|
@ -40,6 +40,7 @@ void tswap_siginfo(target_siginfo_t *tinfo,
|
|||
void set_sigmask(const sigset_t *set);
|
||||
void force_sig(int sig);
|
||||
void force_sigsegv(int oldsig);
|
||||
void force_sig_fault(int sig, int code, abi_ulong addr);
|
||||
#if defined(TARGET_ARCH_HAS_SETUP_FRAME)
|
||||
void setup_frame(int sig, struct target_sigaction *ka,
|
||||
target_sigset_t *set, CPUArchState *env);
|
||||
|
|
|
@ -651,6 +651,23 @@ void force_sig(int sig)
|
|||
queue_signal(env, info.si_signo, QEMU_SI_KILL, &info);
|
||||
}
|
||||
|
||||
/*
|
||||
* Force a synchronously taken QEMU_SI_FAULT signal. For QEMU the
|
||||
* 'force' part is handled in process_pending_signals().
|
||||
*/
|
||||
void force_sig_fault(int sig, int code, abi_ulong addr)
|
||||
{
|
||||
CPUState *cpu = thread_cpu;
|
||||
CPUArchState *env = cpu->env_ptr;
|
||||
target_siginfo_t info = {};
|
||||
|
||||
info.si_signo = sig;
|
||||
info.si_errno = 0;
|
||||
info.si_code = code;
|
||||
info._sifields._sigfault._addr = addr;
|
||||
queue_signal(env, sig, QEMU_SI_FAULT, &info);
|
||||
}
|
||||
|
||||
/* Force a SIGSEGV if we couldn't write to memory trying to set
|
||||
* up the signal frame. oldsig is the signal we were trying to handle
|
||||
* at the point of failure.
|
||||
|
|
Loading…
Reference in New Issue