Changes in kernel/generic/include/mm/as.h [0321109:ada559c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/mm/as.h
r0321109 rada559c 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); 149 bool (* page_table_locked)(as_t *); 143 150 } as_operations_t; 144 151 … … 146 153 * This structure contains information associated with the shared address space 147 154 * area. 155 * 148 156 */ 149 157 typedef struct { 150 158 /** This lock must be acquired only when the as_area lock is held. */ 151 mutex_t lock; 159 mutex_t lock; 152 160 /** This structure can be deallocated if refcount drops to 0. */ 153 161 size_t refcount; 162 154 163 /** 155 164 * B+tree containing complete map of anonymous pages of the shared area. … … 169 178 /** Backend data stored in address space area. */ 170 179 typedef union mem_backend_data { 171 struct { /**< elf_backend members */ 180 /** elf_backend members */ 181 struct { 172 182 elf_header_t *elf; 173 183 elf_segment_header_t *segment; 174 184 }; 175 struct { /**< phys_backend members */ 185 186 /** phys_backend members */ 187 struct { 176 188 uintptr_t base; 177 189 size_t frames; … … 182 194 * 183 195 * Each as_area_t structure describes one contiguous area of virtual memory. 196 * 184 197 */ 185 198 typedef struct { 186 199 mutex_t lock; 187 200 /** Containing address space. */ 188 as_t *as; 201 as_t *as; 202 189 203 /** 190 204 * Flags related to the memory represented by the address space area. 191 205 */ 192 int flags; 206 unsigned int flags; 207 193 208 /** Attributes related to the address space area itself. */ 194 int attributes;209 unsigned int attributes; 195 210 /** Size of this area in multiples of PAGE_SIZE. */ 196 211 size_t pages; … … 199 214 /** Map of used space. */ 200 215 btree_t used_space; 201 216 202 217 /** 203 218 * If the address space area has been shared, this pointer will … … 205 220 */ 206 221 share_info_t *sh_info; 207 222 208 223 /** Memory backend backing this address space area. */ 209 224 struct mem_backend *backend; 210 225 211 226 /** Data to be used by the backend. */ 212 227 mem_backend_data_t backend_data; … … 215 230 /** Address space area backend structure. */ 216 231 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);232 int (* page_fault)(as_area_t *, uintptr_t, pf_access_t); 233 void (* frame_free)(as_area_t *, uintptr_t, uintptr_t); 234 void (* share)(as_area_t *); 220 235 } mem_backend_t; 221 236 … … 227 242 extern void as_init(void); 228 243 229 extern as_t *as_create( int);244 extern as_t *as_create(unsigned int); 230 245 extern void as_destroy(as_t *); 231 246 extern void as_hold(as_t *); … … 234 249 extern int as_page_fault(uintptr_t, pf_access_t, istate_t *); 235 250 236 extern as_area_t *as_area_create(as_t *, int, size_t, uintptr_t, int,237 mem_backend_t *, mem_backend_data_t *);251 extern as_area_t *as_area_create(as_t *, unsigned int, size_t, uintptr_t, 252 unsigned int, mem_backend_t *, mem_backend_data_t *); 238 253 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 *); 254 extern int as_area_resize(as_t *, uintptr_t, size_t, unsigned int); 255 extern int as_area_share(as_t *, uintptr_t, size_t, as_t *, uintptr_t, 256 unsigned int); 257 extern int as_area_change_flags(as_t *, unsigned int, uintptr_t); 258 259 extern unsigned int as_area_get_flags(as_area_t *); 244 260 extern bool as_area_check_access(as_area_t *, pf_access_t); 245 261 extern size_t as_area_get_size(uintptr_t); … … 249 265 250 266 /* Interface to be implemented by architectures. */ 267 251 268 #ifndef as_constructor_arch 252 extern int as_constructor_arch(as_t *, int);269 extern int as_constructor_arch(as_t *, unsigned int); 253 270 #endif /* !def as_constructor_arch */ 271 254 272 #ifndef as_destructor_arch 255 273 extern int as_destructor_arch(as_t *); 256 274 #endif /* !def as_destructor_arch */ 275 257 276 #ifndef as_create_arch 258 extern int as_create_arch(as_t *, int);277 extern int as_create_arch(as_t *, unsigned int); 259 278 #endif /* !def as_create_arch */ 279 260 280 #ifndef as_install_arch 261 281 extern void as_install_arch(as_t *); 262 282 #endif /* !def as_install_arch */ 283 263 284 #ifndef as_deinstall_arch 264 285 extern void as_deinstall_arch(as_t *); … … 270 291 extern mem_backend_t phys_backend; 271 292 272 /** 293 /** 273 294 * This flags is passed when running the loader, otherwise elf_load() 274 295 * 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); 296 * 297 */ 298 #define ELD_F_NONE 0 299 #define ELD_F_LOADER 1 300 301 extern unsigned int elf_load(elf_header_t *, as_t *, unsigned int); 280 302 281 303 /* 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);304 extern unative_t sys_as_area_create(uintptr_t, size_t, unsigned int); 305 extern unative_t sys_as_area_resize(uintptr_t, size_t, unsigned int); 306 extern unative_t sys_as_area_change_flags(uintptr_t, unsigned int); 285 307 extern unative_t sys_as_area_destroy(uintptr_t); 286 308
Note:
See TracChangeset
for help on using the changeset viewer.