xref: /haiku/src/system/kernel/vm/VMKernelAddressSpace.h (revision fc75f2df0c666dcc61be83c4facdd3132340c2fb)
1 /*
2  * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef VM_KERNEL_ADDRESS_SPACE_H
6 #define VM_KERNEL_ADDRESS_SPACE_H
7 
8 
9 #include <vm/VMAddressSpace.h>
10 
11 #include "VMKernelArea.h"
12 
13 
14 struct ObjectCache;
15 
16 
17 struct VMKernelAddressSpace : VMAddressSpace {
18 public:
19 								VMKernelAddressSpace(team_id id, addr_t base,
20 									size_t size);
21 	virtual						~VMKernelAddressSpace();
22 
23 	virtual	status_t			InitObject();
24 
25 	virtual	VMArea*				FirstArea() const;
26 	virtual	VMArea*				NextArea(VMArea* area) const;
27 
28 	virtual	VMArea*				LookupArea(addr_t address) const;
29 	virtual	VMArea*				CreateArea(const char* name, uint32 wiring,
30 									uint32 protection, uint32 allocationFlags);
31 	virtual	void				DeleteArea(VMArea* area,
32 									uint32 allocationFlags);
33 	virtual	status_t			InsertArea(VMArea* area, size_t size,
34 									const virtual_address_restrictions*
35 										addressRestrictions,
36 									uint32 allocationFlags, void** _address);
37 	virtual	void				RemoveArea(VMArea* area,
38 									uint32 allocationFlags);
39 
40 	virtual	bool				CanResizeArea(VMArea* area, size_t newSize);
41 	virtual	status_t			ResizeArea(VMArea* area, size_t newSize,
42 									uint32 allocationFlags);
43 	virtual	status_t			ShrinkAreaHead(VMArea* area, size_t newSize,
44 									uint32 allocationFlags);
45 	virtual	status_t			ShrinkAreaTail(VMArea* area, size_t newSize,
46 									uint32 allocationFlags);
47 
48 	virtual	status_t			ReserveAddressRange(size_t size,
49 									const virtual_address_restrictions*
50 										addressRestrictions,
51 									uint32 flags, uint32 allocationFlags,
52 									void** _address);
53 	virtual	status_t			UnreserveAddressRange(addr_t address,
54 									size_t size, uint32 allocationFlags);
55 	virtual	void				UnreserveAllAddressRanges(
56 									uint32 allocationFlags);
57 
58 	virtual	void				Dump() const;
59 
60 private:
61 			typedef VMKernelAddressRange Range;
62 			typedef VMKernelAddressRangeTree RangeTree;
63 			typedef DoublyLinkedList<Range,
64 				DoublyLinkedListMemberGetLink<Range, &Range::listLink> >
65 					RangeList;
66 			typedef DoublyLinkedList<Range, VMKernelAddressRangeGetFreeListLink>
67 				RangeFreeList;
68 
69 private:
70 	inline	void				_FreeListInsertRange(Range* range, size_t size);
71 	inline	void				_FreeListRemoveRange(Range* range, size_t size);
72 
73 			void				_InsertRange(Range* range);
74 			void				_RemoveRange(Range* range);
75 
76 			status_t			_AllocateRange(
77 									const virtual_address_restrictions*
78 										addressRestrictions,
79 									size_t size, bool allowReservedRange,
80 									uint32 allocationFlags, Range*& _range);
81 			Range*				_FindFreeRange(addr_t start, size_t size,
82 									size_t alignment, uint32 addressSpec,
83 									bool allowReservedRange,
84 									addr_t& _foundAddress);
85 			void				_FreeRange(Range* range,
86 									uint32 allocationFlags);
87 
88 			void				_CheckStructures() const;
89 
90 private:
91 			RangeTree			fRangeTree;
92 			RangeList			fRangeList;
93 			RangeFreeList*		fFreeLists;
94 			int					fFreeListCount;
95 			ObjectCache*		fAreaObjectCache;
96 			ObjectCache*		fRangesObjectCache;
97 };
98 
99 
100 #endif	/* VM_KERNEL_ADDRESS_SPACE_H */
101