00001 /* 00002 * \brief Virtual page-table facility 00003 * \author Thomas Friebel <tf13@os.inf.tu-dresden.de> 00004 * \author Christian Helmuth <ch12@os.inf.tu-dresden.de> 00005 * \date 2006-11-03 00006 */ 00007 00008 #ifndef _ddekit_pgtab_h 00009 #define _ddekit_pgtab_h 00010 00011 #include <l4/dde/ddekit/types.h> 00012 00013 /* FIXME Region types may be defined by pgtab users. Do we really need them 00014 * here? */ 00015 enum ddekit_pgtab_type 00016 { 00017 PTE_TYPE_OTHER, PTE_TYPE_LARGE, PTE_TYPE_UMA, PTE_TYPE_CONTIG 00018 }; 00019 00020 00021 /** 00022 * Set virtual->physical mapping for VM region 00023 * 00024 * \param virt virtual start address for region 00025 * \param phys physical start address for region 00026 * \param pages number of pages in region 00027 * \param type pgtab type for region 00028 */ 00029 void ddekit_pgtab_set_region(void *virt, ddekit_addr_t phys, int pages, int type); 00030 00031 00032 /** 00033 * Set virtual->physical mapping for VM region given a specific size in bytes. 00034 * 00035 * Internally, DDEKit manages regions with pages. However, DDEs do not need to tangle 00036 * with the underlying mechanism and therefore can use this function that takes care 00037 * of translating a size to an amount of pages. 00038 */ 00039 void ddekit_pgtab_set_region_with_size(void *virt, ddekit_addr_t phys, int size, int type); 00040 00041 00042 /** 00043 * Clear virtual->physical mapping for VM region 00044 * 00045 * \param virt virtual start address for region 00046 * \param type pgtab type for region 00047 */ 00048 void ddekit_pgtab_clear_region(void *virt, int type); 00049 00050 /** 00051 * Get physical address for virtual address 00052 * 00053 * \param virt virtual address 00054 * 00055 * \return physical address 00056 */ 00057 ddekit_addr_t ddekit_pgtab_get_physaddr(const void *virt); 00058 00059 /** 00060 * Get virtual address for physical address 00061 * 00062 * \param physical physical address 00063 * 00064 * \return virtual address 00065 */ 00066 ddekit_addr_t ddekit_pgtab_get_virtaddr(const ddekit_addr_t physical); 00067 00068 /** 00069 * Get type of VM region. 00070 * 00071 * \param virt virtual address 00072 00073 * \return VM region type 00074 */ 00075 int ddekit_pgtab_get_type(const void *virt); 00076 00077 /** 00078 * Get size of VM region. 00079 * 00080 * \param virt virtual address 00081 * 00082 * \return VM region size (in bytes) 00083 */ 00084 int ddekit_pgtab_get_size(const void *virt); 00085 00086 #endif
1.5.6