Ignore:
File:
1 edited

Legend:

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

    r01029fc r83b6ba9f  
    5555static bool phys_is_shareable(as_area_t *);
    5656
     57static int phys_page_fault(as_area_t *, uintptr_t, pf_access_t);
    5758
    58 static int phys_page_fault(as_area_t *, uintptr_t, pf_access_t);
     59static bool phys_create_shared_data(as_area_t *);
     60static void phys_destroy_shared_data(void *);
     61
     62typedef struct {
     63        uintptr_t base;
     64        size_t frames; 
     65} phys_shared_data_t;
    5966
    6067mem_backend_t phys_backend = {
     
    6976        .page_fault = phys_page_fault,
    7077        .frame_free = NULL,
     78       
     79        .create_shared_data = phys_create_shared_data,
     80        .destroy_shared_data = phys_destroy_shared_data
    7181};
     82
    7283
    7384bool phys_create(as_area_t *area)
     
    92103void phys_destroy(as_area_t *area)
    93104{
    94         /* Nothing to do. */
     105        /*
     106         * Nothing to do.
     107         * The anonymous frames, if any, are released in
     108         * phys_destroy_shared_data().
     109         */
    95110}
    96111
     
    111126 *
    112127 * @param area Pointer to the address space area.
    113  * @param addr Faulting virtual address.
     128 * @param upage Faulting virtual page.
    114129 * @param access Access mode that caused the fault (i.e. read/write/exec).
    115130 *
     
    117132 * serviced).
    118133 */
    119 int phys_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access)
     134int phys_page_fault(as_area_t *area, uintptr_t upage, pf_access_t access)
    120135{
    121136        uintptr_t base = area->backend_data.base;
     
    123138        ASSERT(page_table_locked(AS));
    124139        ASSERT(mutex_locked(&area->lock));
     140        ASSERT(IS_ALIGNED(upage, PAGE_SIZE));
    125141
    126142        if (!as_area_check_access(area, access))
    127143                return AS_PF_FAULT;
    128144
    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),
    131147            as_area_get_flags(area));
    132148       
    133         if (!used_space_insert(area, ALIGN_DOWN(addr, PAGE_SIZE), 1))
     149        if (!used_space_insert(area, upage, 1))
    134150                panic("Cannot insert used space.");
    135151
     
    137153}
    138154
     155bool 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
     173void 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
    139183/** @}
    140184 */
Note: See TracChangeset for help on using the changeset viewer.