mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Fixes to memory management that helps me sleep at night.
This commit is contained in:
parent
c16bdd2604
commit
1b7dc2d817
2 changed files with 7 additions and 34 deletions
|
@ -35,15 +35,6 @@ namespace Sortix
|
|||
{
|
||||
namespace ELF
|
||||
{
|
||||
// This works around an optimizer bug I ran into, where the memcpy below
|
||||
// somehow gets executed prior to the memory was mapped. Somehow, when I
|
||||
// tried to debug it, it suddenly worked. So here's some deep magic that
|
||||
// somehow fixes my code.
|
||||
void PreventHazardousCodeReordering()
|
||||
{
|
||||
Log::Print("");
|
||||
}
|
||||
|
||||
addr_t Construct32(Process* process, const void* file, size_t filelen)
|
||||
{
|
||||
if ( filelen < sizeof(Header32) ) { return 0; }
|
||||
|
@ -70,6 +61,10 @@ namespace Sortix
|
|||
// Reset the current address space.
|
||||
process->ResetAddressSpace();
|
||||
|
||||
// Flush the TLB such that no stale information from the last
|
||||
// address space is used when creating the new one.
|
||||
Memory::Flush();
|
||||
|
||||
// Create all the segments in the final process.
|
||||
// TODO: Handle errors on bad/malicious input or out-of-mem!
|
||||
for ( uint16_t i = 0; i < numprogheaders; i++ )
|
||||
|
@ -105,8 +100,6 @@ namespace Sortix
|
|||
segment->next = process->segments;
|
||||
process->segments = segment;
|
||||
|
||||
PreventHazardousCodeReordering();
|
||||
|
||||
// Copy as much data as possible and memset the rest to 0.
|
||||
byte* memdest = (byte*) virtualaddr;
|
||||
byte* memsource = (byte*) ( ((addr_t)file) + pht->offset);
|
||||
|
|
|
@ -425,20 +425,10 @@ namespace Sortix
|
|||
|
||||
while ( positionstack[TOPPMLLEVEL] < ENTRIES )
|
||||
{
|
||||
if ( level == 1 )
|
||||
{
|
||||
//Log::PrintF("[%zu > %zu]", positionstack[2], positionstack[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Log::PrintF("[%zu]", positionstack[2]);
|
||||
}
|
||||
|
||||
const size_t pos = positionstack[level];
|
||||
|
||||
if ( pos == ENTRIES )
|
||||
{
|
||||
//Log::PrintF(" done with level\n");
|
||||
(positionstack[++level])++;
|
||||
pmloffset /= ENTRIES;
|
||||
continue;
|
||||
|
@ -454,7 +444,6 @@ namespace Sortix
|
|||
|
||||
if ( unlikely(phys == 0) )
|
||||
{
|
||||
//Log::PrintF(" out of memory!\n");
|
||||
// Oh no. Out of memory! We'll have to undo everything
|
||||
// we just did. Argh!
|
||||
failure = true;
|
||||
|
@ -472,8 +461,6 @@ namespace Sortix
|
|||
|
||||
if ( level == 1 )
|
||||
{
|
||||
//Log::PrintF(" copy\n");
|
||||
|
||||
// Determine the source page's address.
|
||||
const void* src = (const void*) (pmloffset * 4096UL);
|
||||
|
||||
|
@ -484,8 +471,6 @@ namespace Sortix
|
|||
}
|
||||
else
|
||||
{
|
||||
//Log::PrintF(" recurse\n");
|
||||
|
||||
// Fork the PML recursively!
|
||||
pmloffset = pmloffset * ENTRIES + pos;
|
||||
positionstack[--level] = 0;
|
||||
|
@ -496,15 +481,12 @@ namespace Sortix
|
|||
// If this entry should be linked, link it.
|
||||
else
|
||||
{
|
||||
//Log::PrintF(" link\n");
|
||||
FORKPML[level].entry[pos] = entry;
|
||||
}
|
||||
|
||||
positionstack[level]++;
|
||||
}
|
||||
|
||||
//Log::PrintF("Fork: Loop Terminated\n");
|
||||
|
||||
if ( !failure )
|
||||
{
|
||||
// Now, the new top pml needs to have its fractal memory fixed.
|
||||
|
@ -524,8 +506,6 @@ namespace Sortix
|
|||
childaddr = (FORKPML + i)->entry[ENTRIES-2] & PML_ADDRESS;
|
||||
}
|
||||
|
||||
//Log::PrintF("Fork: Done\n");
|
||||
|
||||
return newtoppmladdr;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue