e2k: Bug fixes.

Fix time fields in stat64.

Restore and save a breakpoint frame in a signal
handler. This will fix a segfault if a signal will
be raised while a cpu is in a breakpoint.

Signed-off-by: Denis Drakhnya <numas13@gmail.com>
This commit is contained in:
Denis Drakhnia 2021-03-21 18:39:20 +02:00 committed by Denis Drakhnia
parent 811c08e821
commit 1d0e52b6a0
4 changed files with 32 additions and 9 deletions

View File

@ -195,6 +195,13 @@ static void target_setup_frame(int sig, struct target_sigaction *ka,
abi_ulong frame_addr;
struct target_sigframe *frame;
if (env->is_bp) {
/* numas13 FIXME: I am not sure that it is a good solution but
* the way we handle breakpoints requires these steps.
* Maybe we need to create more fake kernel frames for breakpoints? */
e2k_proc_return(env, true);
}
/* save current frame */
helper_signal_frame(env, env->wd.size, env->ip);
@ -238,6 +245,10 @@ static void target_setup_frame(int sig, struct target_sigaction *ka,
env->tags[2] = E2K_TAG_NUMBER64;
}
if (env->is_bp) {
e2k_proc_call(env, env->wd.size, env->ip, true);
}
unlock_user_struct(frame, frame_addr, 1);
return;

View File

@ -1605,12 +1605,21 @@ struct target_stat64 {
abi_uint st_blksize;
abi_uint __unused1;
abi_ullong st_blocks;
#if 0
abi_int target_st_atime;
abi_uint target_st_atime_nsec;
abi_int target_st_mtime;
abi_uint target_st_mtime_nsec;
abi_int target_st_ctime;
abi_uint target_st_ctime_nsec;
#else
abi_long target_st_atime;
abi_ulong target_st_atime_nsec;
abi_long target_st_mtime;
abi_ulong target_st_mtime_nsec;
abi_long target_st_ctime;
abi_ulong target_st_ctime_nsec;
#endif
};
#elif defined(TARGET_PPC)

View File

@ -834,6 +834,9 @@ void e2k_update_fp_status(CPUE2KState *env);
void e2k_update_fx_status(CPUE2KState *env);
void e2k_pcs_new(E2KPcsState *pcs);
void e2k_ps_new(E2KPsState *ps);
void e2k_proc_call(CPUE2KState *env, int base, target_ulong ret_ip,
bool force_fx);
void e2k_proc_return(CPUE2KState *env, bool force_fx);
#define cpu_signal_handler e2k_cpu_signal_handler
#define cpu_list e2k_cpu_list

View File

@ -155,7 +155,7 @@ static void pcs_pop(CPUE2KState *env, E2KCrs *crs)
}
}
static void proc_call(CPUE2KState *env, int base, target_ulong ret_ip,
void e2k_proc_call(CPUE2KState *env, int base, target_ulong ret_ip,
bool force_fx)
{
E2KCrs crs;
@ -177,7 +177,7 @@ static void proc_call(CPUE2KState *env, int base, target_ulong ret_ip,
env->wd.psize = env->wd.size;
}
static void proc_return(CPUE2KState *env, bool force_fx)
void e2k_proc_return(CPUE2KState *env, bool force_fx)
{
E2KCrs crs;
int base;
@ -200,17 +200,17 @@ static void proc_return(CPUE2KState *env, bool force_fx)
void HELPER(signal_frame)(CPUE2KState *env, int wd_size, target_ulong ret_ip)
{
proc_call(env, wd_size, ret_ip, false);
e2k_proc_call(env, wd_size, ret_ip, false);
}
void HELPER(signal_return)(CPUE2KState *env)
{
proc_return(env, false);
e2k_proc_return(env, false);
}
static inline void do_call(CPUE2KState *env, int wbs, target_ulong ret_ip)
{
proc_call(env, wbs * 2, ret_ip, false);
e2k_proc_call(env, wbs * 2, ret_ip, false);
reset_ctprs(env);
}
@ -281,7 +281,7 @@ void HELPER(return)(CPUE2KState *env)
qemu_log(TARGET_FMT_lx ": unknown return ctpr opc %d\n", env->ip, opc);
}
proc_return(env, false);
e2k_proc_return(env, false);
reset_ctprs(env);
}
}
@ -301,7 +301,7 @@ void G_NORETURN raise_exception_ra(CPUE2KState *env, int exception_index,
/* ignore */
break;
default:
proc_call(env, env->wd.size, env->ip, true);
e2k_proc_call(env, env->wd.size, env->ip, true);
break;
}
cs->exception_index = exception_index;
@ -345,13 +345,13 @@ bool e2k_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
E2KCPU *cpu = E2K_CPU(cs);
CPUE2KState *env = &cpu->env;
proc_call(env, env->wd.size, env->ip, true);
e2k_proc_call(env, env->wd.size, env->ip, true);
cs->exception_index = EXCP_DATA_PAGE;
cpu_loop_exit_restore(cs, retaddr);
}
void HELPER(break_restore_state)(CPUE2KState *env)
{
proc_return(env, true);
e2k_proc_return(env, true);
env->is_bp = false;
}