#include <config.h>
#include <arch/machine/registerset.h>
void Arch_initContext(user_context_t* context)
{
Mode_initContext(context);
context->registers[TLS_BASE] = 0;
context->registers[Error] = 0;
context->registers[FaultIP] = 0;
context->registers[NextIP] = 0;
context->registers[CS] = SEL_CS_3;
context->registers[FLAGS] = FLAGS_USER_DEFAULT;
context->registers[SS] = SEL_DS_3;
Arch_initFpuContext(context);
#ifdef CONFIG_HARDWARE_DEBUG_API
Arch_initBreakpointContext(&context->breakpointState);
#endif
}
word_t sanitiseRegister(register_t reg, word_t v, tcb_t *thread)
{
v = Mode_sanitiseRegister(reg, v);
if (reg == FLAGS) {
v |= FLAGS_HIGH;
v &= ~FLAGS_LOW;
v |= FLAGS_IF;
v &= ~FLAGS_TF;
v &= FLAGS_MASK;
}
if (reg == TLS_BASE) {
if (v > PPTR_USER_TOP) {
v = PPTR_USER_TOP;
}
}
return v;
}