|
@@ -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);
|