public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] nios2: __kuser_sigtramp placement fix
@ 2015-01-22  7:14 Chung-Lin Tang
  2015-01-22  7:54 ` Ley Foon Tan
  0 siblings, 1 reply; 6+ messages in thread
From: Chung-Lin Tang @ 2015-01-22  7:14 UTC (permalink / raw)
  To: linux-kernel; +Cc: Ley Foon Tan, Tobias Klauser, cltang

The address of __kuser_sigtramp is wrong by one word, due to padding
__kuser_cmpxchg to fully 64 bytes. The version word at the start of the
page displaces __kuser_sigtramp to 0x1044, instead of the intended 0x1040.

Fixed by counting the 64-byte frame from the start of the page instead
of __kuser_cmpxchg. This shortens the __kuser_cmpxchg frame to 60-bytes,
but that's likely enough.

The zero-byte padding parts of the kuser_pad macro has been removed, due
to the .if command refusing to behave properly when there are other
.word directives in between. Probably a binutils gas bug.

Thanks,
Chung-Lin

Cc: Ley Foon Tan <lftan@altera.com>
Cc: Tobias Klauser <tklauser@distanz.ch>
Signed-off-by: Chung-Lin Tang <cltang@codesourcery.com>

diff --git a/arch/nios2/kernel/entry.S b/arch/nios2/kernel/entry.S
index 0bdfd13..3224839 100644
--- a/arch/nios2/kernel/entry.S
+++ b/arch/nios2/kernel/entry.S
@@ -492,14 +492,7 @@ ENTRY(ret_from_kernel_thread)

  /* Filling pads with undefined instructions. */
 .macro	kuser_pad sym size
-	.if	((. - \sym) & 3)
-	.rept	(4 - (. - \sym) & 3)
-	.byte	0
-	.endr
-	.endif
-	.rept	((\size - (. - \sym)) / 4)
-	.word	0xdeadbeef
-	.endr
+	.fill	((\size - (. - \sym)) / 4), 4, 0xdeadbeef
 .endm

 	.align	6
@@ -526,7 +519,10 @@ cmpxchg_stw:
 cmpxchg_ret:
 	ret

-	kuser_pad __kuser_cmpxchg, 64
+	/* The first 64-byte frame contains the version word, so note
+	   that the first padding entry is based from the start of the kuser
+	   page, instead of __kuser_cmpxchg.  */
+	kuser_pad __kuser_helper_start, 64

 	.globl	__kuser_sigtramp
 __kuser_sigtramp:

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] nios2: __kuser_sigtramp placement fix
  2015-01-22  7:14 [PATCH] nios2: __kuser_sigtramp placement fix Chung-Lin Tang
@ 2015-01-22  7:54 ` Ley Foon Tan
  2015-01-22  8:15   ` Chung-Lin Tang
  0 siblings, 1 reply; 6+ messages in thread
From: Ley Foon Tan @ 2015-01-22  7:54 UTC (permalink / raw)
  To: Chung-Lin Tang
  Cc: linux-kernel@vger.kernel.org, Tobias Klauser, Chung-Lin Tang

On Thu, Jan 22, 2015 at 3:14 PM, Chung-Lin Tang <chunglin.tang@gmail.com> wrote:
> The address of __kuser_sigtramp is wrong by one word, due to padding
> __kuser_cmpxchg to fully 64 bytes. The version word at the start of the
> page displaces __kuser_sigtramp to 0x1044, instead of the intended 0x1040.
>
> Fixed by counting the 64-byte frame from the start of the page instead
> of __kuser_cmpxchg. This shortens the __kuser_cmpxchg frame to 60-bytes,
> but that's likely enough.
>
> The zero-byte padding parts of the kuser_pad macro has been removed, due
> to the .if command refusing to behave properly when there are other
> .word directives in between. Probably a binutils gas bug.
>
> Thanks,
> Chung-Lin
>
> Cc: Ley Foon Tan <lftan@altera.com>
> Cc: Tobias Klauser <tklauser@distanz.ch>
> Signed-off-by: Chung-Lin Tang <cltang@codesourcery.com>
>
> diff --git a/arch/nios2/kernel/entry.S b/arch/nios2/kernel/entry.S
> index 0bdfd13..3224839 100644
> --- a/arch/nios2/kernel/entry.S
> +++ b/arch/nios2/kernel/entry.S
> @@ -492,14 +492,7 @@ ENTRY(ret_from_kernel_thread)
>
>   /* Filling pads with undefined instructions. */
>  .macro kuser_pad sym size
> -       .if     ((. - \sym) & 3)
> -       .rept   (4 - (. - \sym) & 3)
> -       .byte   0
> -       .endr
> -       .endif
> -       .rept   ((\size - (. - \sym)) / 4)
> -       .word   0xdeadbeef
> -       .endr
> +       .fill   ((\size - (. - \sym)) / 4), 4, 0xdeadbeef
>  .endm
>
>         .align  6
> @@ -526,7 +519,10 @@ cmpxchg_stw:
>  cmpxchg_ret:
>         ret
>
> -       kuser_pad __kuser_cmpxchg, 64
> +       /* The first 64-byte frame contains the version word, so note
> +          that the first padding entry is based from the start of the kuser
> +          page, instead of __kuser_cmpxchg.  */
> +       kuser_pad __kuser_helper_start, 64
>
>         .globl  __kuser_sigtramp
>  __kuser_sigtramp:
> --
Hi Chung-Lin

I thought this is our original intention for it.

First 4 bytes is the __kuser_version and each __kuser function will
have 64 bytes size.

0x1000 __kuser_helper_version
0x1004 __kuser_cmpxchg
0x1044 __kuser_sigtramp

Any reason you can't use __kuser_sigtramp @ 0x1044?
Thanks.

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] nios2: __kuser_sigtramp placement fix
  2015-01-22  7:54 ` Ley Foon Tan
@ 2015-01-22  8:15   ` Chung-Lin Tang
  2015-01-22  8:43     ` Ley Foon Tan
  0 siblings, 1 reply; 6+ messages in thread
From: Chung-Lin Tang @ 2015-01-22  8:15 UTC (permalink / raw)
  To: Ley Foon Tan, Chung-Lin Tang; +Cc: linux-kernel@vger.kernel.org, Tobias Klauser

On 2015/1/22 03:54 PM, Ley Foon Tan wrote:
> On Thu, Jan 22, 2015 at 3:14 PM, Chung-Lin Tang <chunglin.tang@gmail.com> wrote:
>> The address of __kuser_sigtramp is wrong by one word, due to padding
>> __kuser_cmpxchg to fully 64 bytes. The version word at the start of the
>> page displaces __kuser_sigtramp to 0x1044, instead of the intended 0x1040.
>>
>> Fixed by counting the 64-byte frame from the start of the page instead
>> of __kuser_cmpxchg. This shortens the __kuser_cmpxchg frame to 60-bytes,
>> but that's likely enough.
>>
>> The zero-byte padding parts of the kuser_pad macro has been removed, due
>> to the .if command refusing to behave properly when there are other
>> .word directives in between. Probably a binutils gas bug.
>>
>> Thanks,
>> Chung-Lin
>>
>> Cc: Ley Foon Tan <lftan@altera.com>
>> Cc: Tobias Klauser <tklauser@distanz.ch>
>> Signed-off-by: Chung-Lin Tang <cltang@codesourcery.com>
>>
>> diff --git a/arch/nios2/kernel/entry.S b/arch/nios2/kernel/entry.S
>> index 0bdfd13..3224839 100644
>> --- a/arch/nios2/kernel/entry.S
>> +++ b/arch/nios2/kernel/entry.S
>> @@ -492,14 +492,7 @@ ENTRY(ret_from_kernel_thread)
>>
>>   /* Filling pads with undefined instructions. */
>>  .macro kuser_pad sym size
>> -       .if     ((. - \sym) & 3)
>> -       .rept   (4 - (. - \sym) & 3)
>> -       .byte   0
>> -       .endr
>> -       .endif
>> -       .rept   ((\size - (. - \sym)) / 4)
>> -       .word   0xdeadbeef
>> -       .endr
>> +       .fill   ((\size - (. - \sym)) / 4), 4, 0xdeadbeef
>>  .endm
>>
>>         .align  6
>> @@ -526,7 +519,10 @@ cmpxchg_stw:
>>  cmpxchg_ret:
>>         ret
>>
>> -       kuser_pad __kuser_cmpxchg, 64
>> +       /* The first 64-byte frame contains the version word, so note
>> +          that the first padding entry is based from the start of the kuser
>> +          page, instead of __kuser_cmpxchg.  */
>> +       kuser_pad __kuser_helper_start, 64
>>
>>         .globl  __kuser_sigtramp
>>  __kuser_sigtramp:
>> --
> Hi Chung-Lin
> 
> I thought this is our original intention for it.
> 
> First 4 bytes is the __kuser_version and each __kuser function will
> have 64 bytes size.
> 
> 0x1000 __kuser_helper_version
> 0x1004 __kuser_cmpxchg
> 0x1044 __kuser_sigtramp
> 
> Any reason you can't use __kuser_sigtramp @ 0x1044?

Well, that's okay as well, as the main place which sets this is the
signal frame construction in arch/nios2/kernel/signal.c. The user space
is mostly oblivious to the exact location.  You'll need to update it
that way if you prefer 0x1044, as it's currently set at 0x1040.

I suggested 0x1040 because 64b frames aligned at 64b seemed more
intuitive; __kuser_cmpxchg would be a special case.

Chung-Lin


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] nios2: __kuser_sigtramp placement fix
  2015-01-22  8:15   ` Chung-Lin Tang
@ 2015-01-22  8:43     ` Ley Foon Tan
  2015-01-22  9:07       ` Chung-Lin Tang
  0 siblings, 1 reply; 6+ messages in thread
From: Ley Foon Tan @ 2015-01-22  8:43 UTC (permalink / raw)
  To: Chung-Lin Tang
  Cc: Chung-Lin Tang, linux-kernel@vger.kernel.org, Tobias Klauser

On Thu, Jan 22, 2015 at 4:15 PM, Chung-Lin Tang <cltang@codesourcery.com> wrote:
> On 2015/1/22 03:54 PM, Ley Foon Tan wrote:
>> On Thu, Jan 22, 2015 at 3:14 PM, Chung-Lin Tang <chunglin.tang@gmail.com> wrote:
>>> The address of __kuser_sigtramp is wrong by one word, due to padding
>>> __kuser_cmpxchg to fully 64 bytes. The version word at the start of the
>>> page displaces __kuser_sigtramp to 0x1044, instead of the intended 0x1040.
>>>
>>> Fixed by counting the 64-byte frame from the start of the page instead
>>> of __kuser_cmpxchg. This shortens the __kuser_cmpxchg frame to 60-bytes,
>>> but that's likely enough.
>>>
>>> The zero-byte padding parts of the kuser_pad macro has been removed, due
>>> to the .if command refusing to behave properly when there are other
>>> .word directives in between. Probably a binutils gas bug.
>>>
>>> Thanks,
>>> Chung-Lin
>>>
>>> Cc: Ley Foon Tan <lftan@altera.com>
>>> Cc: Tobias Klauser <tklauser@distanz.ch>
>>> Signed-off-by: Chung-Lin Tang <cltang@codesourcery.com>
>>>
>>> diff --git a/arch/nios2/kernel/entry.S b/arch/nios2/kernel/entry.S
>>> index 0bdfd13..3224839 100644
>>> --- a/arch/nios2/kernel/entry.S
>>> +++ b/arch/nios2/kernel/entry.S
>>> @@ -492,14 +492,7 @@ ENTRY(ret_from_kernel_thread)
>>>
>>>   /* Filling pads with undefined instructions. */
>>>  .macro kuser_pad sym size
>>> -       .if     ((. - \sym) & 3)
>>> -       .rept   (4 - (. - \sym) & 3)
>>> -       .byte   0
>>> -       .endr
>>> -       .endif
>>> -       .rept   ((\size - (. - \sym)) / 4)
>>> -       .word   0xdeadbeef
>>> -       .endr
>>> +       .fill   ((\size - (. - \sym)) / 4), 4, 0xdeadbeef
>>>  .endm
>>>
>>>         .align  6
>>> @@ -526,7 +519,10 @@ cmpxchg_stw:
>>>  cmpxchg_ret:
>>>         ret
>>>
>>> -       kuser_pad __kuser_cmpxchg, 64
>>> +       /* The first 64-byte frame contains the version word, so note
>>> +          that the first padding entry is based from the start of the kuser
>>> +          page, instead of __kuser_cmpxchg.  */
>>> +       kuser_pad __kuser_helper_start, 64
>>>
>>>         .globl  __kuser_sigtramp
>>>  __kuser_sigtramp:
>>> --
>> Hi Chung-Lin
>>
>> I thought this is our original intention for it.
>>
>> First 4 bytes is the __kuser_version and each __kuser function will
>> have 64 bytes size.
>>
>> 0x1000 __kuser_helper_version
>> 0x1004 __kuser_cmpxchg
>> 0x1044 __kuser_sigtramp
>>
>> Any reason you can't use __kuser_sigtramp @ 0x1044?
>
> Well, that's okay as well, as the main place which sets this is the
> signal frame construction in arch/nios2/kernel/signal.c. The user space
> is mostly oblivious to the exact location.  You'll need to update it
> that way if you prefer 0x1044, as it's currently set at 0x1040.
>
> I suggested 0x1040 because 64b frames aligned at 64b seemed more
> intuitive; __kuser_cmpxchg would be a special case.

I think I will change to 0x1044 in arch/nios2/kernel/signal.c. I can
submit the fix.
Do you need to update toolchain for this change?

Regards
Ley Foon

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] nios2: __kuser_sigtramp placement fix
  2015-01-22  8:43     ` Ley Foon Tan
@ 2015-01-22  9:07       ` Chung-Lin Tang
  2015-01-22  9:12         ` Ley Foon Tan
  0 siblings, 1 reply; 6+ messages in thread
From: Chung-Lin Tang @ 2015-01-22  9:07 UTC (permalink / raw)
  To: Ley Foon Tan; +Cc: Chung-Lin Tang, linux-kernel@vger.kernel.org, Tobias Klauser

On 2015/1/22 下午 04:43, Ley Foon Tan wrote:
> On Thu, Jan 22, 2015 at 4:15 PM, Chung-Lin Tang <cltang@codesourcery.com> wrote:
>> On 2015/1/22 03:54 PM, Ley Foon Tan wrote:
>>> On Thu, Jan 22, 2015 at 3:14 PM, Chung-Lin Tang <chunglin.tang@gmail.com> wrote:
>>>> The address of __kuser_sigtramp is wrong by one word, due to padding
>>>> __kuser_cmpxchg to fully 64 bytes. The version word at the start of the
>>>> page displaces __kuser_sigtramp to 0x1044, instead of the intended 0x1040.
>>>>
>>>> Fixed by counting the 64-byte frame from the start of the page instead
>>>> of __kuser_cmpxchg. This shortens the __kuser_cmpxchg frame to 60-bytes,
>>>> but that's likely enough.
>>>>
>>>> The zero-byte padding parts of the kuser_pad macro has been removed, due
>>>> to the .if command refusing to behave properly when there are other
>>>> .word directives in between. Probably a binutils gas bug.
>>>>
>>>> Thanks,
>>>> Chung-Lin
>>>>
>>>> Cc: Ley Foon Tan <lftan@altera.com>
>>>> Cc: Tobias Klauser <tklauser@distanz.ch>
>>>> Signed-off-by: Chung-Lin Tang <cltang@codesourcery.com>
>>>>
>>>> diff --git a/arch/nios2/kernel/entry.S b/arch/nios2/kernel/entry.S
>>>> index 0bdfd13..3224839 100644
>>>> --- a/arch/nios2/kernel/entry.S
>>>> +++ b/arch/nios2/kernel/entry.S
>>>> @@ -492,14 +492,7 @@ ENTRY(ret_from_kernel_thread)
>>>>
>>>>   /* Filling pads with undefined instructions. */
>>>>  .macro kuser_pad sym size
>>>> -       .if     ((. - \sym) & 3)
>>>> -       .rept   (4 - (. - \sym) & 3)
>>>> -       .byte   0
>>>> -       .endr
>>>> -       .endif
>>>> -       .rept   ((\size - (. - \sym)) / 4)
>>>> -       .word   0xdeadbeef
>>>> -       .endr
>>>> +       .fill   ((\size - (. - \sym)) / 4), 4, 0xdeadbeef
>>>>  .endm
>>>>
>>>>         .align  6
>>>> @@ -526,7 +519,10 @@ cmpxchg_stw:
>>>>  cmpxchg_ret:
>>>>         ret
>>>>
>>>> -       kuser_pad __kuser_cmpxchg, 64
>>>> +       /* The first 64-byte frame contains the version word, so note
>>>> +          that the first padding entry is based from the start of the kuser
>>>> +          page, instead of __kuser_cmpxchg.  */
>>>> +       kuser_pad __kuser_helper_start, 64
>>>>
>>>>         .globl  __kuser_sigtramp
>>>>  __kuser_sigtramp:
>>>> --
>>> Hi Chung-Lin
>>>
>>> I thought this is our original intention for it.
>>>
>>> First 4 bytes is the __kuser_version and each __kuser function will
>>> have 64 bytes size.
>>>
>>> 0x1000 __kuser_helper_version
>>> 0x1004 __kuser_cmpxchg
>>> 0x1044 __kuser_sigtramp
>>>
>>> Any reason you can't use __kuser_sigtramp @ 0x1044?
>>
>> Well, that's okay as well, as the main place which sets this is the
>> signal frame construction in arch/nios2/kernel/signal.c. The user space
>> is mostly oblivious to the exact location.  You'll need to update it
>> that way if you prefer 0x1044, as it's currently set at 0x1040.
>>
>> I suggested 0x1040 because 64b frames aligned at 64b seemed more
>> intuitive; __kuser_cmpxchg would be a special case.
> 
> I think I will change to 0x1044 in arch/nios2/kernel/signal.c. I can
> submit the fix.
> Do you need to update toolchain for this change?

No, the toolchain is not affected by this change.

Thanks,
Chung-Lin


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] nios2: __kuser_sigtramp placement fix
  2015-01-22  9:07       ` Chung-Lin Tang
@ 2015-01-22  9:12         ` Ley Foon Tan
  0 siblings, 0 replies; 6+ messages in thread
From: Ley Foon Tan @ 2015-01-22  9:12 UTC (permalink / raw)
  To: Chung-Lin Tang
  Cc: Chung-Lin Tang, linux-kernel@vger.kernel.org, Tobias Klauser

On Thu, Jan 22, 2015 at 5:07 PM, Chung-Lin Tang <cltang@codesourcery.com> wrote:
> On 2015/1/22 下午 04:43, Ley Foon Tan wrote:
>> On Thu, Jan 22, 2015 at 4:15 PM, Chung-Lin Tang <cltang@codesourcery.com> wrote:
>>> On 2015/1/22 03:54 PM, Ley Foon Tan wrote:
>>>> On Thu, Jan 22, 2015 at 3:14 PM, Chung-Lin Tang <chunglin.tang@gmail.com> wrote:
>>>>> The address of __kuser_sigtramp is wrong by one word, due to padding
>>>>> __kuser_cmpxchg to fully 64 bytes. The version word at the start of the
>>>>> page displaces __kuser_sigtramp to 0x1044, instead of the intended 0x1040.
>>>>>
>>>>> Fixed by counting the 64-byte frame from the start of the page instead
>>>>> of __kuser_cmpxchg. This shortens the __kuser_cmpxchg frame to 60-bytes,
>>>>> but that's likely enough.
>>>>>
>>>>> The zero-byte padding parts of the kuser_pad macro has been removed, due
>>>>> to the .if command refusing to behave properly when there are other
>>>>> .word directives in between. Probably a binutils gas bug.
>>>>>
>>>>> Thanks,
>>>>> Chung-Lin
>>>>>
>>>>> Cc: Ley Foon Tan <lftan@altera.com>
>>>>> Cc: Tobias Klauser <tklauser@distanz.ch>
>>>>> Signed-off-by: Chung-Lin Tang <cltang@codesourcery.com>
>>>>>
>>>>> diff --git a/arch/nios2/kernel/entry.S b/arch/nios2/kernel/entry.S
>>>>> index 0bdfd13..3224839 100644
>>>>> --- a/arch/nios2/kernel/entry.S
>>>>> +++ b/arch/nios2/kernel/entry.S
>>>>> @@ -492,14 +492,7 @@ ENTRY(ret_from_kernel_thread)
>>>>>
>>>>>   /* Filling pads with undefined instructions. */
>>>>>  .macro kuser_pad sym size
>>>>> -       .if     ((. - \sym) & 3)
>>>>> -       .rept   (4 - (. - \sym) & 3)
>>>>> -       .byte   0
>>>>> -       .endr
>>>>> -       .endif
>>>>> -       .rept   ((\size - (. - \sym)) / 4)
>>>>> -       .word   0xdeadbeef
>>>>> -       .endr
>>>>> +       .fill   ((\size - (. - \sym)) / 4), 4, 0xdeadbeef
>>>>>  .endm
>>>>>
>>>>>         .align  6
>>>>> @@ -526,7 +519,10 @@ cmpxchg_stw:
>>>>>  cmpxchg_ret:
>>>>>         ret
>>>>>
>>>>> -       kuser_pad __kuser_cmpxchg, 64
>>>>> +       /* The first 64-byte frame contains the version word, so note
>>>>> +          that the first padding entry is based from the start of the kuser
>>>>> +          page, instead of __kuser_cmpxchg.  */
>>>>> +       kuser_pad __kuser_helper_start, 64
>>>>>
>>>>>         .globl  __kuser_sigtramp
>>>>>  __kuser_sigtramp:
>>>>> --
>>>> Hi Chung-Lin
>>>>
>>>> I thought this is our original intention for it.
>>>>
>>>> First 4 bytes is the __kuser_version and each __kuser function will
>>>> have 64 bytes size.
>>>>
>>>> 0x1000 __kuser_helper_version
>>>> 0x1004 __kuser_cmpxchg
>>>> 0x1044 __kuser_sigtramp
>>>>
>>>> Any reason you can't use __kuser_sigtramp @ 0x1044?
>>>
>>> Well, that's okay as well, as the main place which sets this is the
>>> signal frame construction in arch/nios2/kernel/signal.c. The user space
>>> is mostly oblivious to the exact location.  You'll need to update it
>>> that way if you prefer 0x1044, as it's currently set at 0x1040.
>>>
>>> I suggested 0x1040 because 64b frames aligned at 64b seemed more
>>> intuitive; __kuser_cmpxchg would be a special case.
>>
>> I think I will change to 0x1044 in arch/nios2/kernel/signal.c. I can
>> submit the fix.
>> Do you need to update toolchain for this change?
>
> No, the toolchain is not affected by this change.
Okay, will fix this.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-01-22  9:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-22  7:14 [PATCH] nios2: __kuser_sigtramp placement fix Chung-Lin Tang
2015-01-22  7:54 ` Ley Foon Tan
2015-01-22  8:15   ` Chung-Lin Tang
2015-01-22  8:43     ` Ley Foon Tan
2015-01-22  9:07       ` Chung-Lin Tang
2015-01-22  9:12         ` Ley Foon Tan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox