public inbox for linux-parisc@vger.kernel.org
 help / color / mirror / Atom feed
From: Helge Deller <deller@gmx.de>
To: "Thomas Weißschuh" <linux@weissschuh.net>,
	"Helge Deller" <deller@kernel.org>
Cc: Willy Tarreau <w@1wt.eu>,
	linux-kernel@vger.kernel.org, linux-parisc@vger.kernel.org
Subject: Re: [PATCH v3 2/2] tools/nolibc: add support for 32-bit parisc
Date: Thu, 9 Apr 2026 13:11:08 +0200	[thread overview]
Message-ID: <26567bee-8e1a-4fbf-8910-42448ad0d4ab@gmx.de> (raw)
In-Reply-To: <9ce29573-1c0a-47ec-8c0b-4706205cecbc@t-8ch.de>

On 4/9/26 10:38, Thomas Weißschuh wrote:
> On 2026-04-09 00:15:54+0200, Helge Deller wrote:
>> * Thomas Weißschuh <linux@weissschuh.net>:
>>> Extend nolibc to target the 32-bit parisc architecture.
>>> 64-bit is not yet supported.
>>>
>>> Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
>>> ---
>>>   tools/include/nolibc/Makefile                  |   2 +-
>>>   tools/include/nolibc/arch-parisc.h             | 178 +++++++++++++++++++++++++
>>>   tools/include/nolibc/arch.h                    |   2 +
>>>   tools/testing/selftests/nolibc/Makefile.nolibc |   6 +
>>>   tools/testing/selftests/nolibc/run-tests.sh    |   8 +-
>>>   5 files changed, 194 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/tools/include/nolibc/Makefile b/tools/include/nolibc/Makefile
>>> index 7455097cff69..81187126bf93 100644
>>> --- a/tools/include/nolibc/Makefile
>>> +++ b/tools/include/nolibc/Makefile
>>> @@ -17,7 +17,7 @@ endif
>>>   # it defaults to this nolibc directory.
>>>   OUTPUT ?= $(CURDIR)/
>>>   
>>> -architectures := arm arm64 loongarch m68k mips powerpc riscv s390 sh sparc x86
>>> +architectures := arm arm64 loongarch m68k mips parisc powerpc riscv s390 sh sparc x86
>>>   arch_files := arch.h $(addsuffix .h, $(addprefix arch-, $(architectures)))
>>>   all_files := \
>>>   		byteswap.h \
>>> diff --git a/tools/include/nolibc/arch-parisc.h b/tools/include/nolibc/arch-parisc.h
>>> new file mode 100644
>>> index 000000000000..8580be5c9c58
>>> --- /dev/null
>>> +++ b/tools/include/nolibc/arch-parisc.h
>>> @@ -0,0 +1,178 @@
>>> +/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
>>> +/*
>>> + * parisc/hppa (32-bit) specific definitions for NOLIBC
>>> + * Copyright (C) 2026 Thomas Weißschuh <linux@weissschuh.net>
>>> + */
>>> +
>>> +#ifndef _NOLIBC_ARCH_PARISC_H
>>> +#define _NOLIBC_ARCH_PARISC_H
>>> +
>>> +#if defined(__LP64__)
>>> +#error 64-bit not supported
>>> +#endif
>>> +
>>> +#include "compiler.h"
>>> +#include "crt.h"
>>> +
>>> +/* Syscalls for parisc :
>>> + *   - syscall number is passed in r20
>>> + *   - arguments are in r26 to r21
>>> + *   - the system call is performed by calling "ble 0x100(%sr2, %r0)",
>>> + *     the instruction after that is executed first, use it to load the number
>> better:
>>     the instruction after that is in the delay slot and executed before the jump
>>     to 0x100 actually happens.
> 
> Ack.
> 
>>> + *   - syscall return comes in r28
>>> + *   - the arguments are cast to long and assigned into the target
>>> + *     registers which are then simply passed as registers to the asm code,
>>> + *     so that we don't have to experience issues with register constraints.
>>
>> side-note:
>> this is actually really tricky.
>> I've seen cases, where the syscalls were not using the given registers,
>> because the callers were too complicated and the compiler could not guarantee
>> to actually use the given register.
> 
> This is weird. We are using the same pattern for all other
> architectures, too and so far that worked fine.
> Was it a compiler bug?

No, it can happen if too many registers are in use and if you e.g. hand
over arg0 = a+x-z, arg1 = 100-z/3, .... (I mean if you put in multiple calculations).
For now I would ignore it.

> (...)
> 
>>> +#ifndef NOLIBC_NO_RUNTIME
>>> +/* startup code */
>>> +void __attribute__((weak, noreturn)) __nolibc_entrypoint __no_stack_protector _start(void)
>>> +{
>>> +	__asm__ volatile (
>>> +		".import $global$\n"           /* Set up the dp register */
>>> +		"ldil L%$global$, %dp\n"
>>> +		"ldo R%$global$(%r27), %dp\n"
>>> +
>>> +		"ldo -4(%r24), %r26\n"         /* The sp register is special on parisc.
>>> +						* r24 points to argv. Subtract 4 to get &argc.
>>> +						* Pass that as first argument to _start_c.
>>> +						*/
>>> +
>>> +		"b,n _start_c\n"
>>
>> you can change that to "b _start_c\" (without ",n") and move it
>> one line up before the "ldo -4..." instruction. It's a little bit faster".
>> The ldo is then in the delay slot.
> 
> Ack.
> 
>>> +	);
>>> +	__nolibc_entrypoint_epilogue();
>>> +}
>>> +#endif /* NOLIBC_NO_RUNTIME */
> 
> (...)
> 
>>>   QEMU_ARCH_USER_ppc64le = ppc64le
>>> @@ -199,6 +203,7 @@ QEMU_ARGS_sparc32    = -M SS-5 -m 256M -append "console=ttyS0,115200 panic=-1 $(
>>>   QEMU_ARGS_sparc64    = -M sun4u -append "console=ttyS0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
>>>   QEMU_ARGS_m68k       = -M virt -append "console=ttyGF0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
>>>   QEMU_ARGS_sh4        = -M r2d -serial file:/dev/stdout -append "console=ttySC1,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
>>> +QEMU_ARGS_parisc32   = -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
>>
>> You could change that to (untested):
>> QEMU_ARGS_parisc32   = -M B160L -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" -nographic
> 
> Will try.

I tried.
You are using "-display none" which is nearly the same.
The difference is: With "-display none", you will see the output starting when the kernel
switches to serial port".  With "-nographics" you will see everything from the start
of the virtual computer, e.g. BIOS messages, boot loader and initial kernel messages.

For your usecase either is OK.
  
>>>   QEMU_ARGS            = -m 1G $(QEMU_ARGS_$(XARCH)) $(QEMU_ARGS_BIOS) $(QEMU_ARGS_EXTRA)
>>>   
>>>   # OUTPUT is only set when run from the main makefile, otherwise
>>> @@ -215,6 +220,7 @@ CFLAGS_i386 = $(call cc-option,-m32)
>>>   CFLAGS_x32 = -mx32
>>>   CFLAGS_arm = -marm
>>>   CFLAGS_armthumb = -mthumb -march=armv6t2
>>> +CFLAGS_parisc32 = -mfast-indirect-calls
>>
>> would be good if we could go without this...
>> But for the beginning it's ok.
> 
> Why? As nolibc is compiled again for each application, any users which
> don't want this don't get it. For nolibc-test it avoids a dependency on
> libgcc.

Yeah, but I think we can avoid libgcc other ways too.
I will try once it's upstreamed..

Helge

      reply	other threads:[~2026-04-09 11:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-08 20:05 [PATCH v3 0/2] tools/nolibc: add support for 32-bit parisc Thomas Weißschuh
2026-04-08 20:05 ` [PATCH v3 1/2] selftests/nolibc: avoid function pointer comparisons Thomas Weißschuh
2026-04-08 20:05 ` [PATCH v3 2/2] tools/nolibc: add support for 32-bit parisc Thomas Weißschuh
2026-04-08 22:15   ` Helge Deller
2026-04-09  8:38     ` Thomas Weißschuh
2026-04-09 11:11       ` Helge Deller [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=26567bee-8e1a-4fbf-8910-42448ad0d4ab@gmx.de \
    --to=deller@gmx.de \
    --cc=deller@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-parisc@vger.kernel.org \
    --cc=linux@weissschuh.net \
    --cc=w@1wt.eu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox