1/*
2 * Copyright 2007, Fran��ois Revol, revol@free.fr.
3 * Distributed under the terms of the MIT License.
4 *
5 * Copyright 2003-2005, Axel D��rfler, axeld@pinc-software.de.
6 * Distributed under the terms of the MIT License.
7 *
8 * Copyright 2001, Travis Geiselbrecht. All rights reserved.
9 * Distributed under the terms of the NewOS License.
10 */
11
12
13#include <KernelExport.h>
14
15#include <kernel.h>
16#include <boot/kernel_args.h>
17
18#include <vm/vm.h>
19#include <vm/VMAddressSpace.h>
20#include <vm/vm_types.h>
21#include <arch/vm.h>
22//#include <arch_mmu.h>
23
24
25//#define TRACE_ARCH_VM
26#ifdef TRACE_ARCH_VM
27#	define TRACE(x...) dprintf(x)
28#else
29#	define TRACE(x...) ;
30#endif
31
32
33status_t
34arch_vm_init(kernel_args *args)
35{
36	TRACE("arch_vm_init: entry\n");
37	return B_OK;
38}
39
40
41status_t
42arch_vm_init2(kernel_args *args)
43{
44	return B_OK;
45}
46
47
48status_t
49arch_vm_init_post_area(kernel_args *args)
50{
51	TRACE("arch_vm_init_post_area: entry\n");
52	return B_OK;
53}
54
55
56status_t
57arch_vm_init_end(kernel_args *args)
58{
59	TRACE("arch_vm_init_end(): %" B_PRIu32 " virtual ranges to keep:\n",
60		args->arch_args.num_virtual_ranges_to_keep);
61
62	for (int i = 0; i < (int)args->arch_args.num_virtual_ranges_to_keep; i++) {
63		addr_range &range = args->arch_args.virtual_ranges_to_keep[i];
64
65		TRACE("  start: %p, size: %#" B_PRIxSIZE "\n", (void*)range.start, range.size);
66
67		// skip ranges outside the kernel address space
68		if (!IS_KERNEL_ADDRESS(range.start)) {
69			TRACE("    no kernel address, skipping...\n");
70			continue;
71		}
72
73		phys_addr_t physicalAddress;
74		void *address = (void*)range.start;
75		if (vm_get_page_mapping(VMAddressSpace::KernelID(), range.start,
76			&physicalAddress) != B_OK)
77			panic("arch_vm_init_end(): No page mapping for %p\n", address);
78
79		area_id area = vm_map_physical_memory(VMAddressSpace::KernelID(),
80			"boot loader reserved area", &address,
81			B_EXACT_ADDRESS, range.size,
82			B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA,
83			physicalAddress, true);
84
85		if (area < 0) {
86			panic("arch_vm_init_end(): Failed to create area for boot loader "
87				"reserved area: %p - %p\n", (void*)range.start,
88				(void*)(range.start + range.size));
89		}
90	}
91
92	// Throw away all mappings that are unused by the kernel
93	vm_free_unused_boot_loader_range(KERNEL_LOAD_BASE, KERNEL_SIZE);
94
95	return B_OK;
96}
97
98
99status_t
100arch_vm_init_post_modules(kernel_args *args)
101{
102	return B_OK;
103}
104
105
106void
107arch_vm_aspace_swap(struct VMAddressSpace *from, struct VMAddressSpace *to)
108{
109	// This functions is only invoked when a userland thread is in the process
110	// of dying. It switches to the kernel team and does whatever cleanup is
111	// necessary (in case it is the team's main thread, it will delete the
112	// team).
113	// It is however not necessary to change the page directory. Userland team's
114	// page directories include all kernel mappings as well. Furthermore our
115	// arch specific translation map data objects are ref-counted, so they won't
116	// go away as long as they are still used on any CPU.
117}
118
119
120bool
121arch_vm_supports_protection(uint32 protection)
122{
123	// TODO check ARM protection possibilities
124	return true;
125}
126
127
128void
129arch_vm_unset_memory_type(VMArea *area)
130{
131}
132
133
134status_t
135arch_vm_set_memory_type(VMArea *area, phys_addr_t physicalBase, uint32 type)
136{
137	return B_OK;
138}
139