#include <object.h>
#include <machine.h>
#include <arch/model/statedata.h>
#include <arch/kernel/vspace.h>
#include <arch/kernel/thread.h>
#include <arch/linker.h>
void
Arch_switchToThread(tcb_t* tcb)
{
setVMRoot(tcb);
#if CONFIG_MAX_NUM_NODES > 1
asm volatile("movq %[value], %%gs:%c[offset]"
:
: [value] "r" (&tcb->tcbArch.tcbContext.registers[Error + 1]),
[offset] "i" (OFFSETOF(nodeInfo_t, currentThreadUserContext)));
#endif
}
BOOT_CODE void
Arch_configureIdleThread(tcb_t* tcb)
{
setRegister(tcb, FLAGS, FLAGS_USER_DEFAULT);
setRegister(tcb, NextIP, (uint64_t)idleThreadStart);
setRegister(tcb, CS, SEL_CS_0);
setRegister(tcb, SS, SEL_DS_0);
}
void
Arch_switchToIdleThread(void)
{
tcb_t *tcb = NODE_STATE(ksIdleThread);
setVMRoot(tcb);
setRegister(tcb, RSP, (uint64_t)&MODE_NODE_STATE(x64KSIRQStack)[IRQ_STACK_SIZE]);
#if CONFIG_MAX_NUM_NODES > 1
asm volatile("movq %[value], %%gs:%c[offset]"
:
: [value] "r"(&tcb->tcbArch.tcbContext.registers[Error + 1]),
[offset] "i" (OFFSETOF(nodeInfo_t, currentThreadUserContext)));
#endif
}
void
Arch_activateIdleThread(tcb_t* tcb)
{
}