Changeset 6b781c0 in mainline for kernel/arch/arm32/src/mm/page.c
- Timestamp:
- 2007-06-08T15:02:49Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c03ee1c
- Parents:
- 3ee8a075
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/mm/page.c
r3ee8a075 r6b781c0 1 1 /* 2 * Copyright (c) 200 3-2004 Jakub Jermar2 * Copyright (c) 2007 Pavel Jancik, Michal Kebrt 3 3 * All rights reserved. 4 4 * … … 31 31 */ 32 32 /** @file 33 * @brief Paging related functions. 33 34 */ 34 35 … … 36 37 #include <genarch/mm/page_pt.h> 37 38 #include <mm/page.h> 39 #include <align.h> 40 #include <config.h> 41 #include <arch/exception.h> 42 #include <typedefs.h> 43 #include <arch/types.h> 44 #include <interrupt.h> 45 #include <arch/mm/frame.h> 38 46 47 /** Initializes page tables. 48 * 49 * 1:1 virtual-physical mapping is created in kernel address space. Mapping 50 * for table with exception vectors is also created. 51 */ 39 52 void page_arch_init(void) 40 53 { 54 uintptr_t cur; 55 int flags; 56 41 57 page_mapping_operations = &pt_mapping_operations; 58 59 flags = PAGE_CACHEABLE; 60 61 /* PA2KA(identity) mapping for all frames until last_frame */ 62 for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { 63 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); 64 } 65 66 /* create mapping for exception table at high offset */ 67 #ifdef HIGH_EXCEPTION_VECTORS 68 void *virtaddr = frame_alloc(ONE_FRAME, FRAME_KA); 69 page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags); 70 #else 71 #error "Only high exception vector supported now" 72 #endif 73 74 as_switch(NULL, AS_KERNEL); 75 76 boot_page_table_free(); 42 77 } 43 78 44 /** Map device into kernel space. */ 79 /** Maps device into the kernel space. 80 * 81 * Maps physical address of device into kernel virtual address space (so it can 82 * be accessed only by kernel through virtual address). 83 * 84 * @param physaddr Physical address where device is connected. 85 * @param size Length of area where device is present. 86 * 87 * @return Virtual address where device will be accessible. 88 */ 45 89 uintptr_t hw_map(uintptr_t physaddr, size_t size) 46 90 { 47 /* TODO */ 48 return NULL; 91 if (last_frame + ALIGN_UP(size, PAGE_SIZE) > 92 KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) { 93 panic("Unable to map physical memory %p (%d bytes)", 94 physaddr, size) 95 } 96 97 uintptr_t virtaddr = PA2KA(last_frame); 98 pfn_t i; 99 for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) { 100 page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), 101 physaddr + PFN2ADDR(i), 102 PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL); 103 } 104 105 last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); 106 return virtaddr; 49 107 } 50 108
Note:
See TracChangeset
for help on using the changeset viewer.