#include <kern/thread.h>
#include <kern/mem.h>
#include <kern/pagetable.h>
+#include <kern/process.h>
namespace Arch {
- void set_aspace(Mem::AddrSpace *aspace)
+ void set_aspace(Mem::ProcAddrSpace *aspace)
{
u32 cr3 = Mem::kvirt_to_phys(aspace->page_table->toplevel);
asm volatile("movl %0, %%cr3" : : "r" (cr3) : "memory");
{
u32 dummy1, dummy2;
- if (dest->addr_space) {
- assert(dest->addr_space == dest->active_addr_space);
+ if (dest->aspace) {
+ assert(dest->aspace == dest->active_aspace);
- if (dest->addr_space != src->active_addr_space)
- set_aspace(dest->addr_space);
+ if (dest->aspace != src->active_aspace)
+ set_aspace(dest->aspace);
} else {
- dest->active_addr_space = src->active_addr_space;
+ dest->active_aspace = src->active_aspace;
}
Priv::tss.esp0 = reinterpret_cast<u32>(dest);
"0" (&src->arch.esp), "1" (&dest->arch.esp) :
"ebx", "edx", "esi", "edi", "memory");
}
+
+ void ArchThread::init(void *entry, void *arg1, void *arg2)
+ {
+ void **stack = reinterpret_cast<void **>(this);
+
+ *--stack = arg2;
+ *--stack = arg1;
+ *--stack = entry;
+
+ esp = stack;
+ ebp = 0;
+ jump_to_init = 1;
+ }
}