1/* 2 * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include "paging/pae/X86PagingStructuresPAE.h" 8 9#include <stdlib.h> 10#include <string.h> 11 12#include <KernelExport.h> 13 14#include <int.h> 15 16#include "paging/pae/X86PagingMethodPAE.h" 17 18 19#if B_HAIKU_PHYSICAL_BITS == 64 20 21 22X86PagingStructuresPAE::X86PagingStructuresPAE() 23 : 24 fPageDirPointerTable(NULL) 25{ 26 memset(fVirtualPageDirs, 0, sizeof(fVirtualPageDirs)); 27} 28 29 30X86PagingStructuresPAE::~X86PagingStructuresPAE() 31{ 32 // free the user page dirs 33 free(fVirtualPageDirs[0]); 34 // There's one contiguous allocation for 0 and 1. 35 36 // free the PDPT page 37 if (fPageDirPointerTable != NULL) { 38 X86PagingMethodPAE::Method()->Free32BitPage(fPageDirPointerTable, 39 pgdir_phys, fPageDirPointerTableHandle); 40 } 41} 42 43 44void 45X86PagingStructuresPAE::Init( 46 pae_page_directory_pointer_table_entry* virtualPDPT, 47 phys_addr_t physicalPDPT, void* pdptHandle, 48 pae_page_directory_entry* const* virtualPageDirs, 49 const phys_addr_t* physicalPageDirs) 50{ 51 fPageDirPointerTable = virtualPDPT; 52 pgdir_phys = physicalPDPT; 53 fPageDirPointerTableHandle = pdptHandle; 54 memcpy(fVirtualPageDirs, virtualPageDirs, sizeof(fVirtualPageDirs)); 55 memcpy(fPhysicalPageDirs, physicalPageDirs, sizeof(fPhysicalPageDirs)); 56} 57 58 59void 60X86PagingStructuresPAE::Delete() 61{ 62 if (are_interrupts_enabled()) 63 delete this; 64 else 65 deferred_delete(this); 66} 67 68 69#endif // B_HAIKU_PHYSICAL_BITS == 64 70