summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/tasking/tcb.c
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));
}