Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6: sparc32: Fix thinko in previous change. sparc: Align clone and signal stacks to 16 bytes.
This commit is contained in:
commit
f2d6cff7f5
|
@ -526,7 +526,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
||||||
* Set some valid stack frames to give to the child.
|
* Set some valid stack frames to give to the child.
|
||||||
*/
|
*/
|
||||||
childstack = (struct sparc_stackf __user *)
|
childstack = (struct sparc_stackf __user *)
|
||||||
(sp & ~0x7UL);
|
(sp & ~0xfUL);
|
||||||
parentstack = (struct sparc_stackf __user *)
|
parentstack = (struct sparc_stackf __user *)
|
||||||
regs->u_regs[UREG_FP];
|
regs->u_regs[UREG_FP];
|
||||||
|
|
||||||
|
|
|
@ -398,11 +398,11 @@ static unsigned long clone_stackframe(unsigned long csp, unsigned long psp)
|
||||||
} else
|
} else
|
||||||
__get_user(fp, &(((struct reg_window32 __user *)psp)->ins[6]));
|
__get_user(fp, &(((struct reg_window32 __user *)psp)->ins[6]));
|
||||||
|
|
||||||
/* Now 8-byte align the stack as this is mandatory in the
|
/* Now align the stack as this is mandatory in the Sparc ABI
|
||||||
* Sparc ABI due to how register windows work. This hides
|
* due to how register windows work. This hides the
|
||||||
* the restriction from thread libraries etc. -DaveM
|
* restriction from thread libraries etc.
|
||||||
*/
|
*/
|
||||||
csp &= ~7UL;
|
csp &= ~15UL;
|
||||||
|
|
||||||
distance = fp - psp;
|
distance = fp - psp;
|
||||||
rval = (csp - distance);
|
rval = (csp - distance);
|
||||||
|
|
|
@ -120,8 +120,8 @@ struct rt_signal_frame32 {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Align macros */
|
/* Align macros */
|
||||||
#define SF_ALIGNEDSZ (((sizeof(struct signal_frame32) + 7) & (~7)))
|
#define SF_ALIGNEDSZ (((sizeof(struct signal_frame32) + 15) & (~15)))
|
||||||
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame32) + 7) & (~7)))
|
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame32) + 15) & (~15)))
|
||||||
|
|
||||||
int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
|
int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
|
||||||
{
|
{
|
||||||
|
@ -420,15 +420,17 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns
|
||||||
sp = current->sas_ss_sp + current->sas_ss_size;
|
sp = current->sas_ss_sp + current->sas_ss_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sp -= framesize;
|
||||||
|
|
||||||
/* Always align the stack frame. This handles two cases. First,
|
/* Always align the stack frame. This handles two cases. First,
|
||||||
* sigaltstack need not be mindful of platform specific stack
|
* sigaltstack need not be mindful of platform specific stack
|
||||||
* alignment. Second, if we took this signal because the stack
|
* alignment. Second, if we took this signal because the stack
|
||||||
* is not aligned properly, we'd like to take the signal cleanly
|
* is not aligned properly, we'd like to take the signal cleanly
|
||||||
* and report that.
|
* and report that.
|
||||||
*/
|
*/
|
||||||
sp &= ~7UL;
|
sp &= ~15UL;
|
||||||
|
|
||||||
return (void __user *)(sp - framesize);
|
return (void __user *) sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
|
static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
|
||||||
|
|
|
@ -267,15 +267,17 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re
|
||||||
sp = current->sas_ss_sp + current->sas_ss_size;
|
sp = current->sas_ss_sp + current->sas_ss_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sp -= framesize;
|
||||||
|
|
||||||
/* Always align the stack frame. This handles two cases. First,
|
/* Always align the stack frame. This handles two cases. First,
|
||||||
* sigaltstack need not be mindful of platform specific stack
|
* sigaltstack need not be mindful of platform specific stack
|
||||||
* alignment. Second, if we took this signal because the stack
|
* alignment. Second, if we took this signal because the stack
|
||||||
* is not aligned properly, we'd like to take the signal cleanly
|
* is not aligned properly, we'd like to take the signal cleanly
|
||||||
* and report that.
|
* and report that.
|
||||||
*/
|
*/
|
||||||
sp &= ~7UL;
|
sp &= ~15UL;
|
||||||
|
|
||||||
return (void __user *)(sp - framesize);
|
return (void __user *) sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
|
|
@ -353,7 +353,7 @@ segv:
|
||||||
/* Checks if the fp is valid */
|
/* Checks if the fp is valid */
|
||||||
static int invalid_frame_pointer(void __user *fp, int fplen)
|
static int invalid_frame_pointer(void __user *fp, int fplen)
|
||||||
{
|
{
|
||||||
if (((unsigned long) fp) & 7)
|
if (((unsigned long) fp) & 15)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -396,15 +396,17 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *
|
||||||
sp = current->sas_ss_sp + current->sas_ss_size;
|
sp = current->sas_ss_sp + current->sas_ss_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sp -= framesize;
|
||||||
|
|
||||||
/* Always align the stack frame. This handles two cases. First,
|
/* Always align the stack frame. This handles two cases. First,
|
||||||
* sigaltstack need not be mindful of platform specific stack
|
* sigaltstack need not be mindful of platform specific stack
|
||||||
* alignment. Second, if we took this signal because the stack
|
* alignment. Second, if we took this signal because the stack
|
||||||
* is not aligned properly, we'd like to take the signal cleanly
|
* is not aligned properly, we'd like to take the signal cleanly
|
||||||
* and report that.
|
* and report that.
|
||||||
*/
|
*/
|
||||||
sp &= ~7UL;
|
sp &= ~15UL;
|
||||||
|
|
||||||
return (void __user *)(sp - framesize);
|
return (void __user *) sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|
Loading…
Reference in a new issue