xref: /haiku/src/system/kernel/arch/ppc/arch_vm.cpp (revision fc7456e9b1ec38c941134ed6d01c438cf289381e)
1 /*
2  * Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  *
5  * Copyright 2001, Travis Geiselbrecht. All rights reserved.
6  * Distributed under the terms of the NewOS License.
7  */
8 
9 #include <KernelExport.h>
10 
11 #include <kernel.h>
12 #include <boot/kernel_args.h>
13 
14 #include <vm/vm.h>
15 #include <vm/VMAddressSpace.h>
16 #include <arch/vm.h>
17 #include <arch_mmu.h>
18 
19 
20 //#define TRACE_ARCH_VM
21 #ifdef TRACE_ARCH_VM
22 #	define TRACE(x) dprintf x
23 #else
24 #	define TRACE(x) ;
25 #endif
26 
27 
28 status_t
29 arch_vm_init(kernel_args *args)
30 {
31 	return B_OK;
32 }
33 
34 
35 status_t
36 arch_vm_init2(kernel_args *args)
37 {
38 //	int bats[8];
39 //	int i;
40 
41 #if 0
42 	// print out any bat mappings
43 	getibats(bats);
44 	dprintf("ibats:\n");
45 	for(i = 0; i < 4; i++)
46 		dprintf("0x%x 0x%x\n", bats[i*2], bats[i*2+1]);
47 	getdbats(bats);
48 	dprintf("dbats:\n");
49 	for(i = 0; i < 4; i++)
50 		dprintf("0x%x 0x%x\n", bats[i*2], bats[i*2+1]);
51 #endif
52 
53 #if 1
54 	// turn off the first 2 BAT mappings (3 & 4 are used by the lower level code)
55 	block_address_translation bat;
56 	bat.Clear();
57 
58 	set_ibat0(&bat);
59 	set_ibat1(&bat);
60 	set_dbat0(&bat);
61 	set_dbat1(&bat);
62 /*	getibats(bats);
63 	memset(bats, 0, 2 * 2);
64 	setibats(bats);
65 	getdbats(bats);
66 	memset(bats, 0, 2 * 2);
67 	setdbats(bats);
68 */
69 #endif
70 #if 0
71 	// just clear the first BAT mapping (0 - 256MB)
72 	dprintf("msr 0x%x\n", getmsr());
73 	{
74 		unsigned int reg;
75 		asm("mr	%0,1" : "=r"(reg));
76 		dprintf("sp 0x%x\n", reg);
77 	}
78 	dprintf("ka %p\n", ka);
79 
80 	getibats(bats);
81 	dprintf("ibats:\n");
82 	for(i = 0; i < 4; i++)
83 		dprintf("0x%x 0x%x\n", bats[i*2], bats[i*2+1]);
84 	bats[0] = bats[1] = 0;
85 	setibats(bats);
86 	getdbats(bats);
87 	dprintf("dbats:\n");
88 	for(i = 0; i < 4; i++)
89 		dprintf("0x%x 0x%x\n", bats[i*2], bats[i*2+1]);
90 	bats[0] = bats[1] = 0;
91 	setdbats(bats);
92 #endif
93 	return B_OK;
94 }
95 
96 
97 status_t
98 arch_vm_init_post_area(kernel_args *args)
99 {
100 	return B_OK;
101 }
102 
103 
104 status_t
105 arch_vm_init_end(kernel_args *args)
106 {
107 	TRACE(("arch_vm_init_end(): %lu virtual ranges to keep:\n",
108 		args->arch_args.num_virtual_ranges_to_keep));
109 
110 	for (int i = 0; i < (int)args->arch_args.num_virtual_ranges_to_keep; i++) {
111 		addr_range &range = args->arch_args.virtual_ranges_to_keep[i];
112 
113 		TRACE(("  start: %p, size: 0x%lx\n", (void*)range.start, range.size));
114 
115 		// skip ranges outside the kernel address space
116 		if (!IS_KERNEL_ADDRESS(range.start)) {
117 			TRACE(("    no kernel address, skipping...\n"));
118 			continue;
119 		}
120 
121 		phys_addr_t physicalAddress;
122 		void *address = (void*)range.start;
123 		if (vm_get_page_mapping(VMAddressSpace::KernelID(), range.start,
124 				&physicalAddress) != B_OK)
125 			panic("arch_vm_init_end(): No page mapping for %p\n", address);
126 		area_id area = vm_map_physical_memory(VMAddressSpace::KernelID(),
127 			"boot loader reserved area", &address,
128 			B_EXACT_ADDRESS, range.size,
129 			B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA,
130 			physicalAddress, true);
131 		if (area < 0) {
132 			panic("arch_vm_init_end(): Failed to create area for boot loader "
133 				"reserved area: %p - %p\n", (void*)range.start,
134 				(void*)(range.start + range.size));
135 		}
136 	}
137 
138 	// Throw away any address space mappings we've inherited from the boot
139 	// loader and have not yet turned into an area.
140 	vm_free_unused_boot_loader_range(0, 0xffffffff - B_PAGE_SIZE + 1);
141 
142 	return B_OK;
143 }
144 
145 
146 status_t
147 arch_vm_init_post_modules(kernel_args *args)
148 {
149 	return B_OK;
150 }
151 
152 
153 void
154 arch_vm_aspace_swap(struct VMAddressSpace *from, struct VMAddressSpace *to)
155 {
156 }
157 
158 
159 bool
160 arch_vm_supports_protection(uint32 protection)
161 {
162 	return true;
163 }
164 
165 
166 void
167 arch_vm_unset_memory_type(VMArea *area)
168 {
169 }
170 
171 
172 status_t
173 arch_vm_set_memory_type(VMArea *area, phys_addr_t physicalBase, uint32 type,
174 	uint32 *effectiveType)
175 {
176 	if (type == 0)
177 		return B_OK;
178 
179 	return B_OK;
180 }
181