Vhex-kernel/src/kernel/scheduler/syscall/sys_fexecve.c

78 lines
1.4 KiB
C

#include <kernel/process.h>
#include <kernel/scheduler.h>
#include <kernel/loader.h>
#include <kernel/atomic.h>
#include <kernel/util.h>
pid_t sys_fexecve(const char *pathname)
{
struct process *proc;
pid_t child_pid;
FILE *bin;
int error;
// Start atomic operation
atomic_start();
// Try create new process
proc = process_create(pathname);
if (proc == NULL)
{
kvram_clear();
printk(0, 0, "sys_fexecve: alloc error !");
kvram_display();
DBG_WAIT;
atomic_stop();
return (-1);
}
// Try to load binary into physical memory
proc->context.spc = (uint32_t)loader(pathname, proc);
if (proc->context.spc == 0x00000000)
{
kvram_clear();
printk(0, 0, "sys_fexecve: loader error !");
kvram_display();
DBG_WAIT;
process_free(proc);
atomic_stop();
return (-1);
}
// Debug
kvram_clear();
printk(0, 0, "New proc loaded !");
kvram_display();
DBG_WAIT;
// Add new process into task queue
error = sched_add_task(proc);
if (error != 0)
{
kvram_clear();
printk(0, 0, "sys_fexecve: scheduler error !");
kvram_display();
DBG_WAIT;
process_free(proc);
atomic_stop();
return (-1);
}
// Debug
printk(0, 1, "New proc sched added !");
kvram_display();
DBG_WAIT;
// Get child process PID
child_pid = process_get_pid(proc);
// Debug
printk(0, 2, "New proc PID = %#x !", child_pid);
kvram_display();
DBG_WAIT;
// Stop atomic operations
atomic_stop();
return (child_pid);
}