Phoenix
Object-oriented orthogonally persistent operating system
|
00001 /* 00002 * /phoenix/kernel/sys/vm_mm.h 00003 * 00004 * This file is a part of Phoenix operating system. 00005 * Copyright (c) 2011-2012, Artyom Lebedev <artyom.lebedev@gmail.com> 00006 * All rights reserved. 00007 * See COPYING file for copyright details. 00008 */ 00009 00014 #ifndef VM_MM_H_ 00015 #define VM_MM_H_ 00016 00017 #include <vm_page.h> 00018 00019 namespace vm { 00020 00022 class QuickMap { 00023 public: 00024 enum { 00026 MAX_PAGES = 64, 00027 }; 00028 00038 QuickMap(Vaddr mapBase, size_t numPages, void **mapPte); 00039 ~QuickMap(); 00040 00047 Vaddr Map(Paddr pa, long flags = LAT_EF_PRESENT | LAT_EF_WRITE); 00048 00053 void Unmap(Vaddr va); 00054 00055 private: 00056 BitString<MAX_PAGES> _mapped; 00057 Vaddr _mapBase; 00058 size_t _numPages; 00059 void **_mapPte; 00060 }; 00061 00063 class MM { 00064 public: 00066 enum InitState { 00070 IS_INITIAL, 00074 IS_PREINITIALIZED, 00078 IS_INITIALIZING, 00082 IS_INITIALIZED, 00083 }; 00084 00086 static inline InitState GetInitState() { return MM::_initState; } 00087 00098 static void PreInitialize(vaddr_t heap, 00099 paddr_t defaultLatRoot, 00100 vaddr_t quickMap, 00101 void **quickMapPte); 00102 00110 static void Initialize(void *memMap, 00111 size_t memMapNumDesc, 00112 size_t memMapDescSize, 00113 u32 memMapDescVersion); 00114 00122 inline Vaddr PhysToVirt(Paddr pa) { 00123 ASSERT(pa >= _physFirst && pa < _physFirst + _physRange); 00124 pa -= _physFirst; 00125 return _physMemMap + pa.IdentityVaddr(); 00126 } 00127 00133 inline Page &GetPage(Paddr pa) { 00134 ASSERT(pa >= _physFirst && pa < _physFirst + _physRange); 00135 return _pageDesc[(pa - _physFirst) / PAGE_SIZE]; 00136 } 00137 00138 inline bool IsPageManaged(Paddr pa) { 00139 if (pa < _physFirst || pa >= _physFirst + _physRange) { 00140 return false; 00141 } 00142 Page &page = GetPage(pa); 00143 return page.GetFlags() & Page::F_MANAGED; 00144 } 00145 00146 private: 00147 friend class Page; 00148 00149 static InitState _initState; 00150 00158 MM(void *memMap, size_t memMapNumDesc, size_t memMapDescSize, 00159 u32 memMapDescVersion); 00160 00162 QuickMap _quickMap; 00163 00165 Vaddr _physMemMap; 00167 Paddr _physFirst; 00169 psize_t _physRange; 00171 Page *_pageDesc; 00172 00174 psize_t _physMemSize; 00175 00177 Paddr _initialStart; 00179 Paddr _initialEnd; 00180 00182 Paddr _defLatRoot; 00183 00192 void _InitializePhysMem(void *memMap, size_t memMapNumDesc, 00193 size_t memMapDescSize, u32 memMapDescVersion); 00194 }; 00195 00197 extern MM *mm; 00198 00199 } /* namespace vm */ 00200 00201 #endif /* VM_MM_H_ */