/*--- tlb.h --- characteristic of the tlb ---*/ #include "mem.h" #ifndef __TLB_H__ #define __TLB_H__ /*---- Stuff for grabbing pages and offsets off of addresses */ #define PHYS_MEM_SIZE (2*1024*1024) #define PAGESIZE 4096 #define PAGEMASK (~(PAGESIZE - 1)) #define PAGEOFFSETMASK (PAGESIZE-1) #define PAGESHIFT 12 /* some utility routines */ #define GET_PAGE(addr) (addr >> PAGESHIFT) #define GET_OFFSET(addr) (addr & PAGEOFFSETMASK) /*---- TLB routines and values */ /* invalid page */ #define INVALID 0xffffffff /* tlb flags */ #define TLB_WRITE_PROTECT 1 /* * Here's the format for the expected return value from a TLB fault * bits 0..19 - physical page # * bits 20..31 - flags * * We'll call this type a PTE (page table entry). * This is just an unsigned but it's * easier to figure out what's going on this way */ typedef unsigned PTE; #define TLB_PAGEMASK (0xfffff) #define FLAGSHIFT 20 /* put together the flags and the page number to form a PTE */ #define TLB_MAKE_PTE(ppage,flags) ((flags << FLAGSHIFT) | ppage ) /* get the physical page number from the PTE */ #define TLB_GETPAGE(retval) ( retval & TLB_PAGEMASK ) /* get the flags out of the PTE */ #define TLB_GETFLAGS(retval) ( retval >> FLAGSHIFT) void tlb_flush(); /* flush the tlb */ void tlb_invalidate(unsigned long vpage); /* invalidate all entries mapping this vpage */ mem_addr tlb_translate(unsigned long vaddr, c_rw rw); /* translate vaddr to paddr */ void set_tlb_ppage(unsigned long vpage, PTE ptentry); void set_tlb_flags(unsigned long vpage, unsigned flags); #endif __TLB_H__