From: "Alex Bennée" <alex.bennee@linaro.org>
To: Yeqi Fu <fufuyqqqqqq@gmail.com>
Cc: richard.henderson@linaro.org, qemu-devel@nongnu.org
Subject: Re: [RFC v4 10/11] tests/tcg/multiarch: Add nativecall.c test
Date: Wed, 09 Aug 2023 18:01:40 +0100 [thread overview]
Message-ID: <87zg302l50.fsf@linaro.org> (raw)
In-Reply-To: <20230808141739.3110740-11-fufuyqqqqqq@gmail.com>
Yeqi Fu <fufuyqqqqqq@gmail.com> writes:
> Introduce a new test for native calls to ensure their functionality.
> The process involves cross-compiling the test cases, building them
> as dynamically linked binaries, and running these binaries which
> necessitates the addition of the appropriate interpreter prefix.
>
> Signed-off-by: Yeqi Fu <fufuyqqqqqq@gmail.com>
> ---
> tests/tcg/multiarch/Makefile.target | 17 +++++
> tests/tcg/multiarch/native/nativecall.c | 98
> +++++++++++++++++++++++++
Another thing I missed is putting the test in a subdir misses out the
common logic:
# Set search path for all sources
VPATH += $(MULTIARCH_SRC)
MULTIARCH_SRCS = $(notdir $(wildcard $(MULTIARCH_SRC)/*.c))
ifeq ($(filter %-linux-user, $(TARGET)),$(TARGET))
VPATH += $(MULTIARCH_SRC)/linux
MULTIARCH_SRCS += $(notdir $(wildcard $(MULTIARCH_SRC)/linux/*.c))
endif
MULTIARCH_TESTS = $(MULTIARCH_SRCS:.c=)
which as a result means things like:
make build-tcg
don't automatically build the tests (although it does get picked up at
runtime).
You can either move it out of the subdir or do something similar that
the arm-compat-semi does, expand VPATH and use TESTS:
modified tests/tcg/multiarch/Makefile.target
@@ -138,13 +138,18 @@ run-plugin-semiconsole-with-%:
TESTS += semihosting semiconsole
endif
-nativecall: native/nativecall.c
- $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(filter-out -static,$(LDFLAGS))
-
ifneq ($(LD_PREFIX),)
ifneq ($(wildcard $(LIBNATIVE)),)
+VPATH += $(MULTIARCH_SRC)/native
+
+nativecall: nativecall.c
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(filter-out -static,$(LDFLAGS))
+
run-nativecall: nativecall
- $(call run-test,$<, $(QEMU) -L $(LD_PREFIX) --native-bypass $(LIBNATIVE) $<, "nativecall")
+ $(call run-test,$<, $(QEMU) -L $(LD_PREFIX) --native-bypass
+ $(LIBNATIVE) $<, "nativecall")
+
+TESTS += nativecall
else
run-nativecall: nativecall
$(call skip-test, $<, "no native library found")
@@ -153,7 +158,6 @@ else
run-nativecall: nativecall
$(call skip-test, $<, "no elf interpreter prefix found")
endif
-EXTRA_RUNS += run-nativecall
> 2 files changed, 115 insertions(+)
> create mode 100644 tests/tcg/multiarch/native/nativecall.c
>
> diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target
> index 43bddeaf21..5231df34ba 100644
> --- a/tests/tcg/multiarch/Makefile.target
> +++ b/tests/tcg/multiarch/Makefile.target
> @@ -138,5 +138,22 @@ run-plugin-semiconsole-with-%:
> TESTS += semihosting semiconsole
> endif
>
> +nativecall: native/nativecall.c
> + $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(filter-out -static,$(LDFLAGS))
> +
> +ifneq ($(LD_PREFIX),)
> +ifneq ($(wildcard $(LIBNATIVE)),)
> +run-nativecall: nativecall
> + $(call run-test,$<, $(QEMU) -L $(LD_PREFIX) --native-bypass $(LIBNATIVE) $<, "nativecall")
> +else
> +run-nativecall: nativecall
> + $(call skip-test, $<, "no native library found")
> +endif
> +else
> +run-nativecall: nativecall
> + $(call skip-test, $<, "no elf interpreter prefix found")
> +endif
> +EXTRA_RUNS += run-nativecall
> +
> # Update TESTS
> TESTS += $(MULTIARCH_TESTS)
> diff --git a/tests/tcg/multiarch/native/nativecall.c b/tests/tcg/multiarch/native/nativecall.c
> new file mode 100644
> index 0000000000..d3f6f49ed0
> --- /dev/null
> +++ b/tests/tcg/multiarch/native/nativecall.c
> @@ -0,0 +1,98 @@
> +#include <assert.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <sys/mman.h>
> +
> +void compare_memory(const void *a, const void *b, size_t n)
> +{
> + const unsigned char *p1 = a;
> + const unsigned char *p2 = b;
> + for (size_t i = 0; i < n; i++) {
> + assert(p1[i] == p2[i]);
> + }
> +}
> +
> +void test_memcpy()
> +{
> + char src[] = "Hello, world!";
> + char dest[20];
> + memcpy(dest, src, 13);
> + compare_memory(dest, src, 13);
> +}
> +
> +void test_strncpy()
> +{
> + char src[] = "Hello, world!";
> + char dest[20];
> + strncpy(dest, src, 13);
> + compare_memory(dest, src, 13);
> +}
> +
> +void test_strcpy()
> +{
> + char src[] = "Hello, world!";
> + char dest[20];
> + strcpy(dest, src);
> + compare_memory(dest, src, 13);
> +}
> +
> +void test_strcat()
> +{
> + char src[20] = "Hello, ";
> + char dst[] = "world!";
> + char str[] = "Hello, world!";
> + strcat(src, dest);
> + compare_memory(src, str, 13);
> +}
> +
> +void test_memcmp()
> +{
> + char str1[] = "abc";
> + char str2[] = "abc";
> + char str3[] = "def";
> + assert(memcmp(str1, str2, 3) == 0);
> + assert(memcmp(str1, str3, 3) != 0);
> +}
> +
> +void test_strncmp()
> +{
> + char str1[] = "abc";
> + char str2[] = "abc";
> + char str3[] = "def";
> + assert(strncmp(str1, str2, 2) == 0);
> + assert(strncmp(str1, str3, 2) != 0);
> +}
> +
> +void test_strcmp()
> +{
> + char str1[] = "abc";
> + char str2[] = "abc";
> + char str3[] = "def";
> + assert(strcmp(str1, str2) == 0);
> + assert(strcmp(str1, str3) != 0);
> +}
> +
> +void test_memset()
> +{
> + char buffer[10];
> + memset(buffer, 'A', 10);
> + int i;
> + for (i = 0; i < 10; i++) {
> + assert(buffer[i] == 'A');
> + }
> +}
> +
> +int main()
> +{
> + test_memset();
> + test_memcpy();
> + test_strncpy();
> + test_memcmp();
> + test_strncmp();
> + test_strcpy();
> + test_strcmp();
> + test_strcat();
> +
> + return EXIT_SUCCESS;
> +}
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
next prev parent reply other threads:[~2023-08-09 17:14 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-08 14:17 [RFC v4 00/11] Native Library Calls Yeqi Fu
2023-08-08 14:17 ` [RFC v4 01/11] build: Implement logic for sharing cross-building config files Yeqi Fu
2023-08-09 12:24 ` Manos Pitsidianakis
2023-08-09 14:42 ` Alex Bennée
2023-08-09 15:23 ` Alex Bennée
2023-08-10 8:41 ` Alex Bennée
2023-08-08 14:17 ` [RFC v4 02/11] build: Implement libnative library and the build machinery for libnative Yeqi Fu
2023-08-09 15:18 ` Alex Bennée
2023-08-09 16:10 ` Richard Henderson
2023-08-08 14:17 ` [RFC v4 03/11] linux-user: Implement envlist_appendenv and add tests for envlist Yeqi Fu
2023-08-09 15:27 ` Alex Bennée
2023-08-09 15:44 ` Richard Henderson
2023-08-09 16:06 ` Richard Henderson
2023-08-08 14:17 ` [RFC v4 04/11] linux-user: Implement native-bypass option support Yeqi Fu
2023-08-09 15:42 ` Richard Henderson
2023-08-09 15:47 ` Alex Bennée
2023-08-08 14:17 ` [RFC v4 05/11] linux-user/elfload: Add support for parsing symbols of native libraries Yeqi Fu
2023-08-09 16:14 ` Richard Henderson
2023-08-09 17:04 ` Alex Bennée
2023-08-08 14:17 ` [RFC v4 06/11] tcg: Add tcg opcodes and helpers for native library calls Yeqi Fu
2023-08-09 16:41 ` Alex Bennée
2023-08-08 14:17 ` [RFC v4 07/11] target/i386: Add support " Yeqi Fu
2023-08-09 16:44 ` Richard Henderson
2023-08-08 14:17 ` [RFC v4 08/11] target/mips: " Yeqi Fu
2023-08-08 14:17 ` [RFC v4 09/11] target/arm: " Yeqi Fu
2023-08-08 14:17 ` [RFC v4 10/11] tests/tcg/multiarch: Add nativecall.c test Yeqi Fu
2023-08-09 8:42 ` Alex Bennée
2023-08-09 17:01 ` Alex Bennée [this message]
2023-08-09 17:12 ` Alex Bennée
2023-08-08 14:17 ` [RFC v4 11/11] docs/user: Add doc for native library calls Yeqi Fu
2023-08-09 12:51 ` Manos Pitsidianakis
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=87zg302l50.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=fufuyqqqqqq@gmail.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.