diff --git a/devel/qemu/Makefile b/devel/qemu/Makefile index f1c869a2..3e3a0d2d 100644 --- a/devel/qemu/Makefile +++ b/devel/qemu/Makefile @@ -40,7 +40,6 @@ CMDLINE = \ DEBUG_DUMP_MEMORY_MAP=1 \ DEBUG_DUMP_SYSCALL_IMPLEMENTATION=1 \ DEBUG_DUMP_RAMDISK=1 \ - RUN_TEST_ACPI=1 \ RUN_TEST_IPC=1 run_log = run-jinue.log diff --git a/userspace/testapp/Makefile b/userspace/testapp/Makefile index af073dd4..1abfde22 100644 --- a/userspace/testapp/Makefile +++ b/userspace/testapp/Makefile @@ -30,7 +30,7 @@ jinue_root = ../.. include $(jinue_root)/header.mk -sources.c = tests/ipc.c debug.c testapp.c utils.c +sources.c = tests/abcd.c tests/ipc.c debug.c testapp.c utils.c testapp = testapp stripped = $(testapp)-stripped temp_ramdisk_fs = ramdisk-tmp diff --git a/userspace/testapp/testapp.c b/userspace/testapp/testapp.c index 3c0e284a..98a6f6f6 100644 --- a/userspace/testapp/testapp.c +++ b/userspace/testapp/testapp.c @@ -37,6 +37,7 @@ #include #include #include +#include "tests/abcd.h" #include "tests/ipc.h" #include "debug.h" #include "utils.h" @@ -61,6 +62,7 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } + run_abcd_test(); run_ipc_test(); if(bool_getenv("DEBUG_DO_REBOOT")) { diff --git a/userspace/testapp/tests/abcd.c b/userspace/testapp/tests/abcd.c new file mode 100644 index 00000000..48a30f8c --- /dev/null +++ b/userspace/testapp/tests/abcd.c @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2025 Philippe Aubertin. + * All rights reserved. + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the author nor the names of other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include "../utils.h" +#include "abcd.h" + +#define THREADS_NUM 8 + +static void *thread_func(void *arg) { + while(true) { + jinue_info("%s", (const char *)arg); + } + + return NULL; +} + +bool start_thread(pthread_t *thread, const char *str) { + pthread_attr_t attr; + + int status = pthread_attr_init(&attr); + + if(status != 0) { + jinue_error("error: pthread_attr_init() failed: %s", strerror(status)); + return EXIT_FAILURE; + } + + status = pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); + + if(status != 0) { + jinue_error("error: pthread_attr_setstacksize() failed: %s", strerror(status)); + return EXIT_FAILURE; + } + + status = pthread_create(thread, &attr, thread_func, (char *)str); + + if(status != 0) { + jinue_error("error: could not create thread: %s", strerror(status)); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +static void initialize_string(char *str, int thread_index) { + for(int idx = 0; idx < THREADS_NUM; ++idx) { + str[2 * idx] = '.'; + str[2 * idx + 1] = ' '; + } + + str[2 * thread_index] = 'A' + thread_index; + str[2 * THREADS_NUM] = '\0'; +} + +void run_abcd_test(void) { + pthread_t threads[THREADS_NUM]; + char strings[THREADS_NUM][2 * THREADS_NUM + 1]; + + if(! bool_getenv("RUN_TEST_ABCD")) { + return; + } + + for(int idx = 0; idx < THREADS_NUM; ++idx) { + initialize_string(strings[idx], idx); + int status = start_thread(&threads[idx], strings[idx]); + + if(status != EXIT_SUCCESS) { + return; + } + } + + for(int idx = 0; idx < THREADS_NUM; ++idx) { + void *client_exit_value; + pthread_join(threads[idx], &client_exit_value); + } +} diff --git a/userspace/testapp/tests/abcd.h b/userspace/testapp/tests/abcd.h new file mode 100644 index 00000000..fdd29229 --- /dev/null +++ b/userspace/testapp/tests/abcd.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Philippe Aubertin. + * All rights reserved. + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the author nor the names of other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TESTAPP_TEST_ABCD_H_ +#define TESTAPP_TEST_ABCD_H_ + +void run_abcd_test(void); + +#endif diff --git a/userspace/testapp/tests/ipc.c b/userspace/testapp/tests/ipc.c index b4b649cf..9dd73528 100644 --- a/userspace/testapp/tests/ipc.c +++ b/userspace/testapp/tests/ipc.c @@ -37,6 +37,7 @@ #include #include #include "../utils.h" +#include "ipc.h" #define MSG_FUNC_TEST (JINUE_SYS_USER_BASE + 42)