Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1405170 > unrolled thread
| Started by | Christophe Leroy <christophe.leroy@c-s.fr> |
|---|---|
| First post | 2016-05-23 10:50 +0200 |
| Last post | 2016-05-25 05:50 +0200 |
| Articles | 6 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH] powerpc: inline current_stack_pointer() Christophe Leroy <christophe.leroy@c-s.fr> - 2016-05-23 10:50 +0200
Re: [PATCH] powerpc: inline current_stack_pointer() Segher Boessenkool <segher@kernel.crashing.org> - 2016-05-23 23:10 +0200
Re: [PATCH] powerpc: inline current_stack_pointer() Christophe Leroy <christophe.leroy@c-s.fr> - 2016-05-24 07:50 +0200
Re: [PATCH] powerpc: inline current_stack_pointer() Segher Boessenkool <segher@kernel.crashing.org> - 2016-05-24 08:10 +0200
Re: [PATCH] powerpc: inline current_stack_pointer() Gabriel Paubert <paubert@iram.es> - 2016-05-24 08:50 +0200
Re: [PATCH] powerpc: inline current_stack_pointer() Paul Mackerras <paulus@ozlabs.org> - 2016-05-25 05:50 +0200
| From | Christophe Leroy <christophe.leroy@c-s.fr> |
|---|---|
| Date | 2016-05-23 10:50 +0200 |
| Subject | [PATCH] powerpc: inline current_stack_pointer() |
| Message-ID | <rBTIJ-3A5-5@gated-at.bofh.it> |
current_stack_pointeur() is a single instruction function. it
It is not worth breaking the execution flow with a bl/blr for a
single instruction
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
---
arch/powerpc/include/asm/reg.h | 7 ++++++-
arch/powerpc/kernel/misc.S | 4 ----
arch/powerpc/kernel/ppc_ksyms.c | 2 --
3 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index c1e82e9..7ce6777 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -1301,7 +1301,12 @@ static inline unsigned long mfvtb (void)
#define proc_trap() asm volatile("trap")
-extern unsigned long current_stack_pointer(void);
+static inline unsigned long current_stack_pointer(void)
+{
+ register unsigned long *ptr asm("r1");
+
+ return *ptr;
+}
extern unsigned long scom970_read(unsigned int address);
extern void scom970_write(unsigned int address, unsigned long value);
diff --git a/arch/powerpc/kernel/misc.S b/arch/powerpc/kernel/misc.S
index 0d43219..7ce26d4 100644
--- a/arch/powerpc/kernel/misc.S
+++ b/arch/powerpc/kernel/misc.S
@@ -114,7 +114,3 @@ _GLOBAL(longjmp)
mtlr r0
mr r3,r4
blr
-
-_GLOBAL(current_stack_pointer)
- PPC_LL r3,0(r1)
- blr
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c
index 9f01e28..eb5c5dc 100644
--- a/arch/powerpc/kernel/ppc_ksyms.c
+++ b/arch/powerpc/kernel/ppc_ksyms.c
@@ -33,5 +33,3 @@ EXPORT_SYMBOL(store_vr_state);
#ifdef CONFIG_EPAPR_PARAVIRT
EXPORT_SYMBOL(epapr_hypercall_start);
#endif
-
-EXPORT_SYMBOL(current_stack_pointer);
--
2.1.0
[toc] | [next] | [standalone]
| From | Segher Boessenkool <segher@kernel.crashing.org> |
|---|---|
| Date | 2016-05-23 23:10 +0200 |
| Message-ID | <rC5gS-2zt-13@gated-at.bofh.it> |
| In reply to | #1405170 |
On Mon, May 23, 2016 at 10:46:02AM +0200, Christophe Leroy wrote:
> +static inline unsigned long current_stack_pointer(void)
> +{
> + register unsigned long *ptr asm("r1");
> +
> + return *ptr;
> +}
Register asm is only guaranteed to work as input to inline asm. NAK.
Segher
[toc] | [prev] | [next] | [standalone]
| From | Christophe Leroy <christophe.leroy@c-s.fr> |
|---|---|
| Date | 2016-05-24 07:50 +0200 |
| Message-ID | <rCdo6-7F4-13@gated-at.bofh.it> |
| In reply to | #1405638 |
Le 23/05/2016 à 22:22, Segher Boessenkool a écrit :
> On Mon, May 23, 2016 at 10:46:02AM +0200, Christophe Leroy wrote:
>> +static inline unsigned long current_stack_pointer(void)
>> +{
>> + register unsigned long *ptr asm("r1");
>> +
>> + return *ptr;
>> +}
> Register asm is only guaranteed to work as input to inline asm. NAK.
>
Does it mean that the following declaration in
arch/powerpc/include/asm/paca.h is wrong too ?
register struct paca_struct *local_paca asm("r13");
Christophe
[toc] | [prev] | [next] | [standalone]
| From | Segher Boessenkool <segher@kernel.crashing.org> |
|---|---|
| Date | 2016-05-24 08:10 +0200 |
| Message-ID | <rCdHs-83D-7@gated-at.bofh.it> |
| In reply to | #1405857 |
On Tue, May 24, 2016 at 07:39:59AM +0200, Christophe Leroy wrote:
> >>+static inline unsigned long current_stack_pointer(void)
> >>+{
> >>+ register unsigned long *ptr asm("r1");
> >>+
> >>+ return *ptr;
> >>+}
> >Register asm is only guaranteed to work as input to inline asm. NAK.
> >
> Does it mean that the following declaration in
> arch/powerpc/include/asm/paca.h is wrong too ?
>
> register struct paca_struct *local_paca asm("r13");
That one is fine, because it is a global var.
https://gcc.gnu.org/onlinedocs/gcc/Explicit-Register-Variables.html
Segher
[toc] | [prev] | [next] | [standalone]
| From | Gabriel Paubert <paubert@iram.es> |
|---|---|
| Date | 2016-05-24 08:50 +0200 |
| Message-ID | <rCek9-8ge-3@gated-at.bofh.it> |
| In reply to | #1405170 |
On Mon, May 23, 2016 at 10:46:02AM +0200, Christophe Leroy wrote:
> current_stack_pointeur() is a single instruction function. it
> It is not worth breaking the execution flow with a bl/blr for a
> single instruction
Are you sure that the result is always the same?
Calling an external function prevents the compiler from considering the
caller of of current_stack_pointer a leaf function, which certainly
does not help the compiler, but in a leaf function the compiler is free
not to establish a new frame.
If the compiler decides to establishes a new frame (typically with
"stwu r1,-frame_size(r1)"), *r1 is the previous stack pointer, or
the caller's stack pointer, or the current function frame pointer if
I remember correctly the ABI definitions.
However, if the compiler decides that it can get away without a frame
for the function, *r1 is the stack pointer of the caller's caller.
Depending on the application, this may or may not be important.
By the way, isn't there a GCC builtin which can perform this task,
for example builtin_frame_address()?
Gabriel
>
> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
> ---
> arch/powerpc/include/asm/reg.h | 7 ++++++-
> arch/powerpc/kernel/misc.S | 4 ----
> arch/powerpc/kernel/ppc_ksyms.c | 2 --
> 3 files changed, 6 insertions(+), 7 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
> index c1e82e9..7ce6777 100644
> --- a/arch/powerpc/include/asm/reg.h
> +++ b/arch/powerpc/include/asm/reg.h
> @@ -1301,7 +1301,12 @@ static inline unsigned long mfvtb (void)
>
> #define proc_trap() asm volatile("trap")
>
> -extern unsigned long current_stack_pointer(void);
> +static inline unsigned long current_stack_pointer(void)
> +{
> + register unsigned long *ptr asm("r1");
> +
> + return *ptr;
> +}
>
> extern unsigned long scom970_read(unsigned int address);
> extern void scom970_write(unsigned int address, unsigned long value);
> diff --git a/arch/powerpc/kernel/misc.S b/arch/powerpc/kernel/misc.S
> index 0d43219..7ce26d4 100644
> --- a/arch/powerpc/kernel/misc.S
> +++ b/arch/powerpc/kernel/misc.S
> @@ -114,7 +114,3 @@ _GLOBAL(longjmp)
> mtlr r0
> mr r3,r4
> blr
> -
> -_GLOBAL(current_stack_pointer)
> - PPC_LL r3,0(r1)
> - blr
> diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c
> index 9f01e28..eb5c5dc 100644
> --- a/arch/powerpc/kernel/ppc_ksyms.c
> +++ b/arch/powerpc/kernel/ppc_ksyms.c
> @@ -33,5 +33,3 @@ EXPORT_SYMBOL(store_vr_state);
> #ifdef CONFIG_EPAPR_PARAVIRT
> EXPORT_SYMBOL(epapr_hypercall_start);
> #endif
> -
> -EXPORT_SYMBOL(current_stack_pointer);
> --
> 2.1.0
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
[toc] | [prev] | [next] | [standalone]
| From | Paul Mackerras <paulus@ozlabs.org> |
|---|---|
| Date | 2016-05-25 05:50 +0200 |
| Message-ID | <rCxZw-4k1-25@gated-at.bofh.it> |
| In reply to | #1405882 |
On Mon, May 23, 2016 at 07:17:38PM +0200, Gabriel Paubert wrote: > On Mon, May 23, 2016 at 10:46:02AM +0200, Christophe Leroy wrote: > > current_stack_pointeur() is a single instruction function. it > > It is not worth breaking the execution flow with a bl/blr for a > > single instruction > > Are you sure that the result is always the same? > > Calling an external function prevents the compiler from considering the > caller of of current_stack_pointer a leaf function, which certainly > does not help the compiler, but in a leaf function the compiler is free > not to establish a new frame. > > If the compiler decides to establishes a new frame (typically with > "stwu r1,-frame_size(r1)"), *r1 is the previous stack pointer, or > the caller's stack pointer, or the current function frame pointer if > I remember correctly the ABI definitions. > > However, if the compiler decides that it can get away without a frame > for the function, *r1 is the stack pointer of the caller's caller. > > Depending on the application, this may or may not be important. Right. I think I wrote the original current_stack_pointer() implementation, and that I deliberately didn't make it an inline so that the caller would have to establish its own stack frame, and thus its stack pointer value would be a well-defined thing. Paul.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web