Message ID | 20180918135328.32034-1-mathieu.desnoyers@efficios.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | rseq/selftests: fix parametrized test with -fpie | expand |
----- On Sep 18, 2018, at 9:53 AM, Mathieu Desnoyers mathieu.desnoyers@efficios.com wrote: > On x86-64, the parametrized selftest code for rseq crashes with a > segmentation fault when compiled with -fpie. This happens when the > param_test binary is loaded at an address beyond 32-bit on x86-64. > > The issue is caused by use of a 32-bit register to hold the address > of the loop counter variable. > > Fix this by using a 64-bit register to calculate the address of the > loop counter variables as an offset from rip. Should this fix go through tip or the selftests tree ? Thanks, Mathieu > > Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > Cc: <stable@vger.kernel.org> # v4.18 > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Joel Fernandes <joelaf@google.com> > Cc: Peter Zijlstra <peterz@infradead.org> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Dave Watson <davejwatson@fb.com> > Cc: Will Deacon <will.deacon@arm.com> > Cc: Shuah Khan <shuahkh@osg.samsung.com> > Cc: Andi Kleen <andi@firstfloor.org> > Cc: linux-kselftest@vger.kernel.org > Cc: "H . Peter Anvin" <hpa@zytor.com> > Cc: Chris Lameter <cl@linux.com> > Cc: Russell King <linux@arm.linux.org.uk> > Cc: Michael Kerrisk <mtk.manpages@gmail.com> > Cc: "Paul E . McKenney" <paulmck@linux.vnet.ibm.com> > Cc: Paul Turner <pjt@google.com> > Cc: Boqun Feng <boqun.feng@gmail.com> > Cc: Josh Triplett <josh@joshtriplett.org> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Ben Maurer <bmaurer@fb.com> > Cc: Andy Lutomirski <luto@amacapital.net> > Cc: Andrew Morton <akpm@linux-foundation.org> > Cc: Linus Torvalds <torvalds@linux-foundation.org> > --- > tools/testing/selftests/rseq/param_test.c | 19 ++++++++++--------- > 1 file changed, 10 insertions(+), 9 deletions(-) > > diff --git a/tools/testing/selftests/rseq/param_test.c > b/tools/testing/selftests/rseq/param_test.c > index 615252331813..4bc071525bf7 100644 > --- a/tools/testing/selftests/rseq/param_test.c > +++ b/tools/testing/selftests/rseq/param_test.c > @@ -56,15 +56,13 @@ unsigned int yield_mod_cnt, nr_abort; > printf(fmt, ## __VA_ARGS__); \ > } while (0) > > -#if defined(__x86_64__) || defined(__i386__) > +#ifdef __i386__ > > #define INJECT_ASM_REG "eax" > > #define RSEQ_INJECT_CLOBBER \ > , INJECT_ASM_REG > > -#ifdef __i386__ > - > #define RSEQ_INJECT_ASM(n) \ > "mov asm_loop_cnt_" #n ", %%" INJECT_ASM_REG "\n\t" \ > "test %%" INJECT_ASM_REG ",%%" INJECT_ASM_REG "\n\t" \ > @@ -76,9 +74,16 @@ unsigned int yield_mod_cnt, nr_abort; > > #elif defined(__x86_64__) > > +#define INJECT_ASM_REG_P "rax" > +#define INJECT_ASM_REG "eax" > + > +#define RSEQ_INJECT_CLOBBER \ > + , INJECT_ASM_REG_P \ > + , INJECT_ASM_REG > + > #define RSEQ_INJECT_ASM(n) \ > - "lea asm_loop_cnt_" #n "(%%rip), %%" INJECT_ASM_REG "\n\t" \ > - "mov (%%" INJECT_ASM_REG "), %%" INJECT_ASM_REG "\n\t" \ > + "lea asm_loop_cnt_" #n "(%%rip), %%" INJECT_ASM_REG_P "\n\t" \ > + "mov (%%" INJECT_ASM_REG_P "), %%" INJECT_ASM_REG "\n\t" \ > "test %%" INJECT_ASM_REG ",%%" INJECT_ASM_REG "\n\t" \ > "jz 333f\n\t" \ > "222:\n\t" \ > @@ -86,10 +91,6 @@ unsigned int yield_mod_cnt, nr_abort; > "jnz 222b\n\t" \ > "333:\n\t" > > -#else > -#error "Unsupported architecture" > -#endif > - > #elif defined(__ARMEL__) > > #define RSEQ_INJECT_INPUT \ > -- > 2.11.0
On Tue, 25 Sep 2018 13:39:36 -0400 (EDT) Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: > ----- On Sep 18, 2018, at 9:53 AM, Mathieu Desnoyers mathieu.desnoyers@efficios.com wrote: > > > On x86-64, the parametrized selftest code for rseq crashes with a > > segmentation fault when compiled with -fpie. This happens when the > > param_test binary is loaded at an address beyond 32-bit on x86-64. > > > > The issue is caused by use of a 32-bit register to hold the address > > of the loop counter variable. > > > > Fix this by using a 64-bit register to calculate the address of the > > loop counter variables as an offset from rip. > > Should this fix go through tip or the selftests tree ? > I usually have changes like this pulled through Shuah's tree with an ack from the maintainer of the code that it tests. -- Steve
On 09/27/2018 07:22 AM, Steven Rostedt wrote: > On Tue, 25 Sep 2018 13:39:36 -0400 (EDT) > Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: > >> ----- On Sep 18, 2018, at 9:53 AM, Mathieu Desnoyers mathieu.desnoyers@efficios.com wrote: >> >>> On x86-64, the parametrized selftest code for rseq crashes with a >>> segmentation fault when compiled with -fpie. This happens when the >>> param_test binary is loaded at an address beyond 32-bit on x86-64. >>> >>> The issue is caused by use of a 32-bit register to hold the address >>> of the loop counter variable. >>> >>> Fix this by using a 64-bit register to calculate the address of the >>> loop counter variables as an offset from rip. >> >> Should this fix go through tip or the selftests tree ? >> > > I usually have changes like this pulled through Shuah's tree with an > ack from the maintainer of the code that it tests. > > -- Steve > Right that is what I prefer. I usually wait for an Ack. I can pull this in. thanks, -- Shuah
----- On Sep 27, 2018, at 9:58 AM, Shuah Khan shuah.kh@samsung.com wrote: > On 09/27/2018 07:22 AM, Steven Rostedt wrote: >> On Tue, 25 Sep 2018 13:39:36 -0400 (EDT) >> Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: >> >>> ----- On Sep 18, 2018, at 9:53 AM, Mathieu Desnoyers >>> mathieu.desnoyers@efficios.com wrote: >>> >>>> On x86-64, the parametrized selftest code for rseq crashes with a >>>> segmentation fault when compiled with -fpie. This happens when the >>>> param_test binary is loaded at an address beyond 32-bit on x86-64. >>>> >>>> The issue is caused by use of a 32-bit register to hold the address >>>> of the loop counter variable. >>>> >>>> Fix this by using a 64-bit register to calculate the address of the >>>> loop counter variables as an offset from rip. >>> >>> Should this fix go through tip or the selftests tree ? >>> >> >> I usually have changes like this pulled through Shuah's tree with an >> ack from the maintainer of the code that it tests. >> >> -- Steve >> > > Right that is what I prefer. I usually wait for an Ack. I can pull this > in. I am maintainer of the code that it tests as well, so being both author of the selftest patch and giving an ack to it seems a bit silly. :) Other rseq co-maintainers could weight in though: Peter, Paul, and Boqun. Thanks, Mathieu > > thanks, > -- Shuah > > -- > Shuah Khan > Sr. Linux Kernel Developer > Open Source Innovation Group > Samsung Research America(Silicon Valley) > shuah.kh@samsung.com
On 09/27/2018 12:02 PM, Mathieu Desnoyers wrote: > ----- On Sep 27, 2018, at 9:58 AM, Shuah Khan shuah.kh@samsung.com wrote: > >> On 09/27/2018 07:22 AM, Steven Rostedt wrote: >>> On Tue, 25 Sep 2018 13:39:36 -0400 (EDT) >>> Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: >>> >>>> ----- On Sep 18, 2018, at 9:53 AM, Mathieu Desnoyers >>>> mathieu.desnoyers@efficios.com wrote: >>>> >>>>> On x86-64, the parametrized selftest code for rseq crashes with a >>>>> segmentation fault when compiled with -fpie. This happens when the >>>>> param_test binary is loaded at an address beyond 32-bit on x86-64. >>>>> >>>>> The issue is caused by use of a 32-bit register to hold the address >>>>> of the loop counter variable. >>>>> >>>>> Fix this by using a 64-bit register to calculate the address of the >>>>> loop counter variables as an offset from rip. >>>> >>>> Should this fix go through tip or the selftests tree ? >>>> >>> >>> I usually have changes like this pulled through Shuah's tree with an >>> ack from the maintainer of the code that it tests. >>> >>> -- Steve >>> >> >> Right that is what I prefer. I usually wait for an Ack. I can pull this >> in. > > I am maintainer of the code that it tests as well, so being both author > of the selftest patch and giving an ack to it seems a bit silly. :) Other > rseq co-maintainers could weight in though: Peter, Paul, and Boqun. > I was commenting in general, not specific to this patch. No worries. I will apply this right away. I have been traveling the last couple of weeks and in the catch up mode still. thanks, -- Shuah >> >> -- >> Shuah Khan >> Sr. Linux Kernel Developer >> Open Source Innovation Group >> Samsung Research America(Silicon Valley) >> shuah.kh@samsung.com >
On Thu, Sep 27, 2018 at 02:02:08PM -0400, Mathieu Desnoyers wrote: > ----- On Sep 27, 2018, at 9:58 AM, Shuah Khan shuah.kh@samsung.com wrote: > > > On 09/27/2018 07:22 AM, Steven Rostedt wrote: > >> On Tue, 25 Sep 2018 13:39:36 -0400 (EDT) > >> Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: > >> > >>> ----- On Sep 18, 2018, at 9:53 AM, Mathieu Desnoyers > >>> mathieu.desnoyers@efficios.com wrote: > >>> > >>>> On x86-64, the parametrized selftest code for rseq crashes with a > >>>> segmentation fault when compiled with -fpie. This happens when the > >>>> param_test binary is loaded at an address beyond 32-bit on x86-64. > >>>> > >>>> The issue is caused by use of a 32-bit register to hold the address > >>>> of the loop counter variable. > >>>> > >>>> Fix this by using a 64-bit register to calculate the address of the > >>>> loop counter variables as an offset from rip. > >>> > >>> Should this fix go through tip or the selftests tree ? > >>> > >> > >> I usually have changes like this pulled through Shuah's tree with an > >> ack from the maintainer of the code that it tests. > >> > >> -- Steve > >> > > > > Right that is what I prefer. I usually wait for an Ack. I can pull this > > in. > > I am maintainer of the code that it tests as well, so being both author > of the selftest patch and giving an ack to it seems a bit silly. :) Other > rseq co-maintainers could weight in though: Peter, Paul, and Boqun. Here you go! ;-) Acked-by: Paul E. McKenney <paulmck@linux.ibm.com> > Thanks, > > Mathieu > > > > > thanks, > > -- Shuah > > > > -- > > Shuah Khan > > Sr. Linux Kernel Developer > > Open Source Innovation Group > > Samsung Research America(Silicon Valley) > > shuah.kh@samsung.com > > -- > Mathieu Desnoyers > EfficiOS Inc. > http://www.efficios.com >
On 09/27/2018 12:10 PM, Shuah Khan wrote: > On 09/27/2018 12:02 PM, Mathieu Desnoyers wrote: >> ----- On Sep 27, 2018, at 9:58 AM, Shuah Khan shuah.kh@samsung.com wrote: >> >>> On 09/27/2018 07:22 AM, Steven Rostedt wrote: >>>> On Tue, 25 Sep 2018 13:39:36 -0400 (EDT) >>>> Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: >>>> >>>>> ----- On Sep 18, 2018, at 9:53 AM, Mathieu Desnoyers >>>>> mathieu.desnoyers@efficios.com wrote: >>>>> >>>>>> On x86-64, the parametrized selftest code for rseq crashes with a >>>>>> segmentation fault when compiled with -fpie. This happens when the >>>>>> param_test binary is loaded at an address beyond 32-bit on x86-64. >>>>>> >>>>>> The issue is caused by use of a 32-bit register to hold the address >>>>>> of the loop counter variable. >>>>>> >>>>>> Fix this by using a 64-bit register to calculate the address of the >>>>>> loop counter variables as an offset from rip. >>>>> >>>>> Should this fix go through tip or the selftests tree ? >>>>> >>>> >>>> I usually have changes like this pulled through Shuah's tree with an >>>> ack from the maintainer of the code that it tests. >>>> >>>> -- Steve >>>> >>> >>> Right that is what I prefer. I usually wait for an Ack. I can pull this >>> in. >> >> I am maintainer of the code that it tests as well, so being both author >> of the selftest patch and giving an ack to it seems a bit silly. :) Other >> rseq co-maintainers could weight in though: Peter, Paul, and Boqun. >> > > I was commenting in general, not specific to this patch. No worries. I will > apply this right away. > > I have been traveling the last couple of weeks and in the catch up mode still. > Hmm. this patch doesn't apply to linux-kselftest fixes branch which is at 4.19-rc4. Also you don't have my current email from getmaintainers. Could you please rebase and send it to me. thanks, -- Shuah
diff --git a/tools/testing/selftests/rseq/param_test.c b/tools/testing/selftests/rseq/param_test.c index 615252331813..4bc071525bf7 100644 --- a/tools/testing/selftests/rseq/param_test.c +++ b/tools/testing/selftests/rseq/param_test.c @@ -56,15 +56,13 @@ unsigned int yield_mod_cnt, nr_abort; printf(fmt, ## __VA_ARGS__); \ } while (0) -#if defined(__x86_64__) || defined(__i386__) +#ifdef __i386__ #define INJECT_ASM_REG "eax" #define RSEQ_INJECT_CLOBBER \ , INJECT_ASM_REG -#ifdef __i386__ - #define RSEQ_INJECT_ASM(n) \ "mov asm_loop_cnt_" #n ", %%" INJECT_ASM_REG "\n\t" \ "test %%" INJECT_ASM_REG ",%%" INJECT_ASM_REG "\n\t" \ @@ -76,9 +74,16 @@ unsigned int yield_mod_cnt, nr_abort; #elif defined(__x86_64__) +#define INJECT_ASM_REG_P "rax" +#define INJECT_ASM_REG "eax" + +#define RSEQ_INJECT_CLOBBER \ + , INJECT_ASM_REG_P \ + , INJECT_ASM_REG + #define RSEQ_INJECT_ASM(n) \ - "lea asm_loop_cnt_" #n "(%%rip), %%" INJECT_ASM_REG "\n\t" \ - "mov (%%" INJECT_ASM_REG "), %%" INJECT_ASM_REG "\n\t" \ + "lea asm_loop_cnt_" #n "(%%rip), %%" INJECT_ASM_REG_P "\n\t" \ + "mov (%%" INJECT_ASM_REG_P "), %%" INJECT_ASM_REG "\n\t" \ "test %%" INJECT_ASM_REG ",%%" INJECT_ASM_REG "\n\t" \ "jz 333f\n\t" \ "222:\n\t" \ @@ -86,10 +91,6 @@ unsigned int yield_mod_cnt, nr_abort; "jnz 222b\n\t" \ "333:\n\t" -#else -#error "Unsupported architecture" -#endif - #elif defined(__ARMEL__) #define RSEQ_INJECT_INPUT \
On x86-64, the parametrized selftest code for rseq crashes with a segmentation fault when compiled with -fpie. This happens when the param_test binary is loaded at an address beyond 32-bit on x86-64. The issue is caused by use of a 32-bit register to hold the address of the loop counter variable. Fix this by using a 64-bit register to calculate the address of the loop counter variables as an offset from rip. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: <stable@vger.kernel.org> # v4.18 Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Joel Fernandes <joelaf@google.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Dave Watson <davejwatson@fb.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Shuah Khan <shuahkh@osg.samsung.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: linux-kselftest@vger.kernel.org Cc: "H . Peter Anvin" <hpa@zytor.com> Cc: Chris Lameter <cl@linux.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Michael Kerrisk <mtk.manpages@gmail.com> Cc: "Paul E . McKenney" <paulmck@linux.vnet.ibm.com> Cc: Paul Turner <pjt@google.com> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Josh Triplett <josh@joshtriplett.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Ben Maurer <bmaurer@fb.com> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> --- tools/testing/selftests/rseq/param_test.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)