Changeset 6b781c0 in mainline for kernel/arch/arm32/src/mm
- Timestamp:
- 2007-06-08T15:02:49Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c03ee1c
- Parents:
- 3ee8a075
- Location:
- kernel/arch/arm32/src/mm
- Files:
-
- 3 added
- 3 edited
-
as.c (modified) (3 diffs)
-
frame.c (modified) (2 diffs)
-
memory_init.c (added)
-
page.c (modified) (3 diffs)
-
page_fault.c (added)
-
tlb.c (added)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/mm/as.c
r3ee8a075 r6b781c0 1 1 /* 2 * Copyright (c) 200 5 Jakub Jermar2 * Copyright (c) 2007 Pavel Jancik, Michal Kebrt 3 3 * All rights reserved. 4 4 * … … 31 31 */ 32 32 /** @file 33 * @brief Address space functions. 33 34 */ 34 35 … … 39 40 #include <arch.h> 40 41 41 /** Architecture dependent address space init. */ 42 /** Architecture dependent address space init. 43 * 44 * Since ARM supports page tables, #as_pt_operations are used. 45 */ 42 46 void as_arch_init(void) 43 47 { 44 as_operations = &as_pt_operations; 45 asid_fifo_init(); 46 } 47 48 /** Install address space. 49 * 50 * Install ASID. 51 * 52 * @param as Address space structure. 53 */ 54 void as_install_arch(as_t *as) 55 { 56 /* TODO */ 48 as_operations = &as_pt_operations; 57 49 } 58 50 -
kernel/arch/arm32/src/mm/frame.c
r3ee8a075 r6b781c0 1 1 /* 2 * Copyright (c) 200 5 Jakub Jermar2 * Copyright (c) 2007 Pavel Jancik, Michal Kebrt 3 3 * All rights reserved. 4 4 * … … 31 31 */ 32 32 /** @file 33 * @brief Frame related functions. 33 34 */ 34 35 35 36 #include <mm/frame.h> 37 #include <arch/mm/frame.h> 38 #include <config.h> 39 #include <arch/debug/print.h> 36 40 37 /** Create memory zones. */ 41 /** Address of the last frame in the memory. */ 42 uintptr_t last_frame = 0; 43 44 /** Creates memory zones. */ 38 45 void frame_arch_init(void) 39 46 { 40 /* TODO */ 47 /* all memory as one zone */ 48 zone_create(0, ADDR2PFN(config.memory_size), 49 BOOT_PAGE_TABLE_START_FRAME + BOOT_PAGE_TABLE_SIZE_IN_FRAMES, 0); 50 last_frame = config.memory_size; 51 52 /* blacklist boot page table */ 53 frame_mark_unavailable(BOOT_PAGE_TABLE_START_FRAME, 54 BOOT_PAGE_TABLE_SIZE_IN_FRAMES); 55 } 56 57 /** Frees the boot page table. */ 58 void boot_page_table_free(void) 59 { 60 int i; 61 for (i = 0; i < BOOT_PAGE_TABLE_SIZE_IN_FRAMES; i++) { 62 frame_free(i * FRAME_SIZE + BOOT_PAGE_TABLE_ADDRESS); 63 } 41 64 } 42 65 -
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.
