summaryrefslogtreecommitdiffstats
path: root/rtemsbsd
diff options
context:
space:
mode:
authorChristian Mauderer <Christian.Mauderer@embedded-brains.de>2016-07-15 11:39:48 +0200
committerChristian Mauderer <Christian.Mauderer@embedded-brains.de>2016-08-02 10:21:38 +0200
commit3d9134086847bc755fd9dcc7f6149f8871d6a6ed (patch)
treee7b1f68cfd9f6448511aedf3eac31b45b24f82ed /rtemsbsd
parenttestsuite/syscalls01: Split out program01 part. (diff)
downloadrtems-libbsd-3d9134086847bc755fd9dcc7f6149f8871d6a6ed.tar.bz2
rtemsbsd: Add call to program with a data restore
This adds the rtems_bsd_program_call_main_width_data_restore function.
Diffstat (limited to 'rtemsbsd')
-rw-r--r--rtemsbsd/include/machine/rtems-bsd-program.h5
-rw-r--r--rtemsbsd/rtems/rtems-kernel-program.c23
2 files changed, 28 insertions, 0 deletions
diff --git a/rtemsbsd/include/machine/rtems-bsd-program.h b/rtemsbsd/include/machine/rtems-bsd-program.h
index 82830f51..4605017f 100644
--- a/rtemsbsd/include/machine/rtems-bsd-program.h
+++ b/rtemsbsd/include/machine/rtems-bsd-program.h
@@ -53,6 +53,11 @@ int
rtems_bsd_program_call_main(const char *name, int (*main)(int, char **),
int argc, char **argv);
+int
+rtems_bsd_program_call_main_with_data_restore(const char *name,
+ int (*main)(int, char **), int argc, char **argv,
+ const void *data_buf, const size_t data_size);
+
void
rtems_bsd_program_exit(int exit_code) __dead2;
diff --git a/rtemsbsd/rtems/rtems-kernel-program.c b/rtemsbsd/rtems/rtems-kernel-program.c
index a71d5496..0355c585 100644
--- a/rtemsbsd/rtems/rtems-kernel-program.c
+++ b/rtemsbsd/rtems/rtems-kernel-program.c
@@ -200,6 +200,29 @@ rtems_bsd_program_call_main(const char *name, int (*main)(int, char **),
return exit_code;
}
+int
+rtems_bsd_program_call_main_with_data_restore(const char *name,
+ int (*main)(int, char **), int argc, char **argv,
+ const void *data_buf, const size_t data_size)
+{
+ int exit_code = EXIT_FAILURE;
+ void *savebuf;
+
+ savebuf = malloc(data_size, M_TEMP, 0);
+ if(savebuf == NULL) {
+ errno = ENOMEM;
+ exit_code = EXIT_FAILURE;
+ } else {
+ memcpy(savebuf, data_buf, data_size);
+ exit_code = rtems_bsd_program_call_main(name, main, argc,
+ argv);
+ memcpy(data_buf, savebuf, data_size);
+ free(savebuf, M_TEMP);
+ }
+
+ return exit_code;
+}
+
static struct mtx program_mtx;
MTX_SYSINIT(rtems_bsd_program, &program_mtx, "BSD program", MTX_DEF);