mirror of
https://github.com/RGBCube/serenity
synced 2025-05-30 19:48:12 +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:
parent
e904f193c1
commit
1d5afbdffc
7 changed files with 35 additions and 8 deletions
|
@ -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;
|
||||||
|
|
|
@ -34,6 +34,7 @@ enum Function {
|
||||||
GetArguments = 0x2002,
|
GetArguments = 0x2002,
|
||||||
PosixChdir = 0x2003,
|
PosixChdir = 0x2003,
|
||||||
PosixUname = 0x2004,
|
PosixUname = 0x2004,
|
||||||
|
SetMmapName = 0x2005,
|
||||||
};
|
};
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
|
|
|
@ -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() == ®ion) {
|
if (m_regions[i].ptr() == ®ion) {
|
||||||
// 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);
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue