summaryrefslogtreecommitdiffhomepage
path: root/Kernel/NewKit/PageManager.hpp
blob: 22e6701ef9d02fcd439d54f857b09c53c1a36e7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// a way to create and find our pages.
// I'm thinking about a separate way of getting a paged area.

/* -------------------------------------------

	Copyright SoftwareLabs

------------------------------------------- */

#pragma once

#include <NewKit/Defines.hpp>
#include <NewKit/PageAllocator.hpp>
#include <NewKit/Ref.hpp>

#ifndef kBadAddress
#define kBadAddress (0)
#endif // #ifndef kBadAddress

namespace NewOS
{
	class PageManager;

	class PTEWrapper final
	{
	public:
		explicit PTEWrapper(Boolean Rw = false, Boolean User = false, Boolean ExecDisable = false, UIntPtr Address = 0);

		~PTEWrapper();

		PTEWrapper& operator=(const PTEWrapper&) = default;
		PTEWrapper(const PTEWrapper&)			 = default;

	public:
		const UIntPtr VirtualAddress();

		void		NoExecute(const bool enable = false);
		const bool& NoExecute();

		bool Reclaim();
		bool Shareable();
		bool Present();
		bool Access();

	private:
		Boolean fRw;
		Boolean fUser;
		Boolean fExecDisable;
		UIntPtr fVirtAddr;
		Boolean fCache;
		Boolean fShareable;
		Boolean fWt;
		Boolean fPresent;
		Boolean fAccessed;

	private:
		friend class PageManager;
		friend class Pmm;
	};

	struct PageManager final
	{
	public:
		PageManager()  = default;
		~PageManager() = default;

		PageManager& operator=(const PageManager&) = default;
		PageManager(const PageManager&)			   = default;

	public:
		PTEWrapper Request(Boolean Rw, Boolean User, Boolean ExecDisable, SizeT Sz);
		bool	   Free(Ref<PTEWrapper*>& wrapper);

	private:
		void FlushTLB(UIntPtr VirtAddr);

	private:
		friend PTEWrapper;
		friend class Pmm;
	};
} // namespace NewOS