tests/tcg: Add SIGRTMIN/SIGRTMAX test

Test the lowest and the highest real-time signals. This requires
configuring the real-time signal mapping, and therefore some knowledge
about the host. To this end, pass the emulator path in the QEMU
environment variable to all tests (this should not disturb the existing
ones), and assume that all hosts have signals 36-39 available.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Message-ID: <20241029232211.206766-3-iii@linux.ibm.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Ilya Leoshkevich 2024-10-30 00:17:48 +01:00 committed by Richard Henderson
parent c107521e0e
commit 6f58b09032
2 changed files with 76 additions and 2 deletions

View File

@ -179,10 +179,10 @@ run-plugin-%-with-libmem.so: PLUGIN_ARGS=$(COMMA)inline=true
ifeq ($(filter %-softmmu, $(TARGET)),)
run-%: %
$(call run-test, $<, $(QEMU) $(QEMU_OPTS) $<)
$(call run-test, $<, env QEMU=$(QEMU) $(QEMU) $(QEMU_OPTS) $<)
run-plugin-%:
$(call run-test, $@, $(QEMU) $(QEMU_OPTS) \
$(call run-test, $@, env QEMU=$(QEMU) $(QEMU) $(QEMU_OPTS) \
-plugin $(PLUGIN_LIB)/$(call extract-plugin,$@)$(PLUGIN_ARGS) \
-d plugin -D $*.pout \
$(call strip-plugin,$<))

View File

@ -0,0 +1,74 @@
/*
* Test the lowest and the highest real-time signals.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <assert.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/* For hexagon and microblaze. */
#ifndef __SIGRTMIN
#define __SIGRTMIN 32
#endif
extern char **environ;
static bool seen_sigrtmin, seen_sigrtmax;
static void handle_signal(int sig)
{
if (sig == SIGRTMIN) {
seen_sigrtmin = true;
} else if (sig == SIGRTMAX) {
seen_sigrtmax = true;
} else {
_exit(1);
}
}
int main(int argc, char **argv)
{
char *qemu = getenv("QEMU");
struct sigaction act;
assert(qemu);
if (!getenv("QEMU_RTSIG_MAP")) {
char **new_argv = malloc((argc + 2) + sizeof(char *));
int tsig1, hsig1, count1, tsig2, hsig2, count2;
char rt_sigmap[64];
/* Re-exec with a mapping that includes SIGRTMIN and SIGRTMAX. */
new_argv[0] = qemu;
memcpy(&new_argv[1], argv, (argc + 1) * sizeof(char *));
tsig1 = __SIGRTMIN;
/* The host must have a few signals starting from this one. */
hsig1 = 36;
count1 = SIGRTMIN - __SIGRTMIN + 1;
tsig2 = SIGRTMAX;
hsig2 = hsig1 + count1;
count2 = 1;
snprintf(rt_sigmap, sizeof(rt_sigmap), "%d %d %d,%d %d %d",
tsig1, hsig1, count1, tsig2, hsig2, count2);
setenv("QEMU_RTSIG_MAP", rt_sigmap, 0);
assert(execve(new_argv[0], new_argv, environ) == 0);
return EXIT_FAILURE;
}
memset(&act, 0, sizeof(act));
act.sa_handler = handle_signal;
assert(sigaction(SIGRTMIN, &act, NULL) == 0);
assert(sigaction(SIGRTMAX, &act, NULL) == 0);
assert(kill(getpid(), SIGRTMIN) == 0);
assert(seen_sigrtmin);
assert(kill(getpid(), SIGRTMAX) == 0);
assert(seen_sigrtmax);
return EXIT_SUCCESS;
}