diff --git a/include/syscalls.h b/include/syscalls.h index efd1e8b..ab6b8fd 100644 --- a/include/syscalls.h +++ b/include/syscalls.h @@ -32,6 +32,10 @@ size_t mmap(syscall_arg_t location, syscall_arg_t length, syscall_arg_t flags); size_t munmap(syscall_arg_t location, syscall_arg_t length); +size_t map_physical(syscall_arg_t arg_addr, syscall_arg_t arg_phys_addr, syscall_arg_t arg_length); + +size_t unmap_physical(syscall_arg_t arg_addr, syscall_arg_t arg_length); + size_t terminate_self(); size_t send(syscall_arg_t recipient, syscall_arg_t message, syscall_arg_t flags); diff --git a/include/types/syscallarg.h b/include/types/syscallarg.h index b1a49c8..b83d5c8 100644 --- a/include/types/syscallarg.h +++ b/include/types/syscallarg.h @@ -6,6 +6,7 @@ typedef union long int signed_int; unsigned long int unsigned_int; void *ptr; + char *str; } syscall_arg_t; #endif \ No newline at end of file diff --git a/include/types/syscallid.h b/include/types/syscallid.h index b04b0e3..030e54c 100644 --- a/include/types/syscallid.h +++ b/include/types/syscallid.h @@ -6,6 +6,8 @@ typedef enum SYSCALL_TEST = 1, SYSCALL_MMAP, SYSCALL_MUNMAP, + SYSCALL_MAP_PHYS, + SYSCALL_UNMAP_PHYS, SYSCALL_YIELD, SYSCALL_EXIT, SYSCALL_SEND, diff --git a/src/kernel.c b/src/kernel.c index c630715..9fd46c8 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -41,8 +41,6 @@ void kernel_initialize(struct boot_info_t *boot_info) panic("Failed to initialize page allocator."); } - printf("End of page map: %08x\n", page_map_end); - if(kminit(page_map_end(), 0xFFC00000 - (size_t)page_map_end())) { panic("Failed to initialize heap."); @@ -60,6 +58,8 @@ void kernel_initialize(struct boot_info_t *boot_info) set_syscall(SYSCALL_TEST, 1, 0, test_syscall); set_syscall(SYSCALL_MMAP, 3, 0, mmap); set_syscall(SYSCALL_MUNMAP, 2, 0, munmap); + set_syscall(SYSCALL_MAP_PHYS, 3, 0, map_physical); + set_syscall(SYSCALL_UNMAP_PHYS, 2, 0, unmap_physical); set_syscall(SYSCALL_SEND, 3, 0, send); set_syscall(SYSCALL_RECEIVE, 2, 0, receive); set_syscall(SYSCALL_OPEN_PORT, 1, 0, open_port); diff --git a/src/syscalls.c b/src/syscalls.c index 297e871..8963727 100644 --- a/src/syscalls.c +++ b/src/syscalls.c @@ -88,6 +88,39 @@ size_t munmap(syscall_arg_t arg_location, syscall_arg_t arg_length) return status; } +size_t map_physical(syscall_arg_t arg_addr, syscall_arg_t arg_phys_addr, syscall_arg_t arg_length) +{ + void *addr = arg_addr.ptr; + physaddr_t frame = arg_phys_addr.unsigned_int; + unsigned long length = arg_length.unsigned_int; + int status = ENONE; + for(unsigned long offset = 0; offset < length; offset += page_size) + { + status = map_page(addr + offset, frame + offset, PAGE_USERMODE | PAGE_RW); + if(status) + { + break; + } + } + return status; +} + +size_t unmap_physical(syscall_arg_t arg_addr, syscall_arg_t arg_length) +{ + void *addr = arg_addr.ptr; + unsigned long length = arg_length.unsigned_int; + int status = ENONE; + for(unsigned long offset = 0; offset < length; offset += page_size) + { + status = unmap_page(addr + offset); + if(status != ENONE) + { + break; + } + } + return status; +} + size_t terminate_self() { return kernel_terminate_process(kernel_current_pid());