#include "paging.h"

void paging_enable(){
    int *page_dir=(int*)PAGING_DIR_LOCATION;
    int *page_table=(int*)PAGING_TABLE_LOCATION;

    // Init page directory
    for(int i=0;i<1024;i++)
        page_dir[i]=0;
    page_dir[0]=(int)page_table;
    page_dir[0] |=7; // Permissions

    // Init page table 0
    int addr_offset=0;
    for(int i=0;i<1024;i++){
        page_table[i]=addr_offset;
        page_table[i]|=7; // Permission
        addr_offset+=4096; // 4Ko pages
    }

    // Turns on paging
    asm(
        "movl %0, %%eax       \n\t"
        "movl %%eax, %%cr3    \n\t" // Configure page table location
        "movl %%cr0, %%eax    \n\t"
        "orl %1, %%eax        \n\t"
        "movl %%eax, %%cr0    \n\t" // Turn on paging
        :: "i" (PAGING_DIR_LOCATION), "i" (PAGING_CR0_BIT)
    );

}