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