Changeset 80bcaed in mainline for kernel/generic/include/mm
- Timestamp:
- 2007-02-03T13:22:24Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f619ec11
- Parents:
- fa8e7d2
- Location:
- kernel/generic/include/mm
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/mm/as.h
rfa8e7d2 r80bcaed 54 54 #include <lib/elf.h> 55 55 56 /** Defined to be true if user address space and kernel address space shadow each other. */ 56 /** 57 * Defined to be true if user address space and kernel address space shadow each 58 * other. 59 */ 57 60 #define KERNEL_ADDRESS_SPACE_SHADOWED KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 58 61 … … 62 65 #define USER_ADDRESS_SPACE_END USER_ADDRESS_SPACE_END_ARCH 63 66 64 #define USTACK_ADDRESS USTACK_ADDRESS_ARCH 65 66 #define FLAG_AS_KERNEL (1 << 0) /**< Kernel address space. */ 67 68 /** Address space area attributes. */ 67 #define USTACK_ADDRESS USTACK_ADDRESS_ARCH 68 69 /** Kernel address space. */ 70 #define FLAG_AS_KERNEL (1 << 0) 71 72 /* Address space area attributes. */ 69 73 #define AS_AREA_ATTR_NONE 0 70 74 #define AS_AREA_ATTR_PARTIAL 1 /**< Not fully initialized area. */ 71 75 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(). */ 76 /** The page fault was not resolved by as_page_fault(). */ 77 #define AS_PF_FAULT 0 78 /** The page fault was resolved by as_page_fault(). */ 79 #define AS_PF_OK 1 80 /** The page fault was caused by memcpy_from_uspace() or memcpy_to_uspace(). */ 81 #define AS_PF_DEFER 2 82 83 /** Address space structure. 84 * 85 * as_t contains the list of as_areas of userspace accessible 86 * pages for one or more tasks. Ranges of kernel memory pages are not 87 * supposed to figure in the list as they are shared by all tasks and 88 * set up during system initialization. 89 */ 90 typedef struct as { 91 /** Protected by asidlock. */ 92 link_t inactive_as_with_asid_link; 93 94 mutex_t lock; 95 96 /** Number of references (i.e tasks that reference this as). */ 97 count_t refcount; 98 99 /** Number of processors on wich is this address space active. */ 100 count_t cpu_refcount; 101 102 /** B+tree of address space areas. */ 103 btree_t as_area_btree; 104 105 /** 106 * Address space identifier. 107 * Constant on architectures that do not support ASIDs. 108 */ 109 asid_t asid; 110 111 /** Non-generic content. */ 112 as_genarch_t genarch; 113 114 /** Architecture specific content. */ 115 as_arch_t arch; 116 } as_t; 75 117 76 118 typedef struct { … … 81 123 } as_operations_t; 82 124 83 /** This structure contains information associated with the shared address space area. */ 125 /** 126 * This structure contains information associated with the shared address space 127 * area. 128 */ 84 129 typedef struct { 85 mutex_t lock; /**< This lock must be acquired only when the as_area lock is held. */ 86 count_t refcount; /**< This structure can be deallocated if refcount drops to 0. */ 87 btree_t pagemap; /**< B+tree containing complete map of anonymous pages of the shared area. */ 130 /** This lock must be acquired only when the as_area lock is held. */ 131 mutex_t lock; 132 /** This structure can be deallocated if refcount drops to 0. */ 133 count_t refcount; 134 /** 135 * B+tree containing complete map of anonymous pages of the shared area. 136 */ 137 btree_t pagemap; 88 138 } share_info_t; 89 139 … … 116 166 typedef struct { 117 167 mutex_t lock; 118 as_t *as; /**< Containing address space. */ 119 int flags; /**< Flags related to the memory represented by the address space area. */ 120 int attributes; /**< Attributes related to the address space area itself. */ 121 count_t pages; /**< Size of this area in multiples of PAGE_SIZE. */ 122 uintptr_t base; /**< Base address of this area. */ 123 btree_t used_space; /**< Map of used space. */ 124 share_info_t *sh_info; /**< If the address space area has been shared, this pointer will 125 reference the share info structure. */ 126 struct mem_backend *backend; /**< Memory backend backing this address space area. */ 168 /** Containing address space. */ 169 as_t *as; 170 /** Flags related to the memory represented by the address space area. */ 171 int flags; 172 /** Attributes related to the address space area itself. */ 173 int attributes; 174 /** Size of this area in multiples of PAGE_SIZE. */ 175 count_t pages; 176 /** Base address of this area. */ 177 uintptr_t base; 178 /** Map of used space. */ 179 btree_t used_space; 180 181 /** 182 * If the address space area has been shared, this pointer will reference 183 * the share info structure. 184 */ 185 share_info_t *sh_info; 186 187 /** Memory backend backing this address space area. */ 188 struct mem_backend *backend; 127 189 128 190 /** Data to be used by the backend. */ … … 147 209 extern as_t *as_create(int flags); 148 210 extern void as_destroy(as_t *as); 149 extern void as_switch(as_t *old , as_t *replace);211 extern void as_switch(as_t *old_as, as_t *new_as); 150 212 extern int as_page_fault(uintptr_t page, pf_access_t access, istate_t *istate); 151 213 152 extern as_area_t *as_area_create(as_t *as, int flags, size_t size, uintptr_t base, int attrs, 153 mem_backend_t *backend, mem_backend_data_t *backend_data); 214 extern as_area_t *as_area_create(as_t *as, int flags, size_t size, 215 uintptr_t base, int attrs, mem_backend_t *backend, 216 mem_backend_data_t *backend_data); 154 217 extern int as_area_destroy(as_t *as, uintptr_t address); 155 218 extern int as_area_resize(as_t *as, uintptr_t address, size_t size, int flags); 156 219 int as_area_share(as_t *src_as, uintptr_t src_base, size_t acc_size, 157 220 as_t *dst_as, uintptr_t dst_base, int dst_flags_mask); 158 221 159 222 extern int as_area_get_flags(as_area_t *area); -
kernel/generic/include/mm/buddy.h
rfa8e7d2 r80bcaed 45 45 /** Buddy system operations to be implemented by each implementation. */ 46 46 typedef struct { 47 /** Return pointer to left-side or right-side buddy for block passed as 48 * argument. */ 47 /** 48 * Return pointer to left-side or right-side buddy for block passed as 49 * argument. 50 */ 49 51 link_t *(* find_buddy)(struct buddy_system *, link_t *); 50 /** Bisect the block passed as argument and return pointer to the new 51 * right-side buddy. */ 52 /** 53 * Bisect the block passed as argument and return pointer to the new 54 * right-side buddy. 55 */ 52 56 link_t *(* bisect)(struct buddy_system *, link_t *); 53 57 /** Coalesce two buddies into a bigger block. */ … … 76 80 77 81 extern void buddy_system_create(buddy_system_t *b, uint8_t max_order, 78 82 buddy_system_operations_t *op, void *data); 79 83 extern link_t *buddy_system_alloc(buddy_system_t *b, uint8_t i); 80 84 extern bool buddy_system_can_alloc(buddy_system_t *b, uint8_t order); -
kernel/generic/include/mm/mm.h
rfa8e7d2 r80bcaed 47 47 #define PAGE_GLOBAL_SHIFT 6 48 48 49 #define PAGE_NOT_CACHEABLE (0 << PAGE_CACHEABLE_SHIFT)50 #define PAGE_CACHEABLE (1 << PAGE_CACHEABLE_SHIFT)49 #define PAGE_NOT_CACHEABLE (0 << PAGE_CACHEABLE_SHIFT) 50 #define PAGE_CACHEABLE (1 << PAGE_CACHEABLE_SHIFT) 51 51 52 #define PAGE_PRESENT (0 << PAGE_PRESENT_SHIFT)53 #define PAGE_NOT_PRESENT (1 << PAGE_PRESENT_SHIFT)52 #define PAGE_PRESENT (0 << PAGE_PRESENT_SHIFT) 53 #define PAGE_NOT_PRESENT (1 << PAGE_PRESENT_SHIFT) 54 54 55 #define PAGE_USER (1 << PAGE_USER_SHIFT)56 #define PAGE_KERNEL (0 << PAGE_USER_SHIFT)55 #define PAGE_USER (1 << PAGE_USER_SHIFT) 56 #define PAGE_KERNEL (0 << PAGE_USER_SHIFT) 57 57 58 #define PAGE_READ (1 << PAGE_READ_SHIFT)59 #define PAGE_WRITE (1 << PAGE_WRITE_SHIFT)60 #define PAGE_EXEC (1 << PAGE_EXEC_SHIFT)58 #define PAGE_READ (1 << PAGE_READ_SHIFT) 59 #define PAGE_WRITE (1 << PAGE_WRITE_SHIFT) 60 #define PAGE_EXEC (1 << PAGE_EXEC_SHIFT) 61 61 62 #define PAGE_GLOBAL (1 << PAGE_GLOBAL_SHIFT)62 #define PAGE_GLOBAL (1 << PAGE_GLOBAL_SHIFT) 63 63 64 64 #endif -
kernel/generic/include/mm/page.h
rfa8e7d2 r80bcaed 59 59 extern void page_table_unlock(as_t *as, bool unlock); 60 60 extern void page_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, 61 61 int flags); 62 62 extern void page_mapping_remove(as_t *as, uintptr_t page); 63 63 extern pte_t *page_mapping_find(as_t *as, uintptr_t page); -
kernel/generic/include/mm/slab.h
rfa8e7d2 r80bcaed 57 57 58 58 /* slab_reclaim constants */ 59 #define SLAB_RECLAIM_ALL 0x1 /**< Reclaim all possible memory, because we are in memory stress */ 59 60 /** Reclaim all possible memory, because we are in memory stress */ 61 #define SLAB_RECLAIM_ALL 0x1 60 62 61 63 /* cache_create flags */ 62 #define SLAB_CACHE_NOMAGAZINE 0x1 /**< Do not use per-cpu cache */ 63 #define SLAB_CACHE_SLINSIDE 0x2 /**< Have control structure inside SLAB */ 64 #define SLAB_CACHE_MAGDEFERRED (0x4 | SLAB_CACHE_NOMAGAZINE) /**< We add magazine cache later, if we have this flag */ 64 65 /** Do not use per-cpu cache */ 66 #define SLAB_CACHE_NOMAGAZINE 0x1 67 /** Have control structure inside SLAB */ 68 #define SLAB_CACHE_SLINSIDE 0x2 69 /** We add magazine cache later, if we have this flag */ 70 #define SLAB_CACHE_MAGDEFERRED (0x4 | SLAB_CACHE_NOMAGAZINE) 65 71 66 72 typedef struct { … … 82 88 83 89 link_t link; 90 84 91 /* Configuration */ 85 size_t size; /**< Size of slab position - align_up(sizeof(obj)) */ 92 /** Size of slab position - align_up(sizeof(obj)) */ 93 size_t size; 94 86 95 int (*constructor)(void *obj, int kmflag); 87 96 int (*destructor)(void *obj); 88 int flags; /**< Flags changing behaviour of cache */ 97 98 /** Flags changing behaviour of cache */ 99 int flags; 89 100 90 101 /* Computed values */ … … 96 107 atomic_t allocated_objs; 97 108 atomic_t cached_objs; 98 atomic_t magazine_counter; /**< How many magazines in magazines list */ 109 /** How many magazines in magazines list */ 110 atomic_t magazine_counter; 99 111 100 112 /* Slabs */ … … 110 122 } slab_cache_t; 111 123 112 extern slab_cache_t * slab_cache_create(char *name, 113 size_t size, 114 size_t align, 115 int (*constructor)(void *obj, int kmflag), 116 int (*destructor)(void *obj), 117 int flags); 124 extern slab_cache_t * slab_cache_create(char *name, size_t size, size_t align, 125 int (*constructor)(void *obj, int kmflag), int (*destructor)(void *obj), 126 int flags); 118 127 extern void slab_cache_destroy(slab_cache_t *cache); 119 128 … … 122 131 extern count_t slab_reclaim(int flags); 123 132 124 /* * Initialize slab subsytem*/133 /* slab subsytem initialization */ 125 134 extern void slab_cache_init(void); 126 135 extern void slab_enable_cpucache(void); -
kernel/generic/include/mm/tlb.h
rfa8e7d2 r80bcaed 40 40 41 41 /** 42 * Number of TLB shootdown messages that can be queued in processor 43 * tlb_messagesqueue.42 * Number of TLB shootdown messages that can be queued in processor tlb_messages 43 * queue. 44 44 */ 45 45 #define TLB_MESSAGE_QUEUE_LEN 10 … … 47 47 /** Type of TLB shootdown message. */ 48 48 typedef enum { 49 TLB_INVL_INVALID = 0, /**< Invalid type. */ 50 TLB_INVL_ALL, /**< Invalidate all entries in TLB. */ 51 TLB_INVL_ASID, /**< Invalidate all entries belonging to one address space. */ 52 TLB_INVL_PAGES /**< Invalidate specified page range belonging to one address space. */ 49 /** Invalid type. */ 50 TLB_INVL_INVALID = 0, 51 /** Invalidate all entries in TLB. */ 52 TLB_INVL_ALL, 53 /** Invalidate all entries belonging to one address space. */ 54 TLB_INVL_ASID, 55 /** Invalidate specified page range belonging to one address space. */ 56 TLB_INVL_PAGES 53 57 } tlb_invalidate_type_t; 54 58 … … 64 68 65 69 #ifdef CONFIG_SMP 66 extern void tlb_shootdown_start(tlb_invalidate_type_t type, asid_t asid, uintptr_t page, count_t count); 70 extern void tlb_shootdown_start(tlb_invalidate_type_t type, asid_t asid, 71 uintptr_t page, count_t count); 67 72 extern void tlb_shootdown_finalize(void); 68 73 extern void tlb_shootdown_ipi_recv(void); 69 74 #else 70 # 71 # 72 # 75 #define tlb_shootdown_start(w, x, y, z) 76 #define tlb_shootdown_finalize() 77 #define tlb_shootdown_ipi_recv() 73 78 #endif /* CONFIG_SMP */ 74 79
Note:
See TracChangeset
for help on using the changeset viewer.