Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/backend_anon.c

    r59fb782 rc142860  
    5959static void anon_destroy(as_area_t *);
    6060
    61 static bool anon_is_resizable(as_area_t *);
    62 static bool anon_is_shareable(as_area_t *);
    63 
    6461static int anon_page_fault(as_area_t *, uintptr_t, pf_access_t);
    6562static void anon_frame_free(as_area_t *, uintptr_t, uintptr_t);
     
    7168        .destroy = anon_destroy,
    7269
    73         .is_resizable = anon_is_resizable,
    74         .is_shareable = anon_is_shareable,
    75 
    7670        .page_fault = anon_page_fault,
    7771        .frame_free = anon_frame_free,
     
    8074bool anon_create(as_area_t *area)
    8175{
    82         if (area->flags & AS_AREA_LATE_RESERVE)
    83                 return true;
    84 
    8576        return reserve_try_alloc(area->pages);
    8677}
     
    8879bool anon_resize(as_area_t *area, size_t new_pages)
    8980{
    90         if (area->flags & AS_AREA_LATE_RESERVE)
    91                 return true;
    92 
    9381        if (new_pages > area->pages)
    9482                return reserve_try_alloc(new_pages - area->pages);
     
    112100        ASSERT(mutex_locked(&area->as->lock));
    113101        ASSERT(mutex_locked(&area->lock));
    114         ASSERT(!(area->flags & AS_AREA_LATE_RESERVE));
    115102
    116103        /*
     
    152139void anon_destroy(as_area_t *area)
    153140{
    154         if (area->flags & AS_AREA_LATE_RESERVE)
    155                 return;
    156 
    157141        reserve_free(area->pages);
    158142}
    159143
    160 bool anon_is_resizable(as_area_t *area)
    161 {
    162         return true;
    163 }
    164 
    165 bool anon_is_shareable(as_area_t *area)
    166 {
    167         return !(area->flags & AS_AREA_LATE_RESERVE);
    168 }
    169144
    170145/** Service a page fault in the anonymous memory address space area.
     
    173148 *
    174149 * @param area Pointer to the address space area.
    175  * @param upage Faulting virtual page.
     150 * @param addr Faulting virtual address.
    176151 * @param access Access mode that caused the fault (i.e. read/write/exec).
    177152 *
     
    179154 *     serviced).
    180155 */
    181 int anon_page_fault(as_area_t *area, uintptr_t upage, pf_access_t access)
    182 {
     156int anon_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access)
     157{
     158        uintptr_t upage = ALIGN_DOWN(addr, PAGE_SIZE);
    183159        uintptr_t kpage;
    184160        uintptr_t frame;
     
    186162        ASSERT(page_table_locked(AS));
    187163        ASSERT(mutex_locked(&area->lock));
    188         ASSERT(IS_ALIGNED(upage, PAGE_SIZE));
    189164
    190165        if (!as_area_check_access(area, access))
     
    250225                 *   the different causes
    251226                 */
    252 
    253                 if (area->flags & AS_AREA_LATE_RESERVE) {
    254                         /*
    255                          * Reserve the memory for this page now.
    256                          */
    257                         if (!reserve_try_alloc(1))
    258                                 return AS_PF_SILENT;
    259                 }
    260 
    261227                kpage = km_temporary_page_get(&frame, FRAME_NO_RESERVE);
    262228                memsetb((void *) kpage, PAGE_SIZE, 0);
     
    289255        ASSERT(mutex_locked(&area->lock));
    290256
    291         if (area->flags & AS_AREA_LATE_RESERVE) {
    292                 /*
    293                  * In case of the late reserve areas, physical memory will not
    294                  * be unreserved when the area is destroyed so we need to use
    295                  * the normal unreserving frame_free().
    296                  */
    297                 frame_free(frame);
    298         } else {
    299                 /*
    300                  * The reserve will be given back when the area is destroyed or
    301                  * resized, so use the frame_free_noreserve() which does not
    302                  * manipulate the reserve or it would be given back twice.
    303                  */
    304                 frame_free_noreserve(frame);
    305         }
     257        frame_free_noreserve(frame);
    306258}
    307259
Note: See TracChangeset for help on using the changeset viewer.