feature (syscalls): implemented 'nx_proc_create'
This commit is contained in:
parent
91f7aa4009
commit
81fc9ca9fc
|
@ -32,9 +32,23 @@ typedef enum {
|
||||||
PROCESS_SIGNAL_START, // SIGSTART
|
PROCESS_SIGNAL_START, // SIGSTART
|
||||||
PROCESS_SIGNAL_PAUSE, // SIGPAUSE
|
PROCESS_SIGNAL_PAUSE, // SIGPAUSE
|
||||||
PROCESS_SIGNAL_KILL, // SIGKILL
|
PROCESS_SIGNAL_KILL, // SIGKILL
|
||||||
PROCESS_SIGNAL_PFAULT, // SIGPFAULT
|
PROCESS_SIGNAL_PAGEFAULT, // SIGPAGEFAULT
|
||||||
|
PROCESS_SIGNAL_MATHFAULT, // SIGMATHFAULT
|
||||||
} process_signals_E;
|
} process_signals_E;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
file_descriptor_t at_parent;
|
||||||
|
file_descriptor_t at_child;
|
||||||
|
}__attribute__((packed)) process_inherit_fd_T;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t privilege_level;
|
||||||
|
char name[80];
|
||||||
|
file_descriptor_t executable;
|
||||||
|
uint16_t num_inherit_fds;
|
||||||
|
process_inherit_fd_T inherit_fds[];
|
||||||
|
}__attribute__((packed)) process_config_T;
|
||||||
|
|
||||||
typedef struct process_T process_T;
|
typedef struct process_T process_T;
|
||||||
struct process_T {
|
struct process_T {
|
||||||
char name [128];
|
char name [128];
|
||||||
|
|
|
@ -72,21 +72,29 @@ void kmain(boot_info_T boot_info) {
|
||||||
|
|
||||||
log(LOG_INFO, "!=====[ Kernel Initialized ]=====!\n");
|
log(LOG_INFO, "!=====[ Kernel Initialized ]=====!\n");
|
||||||
|
|
||||||
// pid_t pid;
|
file_descriptor_t fd;
|
||||||
// syscall_perform(SYSCALL_PROCESS_CREATE, (uint64_t)"/initrd/shell.elf", 0, (uint64_t)&pid, 0);
|
|
||||||
//
|
|
||||||
// process_T* process = scheduler_get_process(pid);
|
|
||||||
//
|
|
||||||
// scheduler_dump_info(scheduler_get_process(PROCESS_KERNEL), 0);
|
|
||||||
//
|
|
||||||
// g_tty->output = &process->stdin;
|
|
||||||
// process->stdout = &g_tty->input;
|
|
||||||
//
|
|
||||||
// syscall_perform(SYSCALL_PROCESS_SIGNAL, pid, PROCESS_SIGNAL_START, 0, 0);
|
|
||||||
|
|
||||||
driver_T* resolved = driver_lookup_pci_device(0x8086, 0x2922);
|
syscall_perform(SYSCALL_NX_FS_OPEN, (uint64_t)"/initrd/test.elf", 0, &fd, 0);
|
||||||
|
|
||||||
|
pid_t pid;
|
||||||
|
process_config_T conf = {
|
||||||
|
.privilege_level = 0,
|
||||||
|
.executable = fd,
|
||||||
|
.num_inherit_fds = 0
|
||||||
|
};
|
||||||
|
memory_copy("test", conf.name, 5);
|
||||||
|
|
||||||
|
syscall_perform(SYSCALL_NX_PROC_CREATE, (uint64_t)&conf, (uint64_t)&pid, 0, 0);
|
||||||
|
|
||||||
|
process_T* process = scheduler_get_process(pid);
|
||||||
|
|
||||||
|
scheduler_dump_info(scheduler_get_process(PROCESS_KERNEL), 0);
|
||||||
|
|
||||||
|
g_tty->output = &process->stdin;
|
||||||
|
process->stdout = &g_tty->input;
|
||||||
|
|
||||||
|
syscall_perform(SYSCALL_NX_PROC_SIGNAL_SEND, pid, PROCESS_SIGNAL_START, 0, 0);
|
||||||
|
|
||||||
DEBUG("resolved: 0x%x", resolved);
|
|
||||||
|
|
||||||
CORE_HALT_FOREVER
|
CORE_HALT_FOREVER
|
||||||
}
|
}
|
||||||
|
|
|
@ -210,12 +210,12 @@ void syscall_handle_nx_mem_free(cpu_state_T* state) {
|
||||||
|
|
||||||
|
|
||||||
void syscall_handle_nx_proc_create(cpu_state_T* state) {
|
void syscall_handle_nx_proc_create(cpu_state_T* state) {
|
||||||
string_t path = (string_t)state->rdi; // arg1
|
process_config_T* conf = (process_config_T*)state->rdi; // arg1
|
||||||
uint64_t len = state->rsi; // arg2
|
pid_t* pid_ptr = (pid_t*)state->rsi; // arg2
|
||||||
pid_t* pid = (pid_t*)state->rdx; // arg3
|
|
||||||
string_t name = (string_t)state->rcx; // arg4
|
|
||||||
|
|
||||||
vfs_node_T* node = vfs_resolve_path(&g_root_fs, path);
|
process_T* parent = scheduler_get_current_process();
|
||||||
|
|
||||||
|
vfs_node_T* node = file_descriptor_resolve(parent->fd_array, conf->executable);
|
||||||
if (node == NULL || node->type != VFS_NODE_FILE) {
|
if (node == NULL || node->type != VFS_NODE_FILE) {
|
||||||
state->rax = STATUS_RESOURCE_NOT_AVAILABLE;
|
state->rax = STATUS_RESOURCE_NOT_AVAILABLE;
|
||||||
return;
|
return;
|
||||||
|
@ -231,18 +231,14 @@ void syscall_handle_nx_proc_create(cpu_state_T* state) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name == NULL) {
|
*pid_ptr = process_spawn(parent->id, conf->name, exec, buffer);
|
||||||
name = path;
|
if (*pid_ptr == PROCESS_NONE) {
|
||||||
}
|
|
||||||
|
|
||||||
*pid = process_spawn(scheduler_get_current_process()->id, name, exec, buffer);
|
|
||||||
if (*pid == PROCESS_NONE) {
|
|
||||||
state->rax = STATUS_GENERIC_ERROR;
|
state->rax = STATUS_GENERIC_ERROR;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void* entry = (void*)(symbol_resolve_from_name(&exec->symbol_table, "_start")->address + MEM_REGION_PROCESS_EXEC);
|
void* entry = (void*)(symbol_resolve_from_name(&exec->symbol_table, "_start")->address + MEM_REGION_PROCESS_EXEC);
|
||||||
|
|
||||||
thread_spawn(*pid, entry);
|
thread_spawn(*pid_ptr, entry);
|
||||||
|
|
||||||
state->rax = STATUS_SUCCESS;
|
state->rax = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue