* [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines
@ 2010-08-08 20:53 ` Namhyung Kim
0 siblings, 0 replies; 6+ messages in thread
From: Namhyung Kim @ 2010-08-08 20:53 UTC (permalink / raw)
To: Paul Mundt, Stuart Menefy, linux-sh; +Cc: linux-kernel
remove unneccessary use of RELOC_HIDE(). It does simple addition of ptr and
offset and in this case (offset 0) does practically nothing. It does NOT do
anything with linker relocation.
Signed-off-by: Namhyung Kim <namhyung@gmail.com>
---
arch/sh/include/asm/system.h | 2 +-
arch/sh/kernel/process_32.c | 8 ++++----
arch/sh/kernel/signal_32.c | 6 +++---
arch/sh/kernel/sys_sh32.c | 2 +-
arch/sh/kernel/traps_32.c | 6 +++---
5 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/arch/sh/include/asm/system.h b/arch/sh/include/asm/system.h
index 0bd7a17..8125c6c 100644
--- a/arch/sh/include/asm/system.h
+++ b/arch/sh/include/asm/system.h
@@ -154,7 +154,7 @@ asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \
struct pt_regs __regs)
#define TRAP_HANDLER_DECL \
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0); \
+ struct pt_regs *regs = &__regs; \
unsigned int vec = regs->tra; \
(void)vec;
#else
diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c
index 0529819..95c9de1 100644
--- a/arch/sh/kernel/process_32.c
+++ b/arch/sh/kernel/process_32.c
@@ -253,7 +253,7 @@ asmlinkage int sys_fork(unsigned long r4, unsigned long r5,
struct pt_regs __regs)
{
#ifdef CONFIG_MMU
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
return do_fork(SIGCHLD, regs->regs[15], regs, 0, NULL, NULL);
#else
/* fork almost works, enough to trick you into looking elsewhere :-( */
@@ -266,7 +266,7 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
unsigned long child_tidptr,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
if (!newsp)
newsp = regs->regs[15];
return do_fork(clone_flags, newsp, regs, 0,
@@ -288,7 +288,7 @@ asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->regs[15], regs,
0, NULL, NULL);
}
@@ -300,7 +300,7 @@ asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv,
char __user * __user *uenvp, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
int error;
char *filename;
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c
index 579cd2c..76843cb 100644
--- a/arch/sh/kernel/signal_32.c
+++ b/arch/sh/kernel/signal_32.c
@@ -109,7 +109,7 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
return do_sigaltstack(uss, uoss, regs->regs[15]);
}
@@ -222,7 +222,7 @@ asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
struct sigframe __user *frame = (struct sigframe __user *)regs->regs[15];
sigset_t set;
int r0;
@@ -259,7 +259,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs->regs[15];
sigset_t set;
int r0;
diff --git a/arch/sh/kernel/sys_sh32.c b/arch/sh/kernel/sys_sh32.c
index eb68bfd..1d96ad2 100644
--- a/arch/sh/kernel/sys_sh32.c
+++ b/arch/sh/kernel/sys_sh32.c
@@ -25,7 +25,7 @@ asmlinkage int sys_sh_pipe(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
int fd[2];
int error;
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c
index c3d86fa..107cccb 100644
--- a/arch/sh/kernel/traps_32.c
+++ b/arch/sh/kernel/traps_32.c
@@ -666,7 +666,7 @@ asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
unsigned long error_code;
struct task_struct *tsk = current;
@@ -754,7 +754,7 @@ asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
unsigned long inst;
struct task_struct *tsk = current;
@@ -783,7 +783,7 @@ asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
long ex;
ex = lookup_exception_vector();
--
1.7.0.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines
@ 2010-08-08 20:53 ` Namhyung Kim
0 siblings, 0 replies; 6+ messages in thread
From: Namhyung Kim @ 2010-08-08 20:53 UTC (permalink / raw)
To: Paul Mundt, Stuart Menefy, linux-sh; +Cc: linux-kernel
remove unneccessary use of RELOC_HIDE(). It does simple addition of ptr and
offset and in this case (offset 0) does practically nothing. It does NOT do
anything with linker relocation.
Signed-off-by: Namhyung Kim <namhyung@gmail.com>
---
arch/sh/include/asm/system.h | 2 +-
arch/sh/kernel/process_32.c | 8 ++++----
arch/sh/kernel/signal_32.c | 6 +++---
arch/sh/kernel/sys_sh32.c | 2 +-
arch/sh/kernel/traps_32.c | 6 +++---
5 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/arch/sh/include/asm/system.h b/arch/sh/include/asm/system.h
index 0bd7a17..8125c6c 100644
--- a/arch/sh/include/asm/system.h
+++ b/arch/sh/include/asm/system.h
@@ -154,7 +154,7 @@ asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \
struct pt_regs __regs)
#define TRAP_HANDLER_DECL \
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0); \
+ struct pt_regs *regs = &__regs; \
unsigned int vec = regs->tra; \
(void)vec;
#else
diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c
index 0529819..95c9de1 100644
--- a/arch/sh/kernel/process_32.c
+++ b/arch/sh/kernel/process_32.c
@@ -253,7 +253,7 @@ asmlinkage int sys_fork(unsigned long r4, unsigned long r5,
struct pt_regs __regs)
{
#ifdef CONFIG_MMU
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
return do_fork(SIGCHLD, regs->regs[15], regs, 0, NULL, NULL);
#else
/* fork almost works, enough to trick you into looking elsewhere :-( */
@@ -266,7 +266,7 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
unsigned long child_tidptr,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
if (!newsp)
newsp = regs->regs[15];
return do_fork(clone_flags, newsp, regs, 0,
@@ -288,7 +288,7 @@ asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->regs[15], regs,
0, NULL, NULL);
}
@@ -300,7 +300,7 @@ asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv,
char __user * __user *uenvp, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
int error;
char *filename;
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c
index 579cd2c..76843cb 100644
--- a/arch/sh/kernel/signal_32.c
+++ b/arch/sh/kernel/signal_32.c
@@ -109,7 +109,7 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
return do_sigaltstack(uss, uoss, regs->regs[15]);
}
@@ -222,7 +222,7 @@ asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
struct sigframe __user *frame = (struct sigframe __user *)regs->regs[15];
sigset_t set;
int r0;
@@ -259,7 +259,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs->regs[15];
sigset_t set;
int r0;
diff --git a/arch/sh/kernel/sys_sh32.c b/arch/sh/kernel/sys_sh32.c
index eb68bfd..1d96ad2 100644
--- a/arch/sh/kernel/sys_sh32.c
+++ b/arch/sh/kernel/sys_sh32.c
@@ -25,7 +25,7 @@ asmlinkage int sys_sh_pipe(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
int fd[2];
int error;
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c
index c3d86fa..107cccb 100644
--- a/arch/sh/kernel/traps_32.c
+++ b/arch/sh/kernel/traps_32.c
@@ -666,7 +666,7 @@ asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
unsigned long error_code;
struct task_struct *tsk = current;
@@ -754,7 +754,7 @@ asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
unsigned long inst;
struct task_struct *tsk = current;
@@ -783,7 +783,7 @@ asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7,
struct pt_regs __regs)
{
- struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+ struct pt_regs *regs = &__regs;
long ex;
ex = lookup_exception_vector();
--
1.7.0.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall
2010-08-08 20:53 ` Namhyung Kim
@ 2010-08-09 15:29 ` Stuart Menefy
-1 siblings, 0 replies; 6+ messages in thread
From: Stuart Menefy @ 2010-08-09 15:29 UTC (permalink / raw)
To: Namhyung Kim
Cc: Paul Mundt, linux-sh@vger.kernel.org,
linux-kernel@vger.kernel.org
Unfortunately these are necessary, although it is nothing to do with linker
relocation. These functions take a struct pt_regs as a parameter (not a
pointer), and modify some of the fields of that structure. We needed a way
to ensure that gcc didn't optimise away those assignments - to gcc
they appear to be assignments to a local variable, so quite legitimately
get optimised away. So we used RELOC_HIDE() as a way of doing that.
A clearer way to do this would be to pass in a struct pt_regs pointer,
but that would require going via a stub function which loads up the
pointer.
Stuart
On 08/08/10 21:53, Namhyung Kim wrote:
> remove unneccessary use of RELOC_HIDE(). It does simple addition of ptr and
> offset and in this case (offset 0) does practically nothing. It does NOT do
> anything with linker relocation.
>
> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
> ---
> arch/sh/include/asm/system.h | 2 +-
> arch/sh/kernel/process_32.c | 8 ++++----
> arch/sh/kernel/signal_32.c | 6 +++---
> arch/sh/kernel/sys_sh32.c | 2 +-
> arch/sh/kernel/traps_32.c | 6 +++---
> 5 files changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/arch/sh/include/asm/system.h b/arch/sh/include/asm/system.h
> index 0bd7a17..8125c6c 100644
> --- a/arch/sh/include/asm/system.h
> +++ b/arch/sh/include/asm/system.h
> @@ -154,7 +154,7 @@ asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \
> struct pt_regs __regs)
>
> #define TRAP_HANDLER_DECL \
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0); \
> + struct pt_regs *regs = &__regs; \
> unsigned int vec = regs->tra; \
> (void)vec;
> #else
> diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c
> index 0529819..95c9de1 100644
> --- a/arch/sh/kernel/process_32.c
> +++ b/arch/sh/kernel/process_32.c
> @@ -253,7 +253,7 @@ asmlinkage int sys_fork(unsigned long r4, unsigned long r5,
> struct pt_regs __regs)
> {
> #ifdef CONFIG_MMU
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> return do_fork(SIGCHLD, regs->regs[15], regs, 0, NULL, NULL);
> #else
> /* fork almost works, enough to trick you into looking elsewhere :-( */
> @@ -266,7 +266,7 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
> unsigned long child_tidptr,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> if (!newsp)
> newsp = regs->regs[15];
> return do_fork(clone_flags, newsp, regs, 0,
> @@ -288,7 +288,7 @@ asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->regs[15], regs,
> 0, NULL, NULL);
> }
> @@ -300,7 +300,7 @@ asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv,
> char __user * __user *uenvp, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> int error;
> char *filename;
>
> diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c
> index 579cd2c..76843cb 100644
> --- a/arch/sh/kernel/signal_32.c
> +++ b/arch/sh/kernel/signal_32.c
> @@ -109,7 +109,7 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
>
> return do_sigaltstack(uss, uoss, regs->regs[15]);
> }
> @@ -222,7 +222,7 @@ asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> struct sigframe __user *frame = (struct sigframe __user *)regs->regs[15];
> sigset_t set;
> int r0;
> @@ -259,7 +259,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs->regs[15];
> sigset_t set;
> int r0;
> diff --git a/arch/sh/kernel/sys_sh32.c b/arch/sh/kernel/sys_sh32.c
> index eb68bfd..1d96ad2 100644
> --- a/arch/sh/kernel/sys_sh32.c
> +++ b/arch/sh/kernel/sys_sh32.c
> @@ -25,7 +25,7 @@ asmlinkage int sys_sh_pipe(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> int fd[2];
> int error;
>
> diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c
> index c3d86fa..107cccb 100644
> --- a/arch/sh/kernel/traps_32.c
> +++ b/arch/sh/kernel/traps_32.c
> @@ -666,7 +666,7 @@ asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> unsigned long error_code;
> struct task_struct *tsk = current;
>
> @@ -754,7 +754,7 @@ asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> unsigned long inst;
> struct task_struct *tsk = current;
>
> @@ -783,7 +783,7 @@ asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> long ex;
>
> ex = lookup_exception_vector();
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines
@ 2010-08-09 15:29 ` Stuart Menefy
0 siblings, 0 replies; 6+ messages in thread
From: Stuart Menefy @ 2010-08-09 15:29 UTC (permalink / raw)
To: Namhyung Kim
Cc: Paul Mundt, linux-sh@vger.kernel.org,
linux-kernel@vger.kernel.org
Unfortunately these are necessary, although it is nothing to do with linker
relocation. These functions take a struct pt_regs as a parameter (not a
pointer), and modify some of the fields of that structure. We needed a way
to ensure that gcc didn't optimise away those assignments - to gcc
they appear to be assignments to a local variable, so quite legitimately
get optimised away. So we used RELOC_HIDE() as a way of doing that.
A clearer way to do this would be to pass in a struct pt_regs pointer,
but that would require going via a stub function which loads up the
pointer.
Stuart
On 08/08/10 21:53, Namhyung Kim wrote:
> remove unneccessary use of RELOC_HIDE(). It does simple addition of ptr and
> offset and in this case (offset 0) does practically nothing. It does NOT do
> anything with linker relocation.
>
> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
> ---
> arch/sh/include/asm/system.h | 2 +-
> arch/sh/kernel/process_32.c | 8 ++++----
> arch/sh/kernel/signal_32.c | 6 +++---
> arch/sh/kernel/sys_sh32.c | 2 +-
> arch/sh/kernel/traps_32.c | 6 +++---
> 5 files changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/arch/sh/include/asm/system.h b/arch/sh/include/asm/system.h
> index 0bd7a17..8125c6c 100644
> --- a/arch/sh/include/asm/system.h
> +++ b/arch/sh/include/asm/system.h
> @@ -154,7 +154,7 @@ asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \
> struct pt_regs __regs)
>
> #define TRAP_HANDLER_DECL \
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0); \
> + struct pt_regs *regs = &__regs; \
> unsigned int vec = regs->tra; \
> (void)vec;
> #else
> diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c
> index 0529819..95c9de1 100644
> --- a/arch/sh/kernel/process_32.c
> +++ b/arch/sh/kernel/process_32.c
> @@ -253,7 +253,7 @@ asmlinkage int sys_fork(unsigned long r4, unsigned long r5,
> struct pt_regs __regs)
> {
> #ifdef CONFIG_MMU
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> return do_fork(SIGCHLD, regs->regs[15], regs, 0, NULL, NULL);
> #else
> /* fork almost works, enough to trick you into looking elsewhere :-( */
> @@ -266,7 +266,7 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
> unsigned long child_tidptr,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> if (!newsp)
> newsp = regs->regs[15];
> return do_fork(clone_flags, newsp, regs, 0,
> @@ -288,7 +288,7 @@ asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->regs[15], regs,
> 0, NULL, NULL);
> }
> @@ -300,7 +300,7 @@ asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv,
> char __user * __user *uenvp, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> int error;
> char *filename;
>
> diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c
> index 579cd2c..76843cb 100644
> --- a/arch/sh/kernel/signal_32.c
> +++ b/arch/sh/kernel/signal_32.c
> @@ -109,7 +109,7 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
>
> return do_sigaltstack(uss, uoss, regs->regs[15]);
> }
> @@ -222,7 +222,7 @@ asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> struct sigframe __user *frame = (struct sigframe __user *)regs->regs[15];
> sigset_t set;
> int r0;
> @@ -259,7 +259,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs->regs[15];
> sigset_t set;
> int r0;
> diff --git a/arch/sh/kernel/sys_sh32.c b/arch/sh/kernel/sys_sh32.c
> index eb68bfd..1d96ad2 100644
> --- a/arch/sh/kernel/sys_sh32.c
> +++ b/arch/sh/kernel/sys_sh32.c
> @@ -25,7 +25,7 @@ asmlinkage int sys_sh_pipe(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> int fd[2];
> int error;
>
> diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c
> index c3d86fa..107cccb 100644
> --- a/arch/sh/kernel/traps_32.c
> +++ b/arch/sh/kernel/traps_32.c
> @@ -666,7 +666,7 @@ asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> unsigned long error_code;
> struct task_struct *tsk = current;
>
> @@ -754,7 +754,7 @@ asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> unsigned long inst;
> struct task_struct *tsk = current;
>
> @@ -783,7 +783,7 @@ asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
> unsigned long r6, unsigned long r7,
> struct pt_regs __regs)
> {
> - struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
> + struct pt_regs *regs = &__regs;
> long ex;
>
> ex = lookup_exception_vector();
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] sh: remove RELOC_HIDE on exception handlers and
2010-08-09 15:29 ` [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines Stuart Menefy
@ 2010-08-10 3:09 ` Namhyung Kim
-1 siblings, 0 replies; 6+ messages in thread
From: Namhyung Kim @ 2010-08-10 3:09 UTC (permalink / raw)
To: Stuart Menefy
Cc: Paul Mundt, linux-sh@vger.kernel.org,
linux-kernel@vger.kernel.org
2010-08-09 (ì›”), 16:29 +0100, Stuart Menefy:
> Unfortunately these are necessary, although it is nothing to do with linker
> relocation. These functions take a struct pt_regs as a parameter (not a
> pointer), and modify some of the fields of that structure. We needed a way
> to ensure that gcc didn't optimise away those assignments - to gcc
> they appear to be assignments to a local variable, so quite legitimately
> get optimised away. So we used RELOC_HIDE() as a way of doing that.
>
Oh, I didn't know that. Thank you for the comments.
> A clearer way to do this would be to pass in a struct pt_regs pointer,
> but that would require going via a stub function which loads up the
> pointer.
>
> Stuart
>
So is it worth if I'm gonna work on it?
--
Regards,
Namhyung Kim
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines
@ 2010-08-10 3:09 ` Namhyung Kim
0 siblings, 0 replies; 6+ messages in thread
From: Namhyung Kim @ 2010-08-10 3:09 UTC (permalink / raw)
To: Stuart Menefy
Cc: Paul Mundt, linux-sh@vger.kernel.org,
linux-kernel@vger.kernel.org
2010-08-09 (월), 16:29 +0100, Stuart Menefy:
> Unfortunately these are necessary, although it is nothing to do with linker
> relocation. These functions take a struct pt_regs as a parameter (not a
> pointer), and modify some of the fields of that structure. We needed a way
> to ensure that gcc didn't optimise away those assignments - to gcc
> they appear to be assignments to a local variable, so quite legitimately
> get optimised away. So we used RELOC_HIDE() as a way of doing that.
>
Oh, I didn't know that. Thank you for the comments.
> A clearer way to do this would be to pass in a struct pt_regs pointer,
> but that would require going via a stub function which loads up the
> pointer.
>
> Stuart
>
So is it worth if I'm gonna work on it?
--
Regards,
Namhyung Kim
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-08-10 3:09 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-08 20:53 [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines Namhyung Kim
2010-08-08 20:53 ` Namhyung Kim
2010-08-09 15:29 ` [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall Stuart Menefy
2010-08-09 15:29 ` [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines Stuart Menefy
2010-08-10 3:09 ` [PATCH] sh: remove RELOC_HIDE on exception handlers and Namhyung Kim
2010-08-10 3:09 ` [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines Namhyung Kim
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.