1
0
mirror of https://git.savannah.gnu.org/git/gnulib.git synced 2025-08-08 17:22:05 +03:00

Skip some tests when running under QEMU user-mode.

* tests/qemu.h: New file.
* tests/test-get-rusage-as.c: Include qemu.h.
(main): Skip the test when running under QEMU.
* tests/test-get-rusage-data.c: Include qemu.h.
(main): Skip the test when running under QEMU.
* tests/test-printf-posix2.c: Include qemu.h.
(main): Return with code 77 when running under QEMU.
* tests/test-fprintf-posix2.c: Include qemu.h.
(main): Return with code 77 when running under QEMU.
* tests/test-fprintf-posix3.c: Include qemu.h.
(main): Return with code 79 when running under QEMU.
* tests/test-fprintf-posix3.sh: Skip the test when the return code was
79.
* tests/test-dprintf-posix2.c: Include qemu.h.
(main): Return with code 79 when running under QEMU. Use return code 80
instead of 78.
* tests/test-dprintf-posix2.sh: Skip the test when the return code was
79. Update for changed return code.
* modules/get-rusage-as-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
* modules/get-rusage-data-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
* modules/fprintf-posix-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
* modules/dprintf-posix-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
This commit is contained in:
Bruno Haible
2021-08-29 01:03:29 +02:00
parent ecf9863b1f
commit d2e97793f7
14 changed files with 185 additions and 4 deletions

View File

@@ -1,3 +1,33 @@
2021-08-28 Bruno Haible <bruno@clisp.org>
Skip some tests when running under QEMU user-mode.
* tests/qemu.h: New file.
* tests/test-get-rusage-as.c: Include qemu.h.
(main): Skip the test when running under QEMU.
* tests/test-get-rusage-data.c: Include qemu.h.
(main): Skip the test when running under QEMU.
* tests/test-printf-posix2.c: Include qemu.h.
(main): Return with code 77 when running under QEMU.
* tests/test-fprintf-posix2.c: Include qemu.h.
(main): Return with code 77 when running under QEMU.
* tests/test-fprintf-posix3.c: Include qemu.h.
(main): Return with code 79 when running under QEMU.
* tests/test-fprintf-posix3.sh: Skip the test when the return code was
79.
* tests/test-dprintf-posix2.c: Include qemu.h.
(main): Return with code 79 when running under QEMU. Use return code 80
instead of 78.
* tests/test-dprintf-posix2.sh: Skip the test when the return code was
79. Update for changed return code.
* modules/get-rusage-as-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
* modules/get-rusage-data-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
* modules/fprintf-posix-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
* modules/dprintf-posix-tests (Files): Add qemu.h.
(Depends-on): Add stdbool.
2021-08-28 Bruno Haible <bruno@clisp.org> 2021-08-28 Bruno Haible <bruno@clisp.org>
sigabbrev_np, sigdescr_np: Fix compilation error on Linux/alpha. sigabbrev_np, sigdescr_np: Fix compilation error on Linux/alpha.

View File

@@ -5,10 +5,12 @@ tests/test-printf-posix.output
tests/test-dprintf-posix2.sh tests/test-dprintf-posix2.sh
tests/test-dprintf-posix2.c tests/test-dprintf-posix2.c
tests/infinity.h tests/infinity.h
tests/qemu.h
tests/signature.h tests/signature.h
tests/macros.h tests/macros.h
Depends-on: Depends-on:
stdbool
stdint stdint
get-rusage-as get-rusage-as

View File

@@ -8,10 +8,12 @@ tests/test-fprintf-posix2.c
tests/test-fprintf-posix3.sh tests/test-fprintf-posix3.sh
tests/test-fprintf-posix3.c tests/test-fprintf-posix3.c
tests/infinity.h tests/infinity.h
tests/qemu.h
tests/signature.h tests/signature.h
tests/macros.h tests/macros.h
Depends-on: Depends-on:
stdbool
stdint stdint
get-rusage-as get-rusage-as

View File

@@ -1,8 +1,10 @@
Files: Files:
tests/test-get-rusage-as.c tests/test-get-rusage-as.c
tests/qemu.h
tests/macros.h tests/macros.h
Depends-on: Depends-on:
stdbool
configure.ac: configure.ac:

View File

@@ -1,9 +1,11 @@
Files: Files:
tests/test-get-rusage-data.c tests/test-get-rusage-data.c
tests/qemu.h
tests/macros.h tests/macros.h
m4/musl.m4 m4/musl.m4
Depends-on: Depends-on:
stdbool
configure.ac: configure.ac:
gl_MUSL_LIBC gl_MUSL_LIBC

99
tests/qemu.h Normal file
View File

@@ -0,0 +1,99 @@
/* Determine whether the current process is running under QEMU.
Copyright (C) 2021 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* Written by Bruno Haible <bruno@clisp.org>, 2021. */
#include <stdbool.h>
#ifdef __linux__
# include <fcntl.h>
# include <string.h>
# include <unistd.h>
#endif
/* This function determines whether the current process is running under QEMU
(user-mode).
It does so by looking at parts of the environment that QEMU does not emulate
100% perfectly well.
For comparison, the techniques given in the paper
Thomas Raffetseder, Christopher Kruegel, Engin Kirda
"Detecting System Emulators"
2007
https://publik.tuwien.ac.at/files/pub-inf_5317.pdf
apply to both the QEMU system mode and QEMU user mode. */
static bool
is_running_under_qemu_user (void)
{
#ifdef __linux__
char buf[4096 + 1];
int fd;
# if defined __m68k__
fd = open ("/proc/hardware", O_RDONLY);
if (fd >= 0)
{
int n = read (fd, buf, sizeof (buf) - 1);
close (fd);
if (n > 0)
{
buf[n] = '\0';
if (strstr (buf, "qemu") != NULL)
return true;
}
}
# endif
fd = open ("/proc/cpuinfo", O_RDONLY);
if (fd >= 0)
{
int n = read (fd, buf, sizeof (buf) - 1);
close (fd);
if (n > 0)
{
buf[n] = '\0';
# if defined __hppa__
if (strstr (buf, "QEMU") != NULL)
return true;
# endif
# if !(defined __i386__ || defined __x86_64__)
if (strstr (buf, "AuthenticAMD") != NULL
|| strstr (buf, "GenuineIntel") != NULL)
return true;
# endif
# if !(defined __arm__ || defined __aarch64__)
if (strstr (buf, "ARM") != NULL
|| strcasestr (buf, "aarch64") != NULL)
return true;
# endif
# if !defined __sparc__
if (strcasestr (buf, "SPARC") != NULL)
return true;
# endif
# if !defined __powerpc__
if (strstr (buf, "POWER") != NULL)
return true;
# endif
}
}
/* If you need more heuristics, look at system calls that are not perfectly
well emulated in qemu/linux-user/syscall.c. */
#endif
return false;
}

View File

@@ -31,6 +31,7 @@
# include <sys/resource.h> # include <sys/resource.h>
#endif #endif
#include "qemu.h"
#include "resource-ext.h" #include "resource-ext.h"
/* Test against a memory leak in the fprintf replacement. */ /* Test against a memory leak in the fprintf replacement. */
@@ -53,6 +54,12 @@ main (int argc, char *argv[])
int arg; int arg;
int result; int result;
if (is_running_under_qemu_user ())
{
fprintf (stderr, "Skipping test: cannot trust address space size when running under QEMU\n");
return 79;
}
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */ /* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
/* On AIX systems, malloc() is limited by RLIMIT_DATA. */ /* On AIX systems, malloc() is limited by RLIMIT_DATA. */
@@ -85,7 +92,7 @@ main (int argc, char *argv[])
if (memory == NULL) if (memory == NULL)
return 1; return 1;
memset (memory, 17, MAX_ALLOC_TOTAL); memset (memory, 17, MAX_ALLOC_TOTAL);
result = 78; result = 80;
} }
else else
{ {

View File

@@ -4,7 +4,7 @@
(${CHECKER} ./test-dprintf-posix2${EXEEXT} 0 (${CHECKER} ./test-dprintf-posix2${EXEEXT} 0
result=$? result=$?
if test $result != 77 && test $result != 78; then result=1; fi if test $result != 77 && test $result != 79 && test $result != 80; then result=1; fi
exit $result exit $result
) 2>/dev/null ) 2>/dev/null
malloc_result=$? malloc_result=$?
@@ -12,6 +12,10 @@ if test $malloc_result = 77; then
echo "Skipping test: no way to determine address space size" echo "Skipping test: no way to determine address space size"
exit 77 exit 77
fi fi
if test $malloc_result = 79; then
echo "Skipping test: cannot trust address space size when running under QEMU"
exit 77
fi
${CHECKER} ./test-dprintf-posix2${EXEEXT} 1 > /dev/null ${CHECKER} ./test-dprintf-posix2${EXEEXT} 1 > /dev/null
result=$? result=$?
@@ -23,7 +27,7 @@ if test $result != 0; then
exit 1 exit 1
fi fi
if test $malloc_result = 78; then if test $malloc_result = 80; then
echo "Skipping test: get_rusage_as() doesn't work" echo "Skipping test: get_rusage_as() doesn't work"
exit 77 exit 77
fi fi

View File

@@ -32,6 +32,8 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "qemu.h"
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@@ -39,6 +41,9 @@ main (int argc, char *argv[])
int arg; int arg;
int ret; int ret;
if (is_running_under_qemu_user ())
return 77;
/* Some printf implementations allocate temporary space with malloc. */ /* Some printf implementations allocate temporary space with malloc. */
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
#ifdef RLIMIT_DATA #ifdef RLIMIT_DATA

View File

@@ -48,6 +48,7 @@ main ()
# include <sys/resource.h> # include <sys/resource.h>
#endif #endif
#include "qemu.h"
#include "resource-ext.h" #include "resource-ext.h"
/* Test against a memory leak in the fprintf replacement. */ /* Test against a memory leak in the fprintf replacement. */
@@ -70,6 +71,12 @@ main (int argc, char *argv[])
int arg; int arg;
int result; int result;
if (is_running_under_qemu_user ())
{
fprintf (stderr, "Skipping test: cannot trust address space size when running under QEMU\n");
return 79;
}
/* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */ /* Limit the amount of malloc()ed memory to MAX_ALLOC_TOTAL or less. */
/* On AIX systems, malloc() is limited by RLIMIT_DATA. */ /* On AIX systems, malloc() is limited by RLIMIT_DATA. */

View File

@@ -4,7 +4,7 @@
(${CHECKER} ./test-fprintf-posix3${EXEEXT} 0 (${CHECKER} ./test-fprintf-posix3${EXEEXT} 0
result=$? result=$?
if test $result != 77 && test $result != 78 && test $result != 80; then result=1; fi if test $result != 77 && test $result != 78 && test $result != 79 && test $result != 80; then result=1; fi
exit $result exit $result
) 2>/dev/null ) 2>/dev/null
malloc_result=$? malloc_result=$?
@@ -16,6 +16,10 @@ if test $malloc_result = 78; then
echo "Skipping test: cannot trust address space size on this platform" echo "Skipping test: cannot trust address space size on this platform"
exit 77 exit 77
fi fi
if test $malloc_result = 79; then
echo "Skipping test: cannot trust address space size when running under QEMU"
exit 77
fi
${CHECKER} ./test-fprintf-posix3${EXEEXT} 1 > /dev/null ${CHECKER} ./test-fprintf-posix3${EXEEXT} 1 > /dev/null
result=$? result=$?

View File

@@ -21,6 +21,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "qemu.h"
#include "macros.h" #include "macros.h"
void *memchunk1; void *memchunk1;
@@ -46,6 +47,11 @@ main ()
fprintf (stderr, "Skipping test: no way to determine address space size\n"); fprintf (stderr, "Skipping test: no way to determine address space size\n");
return 77; return 77;
} }
else if (is_running_under_qemu_user ())
{
fprintf (stderr, "Skipping test: running under QEMU\n");
return 77;
}
else else
{ {
/* The address space size is positive. */ /* The address space size is positive. */

View File

@@ -21,6 +21,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "qemu.h"
#include "macros.h" #include "macros.h"
void *memchunk1; void *memchunk1;
@@ -46,6 +47,11 @@ main ()
fprintf (stderr, "Skipping test: no way to determine data segment size\n"); fprintf (stderr, "Skipping test: no way to determine data segment size\n");
return 77; return 77;
} }
else if (is_running_under_qemu_user ())
{
fprintf (stderr, "Skipping test: running under QEMU\n");
return 77;
}
else else
{ {
/* The data segment size is positive, except possibly at the beginning. */ /* The data segment size is positive, except possibly at the beginning. */

View File

@@ -32,6 +32,8 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "qemu.h"
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
@@ -39,6 +41,9 @@ main (int argc, char *argv[])
int arg; int arg;
int ret; int ret;
if (is_running_under_qemu_user ())
return 77;
/* Some printf implementations allocate temporary space with malloc. */ /* Some printf implementations allocate temporary space with malloc. */
/* On BSD systems, malloc() is limited by RLIMIT_DATA. */ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
#ifdef RLIMIT_DATA #ifdef RLIMIT_DATA