diff mbox series

selftest/powerpc/benchmark: remove requirement libc-dev

Message ID 20240805083008.1300853-1-maddy@linux.ibm.com (mailing list archive)
State New
Headers show
Series selftest/powerpc/benchmark: remove requirement libc-dev | expand

Commit Message

Madhavan Srinivasan Aug. 5, 2024, 8:30 a.m. UTC
Currently exec-target.c file is linked as static and this
post a requirement to install libc dev package to build.
Without it, build-breaks when compiling selftest/powerpc/benchmark.

  CC       exec_target
/usr/bin/ld: cannot find -lc: No such file or directory
collect2: error: ld returned 1 exit status

exec_target.c is using "syscall" library function which
could be replaced with a inline assembly and the same is
proposed as a fix here.

Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
---
 tools/testing/selftests/powerpc/benchmarks/Makefile    |  2 +-
 .../testing/selftests/powerpc/benchmarks/exec_target.c | 10 ++++++++--
 2 files changed, 9 insertions(+), 3 deletions(-)

Comments

Christophe Leroy Aug. 6, 2024, 6:54 a.m. UTC | #1
Le 05/08/2024 à 10:30, Madhavan Srinivasan a écrit :
> Currently exec-target.c file is linked as static and this
> post a requirement to install libc dev package to build.
> Without it, build-breaks when compiling selftest/powerpc/benchmark.
> 
>    CC       exec_target
> /usr/bin/ld: cannot find -lc: No such file or directory
> collect2: error: ld returned 1 exit status
> 
> exec_target.c is using "syscall" library function which
> could be replaced with a inline assembly and the same is
> proposed as a fix here.
> 
> Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
> Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
> ---
>   tools/testing/selftests/powerpc/benchmarks/Makefile    |  2 +-
>   .../testing/selftests/powerpc/benchmarks/exec_target.c | 10 ++++++++--
>   2 files changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/testing/selftests/powerpc/benchmarks/Makefile b/tools/testing/selftests/powerpc/benchmarks/Makefile
> index 1321922038d0..ca4483c238b9 100644
> --- a/tools/testing/selftests/powerpc/benchmarks/Makefile
> +++ b/tools/testing/selftests/powerpc/benchmarks/Makefile
> @@ -18,4 +18,4 @@ $(OUTPUT)/context_switch: LDLIBS += -lpthread
>   
>   $(OUTPUT)/fork: LDLIBS += -lpthread
>   
> -$(OUTPUT)/exec_target: CFLAGS += -static -nostartfiles
> +$(OUTPUT)/exec_target: CFLAGS += -nostartfiles
> diff --git a/tools/testing/selftests/powerpc/benchmarks/exec_target.c b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
> index c14b0fc1edde..20027a23b594 100644
> --- a/tools/testing/selftests/powerpc/benchmarks/exec_target.c
> +++ b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
> @@ -7,10 +7,16 @@
>    */
>   
>   #define _GNU_SOURCE
> -#include <unistd.h>
>   #include <sys/syscall.h>
>   
>   void _start(void)
>   {
> -	syscall(SYS_exit, 0);
> +	asm volatile (
> +		"li %%r0, %[sys_exit];"
> +		"li %%r3, 0;"
> +		"sc;"
> +		:
> +		: [sys_exit] "i" (SYS_exit)
> +		: "r0", "r3"
> +	);

That looks ok because SYS_exit() is not supposed to return, but in the 
general case you should take a lot more precautions regarding which 
registers get clobbered when using sc.

Maybe it is worth a comment.

Christophe

>   }
Madhavan Srinivasan Aug. 9, 2024, 4:25 a.m. UTC | #2
On 8/6/24 12:24 PM, Christophe Leroy wrote:
>
>
> Le 05/08/2024 à 10:30, Madhavan Srinivasan a écrit :
>> Currently exec-target.c file is linked as static and this
>> post a requirement to install libc dev package to build.
>> Without it, build-breaks when compiling selftest/powerpc/benchmark.
>>
>>    CC       exec_target
>> /usr/bin/ld: cannot find -lc: No such file or directory
>> collect2: error: ld returned 1 exit status
>>
>> exec_target.c is using "syscall" library function which
>> could be replaced with a inline assembly and the same is
>> proposed as a fix here.
>>
>> Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
>> Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
>> ---
>>   tools/testing/selftests/powerpc/benchmarks/Makefile    |  2 +-
>>   .../testing/selftests/powerpc/benchmarks/exec_target.c | 10 ++++++++--
>>   2 files changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/tools/testing/selftests/powerpc/benchmarks/Makefile 
>> b/tools/testing/selftests/powerpc/benchmarks/Makefile
>> index 1321922038d0..ca4483c238b9 100644
>> --- a/tools/testing/selftests/powerpc/benchmarks/Makefile
>> +++ b/tools/testing/selftests/powerpc/benchmarks/Makefile
>> @@ -18,4 +18,4 @@ $(OUTPUT)/context_switch: LDLIBS += -lpthread
>>     $(OUTPUT)/fork: LDLIBS += -lpthread
>>   -$(OUTPUT)/exec_target: CFLAGS += -static -nostartfiles
>> +$(OUTPUT)/exec_target: CFLAGS += -nostartfiles
>> diff --git a/tools/testing/selftests/powerpc/benchmarks/exec_target.c 
>> b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>> index c14b0fc1edde..20027a23b594 100644
>> --- a/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>> +++ b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>> @@ -7,10 +7,16 @@
>>    */
>>     #define _GNU_SOURCE
>> -#include <unistd.h>
>>   #include <sys/syscall.h>
>>     void _start(void)
>>   {
>> -    syscall(SYS_exit, 0);
>> +    asm volatile (
>> +        "li %%r0, %[sys_exit];"
>> +        "li %%r3, 0;"
>> +        "sc;"
>> +        :
>> +        : [sys_exit] "i" (SYS_exit)
>> +        : "r0", "r3"
>> +    );
>
> That looks ok because SYS_exit() is not supposed to return, but in the 
> general case you should take a lot more precautions regarding which 
> registers get clobbered when using sc.
>
> Maybe it is worth a comment.


ok sure and something like this will help?


+        : "r0", "r3" //clobber registers, r0 - syscall number, r3 - 
exit value

Maddy


>
> Christophe
>
>>   }
Christophe Leroy Aug. 9, 2024, 4:54 a.m. UTC | #3
Le 09/08/2024 à 06:25, Madhavan Srinivasan a écrit :
> 
> On 8/6/24 12:24 PM, Christophe Leroy wrote:
>>
>>
>> Le 05/08/2024 à 10:30, Madhavan Srinivasan a écrit :
>>> Currently exec-target.c file is linked as static and this
>>> post a requirement to install libc dev package to build.
>>> Without it, build-breaks when compiling selftest/powerpc/benchmark.
>>>
>>>    CC       exec_target
>>> /usr/bin/ld: cannot find -lc: No such file or directory
>>> collect2: error: ld returned 1 exit status
>>>
>>> exec_target.c is using "syscall" library function which
>>> could be replaced with a inline assembly and the same is
>>> proposed as a fix here.
>>>
>>> Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
>>> Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
>>> ---
>>>   tools/testing/selftests/powerpc/benchmarks/Makefile    |  2 +-
>>>   .../testing/selftests/powerpc/benchmarks/exec_target.c | 10 ++++++++--
>>>   2 files changed, 9 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/tools/testing/selftests/powerpc/benchmarks/Makefile 
>>> b/tools/testing/selftests/powerpc/benchmarks/Makefile
>>> index 1321922038d0..ca4483c238b9 100644
>>> --- a/tools/testing/selftests/powerpc/benchmarks/Makefile
>>> +++ b/tools/testing/selftests/powerpc/benchmarks/Makefile
>>> @@ -18,4 +18,4 @@ $(OUTPUT)/context_switch: LDLIBS += -lpthread
>>>     $(OUTPUT)/fork: LDLIBS += -lpthread
>>>   -$(OUTPUT)/exec_target: CFLAGS += -static -nostartfiles
>>> +$(OUTPUT)/exec_target: CFLAGS += -nostartfiles
>>> diff --git a/tools/testing/selftests/powerpc/benchmarks/exec_target.c 
>>> b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>>> index c14b0fc1edde..20027a23b594 100644
>>> --- a/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>>> +++ b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>>> @@ -7,10 +7,16 @@
>>>    */
>>>     #define _GNU_SOURCE
>>> -#include <unistd.h>
>>>   #include <sys/syscall.h>
>>>     void _start(void)
>>>   {
>>> -    syscall(SYS_exit, 0);
>>> +    asm volatile (
>>> +        "li %%r0, %[sys_exit];"
>>> +        "li %%r3, 0;"
>>> +        "sc;"
>>> +        :
>>> +        : [sys_exit] "i" (SYS_exit)
>>> +        : "r0", "r3"
>>> +    );
>>
>> That looks ok because SYS_exit() is not supposed to return, but in the 
>> general case you should take a lot more precautions regarding which 
>> registers get clobbered when using sc.
>>
>> Maybe it is worth a comment.
> 
> 
> ok sure and something like this will help?
> 
> 
> +        : "r0", "r3" //clobber registers, r0 - syscall number, r3 - 
> exit value
> 

Not really.

sc will clobber r0 and r3-r12, also SO bit in CR.

Here the reason why you have no problem with that is that SYS_exit never 
returns. At the end, even your "r0" and "r3" clobber are unnecessary 
because of that.

Christophe
Madhavan Srinivasan Aug. 9, 2024, 5:32 a.m. UTC | #4
On 8/9/24 10:24 AM, Christophe Leroy wrote:
>
>
> Le 09/08/2024 à 06:25, Madhavan Srinivasan a écrit :
>>
>> On 8/6/24 12:24 PM, Christophe Leroy wrote:
>>>
>>>
>>> Le 05/08/2024 à 10:30, Madhavan Srinivasan a écrit :
>>>> Currently exec-target.c file is linked as static and this
>>>> post a requirement to install libc dev package to build.
>>>> Without it, build-breaks when compiling selftest/powerpc/benchmark.
>>>>
>>>>    CC       exec_target
>>>> /usr/bin/ld: cannot find -lc: No such file or directory
>>>> collect2: error: ld returned 1 exit status
>>>>
>>>> exec_target.c is using "syscall" library function which
>>>> could be replaced with a inline assembly and the same is
>>>> proposed as a fix here.
>>>>
>>>> Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
>>>> Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
>>>> ---
>>>>   tools/testing/selftests/powerpc/benchmarks/Makefile    | 2 +-
>>>>   .../testing/selftests/powerpc/benchmarks/exec_target.c | 10 
>>>> ++++++++--
>>>>   2 files changed, 9 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git a/tools/testing/selftests/powerpc/benchmarks/Makefile 
>>>> b/tools/testing/selftests/powerpc/benchmarks/Makefile
>>>> index 1321922038d0..ca4483c238b9 100644
>>>> --- a/tools/testing/selftests/powerpc/benchmarks/Makefile
>>>> +++ b/tools/testing/selftests/powerpc/benchmarks/Makefile
>>>> @@ -18,4 +18,4 @@ $(OUTPUT)/context_switch: LDLIBS += -lpthread
>>>>     $(OUTPUT)/fork: LDLIBS += -lpthread
>>>>   -$(OUTPUT)/exec_target: CFLAGS += -static -nostartfiles
>>>> +$(OUTPUT)/exec_target: CFLAGS += -nostartfiles
>>>> diff --git 
>>>> a/tools/testing/selftests/powerpc/benchmarks/exec_target.c 
>>>> b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>>>> index c14b0fc1edde..20027a23b594 100644
>>>> --- a/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>>>> +++ b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>>>> @@ -7,10 +7,16 @@
>>>>    */
>>>>     #define _GNU_SOURCE
>>>> -#include <unistd.h>
>>>>   #include <sys/syscall.h>
>>>>     void _start(void)
>>>>   {
>>>> -    syscall(SYS_exit, 0);
>>>> +    asm volatile (
>>>> +        "li %%r0, %[sys_exit];"
>>>> +        "li %%r3, 0;"
>>>> +        "sc;"
>>>> +        :
>>>> +        : [sys_exit] "i" (SYS_exit)
>>>> +        : "r0", "r3"
>>>> +    );
>>>
>>> That looks ok because SYS_exit() is not supposed to return, but in 
>>> the general case you should take a lot more precautions regarding 
>>> which registers get clobbered when using sc.
>>>
>>> Maybe it is worth a comment.
>>
>>
>> ok sure and something like this will help?
>>
>>
>> +        : "r0", "r3" //clobber registers, r0 - syscall number, r3 - 
>> exit value
>>
>
> Not really.
>
> sc will clobber r0 and r3-r12, also SO bit in CR.
>
> Here the reason why you have no problem with that is that SYS_exit 
> never returns. At the end, even your "r0" and "r3" clobber are 
> unnecessary because of that.

ah nice. thanks for the details.
I will add comment and post a v2 soon.

Maddy


>
> Christophe
Michael Ellerman Aug. 12, 2024, 12:21 a.m. UTC | #5
Christophe Leroy <christophe.leroy@csgroup.eu> writes:
> Le 05/08/2024 à 10:30, Madhavan Srinivasan a écrit :
>> Currently exec-target.c file is linked as static and this
>> post a requirement to install libc dev package to build.
>> Without it, build-breaks when compiling selftest/powerpc/benchmark.
>> 
>>    CC       exec_target
>> /usr/bin/ld: cannot find -lc: No such file or directory
>> collect2: error: ld returned 1 exit status
>> 
>> exec_target.c is using "syscall" library function which
>> could be replaced with a inline assembly and the same is
>> proposed as a fix here.
>> 
>> Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
>> Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
>> ---
>>   tools/testing/selftests/powerpc/benchmarks/Makefile    |  2 +-
>>   .../testing/selftests/powerpc/benchmarks/exec_target.c | 10 ++++++++--
>>   2 files changed, 9 insertions(+), 3 deletions(-)
>> 
>> diff --git a/tools/testing/selftests/powerpc/benchmarks/exec_target.c b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>> index c14b0fc1edde..20027a23b594 100644
>> --- a/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>> +++ b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
>> @@ -7,10 +7,16 @@
>>    */
>>   
>>   #define _GNU_SOURCE
>> -#include <unistd.h>
>>   #include <sys/syscall.h>
>>   
>>   void _start(void)
>>   {
>> -	syscall(SYS_exit, 0);
>> +	asm volatile (
>> +		"li %%r0, %[sys_exit];"
>> +		"li %%r3, 0;"
>> +		"sc;"
>> +		:
>> +		: [sys_exit] "i" (SYS_exit)
>> +		: "r0", "r3"
>> +	);
>
> That looks ok because SYS_exit() is not supposed to return, but in the 
> general case you should take a lot more precautions regarding which 
> registers get clobbered when using sc.

That's my fault for just blurting out that diff on slack without
thinking about it too hard.

We should probably just add the proper clobbers, in case anyone copies
it in future. Which should be:

	asm volatile (
		"li %%r0, %[sys_exit];"
		"li %%r3, 0;"
		"sc;"
		:
		: [sys_exit] "i" (SYS_exit)
		: "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
		  "r11", "r12", "r13", "cr0", "ctr", "xer", "memory"
	);

cheers
diff mbox series

Patch

diff --git a/tools/testing/selftests/powerpc/benchmarks/Makefile b/tools/testing/selftests/powerpc/benchmarks/Makefile
index 1321922038d0..ca4483c238b9 100644
--- a/tools/testing/selftests/powerpc/benchmarks/Makefile
+++ b/tools/testing/selftests/powerpc/benchmarks/Makefile
@@ -18,4 +18,4 @@  $(OUTPUT)/context_switch: LDLIBS += -lpthread
 
 $(OUTPUT)/fork: LDLIBS += -lpthread
 
-$(OUTPUT)/exec_target: CFLAGS += -static -nostartfiles
+$(OUTPUT)/exec_target: CFLAGS += -nostartfiles
diff --git a/tools/testing/selftests/powerpc/benchmarks/exec_target.c b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
index c14b0fc1edde..20027a23b594 100644
--- a/tools/testing/selftests/powerpc/benchmarks/exec_target.c
+++ b/tools/testing/selftests/powerpc/benchmarks/exec_target.c
@@ -7,10 +7,16 @@ 
  */
 
 #define _GNU_SOURCE
-#include <unistd.h>
 #include <sys/syscall.h>
 
 void _start(void)
 {
-	syscall(SYS_exit, 0);
+	asm volatile (
+		"li %%r0, %[sys_exit];"
+		"li %%r3, 0;"
+		"sc;"
+		:
+		: [sys_exit] "i" (SYS_exit)
+		: "r0", "r3"
+	);
 }