* Copyright 2008-2010, Ingo Weinhold, ingo_weinhold@gmx.de.
* Copyright 2002-2007, Axel DΓΆrfler, axeld@pinc-software.de. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/
#include "paging/classic/PPCPagingStructuresClassic.h"
#include <stdlib.h>
#include <heap.h>
#include <util/AutoLock.h>
struct PagingStructuresGetLink {
private:
typedef SinglyLinkedListLink<PPCPagingStructuresClassic> Link;
public:
inline Link* operator()(PPCPagingStructuresClassic* element) const
{
return (Link*)element->GetSinglyLinkedListLink();
}
inline const Link* operator()(
const PPCPagingStructuresClassic* element) const
{
return (const Link*)element->GetSinglyLinkedListLink();
}
};
typedef SinglyLinkedList<PPCPagingStructuresClassic, PagingStructuresGetLink>
PagingStructuresList;
static PagingStructuresList sPagingStructuresList;
static spinlock sPagingStructuresListLock;
PPCPagingStructuresClassic::PPCPagingStructuresClassic()
pgdir_virt(NULL)*/
{
}
PPCPagingStructuresClassic::~PPCPagingStructuresClassic()
{
#if 0
free(pgdir_virt);
#endif
}
void
PPCPagingStructuresClassic::Init(
phys_addr_t physicalPageDir, page_directory_entry* kernelPageDir*/
page_table_entry_group *pageTable)
{
#if 0
memset(pgdir_virt + FIRST_USER_PGDIR_ENT, 0,
NUM_USER_PGDIR_ENTS * sizeof(page_directory_entry));
#endif
{
int state = disable_interrupts();
acquire_spinlock(&sPagingStructuresListLock);
#if 0
if (kernelPageDir != NULL) {
memcpy(pgdir_virt + FIRST_KERNEL_PGDIR_ENT,
kernelPageDir + FIRST_KERNEL_PGDIR_ENT,
NUM_KERNEL_PGDIR_ENTS * sizeof(page_directory_entry));
}
#endif
sPagingStructuresList.Add(this);
release_spinlock(&sPagingStructuresListLock);
restore_interrupts(state);
}
}
void
PPCPagingStructuresClassic::Delete()
{
InterruptsSpinLocker locker(sPagingStructuresListLock);
sPagingStructuresList.Remove(this);
locker.Unlock();
#if 0
uint32 activePageDirectory = x86_read_cr3();
if (activePageDirectory == pgdir_phys)
panic("deleting a still active page directory\n");
#endif
if (are_interrupts_enabled())
delete this;
else
deferred_delete(this);
}
void
PPCPagingStructuresClassic::StaticInit()
{
B_INITIALIZE_SPINLOCK(&sPagingStructuresListLock);
new (&sPagingStructuresList) PagingStructuresList;
}
void
PPCPagingStructuresClassic::UpdateAllPageDirs(int index,
page_table_entry_group entry)
{
InterruptsSpinLocker locker(sPagingStructuresListLock);
#if 0
PagingStructuresList::Iterator it = sPagingStructuresList.GetIterator();
while (PPCPagingStructuresClassic* info = it.Next())
info->pgdir_virt[index] = entry;
#endif
}