Subversion Repositories HelenOS

Rev

Rev 2131 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2131 Rev 2292
Line 30... Line 30...
30
 * @{
30
 * @{
31
 */
31
 */
32
 
32
 
33
/**
33
/**
34
 * @file
34
 * @file
35
 * @brief   Backend for address space areas backed by continuous physical memory.
35
 * @brief   Backend for address space areas backed by continuous physical
-
 
36
 *      memory.
36
 */
37
 */
37
 
38
 
38
#include <debug.h>
39
#include <debug.h>
39
#include <arch/types.h>
40
#include <arch/types.h>
40
#include <mm/as.h>
41
#include <mm/as.h>
Line 60... Line 61...
60
 *
61
 *
61
 * @param area Pointer to the address space area.
62
 * @param area Pointer to the address space area.
62
 * @param addr Faulting virtual address.
63
 * @param addr Faulting virtual address.
63
 * @param access Access mode that caused the fault (i.e. read/write/exec).
64
 * @param access Access mode that caused the fault (i.e. read/write/exec).
64
 *
65
 *
65
 * @return AS_PF_FAULT on failure (i.e. page fault) or AS_PF_OK on success (i.e. serviced).
66
 * @return AS_PF_FAULT on failure (i.e. page fault) or AS_PF_OK on success (i.e.
-
 
67
 * serviced).
66
 */
68
 */
67
int phys_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access)
69
int phys_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access)
68
{
70
{
69
    uintptr_t base = area->backend_data.base;
71
    uintptr_t base = area->backend_data.base;
70
 
72
 
71
    if (!as_area_check_access(area, access))
73
    if (!as_area_check_access(area, access))
72
        return AS_PF_FAULT;
74
        return AS_PF_FAULT;
73
 
75
 
74
    ASSERT(addr - area->base < area->backend_data.frames * FRAME_SIZE);
76
    ASSERT(addr - area->base < area->backend_data.frames * FRAME_SIZE);
75
    page_mapping_insert(AS, addr, base + (addr - area->base), as_area_get_flags(area));
77
    page_mapping_insert(AS, addr, base + (addr - area->base),
-
 
78
        as_area_get_flags(area));
76
        if (!used_space_insert(area, ALIGN_DOWN(addr, PAGE_SIZE), 1))
79
        if (!used_space_insert(area, ALIGN_DOWN(addr, PAGE_SIZE), 1))
77
                panic("Could not insert used space.\n");
80
                panic("Could not insert used space.\n");
78
 
81
 
79
    return AS_PF_OK;
82
    return AS_PF_OK;
80
}
83
}