Update kernel

This commit is contained in:
Alex
2023-06-10 13:11:25 +03:00
parent dcdba03426
commit 41db477173
82 changed files with 6342 additions and 4079 deletions

View File

@ -441,7 +441,10 @@ void *malloc(size_t Size)
break;
}
default:
throw;
{
error("Unknown allocator type %d", AllocatorType);
CPU::Stop();
}
}
#ifdef DEBUG
if (EnableExternalMemoryTracer)
@ -494,7 +497,10 @@ void *calloc(size_t n, size_t Size)
return ret;
}
default:
throw;
{
error("Unknown allocator type %d", AllocatorType);
CPU::Stop();
}
}
#ifdef DEBUG
if (EnableExternalMemoryTracer)
@ -547,7 +553,10 @@ void *realloc(void *Address, size_t Size)
return ret;
}
default:
throw;
{
error("Unknown allocator type %d", AllocatorType);
CPU::Stop();
}
}
#ifdef DEBUG
if (EnableExternalMemoryTracer)
@ -598,7 +607,10 @@ void free(void *Address)
break;
}
default:
throw;
{
error("Unknown allocator type %d", AllocatorType);
CPU::Stop();
}
}
#ifdef DEBUG
if (EnableExternalMemoryTracer)

View File

@ -26,11 +26,14 @@ namespace Memory
{
if (!Size)
Size = node->Length;
if (Offset > node->Length)
if ((size_t)node->Offset > node->Length)
return 0;
if (Offset + Size > node->Length)
Size = node->Length - Offset;
memcpy(Buffer, (uint8_t *)(node->Address + Offset), Size);
if (node->Offset + Size > node->Length)
Size = node->Length - node->Offset;
memcpy(Buffer, (uint8_t *)(node->Address + node->Offset), Size);
return Size;
}
@ -38,53 +41,21 @@ namespace Memory
{
if (!Size)
Size = node->Length;
if (Offset > node->Length)
if ((size_t)node->Offset > node->Length)
return 0;
if (Offset + Size > node->Length)
Size = node->Length - Offset;
memcpy((uint8_t *)(node->Address + Offset), Buffer, Size);
if (node->Offset + Size > node->Length)
Size = node->Length - node->Offset;
memcpy((uint8_t *)(node->Address + node->Offset), Buffer, Size);
return Size;
}
SeekFSFunction(MEM_Seek)
{
long NewOffset;
if (Whence == SEEK_SET)
{
if (Offset > node->Length)
return -1;
node->Offset = Offset;
NewOffset = (long)node->Offset;
}
else if (Whence == SEEK_CUR)
{
NewOffset = (long)(node->Offset + Offset);
if ((size_t)NewOffset > node->Length || NewOffset < 0)
return -1;
node->Offset = NewOffset;
}
else if (Whence == SEEK_END)
{
NewOffset = node->Length + Offset;
if (NewOffset < 0)
return -1;
node->Offset = NewOffset;
}
else
{
error("Invalid whence!");
return -1;
}
return NewOffset;
}
VirtualFileSystem::FileSystemOperations mem_op = {
.Name = "mem",
.Read = MEM_Read,
.Write = MEM_Write,
.Seek = MEM_Seek,
};
uint64_t MemMgr::GetAllocatedMemorySize()
@ -160,7 +131,10 @@ namespace Memory
if (User)
Flags |= Memory::PTFlag::US;
Memory::Virtual(this->Table).Remap((void *)((uintptr_t)Address + (i * PAGE_SIZE)), (void *)((uint64_t)Address + (i * PAGE_SIZE)), Flags);
void *AddressToMap = (void *)((uintptr_t)Address + (i * PAGE_SIZE));
Memory::Virtual vmm = Memory::Virtual(this->Table);
vmm.Remap(AddressToMap, AddressToMap, Flags);
}
if (this->Directory)
@ -206,10 +180,12 @@ namespace Memory
KernelAllocator.FreePages(Address, Count);
Memory::Virtual vmm = Memory::Virtual(this->Table);
for (size_t i = 0; i < Count; i++)
{
Memory::Virtual(this->Table).Remap((void *)((uintptr_t)Address + (i * PAGE_SIZE)), (void *)((uint64_t)Address + (i * PAGE_SIZE)), Memory::PTFlag::RW);
// Memory::Virtual(this->Table).Unmap((void *)((uintptr_t)Address + (i * PAGE_SIZE)));
void *AddressToMap = (void *)((uintptr_t)Address + (i * PAGE_SIZE));
vmm.Remap(AddressToMap, AddressToMap, Memory::PTFlag::RW);
// vmm.Unmap((void *)((uintptr_t)Address + (i * PAGE_SIZE)));
}
if (this->Directory)
@ -270,8 +246,11 @@ namespace Memory
foreach (auto ap in AllocatedPagesList)
{
KernelAllocator.FreePages(ap.Address, ap.PageCount);
Memory::Virtual vmm = Memory::Virtual(this->Table);
for (size_t i = 0; i < ap.PageCount; i++)
Memory::Virtual(this->Table).Remap((void *)((uintptr_t)ap.Address + (i * PAGE_SIZE)), (void *)((uintptr_t)ap.Address + (i * PAGE_SIZE)), Memory::PTFlag::RW);
vmm.Remap((void *)((uintptr_t)ap.Address + (i * PAGE_SIZE)),
(void *)((uintptr_t)ap.Address + (i * PAGE_SIZE)),
Memory::PTFlag::RW);
}
if (this->Directory)

View File

@ -120,6 +120,13 @@ namespace Memory
return (void *)(PageBitmapIndex * PAGE_SIZE);
}
if (TaskManager && !TaskManager->IsPanic())
{
error("Out of memory! Killing current process...");
TaskManager->KillProcess(TaskManager->GetCurrentProcess(), Tasking::KILL_OOM);
TaskManager->Schedule();
}
error("Out of memory! (Free: %ldMB; Used: %ldMB; Reserved: %ldMB)", TO_MB(FreeMemory), TO_MB(UsedMemory), TO_MB(ReservedMemory));
CPU::Stop();
__builtin_unreachable();
@ -180,6 +187,13 @@ namespace Memory
return (void *)(PageBitmapIndex * PAGE_SIZE);
}
if (TaskManager && !TaskManager->IsPanic())
{
error("Out of memory! Killing current process...");
TaskManager->KillProcess(TaskManager->GetCurrentProcess(), Tasking::KILL_OOM);
TaskManager->Schedule();
}
error("Out of memory! (Free: %ldMB; Used: %ldMB; Reserved: %ldMB)", TO_MB(FreeMemory), TO_MB(UsedMemory), TO_MB(ReservedMemory));
CPU::Halt(true);
__builtin_unreachable();