Compare commits
6 Commits
4fbc6b9027
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 1674c8dbb2 | |||
| 538904b7e4 | |||
| 58e99b046d | |||
| 55f755e7d9 | |||
| 1c6ece7b55 | |||
| 70e990a885 |
+1
-1
Submodule kernel updated: bc575aa1a1...278fe39c0d
@@ -25,6 +25,21 @@ static vm_prot_t vm_prot_from_mmap_prot(int prot)
|
|||||||
return vm_prot;
|
return vm_prot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static vm_flags_t vm_flags_from_mmap_flags(int flags)
|
||||||
|
{
|
||||||
|
vm_flags_t out = 0;
|
||||||
|
|
||||||
|
if (flags & MAP_PRIVATE) {
|
||||||
|
out |= VM_PRIVATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & (MAP_SHARED | MAP_SHARED_VALIDATE)) {
|
||||||
|
out |= VM_SHARED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
static int get_vmo_anon(
|
static int get_vmo_anon(
|
||||||
int fd,
|
int fd,
|
||||||
int prot,
|
int prot,
|
||||||
@@ -109,6 +124,7 @@ void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
|
|||||||
kern_status_t status = KERN_OK;
|
kern_status_t status = KERN_OK;
|
||||||
kern_handle_t self = KERN_HANDLE_INVALID,
|
kern_handle_t self = KERN_HANDLE_INVALID,
|
||||||
address_space = KERN_HANDLE_INVALID;
|
address_space = KERN_HANDLE_INVALID;
|
||||||
|
vm_flags_t vm_flags = vm_flags_from_mmap_flags(flags);
|
||||||
|
|
||||||
status = task_self(&self);
|
status = task_self(&self);
|
||||||
if (status != KERN_OK) {
|
if (status != KERN_OK) {
|
||||||
@@ -146,6 +162,7 @@ void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
|
|||||||
vmo,
|
vmo,
|
||||||
offset,
|
offset,
|
||||||
length,
|
length,
|
||||||
|
vm_flags,
|
||||||
vm_prot,
|
vm_prot,
|
||||||
&map_address);
|
&map_address);
|
||||||
} else {
|
} else {
|
||||||
@@ -155,6 +172,7 @@ void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
|
|||||||
vmo,
|
vmo,
|
||||||
offset,
|
offset,
|
||||||
length,
|
length,
|
||||||
|
vm_flags,
|
||||||
vm_prot,
|
vm_prot,
|
||||||
&map_address);
|
&map_address);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ static kern_status_t expand_heap(heap_t *heap)
|
|||||||
vmo,
|
vmo,
|
||||||
0,
|
0,
|
||||||
HEAP_EXPAND_INCREMENT,
|
HEAP_EXPAND_INCREMENT,
|
||||||
|
VM_PRIVATE,
|
||||||
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
|
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
|
||||||
&base);
|
&base);
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ struct fs_context *fs_context_create(struct fs_allocator *alloc)
|
|||||||
ctx->ctx_temp_object,
|
ctx->ctx_temp_object,
|
||||||
0,
|
0,
|
||||||
TEMP_OBJECT_SIZE,
|
TEMP_OBJECT_SIZE,
|
||||||
|
VM_PRIVATE,
|
||||||
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
|
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
|
||||||
&temp_buffer);
|
&temp_buffer);
|
||||||
kern_handle_close(address_space);
|
kern_handle_close(address_space);
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
#include <mango/handle.h>
|
#include <mango/handle.h>
|
||||||
#include <mango/log.h>
|
#include <mango/log.h>
|
||||||
#include <mango/vm.h>
|
#include <mango/vm.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
static int create_file_mapping(
|
static int create_file_mapping(
|
||||||
|
|||||||
+7
-3
@@ -233,13 +233,15 @@ static enum launch_status map_executable(struct elf_image *image)
|
|||||||
|
|
||||||
kern_handle_t vmo = image->e_image;
|
kern_handle_t vmo = image->e_image;
|
||||||
vm_prot_t prot = VM_PROT_USER;
|
vm_prot_t prot = VM_PROT_USER;
|
||||||
|
vm_flags_t flags = VM_SHARED;
|
||||||
size_t offset = phdr.p_offset;
|
size_t offset = phdr.p_offset;
|
||||||
|
|
||||||
phdr.p_flags &PF_R && (prot |= VM_PROT_READ);
|
phdr.p_flags & PF_R && (prot |= VM_PROT_READ);
|
||||||
phdr.p_flags &PF_W && (prot |= VM_PROT_WRITE);
|
phdr.p_flags & PF_W && (prot |= VM_PROT_WRITE);
|
||||||
phdr.p_flags &PF_X && (prot |= VM_PROT_EXEC);
|
phdr.p_flags & PF_X && (prot |= VM_PROT_EXEC);
|
||||||
if (phdr.p_flags & PF_W) {
|
if (phdr.p_flags & PF_W) {
|
||||||
vmo = image->e_data;
|
vmo = image->e_data;
|
||||||
|
flags = VM_PRIVATE;
|
||||||
offset = data_offset;
|
offset = data_offset;
|
||||||
size_t tmp = 0;
|
size_t tmp = 0;
|
||||||
|
|
||||||
@@ -267,6 +269,7 @@ static enum launch_status map_executable(struct elf_image *image)
|
|||||||
vmo,
|
vmo,
|
||||||
offset,
|
offset,
|
||||||
phdr.p_memsz,
|
phdr.p_memsz,
|
||||||
|
flags,
|
||||||
prot,
|
prot,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
@@ -282,6 +285,7 @@ static enum launch_status map_executable(struct elf_image *image)
|
|||||||
vmo,
|
vmo,
|
||||||
offset,
|
offset,
|
||||||
phdr.p_memsz,
|
phdr.p_memsz,
|
||||||
|
flags,
|
||||||
prot,
|
prot,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ enum launch_status launch_ctx_execute(
|
|||||||
stack_vmo,
|
stack_vmo,
|
||||||
0,
|
0,
|
||||||
STACK_SIZE,
|
STACK_SIZE,
|
||||||
|
VM_PRIVATE,
|
||||||
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
|
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
|
||||||
&remote_stack_buf);
|
&remote_stack_buf);
|
||||||
kstatus = address_space_map(
|
kstatus = address_space_map(
|
||||||
@@ -191,6 +192,7 @@ enum launch_status launch_ctx_execute(
|
|||||||
stack_vmo,
|
stack_vmo,
|
||||||
0,
|
0,
|
||||||
STACK_SIZE,
|
STACK_SIZE,
|
||||||
|
VM_PRIVATE,
|
||||||
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
|
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER,
|
||||||
&local_stack_buf);
|
&local_stack_buf);
|
||||||
kern_handle_close(stack_vmo);
|
kern_handle_close(stack_vmo);
|
||||||
|
|||||||
+1
-1
@@ -147,7 +147,7 @@ static int map_image(struct elf_image *image)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int fd = image->e_fd;
|
int fd = image->e_fd;
|
||||||
int flags = MAP_PRIVATE | MAP_EXECUTABLE | MAP_FIXED;
|
int flags = MAP_SHARED | MAP_EXECUTABLE | MAP_FIXED;
|
||||||
|
|
||||||
if (phdr.p_flags & PF_W) {
|
if (phdr.p_flags & PF_W) {
|
||||||
fd = -1;
|
fd = -1;
|
||||||
|
|||||||
Reference in New Issue
Block a user