1/*
2 * Copyright 2019-2022 Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#include <KernelExport.h>
6
7#include <boot/kernel_args.h>
8#include <kernel.h>
9
10#include <arch/vm.h>
11#include <vm/vm.h>
12#include <vm/VMAddressSpace.h>
13#include <vm/vm_types.h>
14
15
16//#define TRACE_ARCH_VM
17#ifdef TRACE_ARCH_VM
18#	define TRACE(x...) dprintf(x)
19#else
20#	define TRACE(x...) ;
21#endif
22
23
24status_t
25arch_vm_init(kernel_args* args)
26{
27	TRACE("arch_vm_init\n");
28	return B_OK;
29}
30
31
32status_t
33arch_vm_init2(kernel_args* args)
34{
35	TRACE("arch_vm_init2\n");
36	return B_OK;
37}
38
39
40status_t
41arch_vm_init_post_area(kernel_args* args)
42{
43	TRACE("arch_vm_init_post_area\n");
44	return B_OK;
45}
46
47
48status_t
49arch_vm_init_end(kernel_args* args)
50{
51	TRACE("arch_vm_init_end(): %" B_PRIu32 " virtual ranges to keep:\n",
52		args->arch_args.num_virtual_ranges_to_keep);
53
54	for (int i = 0; i < (int)args->arch_args.num_virtual_ranges_to_keep; i++) {
55		addr_range &range = args->arch_args.virtual_ranges_to_keep[i];
56
57		TRACE("  start: %p, size: %#" B_PRIxSIZE "\n", (void*)range.start, range.size);
58
59		// skip ranges outside the kernel address space
60		if (!IS_KERNEL_ADDRESS(range.start)) {
61			TRACE("    no kernel address, skipping...\n");
62			continue;
63		}
64
65		phys_addr_t physicalAddress;
66		void *address = (void*)range.start;
67		if (vm_get_page_mapping(VMAddressSpace::KernelID(), range.start,
68			&physicalAddress) != B_OK)
69			panic("arch_vm_init_end(): No page mapping for %p\n", address);
70
71		area_id area = vm_map_physical_memory(VMAddressSpace::KernelID(),
72			"boot loader reserved area", &address,
73			B_EXACT_ADDRESS, range.size,
74			B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA,
75			physicalAddress, true);
76
77		if (area < 0) {
78			panic("arch_vm_init_end(): Failed to create area for boot loader "
79				"reserved area: %p - %p\n", (void*)range.start,
80				(void*)(range.start + range.size));
81		}
82	}
83
84	return B_OK;
85}
86
87
88status_t
89arch_vm_init_post_modules(kernel_args* args)
90{
91	TRACE("arch_vm_init_post_modules\n");
92	return B_OK;
93}
94
95
96void
97arch_vm_aspace_swap(struct VMAddressSpace* from, struct VMAddressSpace* to)
98{
99	TRACE("arch_vm_aspace_swap\n");
100}
101
102
103bool
104arch_vm_supports_protection(uint32 protection)
105{
106	// User-RO/Kernel-RW is not possible
107	if ((protection & B_READ_AREA) != 0 && (protection & B_WRITE_AREA) == 0
108		&& (protection & B_KERNEL_WRITE_AREA) != 0) {
109		return false;
110	}
111
112	return true;
113}
114
115
116void
117arch_vm_unset_memory_type(VMArea* area)
118{
119}
120
121
122status_t
123arch_vm_set_memory_type(VMArea* area, phys_addr_t physicalBase, uint32 type)
124{
125	return B_OK;
126}
127