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:
parent
811c08e821
commit
1d0e52b6a0
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue