sh: Tidy up NEFF-based sign extension for SH-5.
This consolidates all of the NEFF-based sign extension for SH-5. In the future the other SH code will need to make use of this as well, so make it generic in preparation for more 32/64 consolidation. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
@@ -425,7 +425,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||
struct task_struct *p, struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *childregs;
|
||||
unsigned long long se; /* Sign extension */
|
||||
|
||||
#ifdef CONFIG_SH_FPU
|
||||
if(last_task_used_math == current) {
|
||||
@@ -441,11 +440,19 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||
|
||||
*childregs = *regs;
|
||||
|
||||
/*
|
||||
* Sign extend the edited stack.
|
||||
* Note that thread.pc and thread.pc will stay
|
||||
* 32-bit wide and context switch must take care
|
||||
* of NEFF sign extension.
|
||||
*/
|
||||
if (user_mode(regs)) {
|
||||
childregs->regs[15] = usp;
|
||||
childregs->regs[15] = neff_sign_extend(usp);
|
||||
p->thread.uregs = childregs;
|
||||
} else {
|
||||
childregs->regs[15] = (unsigned long)task_stack_page(p) + THREAD_SIZE;
|
||||
childregs->regs[15] =
|
||||
neff_sign_extend((unsigned long)task_stack_page(p) +
|
||||
THREAD_SIZE);
|
||||
}
|
||||
|
||||
childregs->regs[9] = 0; /* Set return value for child */
|
||||
@@ -454,17 +461,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||
p->thread.sp = (unsigned long) childregs;
|
||||
p->thread.pc = (unsigned long) ret_from_fork;
|
||||
|
||||
/*
|
||||
* Sign extend the edited stack.
|
||||
* Note that thread.pc and thread.pc will stay
|
||||
* 32-bit wide and context switch must take care
|
||||
* of NEFF sign extension.
|
||||
*/
|
||||
|
||||
se = childregs->regs[15];
|
||||
se = (se & NEFF_SIGN) ? (se | NEFF_MASK) : se;
|
||||
childregs->regs[15] = se;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user