Changeset c520034 in mainline for kernel/arch/arm32/src/mm/page.c
- Timestamp:
- 2011-12-31T18:19:35Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 295f658, 77c2b02, 96cd5b4
- Parents:
- 852052d (diff), 22f0561 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/mm/page.c
r852052d rc520034 37 37 #include <genarch/mm/page_pt.h> 38 38 #include <mm/page.h> 39 #include <arch/mm/frame.h> 39 40 #include <align.h> 40 41 #include <config.h> … … 42 43 #include <typedefs.h> 43 44 #include <interrupt.h> 44 #include < arch/mm/frame.h>45 #include <macros.h> 45 46 46 47 /** Initializes page tables. … … 57 58 58 59 uintptr_t cur; 60 59 61 /* Kernel identity mapping */ 60 for (cur = PHYSMEM_START_ADDR; cur < last_frame; cur += FRAME_SIZE) 62 for (cur = PHYSMEM_START_ADDR; 63 cur < min(config.identity_size, config.physmem_end); 64 cur += FRAME_SIZE) 61 65 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); 62 66 63 67 /* Create mapping for exception table at high offset */ 64 68 #ifdef HIGH_EXCEPTION_VECTORS 69 // XXX: fixme to use proper non-identity page 65 70 void *virtaddr = frame_alloc(ONE_FRAME, FRAME_KA); 66 page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags); 71 page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), 72 flags); 67 73 #else 68 74 #error "Only high exception vector supported now" … … 78 84 } 79 85 80 /** Maps device into the kernel space.81 *82 * Maps physical address of device into kernel virtual address space (so it can83 * be accessed only by kernel through virtual address).84 *85 * @param physaddr Physical address where device is connected.86 * @param size Length of area where device is present.87 *88 * @return Virtual address where device will be accessible.89 */90 uintptr_t hw_map(uintptr_t physaddr, size_t size)91 {92 if (last_frame + ALIGN_UP(size, PAGE_SIZE) >93 KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) {94 panic("Unable to map physical memory %p (%d bytes).",95 (void *) physaddr, size);96 }97 98 uintptr_t virtaddr = PA2KA(last_frame);99 pfn_t i;100 101 page_table_lock(AS_KERNEL, true);102 for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) {103 page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i),104 physaddr + PFN2ADDR(i),105 PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL);106 }107 page_table_unlock(AS_KERNEL, true);108 109 last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);110 return virtaddr;111 }112 113 86 /** @} 114 87 */
Note:
See TracChangeset
for help on using the changeset viewer.