mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-05-30 00:07:59 +00:00
kernel/stack: Fix stack guard expansion
Kernel didn't mapped the pages correctly Signed-off-by: EnderIce2 <enderice2@protonmail.com>
This commit is contained in:
parent
1dbee4660e
commit
cc6ec04814
@ -26,8 +26,7 @@ namespace Memory
|
|||||||
if (!this->UserMode)
|
if (!this->UserMode)
|
||||||
assert(!"Kernel mode stack expansion not implemented");
|
assert(!"Kernel mode stack expansion not implemented");
|
||||||
|
|
||||||
if (FaultAddress < USER_STACK_END ||
|
if (FaultAddress < USER_STACK_END || FaultAddress > USER_STACK_BASE)
|
||||||
FaultAddress > USER_STACK_BASE)
|
|
||||||
{
|
{
|
||||||
info("Fault address %#lx is not in range of stack %#lx - %#lx",
|
info("Fault address %#lx is not in range of stack %#lx - %#lx",
|
||||||
FaultAddress, USER_STACK_END, USER_STACK_BASE);
|
FaultAddress, USER_STACK_END, USER_STACK_BASE);
|
||||||
@ -39,16 +38,16 @@ namespace Memory
|
|||||||
size_t stackPages = TO_PAGES(diff);
|
size_t stackPages = TO_PAGES(diff);
|
||||||
stackPages = stackPages < 1 ? 1 : stackPages;
|
stackPages = stackPages < 1 ? 1 : stackPages;
|
||||||
|
|
||||||
debug("roundFA: %#lx, sb: %#lx, diff: %#lx, stackPages: %d",
|
debug("roundFA: %#lx, StackBottom: %#lx, diff: %#lx, stackPages: %d",
|
||||||
roundFA, this->StackBottom, diff, stackPages);
|
roundFA, this->StackBottom, diff, stackPages);
|
||||||
|
|
||||||
void *AllocatedStack = vma->RequestPages(stackPages);
|
void *pPage = vma->RequestPages(stackPages);
|
||||||
debug("AllocatedStack: %#lx", AllocatedStack);
|
debug("pPage: %#lx", pPage);
|
||||||
|
|
||||||
for (size_t i = 0; i < stackPages; i++)
|
for (size_t i = 1; i < stackPages + 1; i++)
|
||||||
{
|
{
|
||||||
void *vAddress = (void *)((uintptr_t)this->StackBottom - (i * PAGE_SIZE));
|
void *vAddress = (void *)((uintptr_t)this->StackBottom - (i * PAGE_SIZE));
|
||||||
void *pAddress = (void *)((uintptr_t)AllocatedStack + (i * PAGE_SIZE));
|
void *pAddress = (void *)((uintptr_t)pPage + (i * PAGE_SIZE));
|
||||||
|
|
||||||
vma->Map(vAddress, pAddress, PAGE_SIZE, PTFlag::RW | PTFlag::US);
|
vma->Map(vAddress, pAddress, PAGE_SIZE, PTFlag::RW | PTFlag::US);
|
||||||
AllocatedPages ap = {
|
AllocatedPages ap = {
|
||||||
@ -56,11 +55,11 @@ namespace Memory
|
|||||||
.VirtualAddress = vAddress,
|
.VirtualAddress = vAddress,
|
||||||
};
|
};
|
||||||
AllocatedPagesList.push_back(ap);
|
AllocatedPagesList.push_back(ap);
|
||||||
debug("Mapped %#lx to %#lx", pAddress, vAddress);
|
debug("Mapped p:%#lx to v:%#lx", pAddress, vAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->StackBottom = (void *)((uintptr_t)this->StackBottom - (stackPages * PAGE_SIZE));
|
this->StackBottom = (void *)((uintptr_t)this->StackBottom - (stackPages * PAGE_SIZE));
|
||||||
this->Size += stackPages * PAGE_SIZE;
|
this->CurrentSize += stackPages * PAGE_SIZE;
|
||||||
debug("Stack expanded to %#lx", this->StackBottom);
|
debug("Stack expanded to %#lx", this->StackBottom);
|
||||||
this->Expanded = true;
|
this->Expanded = true;
|
||||||
return true;
|
return true;
|
||||||
@ -76,7 +75,7 @@ namespace Memory
|
|||||||
this->StackTop = Parent->StackTop;
|
this->StackTop = Parent->StackTop;
|
||||||
this->StackPhysicalBottom = Parent->StackPhysicalBottom;
|
this->StackPhysicalBottom = Parent->StackPhysicalBottom;
|
||||||
this->StackPhysicalTop = Parent->StackPhysicalTop;
|
this->StackPhysicalTop = Parent->StackPhysicalTop;
|
||||||
this->Size = Parent->Size;
|
this->CurrentSize = Parent->CurrentSize;
|
||||||
this->Expanded = Parent->Expanded;
|
this->Expanded = Parent->Expanded;
|
||||||
|
|
||||||
std::list<AllocatedPages> ParentAllocatedPages = Parent->GetAllocatedPages();
|
std::list<AllocatedPages> ParentAllocatedPages = Parent->GetAllocatedPages();
|
||||||
@ -103,19 +102,19 @@ namespace Memory
|
|||||||
|
|
||||||
if (this->UserMode)
|
if (this->UserMode)
|
||||||
{
|
{
|
||||||
void *AllocatedStack = vma->RequestPages(TO_PAGES(USER_STACK_SIZE));
|
void *pPage = vma->RequestPages(TO_PAGES(USER_STACK_SIZE));
|
||||||
|
debug("pPage: %#lx", pPage);
|
||||||
|
|
||||||
this->StackBottom = (void *)USER_STACK_BASE;
|
this->StackBottom = (void *)USER_STACK_BASE;
|
||||||
this->StackTop = (void *)(USER_STACK_BASE + USER_STACK_SIZE);
|
this->StackTop = (void *)(USER_STACK_BASE + USER_STACK_SIZE);
|
||||||
this->StackPhysicalBottom = AllocatedStack;
|
this->StackPhysicalBottom = pPage;
|
||||||
this->StackPhysicalTop = (void *)((uintptr_t)AllocatedStack + USER_STACK_SIZE);
|
this->StackPhysicalTop = (void *)((uintptr_t)pPage + USER_STACK_SIZE);
|
||||||
this->Size = USER_STACK_SIZE;
|
this->CurrentSize = USER_STACK_SIZE;
|
||||||
|
|
||||||
debug("AllocatedStack: %#lx", AllocatedStack);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < TO_PAGES(USER_STACK_SIZE); i++)
|
for (size_t i = 0; i < TO_PAGES(USER_STACK_SIZE); i++)
|
||||||
{
|
{
|
||||||
void *vAddress = (void *)(USER_STACK_BASE + (i * PAGE_SIZE));
|
void *vAddress = (void *)(USER_STACK_BASE + (i * PAGE_SIZE));
|
||||||
void *pAddress = (void *)((uintptr_t)AllocatedStack + (i * PAGE_SIZE));
|
void *pAddress = (void *)((uintptr_t)pPage + (i * PAGE_SIZE));
|
||||||
vma->Map(vAddress, pAddress, PAGE_SIZE, PTFlag::RW | PTFlag::US);
|
vma->Map(vAddress, pAddress, PAGE_SIZE, PTFlag::RW | PTFlag::US);
|
||||||
|
|
||||||
AllocatedPages ap = {
|
AllocatedPages ap = {
|
||||||
@ -123,7 +122,7 @@ namespace Memory
|
|||||||
.VirtualAddress = vAddress,
|
.VirtualAddress = vAddress,
|
||||||
};
|
};
|
||||||
AllocatedPagesList.push_back(ap);
|
AllocatedPagesList.push_back(ap);
|
||||||
debug("Mapped %#lx to %#lx", pAddress, vAddress);
|
debug("Mapped p:%#lx to v:%#lx", pAddress, vAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -133,7 +132,7 @@ namespace Memory
|
|||||||
this->StackTop = (void *)((uintptr_t)this->StackBottom + LARGE_STACK_SIZE);
|
this->StackTop = (void *)((uintptr_t)this->StackBottom + LARGE_STACK_SIZE);
|
||||||
this->StackPhysicalBottom = sa.PhysicalAddress;
|
this->StackPhysicalBottom = sa.PhysicalAddress;
|
||||||
this->StackPhysicalTop = (void *)((uintptr_t)this->StackPhysicalBottom + LARGE_STACK_SIZE);
|
this->StackPhysicalTop = (void *)((uintptr_t)this->StackPhysicalBottom + LARGE_STACK_SIZE);
|
||||||
this->Size = LARGE_STACK_SIZE;
|
this->CurrentSize = LARGE_STACK_SIZE;
|
||||||
|
|
||||||
debug("StackBottom: %#lx", this->StackBottom);
|
debug("StackBottom: %#lx", this->StackBottom);
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ namespace Memory
|
|||||||
void *StackTop = nullptr;
|
void *StackTop = nullptr;
|
||||||
void *StackPhysicalBottom = nullptr;
|
void *StackPhysicalBottom = nullptr;
|
||||||
void *StackPhysicalTop = nullptr;
|
void *StackPhysicalTop = nullptr;
|
||||||
uint64_t Size = 0;
|
uint64_t CurrentSize = 0;
|
||||||
bool UserMode = false;
|
bool UserMode = false;
|
||||||
bool Expanded = false;
|
bool Expanded = false;
|
||||||
VirtualMemoryArea *vma = nullptr;
|
VirtualMemoryArea *vma = nullptr;
|
||||||
@ -55,7 +55,7 @@ namespace Memory
|
|||||||
void Fork(StackGuard *Parent);
|
void Fork(StackGuard *Parent);
|
||||||
|
|
||||||
/** For general info */
|
/** For general info */
|
||||||
uint64_t GetSize() { return Size; }
|
uint64_t GetSize() { return CurrentSize; }
|
||||||
|
|
||||||
/** For general info */
|
/** For general info */
|
||||||
bool GetUserMode() { return UserMode; }
|
bool GetUserMode() { return UserMode; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user