Rev 2278 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2128 | jermar | 1 | /* |
2238 | kebrt | 2 | * Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
2128 | jermar | 3 | * All rights reserved. |
4 | * |
||
5 | * Redistribution and use in source and binary forms, with or without |
||
6 | * modification, are permitted provided that the following conditions |
||
7 | * are met: |
||
8 | * |
||
9 | * - Redistributions of source code must retain the above copyright |
||
10 | * notice, this list of conditions and the following disclaimer. |
||
11 | * - Redistributions in binary form must reproduce the above copyright |
||
12 | * notice, this list of conditions and the following disclaimer in the |
||
13 | * documentation and/or other materials provided with the distribution. |
||
14 | * - The name of the author may not be used to endorse or promote products |
||
15 | * derived from this software without specific prior written permission. |
||
16 | * |
||
17 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
||
18 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
||
19 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
||
20 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
||
21 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
||
22 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||
23 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||
24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
||
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||
27 | */ |
||
28 | |||
29 | /** @addtogroup arm32mm |
||
30 | * @{ |
||
31 | */ |
||
32 | /** @file |
||
33 | */ |
||
34 | |||
35 | #include <arch/mm/page.h> |
||
36 | #include <genarch/mm/page_pt.h> |
||
37 | #include <mm/page.h> |
||
2182 | jancik | 38 | #include <align.h> |
39 | #include <config.h> |
||
2258 | jancik | 40 | #include <arch/exception.h> |
41 | #include <typedefs.h> |
||
42 | #include <arch/types.h> |
||
43 | #include <interrupt.h> |
||
2264 | kebrt | 44 | #include <arch/debug_print/print.h> |
2258 | jancik | 45 | |
2128 | jermar | 46 | |
2258 | jancik | 47 | /** |
48 | * Initializes kernel adress space page tables, sets abourts exceptions vectors |
||
49 | */ |
||
2128 | jermar | 50 | void page_arch_init(void) |
51 | { |
||
2238 | kebrt | 52 | uintptr_t cur; |
2182 | jancik | 53 | int flags; |
54 | |||
2128 | jermar | 55 | page_mapping_operations = &pt_mapping_operations; |
2182 | jancik | 56 | |
57 | flags = PAGE_CACHEABLE; |
||
2238 | kebrt | 58 | |
2243 | kebrt | 59 | /* PA2KA(identity) mapping for all frames until last_frame */ |
60 | for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { |
||
61 | page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); |
||
62 | } |
||
2270 | jancik | 63 | |
64 | // Create mapping for exception table at high offcet |
||
65 | #ifdef HIGH_EXCEPTION_VECTORS |
||
66 | /* Note: this mapping cann't be done by hw_map because fixed exception |
||
67 | vector is stored at fixed virtual address |
||
68 | */ |
||
69 | // reserve frame for exception table |
||
70 | void* virtaddr = frame_alloc( ONE_FRAME ,FRAME_KA); |
||
71 | page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags ); |
||
72 | #endif |
||
2243 | kebrt | 73 | |
2256 | kebrt | 74 | // TODO: move to the kernel space |
2270 | jancik | 75 | // page_mapping_insert(AS_KERNEL, 0xffff0000, 0x00000000, flags); |
2263 | kebrt | 76 | // TODO: remove when aux_printf not needed |
2284 | stepan | 77 | // page_mapping_insert(AS_KERNEL, 0x0000000, 0x0000000, flags); |
78 | page_mapping_insert(AS_KERNEL, 0x1000000, 0x1000000, flags); |
||
79 | // page_mapping_insert(AS_KERNEL, 0x1100000, 0x1100000, flags); |
||
80 | // page_mapping_insert(AS_KERNEL, 0x1500000, 0x1500000, flags); |
||
81 | // page_mapping_insert(AS_KERNEL, 0x1600000, 0x1600000, flags); |
||
2256 | kebrt | 82 | |
2284 | stepan | 83 | // page_mapping_insert(AS_KERNEL, 0xffff0000, 0xffff0000, flags); |
2256 | kebrt | 84 | |
2284 | stepan | 85 | |
2263 | kebrt | 86 | as_switch(NULL, AS_KERNEL); |
2258 | jancik | 87 | |
2128 | jermar | 88 | } |
89 | |||
2258 | jancik | 90 | /** |
91 | * Map device into kernel space. |
||
92 | * |
||
93 | * This function adds mapping of physical address that is read/write only |
||
94 | * from kernel and not bufferable. |
||
95 | * |
||
96 | * \param physaddr Physical addres where device is connected |
||
97 | * \param size Length of area where device is present |
||
98 | * \return Virtual address where device will be accessable |
||
99 | * Note: This is copy of IA32 hw_map code |
||
100 | */ |
||
2128 | jermar | 101 | uintptr_t hw_map(uintptr_t physaddr, size_t size) |
102 | { |
||
2258 | jancik | 103 | if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) |
104 | panic("Unable to map physical memory %p (%d bytes)", physaddr, size) |
||
105 | |||
106 | uintptr_t virtaddr = PA2KA(last_frame); |
||
107 | pfn_t i; |
||
108 | for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) |
||
109 | page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL); |
||
110 | |||
111 | last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
||
112 | |||
113 | return virtaddr; |
||
2128 | jermar | 114 | } |
115 | |||
2258 | jancik | 116 | |
2128 | jermar | 117 | /** @} |
118 | */ |
||
2182 | jancik | 119 |