Changeset b3f8fb7 in mainline for kernel/generic/include/mm
- Timestamp:
- 2007-01-28T13:25:49Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8e8c1a5
- Parents:
- 1ba41c5
- Location:
- kernel/generic/include/mm
- Files:
-
- 1 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/mm/as.h
r1ba41c5 rb3f8fb7 48 48 #include <arch/mm/asid.h> 49 49 #include <arch/types.h> 50 #include <typedefs.h>51 50 #include <synch/spinlock.h> 52 51 #include <synch/mutex.h> … … 67 66 #define FLAG_AS_KERNEL (1 << 0) /**< Kernel address space. */ 68 67 69 /** Address space structure. 70 * 71 * as_t contains the list of as_areas of userspace accessible 72 * pages for one or more tasks. Ranges of kernel memory pages are not 73 * supposed to figure in the list as they are shared by all tasks and 74 * set up during system initialization. 75 */ 76 struct as { 77 /** Protected by asidlock. */ 78 link_t inactive_as_with_asid_link; 79 80 mutex_t lock; 81 82 /** Number of references (i.e tasks that reference this as). */ 83 count_t refcount; 84 85 /** Number of processors on wich is this address space active. */ 86 count_t cpu_refcount; 87 88 /** B+tree of address space areas. */ 89 btree_t as_area_btree; 90 91 /** Page table pointer. Constant on architectures that use global page hash table. */ 92 pte_t *page_table; 93 94 /** Address space identifier. Constant on architectures that do not support ASIDs.*/ 95 asid_t asid; 96 97 /** Architecture specific content. */ 98 as_arch_t arch; 99 }; 100 101 struct as_operations { 68 /** Address space area attributes. */ 69 #define AS_AREA_ATTR_NONE 0 70 #define AS_AREA_ATTR_PARTIAL 1 /**< Not fully initialized area. */ 71 72 #define AS_PF_FAULT 0 /**< The page fault was not resolved by as_page_fault(). */ 73 #define AS_PF_OK 1 /**< The page fault was resolved by as_page_fault(). */ 74 #define AS_PF_DEFER 2 /**< The page fault was caused by memcpy_from_uspace() or memcpy_to_uspace(). */ 75 76 typedef struct { 102 77 pte_t *(* page_table_create)(int flags); 103 78 void (* page_table_destroy)(pte_t *page_table); 104 79 void (* page_table_lock)(as_t *as, bool lock); 105 80 void (* page_table_unlock)(as_t *as, bool unlock); 106 }; 107 typedef struct as_operations as_operations_t; 108 109 /** Address space area attributes. */ 110 #define AS_AREA_ATTR_NONE 0 111 #define AS_AREA_ATTR_PARTIAL 1 /**< Not fully initialized area. */ 112 113 #define AS_PF_FAULT 0 /**< The page fault was not resolved by as_page_fault(). */ 114 #define AS_PF_OK 1 /**< The page fault was resolved by as_page_fault(). */ 115 #define AS_PF_DEFER 2 /**< The page fault was caused by memcpy_from_uspace() 116 or memcpy_to_uspace(). */ 81 } as_operations_t; 117 82 118 83 /** This structure contains information associated with the shared address space area. */ … … 123 88 } share_info_t; 124 89 125 /** Address space area backend structure. */ 126 typedef struct { 127 int (* page_fault)(as_area_t *area, uintptr_t addr, pf_access_t access); 128 void (* frame_free)(as_area_t *area, uintptr_t page, uintptr_t frame); 129 void (* share)(as_area_t *area); 130 } mem_backend_t; 90 /** Page fault access type. */ 91 typedef enum { 92 PF_ACCESS_READ, 93 PF_ACCESS_WRITE, 94 PF_ACCESS_EXEC 95 } pf_access_t; 96 97 struct mem_backend; 131 98 132 99 /** Backend data stored in address space area. */ 133 typedef union {100 typedef union mem_backend_data { 134 101 struct { /**< elf_backend members */ 135 102 elf_header_t *elf; … … 147 114 * In the future, it should not be difficult to support shared areas. 148 115 */ 149 struct as_area{116 typedef struct { 150 117 mutex_t lock; 151 118 as_t *as; /**< Containing address space. */ … … 157 124 share_info_t *sh_info; /**< If the address space area has been shared, this pointer will 158 125 reference the share info structure. */ 159 mem_backend_t*backend; /**< Memory backend backing this address space area. */126 struct mem_backend *backend; /**< Memory backend backing this address space area. */ 160 127 161 128 /** Data to be used by the backend. */ 162 129 mem_backend_data_t backend_data; 163 }; 130 } as_area_t; 131 132 /** Address space area backend structure. */ 133 typedef struct mem_backend { 134 int (* page_fault)(as_area_t *area, uintptr_t addr, pf_access_t access); 135 void (* frame_free)(as_area_t *area, uintptr_t page, uintptr_t frame); 136 void (* share)(as_area_t *area); 137 } mem_backend_t; 164 138 165 139 extern as_t *AS_KERNEL; … … 207 181 #endif /* !def as_deinstall_arch */ 208 182 209 /* Backend declarations . */183 /* Backend declarations and functions. */ 210 184 extern mem_backend_t anon_backend; 211 185 extern mem_backend_t elf_backend; 212 186 extern mem_backend_t phys_backend; 187 188 extern int elf_load(elf_header_t *header, as_t *as); 213 189 214 190 /* Address space area related syscalls. */ -
kernel/generic/include/mm/asid.h
r1ba41c5 rb3f8fb7 45 45 #include <arch/mm/asid.h> 46 46 #include <synch/spinlock.h> 47 #include <typedefs.h> 47 #include <adt/list.h> 48 #include <mm/as.h> 48 49 49 50 #endif -
kernel/generic/include/mm/buddy.h
r1ba41c5 rb3f8fb7 37 37 38 38 #include <arch/types.h> 39 #include < typedefs.h>39 #include <adt/list.h> 40 40 41 41 #define BUDDY_SYSTEM_INNER_BLOCK 0xff -
kernel/generic/include/mm/frame.h
r1ba41c5 rb3f8fb7 38 38 39 39 #include <arch/types.h> 40 #include <typedefs.h>41 40 #include <adt/list.h> 42 41 #include <synch/spinlock.h> -
kernel/generic/include/mm/page.h
r1ba41c5 rb3f8fb7 36 36 #define KERN_PAGE_H_ 37 37 38 #include <arch/mm/asid.h>39 38 #include <arch/types.h> 40 #include < typedefs.h>39 #include <mm/as.h> 41 40 #include <memstr.h> 42 43 #define PAGE_CACHEABLE_SHIFT 044 #define PAGE_NOT_CACHEABLE_SHIFT PAGE_CACHEABLE_SHIFT45 #define PAGE_PRESENT_SHIFT 146 #define PAGE_NOT_PRESENT_SHIFT PAGE_PRESENT_SHIFT47 #define PAGE_USER_SHIFT 248 #define PAGE_KERNEL_SHIFT PAGE_USER_SHIFT49 #define PAGE_READ_SHIFT 350 #define PAGE_WRITE_SHIFT 451 #define PAGE_EXEC_SHIFT 552 #define PAGE_GLOBAL_SHIFT 653 54 #define PAGE_NOT_CACHEABLE (0<<PAGE_CACHEABLE_SHIFT)55 #define PAGE_CACHEABLE (1<<PAGE_CACHEABLE_SHIFT)56 57 #define PAGE_PRESENT (0<<PAGE_PRESENT_SHIFT)58 #define PAGE_NOT_PRESENT (1<<PAGE_PRESENT_SHIFT)59 60 #define PAGE_USER (1<<PAGE_USER_SHIFT)61 #define PAGE_KERNEL (0<<PAGE_USER_SHIFT)62 63 #define PAGE_READ (1<<PAGE_READ_SHIFT)64 #define PAGE_WRITE (1<<PAGE_WRITE_SHIFT)65 #define PAGE_EXEC (1<<PAGE_EXEC_SHIFT)66 67 #define PAGE_GLOBAL (1<<PAGE_GLOBAL_SHIFT)68 69 41 70 42 /** … … 73 45 #define PAGE_COLOR(va) (((va) >> PAGE_WIDTH) & ((1 << PAGE_COLOR_BITS) - 1)) 74 46 75 /** Page fault access type. */76 enum pf_access {77 PF_ACCESS_READ,78 PF_ACCESS_WRITE,79 PF_ACCESS_EXEC80 };81 typedef enum pf_access pf_access_t;82 83 47 /** Operations to manipulate page mappings. */ 84 struct page_mapping_operations{85 void (* mapping_insert)(as_t *as, uintptr_t page, uintptr_t frame, int86 flags);48 typedef struct { 49 void (* mapping_insert)(as_t *as, uintptr_t page, uintptr_t frame, 50 int flags); 87 51 void (* mapping_remove)(as_t *as, uintptr_t page); 88 52 pte_t *(* mapping_find)(as_t *as, uintptr_t page); 89 }; 90 typedef struct page_mapping_operations page_mapping_operations_t; 53 } page_mapping_operations_t; 91 54 92 55 extern page_mapping_operations_t *page_mapping_operations; … … 95 58 extern void page_table_lock(as_t *as, bool lock); 96 59 extern void page_table_unlock(as_t *as, bool unlock); 97 extern void page_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int98 flags);60 extern void page_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, 61 int flags); 99 62 extern void page_mapping_remove(as_t *as, uintptr_t page); 100 63 extern pte_t *page_mapping_find(as_t *as, uintptr_t page); -
kernel/generic/include/mm/tlb.h
r1ba41c5 rb3f8fb7 38 38 #include <arch/mm/asid.h> 39 39 #include <arch/types.h> 40 #include <typedefs.h>41 40 42 41 /** … … 47 46 48 47 /** Type of TLB shootdown message. */ 49 enum tlb_invalidate_type{48 typedef enum { 50 49 TLB_INVL_INVALID = 0, /**< Invalid type. */ 51 50 TLB_INVL_ALL, /**< Invalidate all entries in TLB. */ 52 51 TLB_INVL_ASID, /**< Invalidate all entries belonging to one address space. */ 53 52 TLB_INVL_PAGES /**< Invalidate specified page range belonging to one address space. */ 54 }; 55 typedef enum tlb_invalidate_type tlb_invalidate_type_t; 53 } tlb_invalidate_type_t; 56 54 57 55 /** TLB shootdown message. */ 58 struct tlb_shootdown_msg{56 typedef struct { 59 57 tlb_invalidate_type_t type; /**< Message type. */ 60 58 asid_t asid; /**< Address space identifier. */ 61 59 uintptr_t page; /**< Page address. */ 62 60 count_t count; /**< Number of pages to invalidate. */ 63 }; 64 typedef struct tlb_shootdown_msg tlb_shootdown_msg_t; 61 } tlb_shootdown_msg_t; 65 62 66 63 extern void tlb_init(void);
Note:
See TracChangeset
for help on using the changeset viewer.