#include <inttypes.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char output_string[1024];
void reset_output(void);
static void output(const char *fmt, ...);
void** parent_regs;
void** child_regs;
void lucet_context_swap(void* from, void* to);
void lucet_context_set(void* to);
void arg_printing_child(void *arg0, void *arg1)
{
int arg0_val = *(int *) arg0;
int arg1_val = *(int *) arg1;
output("hello from the child! my args were %d and %d\n", arg0_val, arg1_val);
lucet_context_swap(*child_regs, *parent_regs);
arg0_val = *(int *) arg0;
arg1_val = *(int *) arg1;
output("now they are %d and %d\n", arg0_val, arg1_val);
lucet_context_swap(*child_regs, *parent_regs);
}
void context_set_child()
{
output("hello from the child! setting context to parent...\n");
lucet_context_set(*parent_regs);
}
void returning_child()
{
output("hello from the child! returning...\n");
}
void child_3_args(uint64_t arg1, uint64_t arg2, uint64_t arg3)
{
output("the good three args boy %" PRId64 " %" PRId64 " %" PRId64 "\n", arg1, arg2, arg3);
}
void child_4_args(uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4)
{
output("the large four args boy %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 "\n", arg1, arg2,
arg3, arg4);
}
void child_5_args(uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5)
{
output("the big five args son %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 "\n",
arg1, arg2, arg3, arg4, arg5);
}
void child_6_args(uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,
uint64_t arg6)
{
output("6 args, hahaha long boy %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64
" %" PRId64 "\n",
arg1, arg2, arg3, arg4, arg5, arg6);
}
void child_7_args(uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,
uint64_t arg6, uint64_t arg7)
{
output("7 args, hahaha long boy %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64
" %" PRId64 " %" PRId64 "\n",
arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
void child_8_args(uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,
uint64_t arg6, uint64_t arg7, uint64_t arg8)
{
output("8 args, hahaha long boy %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64
" %" PRId64 " %" PRId64 " %" PRId64 "\n",
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
}
void child_9_args(uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,
uint64_t arg6, uint64_t arg7, uint64_t arg8, uint64_t arg9)
{
output("9 args, hahaha long boy %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64
" %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 "\n",
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
}
void child_10_args(uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4, uint64_t arg5,
uint64_t arg6, uint64_t arg7, uint64_t arg8, uint64_t arg9, uint64_t arg10)
{
output("10 args, hahaha very long boy %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64
" %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 "\n",
arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
}
static char * output_cursor;
static size_t output_cursor_len;
void reset_output(void)
{
memset(output_string, 0, sizeof(output_string));
output_cursor = output_string;
output_cursor_len = sizeof(output_string);
}
static void output(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
int res = vsnprintf(output_cursor, output_cursor_len, fmt, args);
if (res > 0) {
output_cursor += res;
output_cursor_len -= res;
} else {
abort();
}
va_end(args);
}