Viewing: vdso.c
📄 vdso.c (Read Only) ⬅ To go back
#include "vdso.h"
#include "arch/x86/kernel_va_map.h"
#include "pmm.h"
#include "vmm.h"
#include "utils.h"
#include "console.h"

static uintptr_t vdso_phys = 0;
static volatile struct vdso_data* vdso_kptr = 0;

void vdso_init(void) {
    void* page = pmm_alloc_page();
    if (!page) {
        kprintf("[VDSO] OOM\n");
        return;
    }
    vdso_phys = (uintptr_t)page;

    /* Map into kernel space at a fixed VA so we can write to it. */
    uintptr_t kva = KVA_VDSO;
    vmm_map_page((uint64_t)vdso_phys, (uint64_t)kva,
                 VMM_FLAG_PRESENT | VMM_FLAG_RW);

    vdso_kptr = (volatile struct vdso_data*)kva;
    memset((void*)vdso_kptr, 0, PAGE_SIZE);
    vdso_kptr->tick_hz = 50;

    kprintf("[VDSO] Initialized at phys=0x%x\n", (unsigned)vdso_phys);
}

void vdso_update_tick(uint32_t tick) {
    if (vdso_kptr) {
        vdso_kptr->tick_count = tick;
    }
}

uintptr_t vdso_get_phys(void) {
    return vdso_phys;
}