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 <fufuyqqq...@gmail.com> --- tests/tcg/multiarch/Makefile.target | 17 +++++ tests/tcg/multiarch/native/nativecall.c | 98 +++++++++++++++++++++++++ 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; +} -- 2.34.1