Vhex-kernel/src/kernel/process/create.c

69 lines
1.7 KiB
C

#include <kernel/process.h>
#include <kernel/unistd_32.h>
#include <kernel/memory.h>
#include <kernel/util.h>
pid_t process_create(const char *name)
{
extern process_t *process_current;
process_t *process;
pid_t process_pid;
// Check error
if (name == NULL)
return (-1);
// Try to find free slot.
process_pid = process_alloc(&process);
if (process == NULL)
return (-1);
// Initialize stack
process->memory.stack.size = PROCESS_STACK_SIZE;
process->memory.stack.start = (uint32_t)pm_alloc(process->memory.stack.size);
if (process->memory.stack.start == 0x00000000)
{
//TODO: errno
//FIXME: free allocated process.
return (-1);
}
// initialize "exit" part.
uint8_t callexit[6] = {
0b11000011, __NR_exit, // trapa #__NR_exit
0b10110000, 0b00000100, // bsr PC + 2 - 4
0b00000000, 0b00001001 // nop
};
process->memory.exit.size = 6;
process->memory.exit.start = (uint32_t)pm_alloc(process->memory.exit.size);
if (process->memory.exit.start == 0x00000000)
{
//TODO: errno
//FIXME: free allocated process.
return (-1);
}
process->context.pr = process->memory.exit.start;
memcpy((void *)process->memory.exit.start, callexit, 6);
// Set process name.
strncpy(process->name, name, PROCESS_NAME_LENGHT);
// Initialize context.
for (int i = 0 ; i < 15 ; i = i + 1)
process->context.reg[i] = 0x00000000;
process->context.reg[15] = process->memory.stack.start;
// Initialize "special" registers.
process->context.gbr = 0x00000000;
process->context.macl = 0x00000000;
process->context.mach = 0x00000000;
process->context.ssr = 0x00000000;
process->context.spc = 0x00000000;
// Initialize processes.
process->parent = process_current;
process->child = NULL;
process->next = NULL;
return (process_pid);
}