feature (syscalls): implemented syscalls (nx_fdelete, nx_flist)
This commit is contained in:
parent
2fa608ac41
commit
e3d3faf8e0
|
@ -57,11 +57,9 @@ void kmain(boot_info_T boot_info) {
|
||||||
|
|
||||||
log(LOG_INFO, "!=====[ Kernel Initialized ]=====!\n");
|
log(LOG_INFO, "!=====[ Kernel Initialized ]=====!\n");
|
||||||
|
|
||||||
file_descriptor_t fd;
|
|
||||||
syscall_perform(SYSCALL_FILES_OPEN, (uint64_t)"/initrd/test.txt", &fd, 0, 0);
|
|
||||||
syscall_perform(SYSCALL_FILES_WRITE, fd, 0, "Write test", 10);
|
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
syscall_perform(SYSCALL_FILES_READ, fd, 0, (uint64_t)buffer, 64);
|
uint32_t needed_mem = 0;
|
||||||
|
syscall_perform(SYSCALL_FILES_LIST, (uint64_t)"/initrd/", 0, buffer, &needed_mem);
|
||||||
memory_hexdump(buffer, 64);
|
memory_hexdump(buffer, 64);
|
||||||
|
|
||||||
// vfs_node_T* node = vfs_resolve_path(&g_root_fs, "/initrd/test.elf");
|
// vfs_node_T* node = vfs_resolve_path(&g_root_fs, "/initrd/test.elf");
|
||||||
|
|
|
@ -3,52 +3,103 @@
|
||||||
#include "platform/syscall.h"
|
#include "platform/syscall.h"
|
||||||
#include "utils/logger.h"
|
#include "utils/logger.h"
|
||||||
#include "utils/panic.h"
|
#include "utils/panic.h"
|
||||||
|
#include "utils/memory.h"
|
||||||
#include "proc/scheduler.h"
|
#include "proc/scheduler.h"
|
||||||
#include "drivers/fs/vfs.h"
|
#include "drivers/fs/vfs.h"
|
||||||
|
|
||||||
void syscall_handle_nx_fopen(cpu_state_T* state) {
|
void syscall_handle_nx_fopen(cpu_state_T* state) {
|
||||||
uint64_t arg1 = state->rdi;
|
string_t path = (string_t)state->rdi; // arg1
|
||||||
uint64_t arg2 = state->rsi;
|
uint64_t len = state->rsi; // arg2
|
||||||
|
file_descriptor_t* fd_ptr = (file_descriptor_t*)state->rdx; // arg3
|
||||||
|
|
||||||
vfs_node_T *node = vfs_resolve_path(&g_root_fs, (string_t) arg1);
|
vfs_node_T *node = vfs_resolve_path(&g_root_fs, path);
|
||||||
if (node == NULL) {
|
if (node == NULL) {
|
||||||
state->rax = STATUS_RESOURCE_NOT_AVAILABLE;
|
state->rax = STATUS_RESOURCE_NOT_AVAILABLE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*(file_descriptor_t*)(arg2) = file_descriptor_request(scheduler_get_current_process()->fd_array, node);
|
*fd_ptr = file_descriptor_request(scheduler_get_current_process()->fd_array, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syscall_handle_nx_fclose(cpu_state_T* state) {
|
void syscall_handle_nx_fclose(cpu_state_T* state) {
|
||||||
uint64_t arg1 = state->rdi;
|
file_descriptor_t fd = (file_descriptor_t)state->rdi; // arg1
|
||||||
|
|
||||||
file_descriptor_free(scheduler_get_current_process()->fd_array, (file_descriptor_t)arg1);
|
file_descriptor_free(scheduler_get_current_process()->fd_array, fd);
|
||||||
|
|
||||||
state->rax = STATUS_SUCCESS;
|
state->rax = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void syscall_handle_nx_fread(cpu_state_T* state) {
|
void syscall_handle_nx_fread(cpu_state_T* state) {
|
||||||
uint64_t arg1 = state->rdi;
|
file_descriptor_t fd = (file_descriptor_t)state->rdi; // arg1
|
||||||
uint64_t arg2 = state->rsi;
|
uint64_t offset = state->rsi; // arg2
|
||||||
uint64_t arg3 = state->rdx;
|
uint8_t* mem = (uint8_t*)state->rdx; // arg3
|
||||||
uint64_t arg4 = state->rcx;
|
uint64_t n = state->rcx; // arg4
|
||||||
|
|
||||||
vfs_node_T* node = file_descriptor_resolve(scheduler_get_current_process()->fd_array, (file_descriptor_t)arg1);
|
vfs_node_T* node = file_descriptor_resolve(scheduler_get_current_process()->fd_array, fd);
|
||||||
|
|
||||||
vfs_file_read(node, arg2, arg4, (uint8_t*)arg3);
|
vfs_file_read(node, offset, n, mem);
|
||||||
|
|
||||||
state->rax = STATUS_SUCCESS;
|
state->rax = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void syscall_handle_nx_fwrite(cpu_state_T* state) {
|
void syscall_handle_nx_fwrite(cpu_state_T* state) {
|
||||||
uint64_t arg1 = state->rdi;
|
file_descriptor_t fd = (file_descriptor_t)state->rdi; // arg1
|
||||||
uint64_t arg2 = state->rsi;
|
uint64_t offset = state->rsi; // arg2
|
||||||
uint64_t arg3 = state->rdx;
|
uint8_t* mem = (uint8_t*)state->rdx; // arg3
|
||||||
uint64_t arg4 = state->rcx;
|
uint64_t n = state->rcx; // arg4
|
||||||
|
|
||||||
vfs_node_T* node = file_descriptor_resolve(scheduler_get_current_process()->fd_array, (file_descriptor_t)arg1);
|
vfs_node_T* node = file_descriptor_resolve(scheduler_get_current_process()->fd_array, fd);
|
||||||
|
|
||||||
vfs_file_write(node, arg2, arg4, (uint8_t*)arg3);
|
vfs_file_write(node, offset, n, mem);
|
||||||
|
|
||||||
|
state->rax = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void syscall_handle_nx_fdelete(cpu_state_T* state) {
|
||||||
|
string_t path = (string_t)state->rdi; // arg1
|
||||||
|
string_t len = (string_t)state->rsi; // arg2
|
||||||
|
|
||||||
|
vfs_node_T* node = vfs_resolve_path(&g_root_fs, path);
|
||||||
|
if (node == NULL) {
|
||||||
|
state->rax = STATUS_RESOURCE_NOT_AVAILABLE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vfs_node_delete(node);
|
||||||
|
|
||||||
|
state->rax = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void syscall_handle_nx_flist(cpu_state_T* state) {
|
||||||
|
string_t path = (string_t)state->rdi; // arg1
|
||||||
|
uint64_t len = state->rsi; // arg2
|
||||||
|
uint8_t* mem = (uint8_t*)state->rdx; // arg3
|
||||||
|
uint32_t* needed_mem = (uint32_t*)state->rcx; // arg4
|
||||||
|
|
||||||
|
vfs_node_T* node = vfs_resolve_path(&g_root_fs, path);
|
||||||
|
if (node == NULL) {
|
||||||
|
state->rax = STATUS_RESOURCE_NOT_AVAILABLE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t position = 0;
|
||||||
|
|
||||||
|
vfs_node_T* child = node->childs;
|
||||||
|
while (child != NULL) {
|
||||||
|
uint32_t strlen = string_length(child->name);
|
||||||
|
|
||||||
|
if (mem != NULL) {
|
||||||
|
memory_copy(child->name, &mem[position], strlen);
|
||||||
|
mem[position + strlen] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
position += strlen + 1;
|
||||||
|
child = child->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mem == NULL) {
|
||||||
|
*needed_mem = position;
|
||||||
|
}
|
||||||
|
|
||||||
state->rax = STATUS_SUCCESS;
|
state->rax = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -57,8 +108,6 @@ void syscall_handle_nx_fwrite(cpu_state_T* state) {
|
||||||
cpu_state_T* syscall_handle(cpu_state_T* state) {
|
cpu_state_T* syscall_handle(cpu_state_T* state) {
|
||||||
cpu_state_T* return_state = state;
|
cpu_state_T* return_state = state;
|
||||||
syscall_group_E group_id = (state->rax & 0xFF00) >> 8;
|
syscall_group_E group_id = (state->rax & 0xFF00) >> 8;
|
||||||
|
|
||||||
// read arguments
|
|
||||||
uint64_t arg1 = state->rdi;
|
uint64_t arg1 = state->rdi;
|
||||||
|
|
||||||
switch (group_id) {
|
switch (group_id) {
|
||||||
|
@ -81,6 +130,14 @@ cpu_state_T* syscall_handle(cpu_state_T* state) {
|
||||||
syscall_handle_nx_fwrite(state);
|
syscall_handle_nx_fwrite(state);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case SYSCALL_FILES_DELETE: {
|
||||||
|
syscall_handle_nx_fdelete(state);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SYSCALL_FILES_LIST: {
|
||||||
|
syscall_handle_nx_flist(state);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue