nuclear@17: .text nuclear@17: /* enable_paging(void) nuclear@26: * sets bit 31 of cr0 which enables page translation */ nuclear@17: .globl enable_paging nuclear@17: enable_paging: nuclear@17: movl %cr0, %eax nuclear@17: orl $0x80000000, %eax nuclear@17: movl %eax, %cr0 nuclear@17: ret nuclear@17: nuclear@23: /* disable_paging(void) nuclear@26: * clears bit 31 of cr0 which disables page translation */ nuclear@23: .globl disable_paging nuclear@23: disable_paging: nuclear@23: movl %cr0, %eax nuclear@23: andl $0x7fffffff, %eax nuclear@23: movl %eax, %cr0 nuclear@23: ret nuclear@23: nuclear@26: /* get_paging_status(void) nuclear@26: * returns 0 if paging is disabled or 1 if it's enabled */ nuclear@23: .globl get_paging_status nuclear@23: get_paging_status: nuclear@23: movl %cr0, %eax nuclear@23: shr $31, %eax nuclear@23: ret nuclear@23: nuclear@17: /* set_pgdir_addr(uint32_t addr) nuclear@17: * sets the address of the page directory by writing to cr3, which nuclear@17: * also results in a TLB flush. */ nuclear@17: .globl set_pgdir_addr nuclear@17: set_pgdir_addr: nuclear@17: movl 4(%esp), %eax nuclear@17: movl %eax, %cr3 nuclear@17: ret nuclear@17: nuclear@55: /* get_pgdir_addr(void) nuclear@55: * returns the physical address of the page table directory (cr3) */ nuclear@55: .globl get_pgdir_addr nuclear@55: get_pgdir_addr: nuclear@55: movl %cr3, %eax nuclear@55: ret nuclear@55: nuclear@23: /* flush_tlb(void) nuclear@23: * invalidates the whole TLB. entries for pages marked as global nuclear@23: * are unaffected */ nuclear@23: .globl flush_tlb nuclear@23: flush_tlb: nuclear@23: movl %cr3, %eax nuclear@23: movl %eax, %cr3 nuclear@23: ret nuclear@23: nuclear@23: /* flush_tlb_addr(uint32_t addr) nuclear@23: * flushes the TLB entry for the page containing a particular nuclear@23: * virtual address */ nuclear@23: .globl flush_tlb_addr nuclear@23: flush_tlb_addr: nuclear@23: movl 4(%esp), %eax nuclear@23: invlpg (%eax) nuclear@23: ret nuclear@23: nuclear@17: /* get_fault_addr(void) nuclear@17: * returns the contents of control register 2, which provides nuclear@17: * the faulting address during a page fault exception nuclear@17: */ nuclear@17: .globl get_fault_addr nuclear@17: get_fault_addr: nuclear@17: movl %cr2, %eax nuclear@17: ret