浏览代码

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.
Andreas Kling 6 年之前
父节点
当前提交
1d5afbdffc
共有 7 个文件被更改,包括 35 次插入8 次删除
  1. 2 0
      Kernel/Syscall.cpp
  2. 1 0
      Kernel/Syscall.h
  3. 17 8
      Kernel/Task.cpp
  4. 1 0
      Kernel/Task.h
  5. 6 0
      LibC/mman.cpp
  6. 1 0
      LibC/mman.h
  7. 7 0
      LibC/stdlib.cpp

+ 2 - 0
Kernel/Syscall.cpp

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

+ 1 - 0
Kernel/Syscall.h

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

+ 17 - 8
Kernel/Task.cpp

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

+ 1 - 0
Kernel/Task.h

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

+ 6 - 0
LibC/mman.cpp

@@ -16,4 +16,10 @@ int munmap(void* addr, size_t size)
     __RETURN_WITH_ERRNO(rc, rc, -1);
     __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);
+}
+
 }
 }

+ 1 - 0
LibC/mman.h

@@ -6,5 +6,6 @@ extern "C" {
 
 
 void* mmap(void*, size_t);
 void* mmap(void*, size_t);
 int munmap(void*, size_t);
 int munmap(void*, size_t);
+int set_mmap_name(void*, size_t, const char*);
 
 
 }
 }

+ 7 - 0
LibC/stdlib.cpp

@@ -1,5 +1,6 @@
 #include "stdlib.h"
 #include "stdlib.h"
 #include "mman.h"
 #include "mman.h"
+#include "stdio.h"
 #include <Kernel/Syscall.h>
 #include <Kernel/Syscall.h>
 #include <AK/Assertions.h>
 #include <AK/Assertions.h>
 
 
@@ -12,6 +13,12 @@ void* malloc(size_t size)
         *crashme = 0;
         *crashme = 0;
     }
     }
     void* ptr = mmap(nullptr, 4096);
     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;
     return ptr;
 }
 }