Changes in kernel/generic/src/mm/backend_phys.c [01029fc:83b6ba9f] in mainline
- File:
-
- 1 edited
-
kernel/generic/src/mm/backend_phys.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/backend_phys.c
r01029fc r83b6ba9f 55 55 static bool phys_is_shareable(as_area_t *); 56 56 57 static int phys_page_fault(as_area_t *, uintptr_t, pf_access_t); 57 58 58 static int phys_page_fault(as_area_t *, uintptr_t, pf_access_t); 59 static bool phys_create_shared_data(as_area_t *); 60 static void phys_destroy_shared_data(void *); 61 62 typedef struct { 63 uintptr_t base; 64 size_t frames; 65 } phys_shared_data_t; 59 66 60 67 mem_backend_t phys_backend = { … … 69 76 .page_fault = phys_page_fault, 70 77 .frame_free = NULL, 78 79 .create_shared_data = phys_create_shared_data, 80 .destroy_shared_data = phys_destroy_shared_data 71 81 }; 82 72 83 73 84 bool phys_create(as_area_t *area) … … 92 103 void phys_destroy(as_area_t *area) 93 104 { 94 /* Nothing to do. */ 105 /* 106 * Nothing to do. 107 * The anonymous frames, if any, are released in 108 * phys_destroy_shared_data(). 109 */ 95 110 } 96 111 … … 111 126 * 112 127 * @param area Pointer to the address space area. 113 * @param addr Faulting virtual address.128 * @param upage Faulting virtual page. 114 129 * @param access Access mode that caused the fault (i.e. read/write/exec). 115 130 * … … 117 132 * serviced). 118 133 */ 119 int phys_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access)134 int phys_page_fault(as_area_t *area, uintptr_t upage, pf_access_t access) 120 135 { 121 136 uintptr_t base = area->backend_data.base; … … 123 138 ASSERT(page_table_locked(AS)); 124 139 ASSERT(mutex_locked(&area->lock)); 140 ASSERT(IS_ALIGNED(upage, PAGE_SIZE)); 125 141 126 142 if (!as_area_check_access(area, access)) 127 143 return AS_PF_FAULT; 128 144 129 ASSERT( addr- area->base < area->backend_data.frames * FRAME_SIZE);130 page_mapping_insert(AS, addr, base + (addr- area->base),145 ASSERT(upage - area->base < area->backend_data.frames * FRAME_SIZE); 146 page_mapping_insert(AS, upage, base + (upage - area->base), 131 147 as_area_get_flags(area)); 132 148 133 if (!used_space_insert(area, ALIGN_DOWN(addr, PAGE_SIZE), 1))149 if (!used_space_insert(area, upage, 1)) 134 150 panic("Cannot insert used space."); 135 151 … … 137 153 } 138 154 155 bool phys_create_shared_data(as_area_t *area) 156 { 157 /* 158 * For anonymous phys areas, create the shared data. 159 */ 160 if (area->backend_data.anonymous) { 161 phys_shared_data_t *data; 162 163 data = (phys_shared_data_t *) malloc(sizeof(*data), 0); 164 165 data->base = area->backend_data.base; 166 data->frames = area->backend_data.frames; 167 area->sh_info->backend_shared_data = data; 168 } 169 170 return true; 171 } 172 173 void phys_destroy_shared_data(void *opaque_data) 174 { 175 phys_shared_data_t *data = (phys_shared_data_t *) opaque_data; 176 177 if (data) { 178 frame_free(data->base, data->frames); 179 free(data); 180 } 181 } 182 139 183 /** @} 140 184 */
Note:
See TracChangeset
for help on using the changeset viewer.
