This example shows how system call tracing can be done.
#if defined(ARCH_x86) || defined(ARCH_amd64)
#endif
#include <l4/sys/ipc.h>
#include <l4/sys/thread.h>
#include <l4/sys/utcb.h>
#include <l4/util/util.h>
#include <stdlib.h>
#include <stdio.h>
#if defined(ARCH_x86) || defined(ARCH_amd64)
static int
{
#if defined(ARCH_x86)
#else
#endif
}
static inline void
{
printf("PC=%08lx SP=%08lx Err=%08lx Trap=%lx, %s syscall, SC-Nr: %lx\n",
exc->
trapno, is_alien_after_call(exc) ?
" after" :
"before",
}
#elif defined(ARCH_arm)
static int
{
return exc->
err & 0x40; }
static inline void
{
printf("PC=%08lx SP=%08lx ULR=%08lx CPSR=%08lx Err=%lx/%lx, %s syscall\n",
is_alien_after_call(exc) ? " after" : "before");
}
#elif defined(ARCH_arm64)
static int
{
return exc->
err & (1ul << 16); }
static inline void
{
printf("PC=%08lx SP=%08lx PSTATE=%08lx Err=%lx/%lx, %s syscall\n",
is_alien_after_call(exc) ? " after" : "before");
}
#elif defined(ARCH_mips)
static int
{ return 0; }
static inline void
{
printf("PC=%08lx SP=%08lx Cause=%lx, %s syscall\n",
is_alien_after_call(exc) ? " after" : "before");
}
#else
static int
static inline void
{
printf("PC=%08lx SP=%08lx, %s syscall\n",
is_alien_after_call(exc) ? " after" : "before");
}
#endif
#ifdef MEASURE
#include <l4/util/rdtsc.h>
static inline void
calibrate_timer(void)
{
}
static inline void
{
}
static inline void
alien_sleep(void)
{
}
static inline void
{
if (0)
_print_exc_state(exc);
}
#else
static inline void
calibrate_timer(void)
{
}
static inline void
{
(void)start;
}
{
return 0;
}
static inline void
alien_sleep(void)
{
}
static inline void
{
_print_exc_state(exc);
}
#endif
static char alien_thread_stack[8 << 10];
static void alien_thread(void)
{
while (1)
{
alien_sleep();
}
}
int main(void)
{
printf("Alien feature testing\n");
return 1;
l4_touch_rw(alien_thread_stack,
sizeof(alien_thread_stack));
return 2;
return 3;
return 4;
(
l4_umword_t)alien_thread_stack +
sizeof(alien_thread_stack),
0);
return 5;
return 6;
calibrate_timer();
{
printf("l4_ipc_receive failed");
return 7;
}
for (;;)
{
{
print_exc_state(&exc);
}
else
printf("Umm, non-handled request (like PF): %lx %lx\n", mr0, mr1);
{
printf("l4_ipc_call failed\n");
return 8;
}
print_timediff(s);
}
return 0;
}