From: Udit kumar agarwal <dev.madaari@xxxxxxxxx> - Add rtems-specific config files. - Constructors/Destructors being not supported by RTEMS, should be invoked as normal routines. - Add documentation for RTEMS - Update Makefile, os.h for RTEMS --- Makefile | 11 ++- README | 29 ++++++ cgroup.c | 7 +- client.c | 7 +- configure | 2 + crc/xxhash.h | 15 ++++ engines/cpu.c | 14 ++- engines/falloc.c | 7 +- engines/filecreate.c | 14 ++- engines/ftruncate.c | 14 ++- engines/glusterfs_async.c | 7 +- engines/glusterfs_sync.c | 14 ++- engines/mmap.c | 14 ++- engines/net.c | 14 ++- engines/null.c | 14 ++- engines/sync.c | 14 ++- fio.c | 3 + fio.h | 10 ++- fio_sem.c | 6 ++ gettime.c | 14 ++- init.c | 26 +++++- ioengines.c | 2 + lib/prio_tree.c | 7 +- options.c | 6 +- os/os-rtems.h | 70 +++++++++++++++ os/os.h | 3 + os/rtems/rtems-fio-wrap.h | 54 +++++++++++ os/rtems/rtems-init.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++ oslib/inet_aton.c | 3 +- profiles/act.c | 14 ++- profiles/tiobench.c | 14 ++- smalloc.c | 11 ++- stat.c | 6 ++ t/arch.c | 2 + 34 files changed, 638 insertions(+), 35 deletions(-) create mode 100644 os/os-rtems.h create mode 100644 os/rtems/rtems-fio-wrap.h create mode 100644 os/rtems/rtems-init.c diff --git a/Makefile b/Makefile index 20d3ec1..e93f964 100644 --- a/Makefile +++ b/Makefile @@ -194,11 +194,20 @@ ifneq (,$(findstring CYGWIN,$(CONFIG_TARGET_OS))) LIBS += -lpthread -lpsapi -lws2_32 CFLAGS += -DPSAPI_VERSION=1 -Ios/windows/posix/include -Wno-format -static endif +ifeq ($(CONFIG_TARGET_OS), RTEMS) + LDFLAGS += -B $(TOOL_PATH_PREFIX)/arm-rtems5/beagleboneblack/lib -specs bsp_specs -qrtems -Wl,--gc-sections + LIBS += -Wl,-Bstatic -L. -lbsd -Wl,-Bdynamic -lm -lz + CFLAGS += -I $(TOOL_PATH_PREFIX)/arm-rtems5/beagleboneblack/lib/include -ffunction-sections -fdata-sections -g -mcpu=cortex-a8 -fno-strict-aliasing -ffreestanding -fno-common -w -DHAVE_RTEMS_SCORE_CPUOPTS_H=1 -DHAVE_RTEMS_H=1 -DHAVE_DLFCN_H=1 -DHAVE_RTEMS_PCI_H=1 -DHAVE_RTEMS_RTEMS_DEBUGGER_H=1 +endif OBJS := $(SOURCE:.c=.o) FIO_OBJS = $(OBJS) fio.o +ifeq ($(CONFIG_TARGET_OS), RTEMS) + FIO_OBJS += os/rtems/rtems-init.o +endif + GFIO_OBJS = $(OBJS) gfio.o graph.o tickmarks.o ghelpers.o goptions.o gerror.o \ gclient.o gcompat.o cairo_text_helpers.o printing.o @@ -462,7 +471,7 @@ t/time-test: $(T_TT_OBJS) $(QUIET_LINK)$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $(T_TT_OBJS) $(LIBS) clean: FORCE - @rm -f .depend $(FIO_OBJS) $(GFIO_OBJS) $(OBJS) $(T_OBJS) $(PROGS) $(T_PROGS) $(T_TEST_PROGS) core.* core gfio FIO-VERSION-FILE *.[do] lib/*.d oslib/*.[do] crc/*.d engines/*.[do] profiles/*.[do] t/*.[do] config-host.mak config-host.h y.tab.[ch] lex.yy.c exp/*.[do] lexer.h + @rm -f .depend $(FIO_OBJS) $(GFIO_OBJS) $(OBJS) $(T_OBJS) $(PROGS) $(T_PROGS) $(T_TEST_PROGS) core.* core gfio FIO-VERSION-FILE *.[do] lib/*.d oslib/*.[do] crc/*.d engines/*.[do] profiles/*.[do] t/*.[do] config-host.mak config-host.h y.tab.[ch] lex.yy.c exp/*.[do] lexer.h os/rtems/*.[do] @rm -rf doc/output distclean: clean FORCE diff --git a/README b/README index 38022bb..cbca933 100644 --- a/README +++ b/README @@ -192,6 +192,35 @@ https://github.com/mintty/mintty/issues/56 and https://github.com/mintty/mintty/wiki/Tips#inputoutput-interaction-with-alien-programs for details). +RTEMS +~~~~~~~ + +For RTEMS Toolchain generation:: + +Toolchain, required for cross-compiling fio for desired architecture +(like arm in this example) can be generated by using RTEMS Source Builder(RSB). + +Please note that fio's build for RTEMS has been tested with RSB version 5(commit id: +25f4db09c85a52fb1640a29f9bdc2de8c2768988), and it may not work with older versions. + +Moreover, For enabling POSIX support(required by fio), build the BSP using RTEMS v5 with +--enable-posix option. After that, if needed(like for using SD card driver for BeagleBone Black) +one may also need to build rtems-libbsd for the desired BSP. + +For Cross-compiling fio for RTEMS:: + +Variable to be passed for toolchain path is TOOL_PATH_PREFIX, which in this case would be, + + $ export TOOL_PATH_PREFIX=/home/uka_in/development/sandbox/5 + +After setting up the variable, next step would be to configure and build fio as: + + $ make clean + $ ./configure --cc=$TOOL_PATH_PREFIX/bin/arm-rtems5-gcc --disable-optimizations --extra-cflags=-O3 + $ make CROSS_COMPILE=$TOOL_PATH_PREFIX/bin/arm-rtems5- V=1 + +Refer to ticket #3429 https://devel.rtems.org/ticket/3429 for updates and +drawbacks of current implementation. Documentation ~~~~~~~~~~~~~ diff --git a/cgroup.c b/cgroup.c index 77e31a4..0a3d372 100644 --- a/cgroup.c +++ b/cgroup.c @@ -224,7 +224,12 @@ out: sfree(mnt); } -static void fio_init cgroup_init(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +cgroup_init(void) { lock = fio_sem_init(FIO_SEM_UNLOCKED); if (!lock) diff --git a/client.c b/client.c index 2a86ea9..cb4ef56 100644 --- a/client.c +++ b/client.c @@ -86,7 +86,12 @@ static void fio_client_remove_hash(struct fio_client *client) flist_del_init(&client->hash_list); } -static void fio_init fio_client_hash_init(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_client_hash_init(void) { int i; diff --git a/configure b/configure index 9bdc7a1..53dd857 100755 --- a/configure +++ b/configure @@ -262,6 +262,8 @@ elif check_define __sun__ ; then CFLAGS="$CFLAGS -D_REENTRANT" elif check_define _WIN32 ; then targetos='CYGWIN' +elif check_define __rtems__ ; then + targetos='RTEMS' else targetos=`uname -s` fi diff --git a/crc/xxhash.h b/crc/xxhash.h index 8850d20..81bf51d 100644 --- a/crc/xxhash.h +++ b/crc/xxhash.h @@ -107,9 +107,16 @@ XXH32() : // Advanced Hash Functions //**************************** +/* Unlike most desktop OS, In Newlib unsigned int and uint32_t are different */ +#ifndef __rtems__ void* XXH32_init (unsigned int seed); XXH_errorcode XXH32_update (void* state, const void* input, int len); unsigned int XXH32_digest (void* state); +#else /* __rtems__ */ +void* XXH32_init (uint32_t seed); +XXH_errorcode XXH32_update (void* state, const void* input, int len); +uint32_t XXH32_digest (void* state); +#endif /* __rtems__ */ /* These functions calculate the xxhash of an input provided in several small packets, @@ -135,7 +142,11 @@ Memory will be freed by XXH32_digest(). int XXH32_sizeofState(void); +#ifndef __rtems__ XXH_errorcode XXH32_resetState(void* state, unsigned int seed); +#else /* __rtems__ */ +XXH_errorcode XXH32_resetState(void* state, uint32_t seed); +#endif /* __rtems__ */ #define XXH32_SIZEOFSTATE 48 typedef struct { long long ll[(XXH32_SIZEOFSTATE+(sizeof(long long)-1))/sizeof(long long)]; } XXH32_stateSpace_t; @@ -151,7 +162,11 @@ use the structure XXH32_stateSpace_t, which will ensure that memory space is lar */ +#ifndef __rtems__ unsigned int XXH32_intermediateDigest (void* state); +#else /* __rtems__ */ +uint32_t XXH32_intermediateDigest (void* state); +#endif /* __rtems__ */ /* This function does the same as XXH32_digest(), generating a 32-bit hash, but preserve memory context. diff --git a/engines/cpu.c b/engines/cpu.c index 0987250..9838af1 100644 --- a/engines/cpu.c +++ b/engines/cpu.c @@ -112,12 +112,22 @@ static struct ioengine_ops ioengine = { .option_struct_size = sizeof(struct cpu_options), }; -static void fio_init fio_cpuio_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_cpuio_register(void) { register_ioengine(&ioengine); } -static void fio_exit fio_cpuio_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_cpuio_unregister(void) { unregister_ioengine(&ioengine); } diff --git a/engines/falloc.c b/engines/falloc.c index 6382569..446638c 100644 --- a/engines/falloc.c +++ b/engines/falloc.c @@ -101,7 +101,12 @@ static struct ioengine_ops ioengine = { .flags = FIO_SYNCIO }; -static void fio_init fio_syncio_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_syncio_register(void) { register_ioengine(&ioengine); } diff --git a/engines/filecreate.c b/engines/filecreate.c index 39a2950..35dc5d7 100644 --- a/engines/filecreate.c +++ b/engines/filecreate.c @@ -107,12 +107,22 @@ static struct ioengine_ops ioengine = { FIO_NOSTATS | FIO_NOFILEHASH, }; -static void fio_init fio_filecreate_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_filecreate_register(void) { register_ioengine(&ioengine); } -static void fio_exit fio_filecreate_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_filecreate_unregister(void) { unregister_ioengine(&ioengine); } diff --git a/engines/ftruncate.c b/engines/ftruncate.c index c7ad038..ab616be 100644 --- a/engines/ftruncate.c +++ b/engines/ftruncate.c @@ -41,12 +41,22 @@ static struct ioengine_ops ioengine = { .flags = FIO_SYNCIO | FIO_FAKEIO }; -static void fio_init fio_syncio_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_syncio_register(void) { register_ioengine(&ioengine); } -static void fio_exit fio_syncio_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_syncio_unregister(void) { unregister_ioengine(&ioengine); } diff --git a/engines/glusterfs_async.c b/engines/glusterfs_async.c index 9e1c4bf..0f1083b 100644 --- a/engines/glusterfs_async.c +++ b/engines/glusterfs_async.c @@ -177,7 +177,12 @@ static struct ioengine_ops ioengine = { .flags = FIO_DISKLESSIO, }; -static void fio_init fio_gf_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_gf_register(void) { register_ioengine(&ioengine); } diff --git a/engines/glusterfs_sync.c b/engines/glusterfs_sync.c index a10e0ed..b634ce8 100644 --- a/engines/glusterfs_sync.c +++ b/engines/glusterfs_sync.c @@ -88,12 +88,22 @@ static struct ioengine_ops ioengine = { .flags = FIO_SYNCIO | FIO_DISKLESSIO, }; -static void fio_init fio_gf_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_gf_register(void) { register_ioengine(&ioengine); } -static void fio_exit fio_gf_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_gf_unregister(void) { unregister_ioengine(&ioengine); } diff --git a/engines/mmap.c b/engines/mmap.c index 308b466..7ce6ebf 100644 --- a/engines/mmap.c +++ b/engines/mmap.c @@ -277,12 +277,22 @@ static struct ioengine_ops ioengine = { .flags = FIO_SYNCIO | FIO_NOEXTEND, }; -static void fio_init fio_mmapio_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_mmapio_register(void) { register_ioengine(&ioengine); } -static void fio_exit fio_mmapio_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_mmapio_unregister(void) { unregister_ioengine(&ioengine); } diff --git a/engines/net.c b/engines/net.c index ca6fb34..5222601 100644 --- a/engines/net.c +++ b/engines/net.c @@ -1451,7 +1451,12 @@ static int str_hostname_cb(void *data, const char *input) return 0; } -static void fio_init fio_netio_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_netio_register(void) { register_ioengine(&ioengine_rw); #ifdef CONFIG_LINUX_SPLICE @@ -1459,7 +1464,12 @@ static void fio_init fio_netio_register(void) #endif } -static void fio_exit fio_netio_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_netio_unregister(void) { unregister_ioengine(&ioengine_rw); #ifdef CONFIG_LINUX_SPLICE diff --git a/engines/null.c b/engines/null.c index 4cc0102..da10d69 100644 --- a/engines/null.c +++ b/engines/null.c @@ -154,12 +154,22 @@ static struct ioengine_ops ioengine = { .flags = FIO_DISKLESSIO | FIO_FAKEIO, }; -static void fio_init fio_null_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_null_register(void) { register_ioengine(&ioengine); } -static void fio_exit fio_null_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_null_unregister(void) { unregister_ioengine(&ioengine); } diff --git a/engines/sync.c b/engines/sync.c index b3e1c9d..4b98f4d 100644 --- a/engines/sync.c +++ b/engines/sync.c @@ -466,7 +466,12 @@ static struct ioengine_ops ioengine_pvrw2 = { }; #endif -static void fio_init fio_syncio_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +fio_syncio_register(void) { register_ioengine(&ioengine_rw); register_ioengine(&ioengine_prw); @@ -479,7 +484,12 @@ static void fio_init fio_syncio_register(void) #endif } -static void fio_exit fio_syncio_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_syncio_unregister(void) { unregister_ioengine(&ioengine_rw); unregister_ioengine(&ioengine_prw); diff --git a/fio.c b/fio.c index f19db1b..d4e0821 100644 --- a/fio.c +++ b/fio.c @@ -65,3 +65,6 @@ done: deinitialize_fio(); return ret; } +#ifdef __rtems__ +#include <os/rtems/rtems-fio-wrap.h> +#endif /* __rtems__ */ diff --git a/fio.h b/fio.h index 3ac552b..e382eb7 100644 --- a/fio.h +++ b/fio.h @@ -785,7 +785,11 @@ static inline void td_flags_clear(struct thread_data *td, unsigned int *flags, if (!td_async_processing(td)) *flags &= ~value; else +#ifndef __rtems__ __sync_fetch_and_and(flags, ~value); +#else /* __rtems__ */ + atomic_fetch_and_explicit(flags, ~value, memory_order_relaxed); +#endif /* __rtems__ */ } static inline void td_flags_set(struct thread_data *td, unsigned int *flags, @@ -794,7 +798,11 @@ static inline void td_flags_set(struct thread_data *td, unsigned int *flags, if (!td_async_processing(td)) *flags |= value; else - __sync_fetch_and_or(flags, value); +#ifndef __rtems__ + __sync_fetch_and_or(flags, ~value); +#else /*__rtems__ */ + atomic_fetch_or_explicit(flags, ~value, memory_order_relaxed); +#endif /* __rtems__ */ } extern const char *fio_get_arch_string(int); diff --git a/fio_sem.c b/fio_sem.c index 3b48061..b5bc9c2 100644 --- a/fio_sem.c +++ b/fio_sem.c @@ -56,9 +56,15 @@ struct fio_sem *fio_sem_init(int value) { struct fio_sem *sem = NULL; +#ifndef __rtems__ sem = (void *) mmap(NULL, sizeof(struct fio_sem), PROT_READ | PROT_WRITE, OS_MAP_ANON | MAP_SHARED, -1, 0); +#else /* __rtems__ */ + sem = (void *) mmap(NULL, sizeof(struct fio_sem), + PROT_READ | PROT_WRITE, + OS_MAP_ANON | MAP_PRIVATE, -1, 0); +#endif /* __rtems__ */ if (sem == MAP_FAILED) { perror("mmap semaphore"); return NULL; diff --git a/gettime.c b/gettime.c index c0f2638..03f11eb 100644 --- a/gettime.c +++ b/gettime.c @@ -94,7 +94,12 @@ static void gtod_log_caller(void *caller) inc_caller(caller); } -static void fio_exit fio_dump_gtod(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +fio_dump_gtod(void) { unsigned long total_calls = 0; int i; @@ -115,7 +120,12 @@ static void fio_exit fio_dump_gtod(void) printf("Total %lu gettimeofday\n", total_calls); } -static void fio_init gtod_init(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +gtod_init(void) { int i; diff --git a/init.c b/init.c index af4cc6b..d69b644 100644 --- a/init.c +++ b/init.c @@ -7,7 +7,6 @@ #include <ctype.h> #include <string.h> #include <errno.h> -#include <sys/ipc.h> #include <sys/types.h> #include <dlfcn.h> #ifdef CONFIG_VALGRIND_DEV @@ -21,6 +20,10 @@ #include <sys/shm.h> #endif +#ifndef __rtems__ +#include <sys/ipc.h> +#endif /* __rtems__ */ + #include "parse.h" #include "smalloc.h" #include "filehash.h" @@ -31,7 +34,13 @@ #include "filelock.h" #include "steadystate.h" +/* RTEMS uses newlib's getopt_long_only_r() */ +#ifdef __rtems__ +#include <getopt.h> +#else /* __rtems__ */ #include "oslib/getopt.h" +#endif /* __rtems__ */ + #include "oslib/strcasestr.h" #include "crc/test.h" @@ -87,6 +96,10 @@ unsigned int *fio_warned = NULL; static char cmd_optstr[256]; static bool did_arg; +#ifdef __rtems__ + struct getopt_data getopt_reent; +#endif /* __rtems__ */ + #define FIO_CLIENT_FLAG (1 << 16) /* @@ -2435,13 +2448,20 @@ int parse_cmd_line(int argc, char *argv[], int client_type) void *cur_client = NULL; int backend = 0; +#ifdef __rtems__ + memset(&getopt_reent, 0, sizeof(getopt_data)); +#endif /* __rtems__ */ /* * Reset optind handling, since we may call this multiple times * for the backend. */ optind = 1; - - while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) { + while ((c = +#ifdef __rtems__ /* Using Newlib's reentrant version of getopt */ + getopt_long_only_r(argc, argv, ostr, l_opts, &lidx, &getopt_reent))!= -1) { +#else /* __rtems__ */ + getopt_long_only(argc, argv, ostr, l_opts, &lidx))!= -1) { +#endif /* __rtems__ */ if ((c & FIO_CLIENT_FLAG) || client_flag_set(c)) { parse_cmd_client(cur_client, argv[optind - 1]); c &= ~FIO_CLIENT_FLAG; diff --git a/ioengines.c b/ioengines.c index d579682..c051ed5 100644 --- a/ioengines.c +++ b/ioengines.c @@ -185,6 +185,7 @@ struct ioengine_ops *load_ioengine(struct thread_data *td) */ void free_ioengine(struct thread_data *td) { +#ifndef __rtems__ dprint(FD_IO, "free ioengine %s\n", td->io_ops->name); if (td->eo && td->io_ops->options) { @@ -199,6 +200,7 @@ void free_ioengine(struct thread_data *td) } td->io_ops = NULL; +#endif /* __rtems__ */ } void close_ioengine(struct thread_data *td) diff --git a/lib/prio_tree.c b/lib/prio_tree.c index d8e1b89..95b55a8 100644 --- a/lib/prio_tree.c +++ b/lib/prio_tree.c @@ -53,7 +53,12 @@ static void get_index(const struct prio_tree_node *node, static unsigned long index_bits_to_maxindex[BITS_PER_LONG]; -static void fio_init prio_tree_init(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +prio_tree_init(void) { unsigned int i; diff --git a/options.c b/options.c index a174e2c..0abb5b1 100644 --- a/options.c +++ b/options.c @@ -4744,7 +4744,7 @@ static char *bc_calc(char *str) if ((!strchr(str, '+') && !strchr(str, '-') && !strchr(str, '*') && !strchr(str, '/')) || strchr(str, '\'')) return str; - +#ifndef __rtems__ /* * Split option from value, we only need to calculate the value */ @@ -4782,6 +4782,10 @@ static char *bc_calc(char *str) memcpy(buf, str, tmp - str); free(str); return strdup(buf); +#else /* __rtems__ */ + log_err("fio: performing math is not supported\n"); + return NULL; +#endif /* __rtems__ */ } /* diff --git a/os/os-rtems.h b/os/os-rtems.h new file mode 100644 index 0000000..4964eb1 --- /dev/null +++ b/os/os-rtems.h @@ -0,0 +1,70 @@ +/*- + * Copyright (c) 2018 Udit kumar agarwal <dev.madaari@xxxxxxxxx> + * 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. + * + * 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 FIO_OS_RTEMS_H +#define FIO_OS_RTEMS_H + +#define FIO_OS os_rtems + +#include <errno.h> +#include <machine/endian.h> +#include <sys/socket.h> +#include <machine/param.h> +#include <sys/cpuset.h> +#include <sys/resource.h> +#include <stdatomic.h> +#include "../file.h" + +#define FIO_HAVE_ODIRECT +#define FIO_USE_GENERIC_RAND +#define FIO_USE_GENERIC_INIT_RANDOM_STATE +#define off64_t _off64_t +#define OS_MAP_ANON MAP_ANON +#define O_DIRECT 0x1000000 +#define FIO_NO_HAVE_SHM_H +#define CONFIG_NO_SHM +#define CONFIG_HAVE_MKDIR_TWO +#define SA_RESTART 0 +#define __need_getopt_newlib + +static inline int blockdev_invalidate_cache(struct fio_file *f) +{ + return ENOTSUP; +} + +static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) +{ + errno = ENOSYS; + return 0; +} + +static inline unsigned long long os_phys_mem(void) +{ + errno = ENOSYS; + return 0; +} + +#endif diff --git a/os/os.h b/os/os.h index becc410..bc230dc 100644 --- a/os/os.h +++ b/os/os.h @@ -23,6 +23,7 @@ enum { os_windows, os_android, os_dragonfly, + os_rtems, os_nr, }; @@ -36,6 +37,8 @@ typedef enum { #include "os-android.h" #elif defined(__linux__) #include "os-linux.h" +#elif defined (__rtems__) +#include "os-rtems.h" #elif defined(__FreeBSD__) #include "os-freebsd.h" #elif defined(__OpenBSD__) diff --git a/os/rtems/rtems-fio-wrap.h b/os/rtems/rtems-fio-wrap.h new file mode 100644 index 0000000..2c639cb --- /dev/null +++ b/os/rtems/rtems-fio-wrap.h @@ -0,0 +1,54 @@ +/* RTEMS specific wrapper for explicitly calling constructors and + * destructors */ + +void act_register(void); +void tiobench_register(void); +void fio_syncio_register(void); +void fio_filecreate_register(void); +void fio_null_register(void); +void prio_tree_init(void); +void fio_syncio_register_ft(void); +void fio_client_hash_init(void); +void fio_syncio_unregister(void); +void tiobench_unregister(void); +void fio_filecreate_unregister(void); +void fio_null_unregister(void); +void act_unregister(void); +void fio_syncio_unregister_ft(void); + +static int +mainwrapper(int argc, char *argv[]) +{ + int err=0; + + /* Constructors */ + act_register(); + tiobench_register(); + fio_syncio_register(); + fio_filecreate_register(); + fio_null_register(); + prio_tree_init(); + fio_syncio_register_ft(); + fio_client_hash_init(); + + err = main(argc, argv, (char *)NULL); + + /* Destructors */ + fio_syncio_unregister(); + tiobench_unregister(); + fio_filecreate_unregister(); + fio_null_unregister(); + act_unregister(); + fio_syncio_unregister_ft(); + + return err; +} + +rtems_bsd_command_fio(int argc, char *argv[]) +{ + int exit_code; + + exit_code = mainwrapper(argc, argv); + + return exit_code; +} diff --git a/os/rtems/rtems-init.c b/os/rtems/rtems-init.c new file mode 100644 index 0000000..a10cfc9 --- /dev/null +++ b/os/rtems/rtems-init.c @@ -0,0 +1,225 @@ +/*- + * Copyright (c) 2018 Udit kumar agarwal <dev.madaari@xxxxxxxxx> + * Copyright (c) 2018 Christian Mauderer <christian.mauderer@xxxxxxxxxxxxxxxxxx> + * 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. + * + * 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 <sys/param.h> +#include <sys/stat.h> +#include <sys/socket.h> + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <ifaddrs.h> +#include <sysexits.h> + +#include <machine/rtems-bsd-commands.h> + +#include <net/if.h> + +#include <rtems/bdbuf.h> +#include <rtems/console.h> +#include <rtems/ftpd.h> +#include <rtems/media.h> +#include <rtems/shell.h> +#include <rtems/telnetd.h> +#include <rtems.h> +#include <rtems/printer.h> +#include <rtems/stackchk.h> +#include <rtems/bsd/bsd.h> +#include <rtems/bsd/modules.h> +#include <rtems/dhcpcd.h> +#include <rtems/console.h> +#include <rtems/shell.h> + +rtems_bsd_command_fio(int argc, char *argv[]); + +static rtems_status_code +media_listener(rtems_media_event event, rtems_media_state state, + const char *src, const char *dest, void *arg) +{ + + if (dest != NULL) { + printf(", dest = %s", dest); + } + + if (arg != NULL) { + printf(", arg = %p\n", arg); + } + + return RTEMS_SUCCESSFUL; +} + +rtems_shell_cmd_t rtems_shell_fio_Command = { + .name = "fio", + .usage = "fio testfile.fio", + .topic = "user", + .command = rtems_bsd_command_fio +}; + +int nice(int incr) +{ + /* FIXME */ + return 0; +} + +static void +early_initialization(void) +{ + rtems_status_code sc; + + sc = rtems_bdbuf_init(); + assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_media_initialize(); + assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_media_listener_add(media_listener, NULL); + assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_media_server_initialize( + 200, + 32 * 1024, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES + ); + assert(sc == RTEMS_SUCCESSFUL); +} + +void +Init(rtems_task_argument arg) +{ + rtems_status_code sc; + + puts("\n*** FIO - Flexible I/O tester ***\n\n"); + + early_initialization(); + rtems_bsd_initialize(); + + /* Let the callout timer allocate its resources */ + sc = rtems_task_wake_after(2); + assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_shell_init("SHLL", 16 * 1024, 1, CONSOLE_DEVICE_NAME, + false, true, NULL); + assert(sc == RTEMS_SUCCESSFUL); + + assert(0); +} + + +#define CONFIGURE_MICROSECONDS_PER_TICK 1000 + +#define CONFIGURE_MAXIMUM_DRIVERS 32 + +#define CONFIGURE_FILESYSTEM_DOSFS + +#define CONFIGURE_MAXIMUM_PROCESSORS 32 + +/* + * Configure LibBSD. + */ + +#define RTEMS_BSD_CONFIG_NET_PF_UNIX +#define RTEMS_BSD_CONFIG_NET_IP_MROUTE +#define RTEMS_BSD_CONFIG_NET_IP6_MROUTE +#define RTEMS_BSD_CONFIG_NET_IF_BRIDGE +#define RTEMS_BSD_CONFIG_NET_IF_LAGG +#define RTEMS_BSD_CONFIG_NET_IF_VLAN +#define RTEMS_BSD_CONFIG_BSP_CONFIG +#define RTEMS_BSD_CONFIG_INIT + +#include <machine/rtems-bsd-config.h> + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK + +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32 + +#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1 + +#define CONFIGURE_UNLIMITED_ALLOCATION_SIZE 32 +#define CONFIGURE_UNLIMITED_OBJECTS +#define CONFIGURE_UNIFIED_WORK_AREAS + +/* Turn cache off */ +#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE (4 * 1024) +#define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS 0 +#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE (1 * 1024 * 1024) + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT_TASK_STACK_SIZE (256 * 1024) +#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES +#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT + +#define CONFIGURE_INIT +#define CPU_STACK_MINIMUM_SIZE (256*1024) +#include <rtems/confdefs.h> + +#define CONFIGURE_SHELL_COMMANDS_INIT + +#include <bsp/irq-info.h> + +#define CONFIGURE_SHELL_USER_COMMANDS \ + &rtems_shell_fio_Command + +#define CONFIGURE_SHELL_COMMAND_CPUINFO +#define CONFIGURE_SHELL_COMMAND_PROFREPORT +#define CONFIGURE_SHELL_COMMAND_MKRFS + +#define CONFIGURE_SHELL_COMMAND_CP +#define CONFIGURE_SHELL_COMMAND_PWD +#define CONFIGURE_SHELL_COMMAND_LS +#define CONFIGURE_SHELL_COMMAND_LN +#define CONFIGURE_SHELL_COMMAND_LSOF +#define CONFIGURE_SHELL_COMMAND_CHDIR +#define CONFIGURE_SHELL_COMMAND_CD +#define CONFIGURE_SHELL_COMMAND_MKDIR +#define CONFIGURE_SHELL_COMMAND_RMDIR +#define CONFIGURE_SHELL_COMMAND_CAT +#define CONFIGURE_SHELL_COMMAND_MV +#define CONFIGURE_SHELL_COMMAND_RM +#define CONFIGURE_SHELL_COMMAND_MALLOC_INFO +#define CONFIGURE_SHELL_COMMAND_SHUTDOWN + +#define CONFIGURE_SHELL_COMMAND_FDISK +#define CONFIGURE_SHELL_COMMAND_BLKSTATS +#define CONFIGURE_SHELL_COMMAND_BLKSYNC +#define CONFIGURE_SHELL_COMMAND_MSDOSFMT +#define CONFIGURE_SHELL_COMMAND_DF +#define CONFIGURE_SHELL_COMMAND_MOUNT +#define CONFIGURE_SHELL_COMMAND_UNMOUNT +#define CONFIGURE_SHELL_COMMAND_MSDOSFMT +#define CONFIGURE_SHELL_COMMAND_EDIT +#define CONFIGURE_SHELL_COMMAND_GETENV +#define CONFIGURE_SHELL_COMMAND_SETENV +#define CONFIGURE_SHELL_COMMAND_UNSETENV +#include <rtems/shellconfig.h> diff --git a/oslib/inet_aton.c b/oslib/inet_aton.c index 7ae7db7..5bbc05b 100644 --- a/oslib/inet_aton.c +++ b/oslib/inet_aton.c @@ -1,6 +1,7 @@ #include "inet_aton.h" - +#ifndef __rtems__ int inet_aton(const char *cp, struct in_addr *inp) { return inet_pton(AF_INET, cp, inp); } +#endif diff --git a/profiles/act.c b/profiles/act.c index 5d3bd25..49a321f 100644 --- a/profiles/act.c +++ b/profiles/act.c @@ -461,7 +461,12 @@ static struct profile_ops act_profile = { .io_ops = &act_io_ops, }; -static void fio_init act_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +act_register(void) { act_run_data = calloc(1, sizeof(*act_run_data)); act_run_data->sem = fio_sem_init(FIO_SEM_UNLOCKED); @@ -470,7 +475,12 @@ static void fio_init act_register(void) log_err("fio: failed to register profile 'act'\n"); } -static void fio_exit act_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +act_unregister(void) { while (org_idx && org_idx < opt_idx) free((void *) act_opts[++org_idx]); diff --git a/profiles/tiobench.c b/profiles/tiobench.c index f19a085..e36be66 100644 --- a/profiles/tiobench.c +++ b/profiles/tiobench.c @@ -121,13 +121,23 @@ static struct profile_ops tiobench_profile = { .opt_data = &tiobench_options, }; -static void fio_init tiobench_register(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_init +#endif /* __rtems__ */ +tiobench_register(void) { if (register_profile(&tiobench_profile)) log_err("fio: failed to register profile 'tiobench'\n"); } -static void fio_exit tiobench_unregister(void) +#ifdef __rtems__ +void +#else /* __rtems__ */ +static void fio_exit +#endif /* __rtems__ */ +tiobench_unregister(void) { unregister_profile(&tiobench_profile); } diff --git a/smalloc.c b/smalloc.c index a2ad25a..f42677a 100644 --- a/smalloc.c +++ b/smalloc.c @@ -170,12 +170,17 @@ static bool add_pool(struct pool *pool, unsigned int alloc_size) pool->free_blocks = bitmap_blocks * SMALLOC_BPB; mmap_flags = OS_MAP_ANON; -#ifdef CONFIG_ESX +#if defined(CONFIG_ESX)||defined(__rtems__) mmap_flags |= MAP_PRIVATE; #else mmap_flags |= MAP_SHARED; #endif + +#ifdef __rtems__ + ptr = (void*)malloc(alloc_size); +#else ptr = mmap(NULL, alloc_size, PROT_READ|PROT_WRITE, mmap_flags, -1, 0); +#endif if (ptr == MAP_FAILED) goto out_fail; @@ -193,7 +198,11 @@ static bool add_pool(struct pool *pool, unsigned int alloc_size) out_fail: log_err("smalloc: failed adding pool\n"); if (pool->map) +#ifdef __rtems__ + free(pool->map); +#else /* __rtems__ */ munmap(pool->map, pool->mmap_size); +#endif /* __rtems__ */ return false; } diff --git a/stat.c b/stat.c index a308eb8..093f216 100644 --- a/stat.c +++ b/stat.c @@ -38,10 +38,16 @@ void update_rusage_stat(struct thread_data *td) &td->ru_end.ru_utime); ts->sys_time += mtime_since_tv(&td->ru_start.ru_stime, &td->ru_end.ru_stime); +#ifndef __rtems__ /* Virtual Memory not supported on RTEMS */ ts->ctx += td->ru_end.ru_nvcsw + td->ru_end.ru_nivcsw - (td->ru_start.ru_nvcsw + td->ru_start.ru_nivcsw); ts->minf += td->ru_end.ru_minflt - td->ru_start.ru_minflt; ts->majf += td->ru_end.ru_majflt - td->ru_start.ru_majflt; +#else /* __rtems__ */ + ts->ctx = ((uint64_t) -1); + ts->minf = ((uint64_t) -1); + ts->majf = ((uint64_t) -1); +#endif /* __rtems__ */ memcpy(&td->ru_start, &td->ru_end, sizeof(td->ru_end)); } diff --git a/t/arch.c b/t/arch.c index bd28a84..efee2db 100644 --- a/t/arch.c +++ b/t/arch.c @@ -1,5 +1,7 @@ #include "../arch/arch.h" unsigned long arch_flags = 0; +#ifndef __rtems__ bool tsc_reliable; +#endif /* __rtems__ */ int arch_random; -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html