xref: /haiku/src/system/kernel/arch/arm/paging/ARMVMTranslationMap.h (revision 13581b3d2a71545960b98fefebc5225b5bf29072)
1 /*
2  * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef KERNEL_ARCH_ARM_ARM_VM_TRANSLATION_MAP_H
6 #define KERNEL_ARCH_ARM_ARM_VM_TRANSLATION_MAP_H
7 
8 
9 #include <vm/VMTranslationMap.h>
10 
11 
12 #if __GNUC__ < 4
13 #define final
14 #endif
15 
16 
17 #define PAGE_INVALIDATE_CACHE_SIZE 64
18 
19 
20 struct ARMPagingStructures;
21 class TranslationMapPhysicalPageMapper;
22 
23 
24 struct ARMVMTranslationMap : VMTranslationMap {
25 								ARMVMTranslationMap();
26 	virtual						~ARMVMTranslationMap();
27 
28 			status_t			Init(bool kernel);
29 
30 	virtual	bool 				Lock() final;
31 	virtual	void				Unlock() final;
32 
33 	virtual	addr_t				MappedSize() const final;
34 
35 	virtual	void				Flush() final;
36 
37 	virtual	ARMPagingStructures* PagingStructures() const = 0;
38 
39 	inline	void				InvalidatePage(addr_t address);
40 
41 	virtual	status_t			SetFlags(addr_t virtualAddress, uint32 flags) = 0;
42 
43 protected:
44 			TranslationMapPhysicalPageMapper* fPageMapper;
45 			int					fInvalidPagesCount;
46 			addr_t				fInvalidPages[PAGE_INVALIDATE_CACHE_SIZE];
47 			bool				fIsKernelMap;
48 };
49 
50 
51 void
52 ARMVMTranslationMap::InvalidatePage(addr_t address)
53 {
54 	if (fInvalidPagesCount < PAGE_INVALIDATE_CACHE_SIZE)
55 		fInvalidPages[fInvalidPagesCount] = address;
56 
57 	fInvalidPagesCount++;
58 }
59 
60 
61 #endif	// KERNEL_ARCH_ARM_ARM_VM_TRANSLATION_MAP_H
62