linux-sh.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines
@ 2010-08-08 20:53 Namhyung Kim
  2010-08-09 15:29 ` [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall Stuart Menefy
  0 siblings, 1 reply; 3+ 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] 3+ messages in thread

* Re: [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall
  2010-08-08 20:53 [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall routines Namhyung Kim
@ 2010-08-09 15:29 ` Stuart Menefy
  2010-08-10  3:09   ` [PATCH] sh: remove RELOC_HIDE on exception handlers and Namhyung Kim
  0 siblings, 1 reply; 3+ 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] 3+ 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 Stuart Menefy
@ 2010-08-10  3:09   ` Namhyung Kim
  0 siblings, 0 replies; 3+ 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] 3+ messages in thread

end of thread, other threads:[~2010-08-10  3:09 UTC | newest]

Thread overview: 3+ 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-09 15:29 ` [PATCH] sh: remove RELOC_HIDE on exception handlers and syscall Stuart Menefy
2010-08-10  3:09   ` [PATCH] sh: remove RELOC_HIDE on exception handlers and Namhyung Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).