Rev 2089 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 2089 | Rev 2132 | ||
|---|---|---|---|
| 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 | } |