Compare commits

...

2 Commits

Author SHA1 Message Date
49d1e4f011
Revert "mprotect(): Validate the entire range to protect is in userspace memory"
This reverts commit 4ef764e62e.
2023-01-08 15:41:53 +01:00
401a807551
Revert "Update README.md"
This reverts commit 1f4c4f1a0c.
2023-01-08 15:41:39 +01:00
3 changed files with 10 additions and 29 deletions

View File

@ -1,18 +1,6 @@
# Luna
A simple kernel and userspace for the x86_64 platform, written mostly in C++ and C.
## WARNING
This branch is no longer actively updated. I have started rewriting the kernel for three different reasons:
- To switch to CMake, which is a lot more convenient than manually writing Makefiles.
- The code in this branch is so unportable that it doesn't have ANY hope of moving outside x86_64. I wanted to change that.
- To start fresh without my 3-month-old bad code, with a new way of doing things, kind of inspired by my recent adventures with the Rust programming language (it's still C++ though, I found Rust to be too limiting for kernel development).
The code for this rewrite can be found in the [restart](https://git.cloudapio.eu/apio/Luna/src/branch/restart) branch.
The changes in this branch will be merged as soon as the rewrite has reached a level of functionality similar to the `main` branch.
Until then, this version of Luna will stay in the `main` branch, although not actively developed.
## Features
- x86_64-compatible [kernel](kernel/).
- Keeps track of which [memory](kernel/src/memory/) is used and which memory is free, and can allocate memory for itself and [user programs](kernel/src/sys/mem.cpp).

View File

@ -45,10 +45,10 @@ uint64_t Memory::get_usable()
bool Memory::is_kernel_address(uintptr_t address)
{
return address >= 0xffff800000000000;
return address >= 0xfffffffff8000000;
}
bool Memory::is_user_address(uintptr_t address)
{
return address && address < 0x00007fffffffffff;
return address && address < 0xfffffffff8000000;
}

View File

@ -55,9 +55,9 @@ void sys_mmap(Context* context, void* address, size_t size, int prot, int fd, of
if (address)
{
kdbgln("mmap(): %ld pages at address %p, %s, fd %d", size / PAGE_SIZE, address, format_prot(prot), fd);
if (!Memory::is_user_address((uintptr_t)address))
if (Memory::is_kernel_address((uintptr_t)address))
{
kwarnln("mmap() failed: attempted to map a non-user page");
kwarnln("munmap() failed: attempted to unmap a kernel page");
context->rax = MAP_FAIL(ENOMEM);
return;
}
@ -153,9 +153,9 @@ void sys_munmap(Context* context, void* address, size_t size)
context->rax = -EINVAL;
return;
}
if (!Memory::is_user_address((uintptr_t)address))
if (Memory::is_kernel_address((uintptr_t)address))
{
kwarnln("munmap() failed: attempted to unmap a non-user page");
kwarnln("munmap() failed: attempted to unmap a kernel page");
context->rax = -EINVAL;
return;
}
@ -202,19 +202,12 @@ void sys_mprotect(Context* context, void* address, size_t size, int prot)
context->rax = -EINVAL;
return;
}
if (!Memory::is_user_address((uintptr_t)address))
if (Memory::is_kernel_address((uintptr_t)address))
{
kwarnln("mprotect() failed: attempted to protect a non-user page");
kwarnln("mprotect() failed: attempted to protect a kernel page");
context->rax = -EINVAL;
return;
}
// FIXME: Check for overflow when adding address + size.
if (!Memory::is_user_address((uintptr_t)address + size))
{
kwarnln("mprotect() failed: end of given range is out of user memory");
context->rax = -EINVAL;
return;
}
uint64_t flags = VMM::get_flags((uint64_t)address);
if (flags == (uint64_t)-1)
{