Changeset da1bafb in mainline for kernel/generic/include/mm/as.h
- Timestamp:
- 2010-05-24T18:57:31Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0095368
- Parents:
- 666f492
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/mm/as.h
r666f492 rda1bafb 43 43 44 44 /** Address space area flags. */ 45 #define AS_AREA_READ 46 #define AS_AREA_WRITE 47 #define AS_AREA_EXEC 48 #define AS_AREA_CACHEABLE 45 #define AS_AREA_READ 1 46 #define AS_AREA_WRITE 2 47 #define AS_AREA_EXEC 4 48 #define AS_AREA_CACHEABLE 8 49 49 50 50 /** Address space area info exported to userspace. */ … … 52 52 /** Starting address */ 53 53 uintptr_t start_addr; 54 54 55 55 /** Area size */ 56 56 size_t size; 57 57 58 58 /** Area flags */ 59 int flags;59 unsigned int flags; 60 60 } as_area_info_t; 61 61 … … 75 75 * Defined to be true if user address space and kernel address space shadow each 76 76 * other. 77 */ 78 #define KERNEL_ADDRESS_SPACE_SHADOWED KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 79 80 #define KERNEL_ADDRESS_SPACE_START KERNEL_ADDRESS_SPACE_START_ARCH 81 #define KERNEL_ADDRESS_SPACE_END KERNEL_ADDRESS_SPACE_END_ARCH 82 #define USER_ADDRESS_SPACE_START USER_ADDRESS_SPACE_START_ARCH 83 #define USER_ADDRESS_SPACE_END USER_ADDRESS_SPACE_END_ARCH 84 85 #define USTACK_ADDRESS USTACK_ADDRESS_ARCH 77 * 78 */ 79 #define KERNEL_ADDRESS_SPACE_SHADOWED KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 80 81 #define KERNEL_ADDRESS_SPACE_START KERNEL_ADDRESS_SPACE_START_ARCH 82 #define KERNEL_ADDRESS_SPACE_END KERNEL_ADDRESS_SPACE_END_ARCH 83 #define USER_ADDRESS_SPACE_START USER_ADDRESS_SPACE_START_ARCH 84 #define USER_ADDRESS_SPACE_END USER_ADDRESS_SPACE_END_ARCH 85 86 #define USTACK_ADDRESS USTACK_ADDRESS_ARCH 86 87 87 88 /** Kernel address space. */ 88 #define FLAG_AS_KERNEL (1 << 0)89 #define FLAG_AS_KERNEL (1 << 0) 89 90 90 91 /* Address space area attributes. */ 91 #define AS_AREA_ATTR_NONE 92 #define AS_AREA_ATTR_PARTIAL 1/**< Not fully initialized area. */92 #define AS_AREA_ATTR_NONE 0 93 #define AS_AREA_ATTR_PARTIAL 1 /**< Not fully initialized area. */ 93 94 94 95 /** The page fault was not resolved by as_page_fault(). */ 95 #define AS_PF_FAULT 0 96 #define AS_PF_FAULT 0 97 96 98 /** The page fault was resolved by as_page_fault(). */ 97 #define AS_PF_OK 1 99 #define AS_PF_OK 1 100 98 101 /** The page fault was caused by memcpy_from_uspace() or memcpy_to_uspace(). */ 99 #define AS_PF_DEFER 102 #define AS_PF_DEFER 2 100 103 101 104 /** Address space structure. … … 105 108 * supposed to figure in the list as they are shared by all tasks and 106 109 * set up during system initialization. 110 * 107 111 */ 108 112 typedef struct as { 109 113 /** Protected by asidlock. */ 110 114 link_t inactive_as_with_asid_link; 115 111 116 /** 112 117 * Number of processors on wich is this address space active. … … 114 119 */ 115 120 size_t cpu_refcount; 121 116 122 /** 117 123 * Address space identifier. … … 120 126 */ 121 127 asid_t asid; 122 128 123 129 /** Number of references (i.e tasks that reference this as). */ 124 130 atomic_t refcount; 125 131 126 132 mutex_t lock; 127 133 128 134 /** B+tree of address space areas. */ 129 135 btree_t as_area_btree; … … 131 137 /** Non-generic content. */ 132 138 as_genarch_t genarch; 133 139 134 140 /** Architecture specific content. */ 135 141 as_arch_t arch; … … 137 143 138 144 typedef struct { 139 pte_t *(* page_table_create)( int flags);140 void (* page_table_destroy)(pte_t * page_table);141 void (* page_table_lock)(as_t * as, bool lock);142 void (* page_table_unlock)(as_t * as, bool unlock);145 pte_t *(* page_table_create)(unsigned int); 146 void (* page_table_destroy)(pte_t *); 147 void (* page_table_lock)(as_t *, bool); 148 void (* page_table_unlock)(as_t *, bool); 143 149 } as_operations_t; 144 150 … … 146 152 * This structure contains information associated with the shared address space 147 153 * area. 154 * 148 155 */ 149 156 typedef struct { 150 157 /** This lock must be acquired only when the as_area lock is held. */ 151 mutex_t lock; 158 mutex_t lock; 152 159 /** This structure can be deallocated if refcount drops to 0. */ 153 160 size_t refcount; 161 154 162 /** 155 163 * B+tree containing complete map of anonymous pages of the shared area. … … 169 177 /** Backend data stored in address space area. */ 170 178 typedef union mem_backend_data { 171 struct { /**< elf_backend members */ 179 /** elf_backend members */ 180 struct { 172 181 elf_header_t *elf; 173 182 elf_segment_header_t *segment; 174 183 }; 175 struct { /**< phys_backend members */ 184 185 /** phys_backend members */ 186 struct { 176 187 uintptr_t base; 177 188 size_t frames; … … 182 193 * 183 194 * Each as_area_t structure describes one contiguous area of virtual memory. 195 * 184 196 */ 185 197 typedef struct { 186 198 mutex_t lock; 187 199 /** Containing address space. */ 188 as_t *as; 200 as_t *as; 201 189 202 /** 190 203 * Flags related to the memory represented by the address space area. 191 204 */ 192 int flags; 205 unsigned int flags; 206 193 207 /** Attributes related to the address space area itself. */ 194 int attributes;208 unsigned int attributes; 195 209 /** Size of this area in multiples of PAGE_SIZE. */ 196 210 size_t pages; … … 199 213 /** Map of used space. */ 200 214 btree_t used_space; 201 215 202 216 /** 203 217 * If the address space area has been shared, this pointer will … … 205 219 */ 206 220 share_info_t *sh_info; 207 221 208 222 /** Memory backend backing this address space area. */ 209 223 struct mem_backend *backend; 210 224 211 225 /** Data to be used by the backend. */ 212 226 mem_backend_data_t backend_data; … … 215 229 /** Address space area backend structure. */ 216 230 typedef struct mem_backend { 217 int (* page_fault)(as_area_t * area, uintptr_t addr, pf_access_t access);218 void (* frame_free)(as_area_t * area, uintptr_t page, uintptr_t frame);219 void (* share)(as_area_t * area);231 int (* page_fault)(as_area_t *, uintptr_t, pf_access_t); 232 void (* frame_free)(as_area_t *, uintptr_t, uintptr_t); 233 void (* share)(as_area_t *); 220 234 } mem_backend_t; 221 235 … … 227 241 extern void as_init(void); 228 242 229 extern as_t *as_create( int);243 extern as_t *as_create(unsigned int); 230 244 extern void as_destroy(as_t *); 231 245 extern void as_hold(as_t *); … … 234 248 extern int as_page_fault(uintptr_t, pf_access_t, istate_t *); 235 249 236 extern as_area_t *as_area_create(as_t *, int, size_t, uintptr_t, int,237 mem_backend_t *, mem_backend_data_t *);250 extern as_area_t *as_area_create(as_t *, unsigned int, size_t, uintptr_t, 251 unsigned int, mem_backend_t *, mem_backend_data_t *); 238 252 extern int as_area_destroy(as_t *, uintptr_t); 239 extern int as_area_resize(as_t *, uintptr_t, size_t, int); 240 extern int as_area_share(as_t *, uintptr_t, size_t, as_t *, uintptr_t, int); 241 extern int as_area_change_flags(as_t *, int, uintptr_t); 242 243 extern int as_area_get_flags(as_area_t *); 253 extern int as_area_resize(as_t *, uintptr_t, size_t, unsigned int); 254 extern int as_area_share(as_t *, uintptr_t, size_t, as_t *, uintptr_t, 255 unsigned int); 256 extern int as_area_change_flags(as_t *, unsigned int, uintptr_t); 257 258 extern unsigned int as_area_get_flags(as_area_t *); 244 259 extern bool as_area_check_access(as_area_t *, pf_access_t); 245 260 extern size_t as_area_get_size(uintptr_t); … … 249 264 250 265 /* Interface to be implemented by architectures. */ 266 251 267 #ifndef as_constructor_arch 252 extern int as_constructor_arch(as_t *, int);268 extern int as_constructor_arch(as_t *, unsigned int); 253 269 #endif /* !def as_constructor_arch */ 270 254 271 #ifndef as_destructor_arch 255 272 extern int as_destructor_arch(as_t *); 256 273 #endif /* !def as_destructor_arch */ 274 257 275 #ifndef as_create_arch 258 extern int as_create_arch(as_t *, int);276 extern int as_create_arch(as_t *, unsigned int); 259 277 #endif /* !def as_create_arch */ 278 260 279 #ifndef as_install_arch 261 280 extern void as_install_arch(as_t *); 262 281 #endif /* !def as_install_arch */ 282 263 283 #ifndef as_deinstall_arch 264 284 extern void as_deinstall_arch(as_t *); … … 270 290 extern mem_backend_t phys_backend; 271 291 272 /** 292 /** 273 293 * This flags is passed when running the loader, otherwise elf_load() 274 294 * would return with a EE_LOADER error code. 275 */ 276 #define ELD_F_NONE 0 277 #define ELD_F_LOADER 1 278 279 extern unsigned int elf_load(elf_header_t *, as_t *, int); 295 * 296 */ 297 #define ELD_F_NONE 0 298 #define ELD_F_LOADER 1 299 300 extern unsigned int elf_load(elf_header_t *, as_t *, unsigned int); 280 301 281 302 /* Address space area related syscalls. */ 282 extern unative_t sys_as_area_create(uintptr_t, size_t, int);283 extern unative_t sys_as_area_resize(uintptr_t, size_t, int);284 extern unative_t sys_as_area_change_flags(uintptr_t, int);303 extern unative_t sys_as_area_create(uintptr_t, size_t, unsigned int); 304 extern unative_t sys_as_area_resize(uintptr_t, size_t, unsigned int); 305 extern unative_t sys_as_area_change_flags(uintptr_t, unsigned int); 285 306 extern unative_t sys_as_area_destroy(uintptr_t); 286 307
Note:
See TracChangeset
for help on using the changeset viewer.