mbox series

[v2,0/4] nolibc signal handling support

Message ID 20230108131038.841204-1-ammar.faizi@intel.com (mailing list archive)
Headers show
Series nolibc signal handling support | expand

Message

Ammar Faizi Jan. 8, 2023, 1:10 p.m. UTC
From: Ammar Faizi <ammarfaizi2@gnuweeb.org>

Hi Willy,

On top of the series titled "nolibc auxiliary vector retrieval support".
The prerequisite patches of this series are in that series.

This is v2 of nolibc signal handling support. It adds signal handling
support to the nolibc subsystem:

1)  Initial implementation of nolibc sigaction(2) function.

    `sigaction()` needs an architecture-dependent "signal trampoline"
    function that invokes __rt_sigreturn syscall to resume the process
    after a signal gets handled.

    The "signal trampoline" function is called `__restore_rt` in this
    implementation. The naming `__restore_rt` is important for GDB. It
    also has to be given a special optimization attribute
    "omit-frame-pointer" to prevent the compiler from creating a stack
    frame that makes the `%rsp` value no longer points to the `struct
    rt_sigframe` that the kernel constructed.


2)  signal(2) function.

    signal() function is the simpler version of sigaction(). Unlike
    sigaction(), which fully controls the struct sigaction, the caller
    only cares about the sa_handler when calling the signal() function.
    signal() internally calls sigaction().


3)  More selftests.

    This series also adds selftests for:
      - fork(2)
      - sigaction(2)
      - signal(2)


Side note for __restore_rt:
This has been tested on x86-64 arch and `__restore_rt` generates the
correct code. The `__restore_rt` codegen correctness on other
architectures need to be evaluated as well. If it can't generate the
correct code, it has to be written in inline Assembly.

The current codegen for __restore_rt looks like this (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0):

  00000000004038e3 <__restore_rt>:
    4038e3:  endbr64 
    4038e7:  mov    $0xf,%eax
    4038ec:  syscall


## Changes since RFC v1:
  - Separate getpagesize() series.
  - Write __restore_rt function in C instead of in inline Assembly.


Signed-off-by: Ammar Faizi <ammarfaizi2@gnuweeb.org>
---

Ammar Faizi (4):
  nolibc/sys: Implement `sigaction(2)` function
  nolibc/sys: Implement `signal(2)` function
  selftests/nolibc: Add `fork(2)` selftest
  selftests/nolibc: Add `sigaction(2)` selftest

 tools/include/nolibc/sys.h                   |  97 +++++++++++
 tools/testing/selftests/nolibc/nolibc-test.c | 172 +++++++++++++++++++
 2 files changed, 269 insertions(+)


base-commit: b6887ec8b0b0c78db414b78e329bf2ce234dedd5
prerequisite-patch-id: 8dd0ca8ecee1732d8f5c0b233f8231dda6ab0d22
prerequisite-patch-id: ff4c08615ebbdc1a04ce39f39f99387ee46b2b31
prerequisite-patch-id: af837a829263849331eb6d73701afd7903146055

Comments

Alviro Iskandar Setiawan Jan. 8, 2023, 1:28 p.m. UTC | #1
On Sun, Jan 8, 2023 at 8:10 PM Ammar Faizi wrote:
> 3)  More selftests.
>
>     This series also adds selftests for:
>       - fork(2)
>       - sigaction(2)
>       - signal(2)
[...]
> Ammar Faizi (4):
>   nolibc/sys: Implement `sigaction(2)` function
>   nolibc/sys: Implement `signal(2)` function
>   selftests/nolibc: Add `fork(2)` selftest
>   selftests/nolibc: Add `sigaction(2)` selftest

The signal() self test is missing?
btw, it's too crowded here, let's create a new thread for this if you
ever send another version
Ammar Faizi Jan. 8, 2023, 1:31 p.m. UTC | #2
On Sun, Jan 08, 2023 at 08:28:33PM +0700, Alviro Iskandar Setiawan wrote:
> The signal() self test is missing?

Ugh, yes. I didn't send the signal() selftest. Will do.

> btw, it's too crowded here, let's create a new thread for this if you
> ever send another version

I'll resend both series. Please ignore these versions...
Ammar Faizi Jan. 8, 2023, 1:39 p.m. UTC | #3
On Sun, Jan 08, 2023 at 08:31:37PM +0700, Ammar Faizi wrote:
> On Sun, Jan 08, 2023 at 08:28:33PM +0700, Alviro Iskandar Setiawan wrote:
> > The signal() self test is missing?
> 
> Ugh, yes. I didn't send the signal() selftest. Will do.

Bah, it turned out I squashed the signal() test into "selftests/nolibc:
Add `sigaction(2)` selftes" patch. It was unintentional. Will split it
properly in v3.