Improvements to the address space switching function.
It now only switches when needed and returns the old addr space.
This commit is contained in:
parent
66c058fba1
commit
90ebfe7f0a
|
@ -226,7 +226,7 @@ namespace Sortix
|
||||||
Table* BootstrapCreateTable(Dir* dir, addr_t where);
|
Table* BootstrapCreateTable(Dir* dir, addr_t where);
|
||||||
void BootstrapMap(Dir* dir, addr_t where, addr_t physical);
|
void BootstrapMap(Dir* dir, addr_t where, addr_t physical);
|
||||||
void BootstrapMapStructures(Dir* dir);
|
void BootstrapMapStructures(Dir* dir);
|
||||||
void SwitchDirectory(addr_t dir);
|
addr_t SwitchDirectory(addr_t dir);
|
||||||
addr_t CreateDirectory();
|
addr_t CreateDirectory();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -356,16 +356,21 @@ namespace Sortix
|
||||||
return CreateDirectory();
|
return CreateDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchAddressSpace(addr_t addrspace)
|
addr_t SwitchAddressSpace(addr_t addrspace)
|
||||||
{
|
{
|
||||||
return SwitchDirectory(addrspace);
|
return SwitchDirectory(addrspace);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchDirectory(addr_t dir)
|
addr_t SwitchDirectory(addr_t dir)
|
||||||
{
|
{
|
||||||
|
// Don't switch if we are already there.
|
||||||
|
if ( dir == currentDirPhysical ) { return currentDirPhysical; }
|
||||||
|
|
||||||
|
addr_t previous = currentDirPhysical;
|
||||||
asm volatile("mov %0, %%cr3":: "r"(dir));
|
asm volatile("mov %0, %%cr3":: "r"(dir));
|
||||||
currentDirPhysical = dir;
|
currentDirPhysical = dir;
|
||||||
Flush();
|
Flush();
|
||||||
|
return previous;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr_t CreateDirectory()
|
addr_t CreateDirectory()
|
||||||
|
|
|
@ -41,7 +41,7 @@ namespace Sortix
|
||||||
void Init();
|
void Init();
|
||||||
void Flush();
|
void Flush();
|
||||||
addr_t CreateAddressSpace();
|
addr_t CreateAddressSpace();
|
||||||
void SwitchAddressSpace(addr_t addrspace);
|
addr_t SwitchAddressSpace(addr_t addrspace);
|
||||||
void MapKernel(addr_t where, addr_t physical);
|
void MapKernel(addr_t where, addr_t physical);
|
||||||
bool MapUser(addr_t where, addr_t physical);
|
bool MapUser(addr_t where, addr_t physical);
|
||||||
addr_t UnmapKernel(addr_t where);
|
addr_t UnmapKernel(addr_t where);
|
||||||
|
|
Loading…
Reference in New Issue