Added syscalls to map to particular physical address
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -6,6 +6,7 @@ typedef union
|
||||
long int signed_int;
|
||||
unsigned long int unsigned_int;
|
||||
void *ptr;
|
||||
char *str;
|
||||
} syscall_arg_t;
|
||||
|
||||
#endif
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user