Changeset de7663f in mainline for boot/arch/arm32/loader/mm.h
- Timestamp:
- 2007-06-13T18:39:31Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 341140c
- Parents:
- c03ee1c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/arm32/loader/mm.h
rc03ee1c rde7663f 1 1 /* 2 * Copyright (c) 2007 Pavel Jancik, Michal Kebrt 2 * Copyright (c) 2007 Pavel Jancik 3 * Copyright (c) 2007 Michal Kebrt 3 4 * All rights reserved. 4 5 * … … 34 35 * @brief Memory management used while booting the kernel. 35 36 * 36 * So called "section" paging is used while booting the kernel. The term "section" 37 * comes from the ARM architecture specification and stands for the following: 38 * one-level paging, 1MB sized pages, 4096 entries in the page table. 37 * So called "section" paging is used while booting the kernel. The term 38 * "section" comes from the ARM architecture specification and stands for the 39 * following: one-level paging, 1MB sized pages, 4096 entries in the page 40 * table. 39 41 */ 40 42 … … 50 52 51 53 /** Frame width. */ 52 #define FRAME_WIDTH 54 #define FRAME_WIDTH 20 53 55 54 56 /** Frame size. */ 55 #define FRAME_SIZE 57 #define FRAME_SIZE (1 << FRAME_WIDTH) 56 58 57 /** Page size in 2-level paging which is switched on later after the kernel initialization. */ 58 #define KERNEL_PAGE_SIZE (1 << 12) 59 /** Page size in 2-level paging which is switched on later after the kernel 60 * initialization. 61 */ 62 #define KERNEL_PAGE_SIZE (1 << 12) 59 63 60 64 61 65 #ifndef __ASM__ 62 66 /** Converts kernel address to physical address. */ 63 # define KA2PA(x) 67 # define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) 64 68 /** Converts physical address to kernel address. */ 65 # define PA2KA(x) 69 # define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) 66 70 #else 67 # define KA2PA(x) 68 # define PA2KA(x) 71 # define KA2PA(x) ((x) - 0x80000000) 72 # define PA2KA(x) ((x) + 0x80000000) 69 73 #endif 70 74 71 75 72 76 /** Number of entries in PTL0. */ 73 #define PTL0_ENTRIES (1<<12)/* 4096 */77 #define PTL0_ENTRIES (1 << 12) /* 4096 */ 74 78 75 79 /** Size of an entry in PTL0. */ 76 #define PTL0_ENTRY_SIZE 80 #define PTL0_ENTRY_SIZE 4 77 81 78 82 /** Returns number of frame the address belongs to. */ 79 #define ADDR2PFN( addr ) ( ((uintptr_t)(addr)) >> FRAME_WIDTH)83 #define ADDR2PFN(addr) (((uintptr_t) (addr)) >> FRAME_WIDTH) 80 84 81 85 /** Describes "section" page table entry (one-level paging with 1MB sized pages). */ 82 #define PTE_DESCRIPTOR_SECTION 86 #define PTE_DESCRIPTOR_SECTION 0x2 83 87 84 88 /** Page table access rights: user - no access, kernel - read/write. */ 85 #define PTE_AP_USER_NO_KERNEL_RW 89 #define PTE_AP_USER_NO_KERNEL_RW 0x1 86 90 87 91 … … 89 93 90 94 91 /** Page table level 0 entry - "section" format is used (one-level paging, 1MB sized92 * pages). Used only while booting the kernel.95 /** Page table level 0 entry - "section" format is used (one-level paging, 1MB 96 * sized pages). Used only while booting the kernel. 93 97 */ 94 98 typedef struct { 95 unsigned descriptor_type 96 unsigned bufferable 97 unsigned cacheable 98 unsigned impl_specific 99 unsigned domain 100 unsigned should_be_zero_1 101 unsigned access_permission 102 unsigned should_be_zero_2 103 unsigned section_base_addr 99 unsigned descriptor_type : 2; 100 unsigned bufferable : 1; 101 unsigned cacheable : 1; 102 unsigned impl_specific : 1; 103 unsigned domain : 4; 104 unsigned should_be_zero_1 : 1; 105 unsigned access_permission : 2; 106 unsigned should_be_zero_2 : 8; 107 unsigned section_base_addr : 12; 104 108 } __attribute__ ((packed)) pte_level0_section_t; 105 109 106 110 107 /** Page table that holds 1:1 virtual to physical mapping used while booting the kernel. */ 111 /** Page table that holds 1:1 virtual to physical mapping used while booting the 112 * kernel. 113 */ 108 114 extern pte_level0_section_t page_table[PTL0_ENTRIES]; 109 115 … … 118 124 */ 119 125 asm volatile ( 120 / / behave as a client of domains121 "ldr r0, =0x55555555 122 "mcr p15, 0, r0, c3, c0, 0 126 /* behave as a client of domains */ 127 "ldr r0, =0x55555555\n" 128 "mcr p15, 0, r0, c3, c0, 0\n" 123 129 124 / / current settings125 "mrc p15, 0, r0, c1, c0, 0 130 /* current settings */ 131 "mrc p15, 0, r0, c1, c0, 0\n" 126 132 127 / / mask to enable paging128 "ldr r1, =0x00000001 129 "orr r0, r0, r1 133 /* mask to enable paging */ 134 "ldr r1, =0x00000001\n" 135 "orr r0, r0, r1\n" 130 136 131 / / store settings132 "mcr p15, 0, r0, c1, c0, 0 137 /* store settings */ 138 "mcr p15, 0, r0, c1, c0, 0\n" 133 139 : 134 140 : … … 144 150 static inline void set_ptl0_address(pte_level0_section_t* pt) 145 151 { 146 147 "mcr p15, 0, %0, c2, c0, 0 152 asm volatile ( 153 "mcr p15, 0, %0, c2, c0, 0\n" 148 154 : 149 : "r" (pt)150 155 : "r" (pt) 156 ); 151 157 } 152 158
Note:
See TracChangeset
for help on using the changeset viewer.