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 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);
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
Reference in New Issue
Block a user