blob: 9877455deddfd85b07a4e79b240167a6a8f608e8 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include "arch/x86_64/tcb.h"
#include "arch/x86_64/processor.h"
#include "arch/x86_64/page.h"
#include "device/processor.h"
#include "object.h"
#include "init.h"
#include "string.h"
#define INIT_TCB_BYTES (0x1000 + KERNEL_STACK_MINSIZE)
uint8_t _init_tcb_bytes[INIT_TCB_BYTES];
tcb_t *_init_tcb = (tcb_t*)&_init_tcb_bytes;
void
tcb_init(void *task_main)
{
memset(_init_tcb, 0, INIT_TCB_BYTES);
_init_tcb->size = INIT_TCB_BYTES;
size_t kstack_bytes = (size_t)(INIT_TCB_BYTES - sizeof(tcb_t));
_init_tcb->ksp = (uintptr_t)_init_tcb->kstack + kstack_bytes - sizeof(intmax_t);
_init_tcb->pml4 = ko_entry_data(&_initDirectory.entries[INIT_OBJECT_PAGEMAP]);
_initDirectory.entries[INIT_OBJECT_TCB] = (objdir_entry_t) {
.type = KO_TCB,
.data = vptr_tophys_koff((uintptr_t)_init_tcb)
};
((processor_t*)processor_current())->tcb = _init_tcb;
__asm__ volatile("\
movq %0, %%rsp; \
movq $0, %%rbp; \
jmpq %1"::
"r"(_init_tcb->ksp), "r"(task_main));
}
|