Author: bonefish Date: 2010-06-08 23:15:29 +0200 (Tue, 08 Jun 2010) New Revision: 37066 Changeset: http://dev.haiku-os.org/changeset/37066/haiku Added: haiku/trunk/src/system/kernel/arch/x86/paging/pae/ haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.h haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingStructuresPAE.cpp haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingStructuresPAE.h haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.cpp haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.h haiku/trunk/src/system/kernel/arch/x86/paging/pae/paging.h Modified: haiku/trunk/src/system/kernel/arch/x86/Jamfile haiku/trunk/src/system/kernel/arch/x86/arch_vm_translation_map.cpp Log: Skeleton classes for PAE support. Modified: haiku/trunk/src/system/kernel/arch/x86/Jamfile =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/Jamfile 2010-06-08 21:07:38 UTC (rev 37065) +++ haiku/trunk/src/system/kernel/arch/x86/Jamfile 2010-06-08 21:15:29 UTC (rev 37066) @@ -10,6 +10,7 @@ SEARCH_SOURCE += [ FDirName $(SUBDIR) paging ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) paging 32bit ] ; +SEARCH_SOURCE += [ FDirName $(SUBDIR) paging pae ] ; SEARCH_SOURCE += [ FDirName $(SUBDIR) timers ] ; @@ -54,6 +55,12 @@ X86PagingStructures32Bit.cpp X86VMTranslationMap32Bit.cpp + # paging/pae + X86PagingMethodPAE.cpp + X86PagingStructuresPAE.cpp + X86VMTranslationMapPAE.cpp + + # timers x86_apic.cpp x86_hpet.cpp x86_pit.cpp Modified: haiku/trunk/src/system/kernel/arch/x86/arch_vm_translation_map.cpp =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/arch_vm_translation_map.cpp 2010-06-08 21:07:38 UTC (rev 37065) +++ haiku/trunk/src/system/kernel/arch/x86/arch_vm_translation_map.cpp 2010-06-08 21:15:29 UTC (rev 37066) @@ -11,6 +11,7 @@ #include <arch/vm_translation_map.h> #include "paging/32bit/X86PagingMethod32Bit.h" +#include "paging/pae/X86PagingMethodPAE.h" //#define TRACE_VM_TMAP @@ -24,6 +25,9 @@ static union { uint64 align; char thirty_two[sizeof(X86PagingMethod32Bit)]; +#if B_HAIKU_PHYSICAL_BITS == 64 + char pae[sizeof(X86PagingMethodPAE)]; +#endif } sPagingMethodBuffer; @@ -68,7 +72,12 @@ } #endif - gX86PagingMethod = new(&sPagingMethodBuffer) X86PagingMethod32Bit; +#if B_HAIKU_PHYSICAL_BITS == 64 + if (true /* TODO: If needed! */) + gX86PagingMethod = new(&sPagingMethodBuffer) X86PagingMethodPAE; + else +#endif + gX86PagingMethod = new(&sPagingMethodBuffer) X86PagingMethod32Bit; return gX86PagingMethod->Init(args, _physicalPageMapper); } Added: haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp (rev 0) +++ haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp 2010-06-08 21:15:29 UTC (rev 37066) @@ -0,0 +1,167 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "paging/pae/X86PagingMethodPAE.h" + +#include <stdlib.h> +#include <string.h> + +#include "paging/pae/X86PagingStructuresPAE.h" +#include "paging/pae/X86VMTranslationMapPAE.h" +#include "paging/x86_physical_page_mapper.h" +#include "paging/x86_physical_page_mapper_large_memory.h" + + +//#define TRACE_X86_PAGING_METHOD_PAE +#ifdef TRACE_X86_PAGING_METHOD_PAE +# define TRACE(x...) dprintf(x) +#else +# define TRACE(x...) ; +#endif + + +#if B_HAIKU_PHYSICAL_BITS == 64 + + +using X86LargePhysicalPageMapper::PhysicalPageSlot; + + +// #pragma mark - X86PagingMethodPAE::PhysicalPageSlotPool + + +struct X86PagingMethodPAE::PhysicalPageSlotPool + : X86LargePhysicalPageMapper::PhysicalPageSlotPool { +public: + virtual ~PhysicalPageSlotPool(); + + status_t InitInitial(kernel_args* args); + status_t InitInitialPostArea(kernel_args* args); + + virtual status_t AllocatePool( + X86LargePhysicalPageMapper + ::PhysicalPageSlotPool*& _pool); + virtual void Map(phys_addr_t physicalAddress, + addr_t virtualAddress); + +public: + static PhysicalPageSlotPool sInitialPhysicalPagePool; + +private: +}; + + +X86PagingMethodPAE::PhysicalPageSlotPool + X86PagingMethodPAE::PhysicalPageSlotPool::sInitialPhysicalPagePool; + + +X86PagingMethodPAE::PhysicalPageSlotPool::~PhysicalPageSlotPool() +{ +} + + +status_t +X86PagingMethodPAE::PhysicalPageSlotPool::InitInitial(kernel_args* args) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +status_t +X86PagingMethodPAE::PhysicalPageSlotPool::InitInitialPostArea( + kernel_args* args) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +void +X86PagingMethodPAE::PhysicalPageSlotPool::Map(phys_addr_t physicalAddress, + addr_t virtualAddress) +{ +// TODO: Implement! + panic("unsupported"); +} + + +status_t +X86PagingMethodPAE::PhysicalPageSlotPool::AllocatePool( + X86LargePhysicalPageMapper::PhysicalPageSlotPool*& _pool) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +// #pragma mark - X86PagingMethodPAE + + +X86PagingMethodPAE::X86PagingMethodPAE() + : + fPhysicalPageMapper(NULL), + fKernelPhysicalPageMapper(NULL) +{ +} + + +X86PagingMethodPAE::~X86PagingMethodPAE() +{ +} + + +status_t +X86PagingMethodPAE::Init(kernel_args* args, + VMPhysicalPageMapper** _physicalPageMapper) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +status_t +X86PagingMethodPAE::InitPostArea(kernel_args* args) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +status_t +X86PagingMethodPAE::CreateTranslationMap(bool kernel, VMTranslationMap** _map) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +status_t +X86PagingMethodPAE::MapEarly(kernel_args* args, addr_t virtualAddress, + phys_addr_t physicalAddress, uint8 attributes, + phys_addr_t (*get_free_page)(kernel_args*)) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +bool +X86PagingMethodPAE::IsKernelPageAccessible(addr_t virtualAddress, + uint32 protection) +{ +// TODO: Implement! + return false; +} + + +#endif // B_HAIKU_PHYSICAL_BITS == 64 Added: haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.h =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.h (rev 0) +++ haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.h 2010-06-08 21:15:29 UTC (rev 37066) @@ -0,0 +1,69 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef KERNEL_ARCH_X86_PAGING_PAE_X86_PAGING_METHOD_PAE_H +#define KERNEL_ARCH_X86_PAGING_PAE_X86_PAGING_METHOD_PAE_H + + +#include "paging/pae/paging.h" +#include "paging/X86PagingMethod.h" +#include "paging/X86PagingStructures.h" + + +#if B_HAIKU_PHYSICAL_BITS == 64 + + +class TranslationMapPhysicalPageMapper; +class X86PhysicalPageMapper; + + +class X86PagingMethodPAE : public X86PagingMethod { +public: + X86PagingMethodPAE(); + virtual ~X86PagingMethodPAE(); + + virtual status_t Init(kernel_args* args, + VMPhysicalPageMapper** _physicalPageMapper); + virtual status_t InitPostArea(kernel_args* args); + + virtual status_t CreateTranslationMap(bool kernel, + VMTranslationMap** _map); + + virtual status_t MapEarly(kernel_args* args, + addr_t virtualAddress, + phys_addr_t physicalAddress, + uint8 attributes, + phys_addr_t (*get_free_page)(kernel_args*)); + + virtual bool IsKernelPageAccessible(addr_t virtualAddress, + uint32 protection); + + inline X86PhysicalPageMapper* PhysicalPageMapper() const + { return fPhysicalPageMapper; } + inline TranslationMapPhysicalPageMapper* KernelPhysicalPageMapper() const + { return fKernelPhysicalPageMapper; } + + static X86PagingMethodPAE* Method(); + +private: + struct PhysicalPageSlotPool; + friend struct PhysicalPageSlotPool; + +private: + X86PhysicalPageMapper* fPhysicalPageMapper; + TranslationMapPhysicalPageMapper* fKernelPhysicalPageMapper; +}; + + +/*static*/ inline X86PagingMethodPAE* +X86PagingMethodPAE::Method() +{ + return static_cast<X86PagingMethodPAE*>(gX86PagingMethod); +} + + +#endif // B_HAIKU_PHYSICAL_BITS == 64 + + +#endif // KERNEL_ARCH_X86_PAGING_PAE_X86_PAGING_METHOD_PAE_H Added: haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingStructuresPAE.cpp =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingStructuresPAE.cpp (rev 0) +++ haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingStructuresPAE.cpp 2010-06-08 21:15:29 UTC (rev 37066) @@ -0,0 +1,49 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "paging/pae/X86PagingStructuresPAE.h" + +#include <KernelExport.h> + + +#if B_HAIKU_PHYSICAL_BITS == 64 + + +X86PagingStructuresPAE::X86PagingStructuresPAE() +{ +} + + +X86PagingStructuresPAE::~X86PagingStructuresPAE() +{ +} + + +void +X86PagingStructuresPAE::Init() +{ +// TODO: Implement! + panic("unsupported"); +} + + +void +X86PagingStructuresPAE::Delete() +{ +// TODO: Implement! + panic("unsupported"); +} + + +/*static*/ void +X86PagingStructuresPAE::StaticInit() +{ +// TODO: Implement! + panic("unsupported"); +} + + +#endif // B_HAIKU_PHYSICAL_BITS == 64 Added: haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingStructuresPAE.h =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingStructuresPAE.h (rev 0) +++ haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86PagingStructuresPAE.h 2010-06-08 21:15:29 UTC (rev 37066) @@ -0,0 +1,31 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef KERNEL_ARCH_X86_PAGING_PAE_X86_PAGING_STRUCTURES_PAE_H +#define KERNEL_ARCH_X86_PAGING_PAE_X86_PAGING_STRUCTURES_PAE_H + + +#include "paging/pae/paging.h" +#include "paging/X86PagingStructures.h" + + +#if B_HAIKU_PHYSICAL_BITS == 64 + + +struct X86PagingStructuresPAE : X86PagingStructures { + X86PagingStructuresPAE(); + virtual ~X86PagingStructuresPAE(); + + void Init(); + + virtual void Delete(); + + static void StaticInit(); +}; + + +#endif // B_HAIKU_PHYSICAL_BITS == 64 + + +#endif // KERNEL_ARCH_X86_PAGING_PAE_X86_PAGING_STRUCTURES_PAE_H Added: haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.cpp =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.cpp (rev 0) +++ haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.cpp 2010-06-08 21:15:29 UTC (rev 37066) @@ -0,0 +1,169 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "paging/pae/X86VMTranslationMapPAE.h" + +#include <vm/VMAddressSpace.h> +#include <vm/VMCache.h> + +#include "paging/pae/X86PagingMethodPAE.h" +#include "paging/pae/X86PagingStructuresPAE.h" +#include "paging/x86_physical_page_mapper.h" + + +//#define TRACE_X86_VM_TRANSLATION_MAP_PAE +#ifdef TRACE_X86_VM_TRANSLATION_MAP_PAE +# define TRACE(x...) dprintf(x) +#else +# define TRACE(x...) ; +#endif + + +#if B_HAIKU_PHYSICAL_BITS == 64 + + +X86VMTranslationMapPAE::X86VMTranslationMapPAE() + : + fPagingStructures(NULL) +{ +} + + +X86VMTranslationMapPAE::~X86VMTranslationMapPAE() +{ +// TODO: Implement! +} + + +status_t +X86VMTranslationMapPAE::Init(bool kernel) +{ + TRACE("X86VMTranslationMapPAE::Init()\n"); + + X86VMTranslationMap::Init(kernel); + +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +size_t +X86VMTranslationMapPAE::MaxPagesNeededToMap(addr_t start, addr_t end) const +{ +// TODO: Implement! + panic("unsupported"); + return 0; +} + + +status_t +X86VMTranslationMapPAE::Map(addr_t va, phys_addr_t pa, uint32 attributes, + uint32 memoryType, vm_page_reservation* reservation) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +status_t +X86VMTranslationMapPAE::Unmap(addr_t start, addr_t end) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +/*! Caller must have locked the cache of the page to be unmapped. + This object shouldn't be locked. +*/ +status_t +X86VMTranslationMapPAE::UnmapPage(VMArea* area, addr_t address, + bool updatePageQueue) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +void +X86VMTranslationMapPAE::UnmapPages(VMArea* area, addr_t base, size_t size, + bool updatePageQueue) +{ +// TODO: Implement! + panic("unsupported"); +} + + +void +X86VMTranslationMapPAE::UnmapArea(VMArea* area, bool deletingAddressSpace, + bool ignoreTopCachePageFlags) +{ +// TODO: Implement! + panic("unsupported"); +} + + +status_t +X86VMTranslationMapPAE::Query(addr_t va, phys_addr_t *_physical, + uint32 *_flags) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +status_t +X86VMTranslationMapPAE::QueryInterrupt(addr_t va, phys_addr_t *_physical, + uint32 *_flags) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +status_t +X86VMTranslationMapPAE::Protect(addr_t start, addr_t end, uint32 attributes, + uint32 memoryType) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +status_t +X86VMTranslationMapPAE::ClearFlags(addr_t va, uint32 flags) +{ +// TODO: Implement! + panic("unsupported"); + return B_UNSUPPORTED; +} + + +bool +X86VMTranslationMapPAE::ClearAccessedAndModified(VMArea* area, addr_t address, + bool unmapIfUnaccessed, bool& _modified) +{ +// TODO: Implement! + panic("unsupported"); + return false; +} + + +X86PagingStructures* +X86VMTranslationMapPAE::PagingStructures() const +{ + return fPagingStructures; +} + + +#endif // B_HAIKU_PHYSICAL_BITS == 64 Added: haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.h =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.h (rev 0) +++ haiku/trunk/src/system/kernel/arch/x86/paging/pae/X86VMTranslationMapPAE.h 2010-06-08 21:15:29 UTC (rev 37066) @@ -0,0 +1,71 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef KERNEL_ARCH_X86_PAGING_PAE_X86_VM_TRANSLATION_MAP_PAE_H +#define KERNEL_ARCH_X86_PAGING_PAE_X86_VM_TRANSLATION_MAP_PAE_H + + +#include "paging/X86VMTranslationMap.h" + + +#if B_HAIKU_PHYSICAL_BITS == 64 + + +struct X86PagingStructuresPAE; + + +struct X86VMTranslationMapPAE : X86VMTranslationMap { + X86VMTranslationMapPAE(); + virtual ~X86VMTranslationMapPAE(); + + status_t Init(bool kernel); + + virtual size_t MaxPagesNeededToMap(addr_t start, + addr_t end) const; + + virtual status_t Map(addr_t virtualAddress, + phys_addr_t physicalAddress, + uint32 attributes, uint32 memoryType, + vm_page_reservation* reservation); + virtual status_t Unmap(addr_t start, addr_t end); + + virtual status_t UnmapPage(VMArea* area, addr_t address, + bool updatePageQueue); + virtual void UnmapPages(VMArea* area, addr_t base, + size_t size, bool updatePageQueue); + virtual void UnmapArea(VMArea* area, + bool deletingAddressSpace, + bool ignoreTopCachePageFlags); + + virtual status_t Query(addr_t virtualAddress, + phys_addr_t* _physicalAddress, + uint32* _flags); + virtual status_t QueryInterrupt(addr_t virtualAddress, + phys_addr_t* _physicalAddress, + uint32* _flags); + + virtual status_t Protect(addr_t base, addr_t top, + uint32 attributes, uint32 memoryType); + + virtual status_t ClearFlags(addr_t virtualAddress, + uint32 flags); + + virtual bool ClearAccessedAndModified( + VMArea* area, addr_t address, + bool unmapIfUnaccessed, + bool& _modified); + + virtual X86PagingStructures* PagingStructures() const; + inline X86PagingStructuresPAE* PagingStructuresPAE() const + { return fPagingStructures; } + +private: + X86PagingStructuresPAE* fPagingStructures; +}; + + +#endif // B_HAIKU_PHYSICAL_BITS == 64 + + +#endif // KERNEL_ARCH_X86_PAGING_PAE_X86_VM_TRANSLATION_MAP_PAE_H Added: haiku/trunk/src/system/kernel/arch/x86/paging/pae/paging.h =================================================================== --- haiku/trunk/src/system/kernel/arch/x86/paging/pae/paging.h (rev 0) +++ haiku/trunk/src/system/kernel/arch/x86/paging/pae/paging.h 2010-06-08 21:15:29 UTC (rev 37066) @@ -0,0 +1,21 @@ +/* + * Copyright 2010, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef KERNEL_ARCH_X86_PAGING_PAE_PAGING_H +#define KERNEL_ARCH_X86_PAGING_PAE_PAGING_H + + +#include <SupportDefs.h> + + +#if B_HAIKU_PHYSICAL_BITS == 64 + + +// TODO:... + + +#endif // B_HAIKU_PHYSICAL_BITS == 64 + + +#endif // KERNEL_ARCH_X86_PAGING_PAE_PAGING_H