linux-user: Move tswap_siginfo out of target code
Move tswap_siginfo from target code to handle_pending_signal. This will allow some cleanups and having the siginfo ready to be used in gdbstub. Signed-off-by: Gustavo Romero <gustavo.romero@linaro.org> Suggested-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20240309030901.1726211-3-gustavo.romero@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
This commit is contained in:
parent
b6617e937e
commit
4d6d8a05a0
@ -670,7 +670,7 @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
|
|||||||
aarch64_set_svcr(env, 0, R_SVCR_SM_MASK | R_SVCR_ZA_MASK);
|
aarch64_set_svcr(env, 0, R_SVCR_SM_MASK | R_SVCR_ZA_MASK);
|
||||||
|
|
||||||
if (info) {
|
if (info) {
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
env->xregs[1] = frame_addr + offsetof(struct target_rt_sigframe, info);
|
env->xregs[1] = frame_addr + offsetof(struct target_rt_sigframe, info);
|
||||||
env->xregs[2] = frame_addr + offsetof(struct target_rt_sigframe, uc);
|
env->xregs[2] = frame_addr + offsetof(struct target_rt_sigframe, uc);
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
goto give_sigsegv;
|
goto give_sigsegv;
|
||||||
}
|
}
|
||||||
|
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
|
|
||||||
__put_user(0, &frame->uc.tuc_flags);
|
__put_user(0, &frame->uc.tuc_flags);
|
||||||
__put_user(0, &frame->uc.tuc_link);
|
__put_user(0, &frame->uc.tuc_link);
|
||||||
|
@ -357,7 +357,7 @@ void setup_rt_frame(int usig, struct target_sigaction *ka,
|
|||||||
|
|
||||||
info_addr = frame_addr + offsetof(struct rt_sigframe, info);
|
info_addr = frame_addr + offsetof(struct rt_sigframe, info);
|
||||||
uc_addr = frame_addr + offsetof(struct rt_sigframe, sig.uc);
|
uc_addr = frame_addr + offsetof(struct rt_sigframe, sig.uc);
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
|
|
||||||
setup_sigframe(&frame->sig.uc, set, env);
|
setup_sigframe(&frame->sig.uc, set, env);
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
}
|
}
|
||||||
|
|
||||||
setup_ucontext(&frame->uc, env, set);
|
setup_ucontext(&frame->uc, env, set);
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
/*
|
/*
|
||||||
* The on-stack signal trampoline is no longer executed;
|
* The on-stack signal trampoline is no longer executed;
|
||||||
* however, the libgcc signal frame unwinding code checks
|
* however, the libgcc signal frame unwinding code checks
|
||||||
|
@ -127,7 +127,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
goto give_sigsegv;
|
goto give_sigsegv;
|
||||||
}
|
}
|
||||||
|
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
frame->uc.tuc_flags = 0;
|
frame->uc.tuc_flags = 0;
|
||||||
frame->uc.tuc_link = 0;
|
frame->uc.tuc_link = 0;
|
||||||
|
|
||||||
|
@ -430,7 +430,7 @@ void setup_frame(int sig, struct target_sigaction *ka,
|
|||||||
setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0],
|
setup_sigcontext(&frame->sc, &frame->fpstate, env, set->sig[0],
|
||||||
frame_addr + offsetof(struct sigframe, fpstate));
|
frame_addr + offsetof(struct sigframe, fpstate));
|
||||||
|
|
||||||
for(i = 1; i < TARGET_NSIG_WORDS; i++) {
|
for (i = 1; i < TARGET_NSIG_WORDS; i++) {
|
||||||
__put_user(set->sig[i], &frame->extramask[i - 1]);
|
__put_user(set->sig[i], &frame->extramask[i - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,7 +490,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
__put_user(addr, &frame->puc);
|
__put_user(addr, &frame->puc);
|
||||||
#endif
|
#endif
|
||||||
if (ka->sa_flags & TARGET_SA_SIGINFO) {
|
if (ka->sa_flags & TARGET_SA_SIGINFO) {
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the ucontext. */
|
/* Create the ucontext. */
|
||||||
@ -504,7 +504,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate, env,
|
setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate, env,
|
||||||
set->sig[0], frame_addr + offsetof(struct rt_sigframe, fpstate));
|
set->sig[0], frame_addr + offsetof(struct rt_sigframe, fpstate));
|
||||||
|
|
||||||
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
|
for (i = 0; i < TARGET_NSIG_WORDS; i++) {
|
||||||
__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
|
__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
extctx.end.haddr = (void *)frame + (extctx.end.gaddr - frame_addr);
|
extctx.end.haddr = (void *)frame + (extctx.end.gaddr - frame_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
tswap_siginfo(&frame->rs_info, info);
|
frame->rs_info = *info;
|
||||||
|
|
||||||
__put_user(0, &frame->rs_uc.tuc_flags);
|
__put_user(0, &frame->rs_uc.tuc_flags);
|
||||||
__put_user(0, &frame->rs_uc.tuc_link);
|
__put_user(0, &frame->rs_uc.tuc_link);
|
||||||
|
@ -295,7 +295,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
|
uc_addr = frame_addr + offsetof(struct target_rt_sigframe, uc);
|
||||||
__put_user(uc_addr, &frame->puc);
|
__put_user(uc_addr, &frame->puc);
|
||||||
|
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
|
|
||||||
/* Create the ucontext */
|
/* Create the ucontext */
|
||||||
|
|
||||||
@ -307,7 +307,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
if (err)
|
if (err)
|
||||||
goto give_sigsegv;
|
goto give_sigsegv;
|
||||||
|
|
||||||
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
|
for (i = 0; i < TARGET_NSIG_WORDS; i++) {
|
||||||
__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
|
__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
|
|
||||||
__put_user(0, &frame->uc.tuc_flags);
|
__put_user(0, &frame->uc.tuc_flags);
|
||||||
__put_user(0, &frame->uc.tuc_link);
|
__put_user(0, &frame->uc.tuc_link);
|
||||||
|
@ -303,7 +303,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
goto give_sigsegv;
|
goto give_sigsegv;
|
||||||
}
|
}
|
||||||
|
|
||||||
tswap_siginfo(&frame->rs_info, info);
|
frame->rs_info = *info;
|
||||||
|
|
||||||
__put_user(0, &frame->rs_uc.tuc_flags);
|
__put_user(0, &frame->rs_uc.tuc_flags);
|
||||||
__put_user(0, &frame->rs_uc.tuc_link);
|
__put_user(0, &frame->rs_uc.tuc_link);
|
||||||
@ -311,7 +311,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
|
|
||||||
setup_sigcontext(env, &frame->rs_uc.tuc_mcontext);
|
setup_sigcontext(env, &frame->rs_uc.tuc_mcontext);
|
||||||
|
|
||||||
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
|
for (i = 0; i < TARGET_NSIG_WORDS; i++) {
|
||||||
__put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]);
|
__put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
|
|
||||||
/* Create the ucontext. */
|
/* Create the ucontext. */
|
||||||
__put_user(0, &frame->uc.tuc_flags);
|
__put_user(0, &frame->uc.tuc_flags);
|
||||||
|
@ -103,7 +103,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ka->sa_flags & SA_SIGINFO) {
|
if (ka->sa_flags & SA_SIGINFO) {
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
}
|
}
|
||||||
|
|
||||||
__put_user(0, &frame->uc.tuc_flags);
|
__put_user(0, &frame->uc.tuc_flags);
|
||||||
|
@ -493,7 +493,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
if (!lock_user_struct(VERIFY_WRITE, rt_sf, rt_sf_addr, 1))
|
if (!lock_user_struct(VERIFY_WRITE, rt_sf, rt_sf_addr, 1))
|
||||||
goto sigsegv;
|
goto sigsegv;
|
||||||
|
|
||||||
tswap_siginfo(&rt_sf->info, info);
|
rt_sf->info = *info;
|
||||||
|
|
||||||
__put_user(0, &rt_sf->uc.tuc_flags);
|
__put_user(0, &rt_sf->uc.tuc_flags);
|
||||||
__put_user(0, &rt_sf->uc.tuc_link);
|
__put_user(0, &rt_sf->uc.tuc_link);
|
||||||
@ -502,7 +502,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
__put_user(h2g (&rt_sf->uc.tuc_mcontext),
|
__put_user(h2g (&rt_sf->uc.tuc_mcontext),
|
||||||
&rt_sf->uc.tuc_regs);
|
&rt_sf->uc.tuc_regs);
|
||||||
#endif
|
#endif
|
||||||
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
|
for (i = 0; i < TARGET_NSIG_WORDS; i++) {
|
||||||
__put_user(set->sig[i], &rt_sf->uc.tuc_sigmask.sig[i]);
|
__put_user(set->sig[i], &rt_sf->uc.tuc_sigmask.sig[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
}
|
}
|
||||||
|
|
||||||
setup_ucontext(&frame->uc, env, set);
|
setup_ucontext(&frame->uc, env, set);
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
|
|
||||||
env->pc = ka->_sa_handler;
|
env->pc = ka->_sa_handler;
|
||||||
env->gpr[xSP] = frame_addr;
|
env->gpr[xSP] = frame_addr;
|
||||||
|
@ -267,7 +267,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Create siginfo on the signal stack. */
|
/* Create siginfo on the signal stack. */
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
|
|
||||||
/* Create ucontext on the signal stack. */
|
/* Create ucontext on the signal stack. */
|
||||||
uc_flags = 0;
|
uc_flags = 0;
|
||||||
|
@ -233,7 +233,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
goto give_sigsegv;
|
goto give_sigsegv;
|
||||||
}
|
}
|
||||||
|
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
|
|
||||||
/* Create the ucontext. */
|
/* Create the ucontext. */
|
||||||
__put_user(0, &frame->uc.tuc_flags);
|
__put_user(0, &frame->uc.tuc_flags);
|
||||||
|
@ -43,8 +43,6 @@ void host_to_target_sigset_internal(target_sigset_t *d,
|
|||||||
const sigset_t *s);
|
const sigset_t *s);
|
||||||
void target_to_host_sigset_internal(sigset_t *d,
|
void target_to_host_sigset_internal(sigset_t *d,
|
||||||
const target_sigset_t *s);
|
const target_sigset_t *s);
|
||||||
void tswap_siginfo(target_siginfo_t *tinfo,
|
|
||||||
const target_siginfo_t *info);
|
|
||||||
void set_sigmask(const sigset_t *set);
|
void set_sigmask(const sigset_t *set);
|
||||||
void force_sig(int sig);
|
void force_sig(int sig);
|
||||||
void force_sigsegv(int oldsig);
|
void force_sigsegv(int oldsig);
|
||||||
|
@ -409,8 +409,8 @@ static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
|
|||||||
tinfo->si_code = deposit32(si_code, 16, 16, si_type);
|
tinfo->si_code = deposit32(si_code, 16, 16, si_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tswap_siginfo(target_siginfo_t *tinfo,
|
static void tswap_siginfo(target_siginfo_t *tinfo,
|
||||||
const target_siginfo_t *info)
|
const target_siginfo_t *info)
|
||||||
{
|
{
|
||||||
int si_type = extract32(info->si_code, 16, 16);
|
int si_type = extract32(info->si_code, 16, 16);
|
||||||
int si_code = sextract32(info->si_code, 0, 16);
|
int si_code = sextract32(info->si_code, 0, 16);
|
||||||
@ -1178,6 +1178,12 @@ static void handle_pending_signal(CPUArchState *cpu_env, int sig,
|
|||||||
/* dequeue signal */
|
/* dequeue signal */
|
||||||
k->pending = 0;
|
k->pending = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes out siginfo values byteswapped, accordingly to the target. It also
|
||||||
|
* cleans the si_type from si_code making it correct for the target.
|
||||||
|
*/
|
||||||
|
tswap_siginfo(&k->info, &k->info);
|
||||||
|
|
||||||
sig = gdb_handlesig(cpu, sig, NULL);
|
sig = gdb_handlesig(cpu, sig, NULL);
|
||||||
if (!sig) {
|
if (!sig) {
|
||||||
sa = NULL;
|
sa = NULL;
|
||||||
|
@ -333,7 +333,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
|
|
||||||
__put_user(0, &sf->rwin_save); /* TODO: save_rwin_state */
|
__put_user(0, &sf->rwin_save); /* TODO: save_rwin_state */
|
||||||
|
|
||||||
tswap_siginfo(&sf->info, info);
|
sf->info = *info;
|
||||||
tswap_sigset(&sf->mask, set);
|
tswap_sigset(&sf->mask, set);
|
||||||
target_save_altstack(&sf->stack, env);
|
target_save_altstack(&sf->stack, env);
|
||||||
|
|
||||||
|
@ -184,7 +184,7 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ka->sa_flags & SA_SIGINFO) {
|
if (ka->sa_flags & SA_SIGINFO) {
|
||||||
tswap_siginfo(&frame->info, info);
|
frame->info = *info;
|
||||||
}
|
}
|
||||||
|
|
||||||
__put_user(0, &frame->uc.tuc_flags);
|
__put_user(0, &frame->uc.tuc_flags);
|
||||||
|
Loading…
Reference in New Issue
Block a user