1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:37:35 +00:00

Add sys$set_mmap_name and use it from LibC's malloc.

It's nice to be able to identify mmap's in /proc/PID/vm.
This commit is contained in:
Andreas Kling 2018-10-28 09:57:22 +01:00
parent e904f193c1
commit 1d5afbdffc
7 changed files with 35 additions and 8 deletions

View file

@ -114,6 +114,8 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3)
return current->sys$chdir((const char*)arg1);
case Syscall::PosixUname:
return current->sys$uname((utsname*)arg1);
case Syscall::SetMmapName:
return current->sys$set_mmap_name((void*)arg1, (size_t)arg2, (const char*)arg3);
default:
kprintf("int0x80: Unknown function %x requested {%x, %x, %x}\n", function, arg1, arg2, arg3);
break;

View file

@ -34,6 +34,7 @@ enum Function {
GetArguments = 0x2002,
PosixChdir = 0x2003,
PosixUname = 0x2004,
SetMmapName = 0x2005,
};
void initialize();

View file

@ -18,6 +18,13 @@
//#define DEBUG_IO
//#define TASK_DEBUG
#define VALIDATE_USER_BUFFER(b, s) \
do { \
LinearAddress laddr((dword)(b)); \
if (!isValidAddressForUser(laddr) || !isValidAddressForUser(laddr.offset((s) - 1))) \
return -EFAULT; \
} while(0)
static const DWORD defaultStackSize = 16384;
Task* current;
@ -145,7 +152,6 @@ bool Task::deallocateRegion(Region& region)
InterruptDisabler disabler;
for (size_t i = 0; i < m_regions.size(); ++i) {
if (m_regions[i].ptr() == &region) {
// FIXME: This seems racy.
MM.unmapRegion(*this, region);
m_regions.remove(i);
return true;
@ -163,6 +169,16 @@ Task::Region* Task::regionFromRange(LinearAddress laddr, size_t size)
return nullptr;
}
int Task::sys$set_mmap_name(void* addr, size_t size, const char* name)
{
VALIDATE_USER_BUFFER(name, strlen(name));
auto* region = regionFromRange(LinearAddress((dword)addr), size);
if (!region)
return -EINVAL;
region->name = name;
return 0;
}
void* Task::sys$mmap(void* addr, size_t size)
{
// FIXME: Implement mapping at a client-preferred address.
@ -184,13 +200,6 @@ int Task::sys$munmap(void* addr, size_t size)
return 0;
}
#define VALIDATE_USER_BUFFER(b, s) \
do { \
LinearAddress laddr((dword)(b)); \
if (!isValidAddressForUser(laddr) || !isValidAddressForUser(laddr.offset((s) - 1))) \
return -EFAULT; \
} while(0)
int Task::sys$gethostname(char* buffer, size_t size)
{
VALIDATE_USER_BUFFER(buffer, size);

View file

@ -98,6 +98,7 @@ public:
pid_t sys$waitpid(pid_t, int* wstatus, int options);
void* sys$mmap(void*, size_t size);
int sys$munmap(void*, size_t size);
int sys$set_mmap_name(void*, size_t, const char*);
int sys$get_dir_entries(int fd, void*, size_t);
int sys$getcwd(char*, size_t);
int sys$chdir(const char*);