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 | } |