1 #ifndef _ARCH_PAGETABLE_H
2 #define _ARCH_PAGETABLE_H
4 #include <lowlevel/misc.h>
5 #include <lowlevel/atomic.h>
29 PTE(Word init) : raw(init)
42 static Word addr_to_offset(Word addr, int shift)
44 int pages_per_table = page_size / sizeof(Word);
45 return (addr >> shift) & (pages_per_table - 1);
50 return raw & 0x000ffffffffff000;
53 static PTE addr_to_pte(Word phys)
55 return phys & 0x000ffffffffff000;
58 static void flags_to_pte(Mem::PTEFlags flagsin,
68 flagsout.Valid = flagsin.Valid;
71 if (maskin.Writeable) {
72 maskout.Writeable = 0;
73 flagsout.Writeable = flagsin.Writeable;
76 // FIXME: check for and enable NX support
77 if (0 && maskin.Executable) {
79 flagsout.NoExec = !flagsin.Executable;
84 flagsout.User = flagsin.User;
88 Mem::PTEFlags pte_to_flags()
90 Mem::PTEFlags ret = 0;
97 ret.Writeable = Writeable;
98 ret.Executable = !NoExec;
104 void set_pte(PTE *table, uint offset)
109 PTE xchg_pte(PTE *table, uint offset)
111 return ll_xchg_long(reinterpret_cast<Word *>(&table[offset]), raw);
124 static void invalidate_tlb_entry(Word addr)
126 ll_invalidate_tlb_entry(addr);
130 page_size = Arch::page_size,
131 page_shift = Arch::page_shift,
133 pages_per_table = page_size / sizeof(Word),
137 // All "upper" addresses belong to the kernel.