#include <rt/abort.h>
#include <rt/context.h>
#include <rt/cycle.h>
#include <rt/idle.h>
#include <rt/interrupt.h>
#include <rt/mpu.h>
#include <rt/syscall.h>
#include <rt/task.h>
#include <rt/tls.h>
#include <rt/trap.h>
#include <rt/arch/fp.h>
#include <rt/arch/profile.h>
#include <stddef.h>
#include <stdint.h>
#if RT_ARM_PROFILE_AR
#include "ar/ar.c"
#elif RT_ARM_PROFILE_M
#include "m/m.c"
#endif
void *rt_context_init(uintptr_t fn, uintptr_t arg, void *stack,
size_t stack_size)
{
void *const sp = (char *)stack + stack_size;
struct context *ctx = sp;
--ctx;
profile_context_init(ctx);
#if RT_ARM_V8M
ctx->psplim = (uint32_t)stack;
#endif
ctx->r0 = arg;
ctx->r1 = fn;
ctx->pc = (uint32_t)rt_task_entry & ~UINT32_C(1);
return ctx;
}
__attribute__((noreturn, weak)) void rt_idle(void)
{
rt_task_drop_privilege();
for (;;)
{
__asm__("wfi" :::);
}
}
__attribute__((noreturn, weak)) void rt_abort(void)
{
for (;;)
{
__asm__("udf" :::);
}
}
__attribute__((noreturn, weak)) void rt_trap(void)
{
for (;;)
{
__asm__("bkpt" :::);
}
}
#if RT_ARM_V6M
#include "m/atomic-v6.c"
#endif