From 1d5afbdffc2ca0262c9ca335c1a30e7b214d13a5 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 28 Oct 2018 09:57:22 +0100 Subject: [PATCH] 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. --- Kernel/Syscall.cpp | 2 ++ Kernel/Syscall.h | 1 + Kernel/Task.cpp | 25 +++++++++++++++++-------- Kernel/Task.h | 1 + LibC/mman.cpp | 6 ++++++ LibC/mman.h | 1 + LibC/stdlib.cpp | 7 +++++++ 7 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index 4bf39c045c..e80bed6601 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -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; diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index 68a36ffd52..1d55e4bd2e 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -34,6 +34,7 @@ enum Function { GetArguments = 0x2002, PosixChdir = 0x2003, PosixUname = 0x2004, + SetMmapName = 0x2005, }; void initialize(); diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index bbec8f0fe5..c08219a957 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -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() == ®ion) { - // 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); diff --git a/Kernel/Task.h b/Kernel/Task.h index c683f50088..99a53a87c5 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -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*); diff --git a/LibC/mman.cpp b/LibC/mman.cpp index 604f3aaf05..53c0b921d6 100644 --- a/LibC/mman.cpp +++ b/LibC/mman.cpp @@ -16,4 +16,10 @@ int munmap(void* addr, size_t size) __RETURN_WITH_ERRNO(rc, rc, -1); } +int set_mmap_name(void* addr, size_t size, const char* name) +{ + int rc = Syscall::invoke(Syscall::SetMmapName, (dword)addr, (dword)size, (dword)name); + __RETURN_WITH_ERRNO(rc, rc, -1); +} + } diff --git a/LibC/mman.h b/LibC/mman.h index fb6f2af844..5c82eef3ef 100644 --- a/LibC/mman.h +++ b/LibC/mman.h @@ -6,5 +6,6 @@ extern "C" { void* mmap(void*, size_t); int munmap(void*, size_t); +int set_mmap_name(void*, size_t, const char*); } diff --git a/LibC/stdlib.cpp b/LibC/stdlib.cpp index 5feceaec5f..8f9758521b 100644 --- a/LibC/stdlib.cpp +++ b/LibC/stdlib.cpp @@ -1,5 +1,6 @@ #include "stdlib.h" #include "mman.h" +#include "stdio.h" #include #include @@ -12,6 +13,12 @@ void* malloc(size_t size) *crashme = 0; } void* ptr = mmap(nullptr, 4096); + if (ptr) { + int rc = set_mmap_name(ptr, 4096, "malloc"); + if (rc < 0) { + perror("set_mmap_name failed"); + } + } return ptr; }