Added syscalls to map to particular physical address

This commit is contained in:
2023-09-02 21:50:35 -05:00
parent 75b7e08e96
commit 29a528780b
5 changed files with 42 additions and 2 deletions

View File

@@ -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 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 terminate_self();
size_t send(syscall_arg_t recipient, syscall_arg_t message, syscall_arg_t flags); size_t send(syscall_arg_t recipient, syscall_arg_t message, syscall_arg_t flags);

View File

@@ -6,6 +6,7 @@ typedef union
long int signed_int; long int signed_int;
unsigned long int unsigned_int; unsigned long int unsigned_int;
void *ptr; void *ptr;
char *str;
} syscall_arg_t; } syscall_arg_t;
#endif #endif

View File

@@ -6,6 +6,8 @@ typedef enum
SYSCALL_TEST = 1, SYSCALL_TEST = 1,
SYSCALL_MMAP, SYSCALL_MMAP,
SYSCALL_MUNMAP, SYSCALL_MUNMAP,
SYSCALL_MAP_PHYS,
SYSCALL_UNMAP_PHYS,
SYSCALL_YIELD, SYSCALL_YIELD,
SYSCALL_EXIT, SYSCALL_EXIT,
SYSCALL_SEND, SYSCALL_SEND,

View File

@@ -41,8 +41,6 @@ void kernel_initialize(struct boot_info_t *boot_info)
panic("Failed to initialize page allocator."); 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())) if(kminit(page_map_end(), 0xFFC00000 - (size_t)page_map_end()))
{ {
panic("Failed to initialize heap."); 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_TEST, 1, 0, test_syscall);
set_syscall(SYSCALL_MMAP, 3, 0, mmap); set_syscall(SYSCALL_MMAP, 3, 0, mmap);
set_syscall(SYSCALL_MUNMAP, 2, 0, munmap); 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_SEND, 3, 0, send);
set_syscall(SYSCALL_RECEIVE, 2, 0, receive); set_syscall(SYSCALL_RECEIVE, 2, 0, receive);
set_syscall(SYSCALL_OPEN_PORT, 1, 0, open_port); set_syscall(SYSCALL_OPEN_PORT, 1, 0, open_port);

View File

@@ -88,6 +88,39 @@ size_t munmap(syscall_arg_t arg_location, syscall_arg_t arg_length)
return status; 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() size_t terminate_self()
{ {
return kernel_terminate_process(kernel_current_pid()); return kernel_terminate_process(kernel_current_pid());