1/*
2 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef KERNEL_ARCH_X86_X86_VM_TRANSLATION_MAP_H
6#define KERNEL_ARCH_X86_X86_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
20struct X86PagingStructures;
21class TranslationMapPhysicalPageMapper;
22
23
24struct X86VMTranslationMap : VMTranslationMap {
25								X86VMTranslationMap();
26	virtual						~X86VMTranslationMap();
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	X86PagingStructures* PagingStructures() const = 0;
38
39	inline	void				InvalidatePage(addr_t address);
40
41protected:
42			TranslationMapPhysicalPageMapper* fPageMapper;
43			int					fInvalidPagesCount;
44			addr_t				fInvalidPages[PAGE_INVALIDATE_CACHE_SIZE];
45			bool				fIsKernelMap;
46};
47
48
49void
50X86VMTranslationMap::InvalidatePage(addr_t address)
51{
52	if (fInvalidPagesCount < PAGE_INVALIDATE_CACHE_SIZE)
53		fInvalidPages[fInvalidPagesCount] = address;
54
55	fInvalidPagesCount++;
56}
57
58
59#endif	// KERNEL_ARCH_X86_X86_VM_TRANSLATION_MAP_H
60