Fix _brk issues and workaround some M2-Planet assign on initialization bugs.

This commit is contained in:
Andrius Štikonas 2024-01-01 22:22:37 +00:00
parent 008899d565
commit c7c827a1e9
Signed by: andrius
GPG Key ID: 0C0331D5228A3B62
1 changed files with 19 additions and 15 deletions

View File

@ -30,7 +30,6 @@ struct process {
void* saved_brk; void* saved_brk;
void* stack; void* stack;
void* saved_stack_pointer; void* saved_stack_pointer;
void* memory;
mem_block program; mem_block program;
mem_block saved_stack; mem_block saved_stack;
mem_block saved_memory; mem_block saved_memory;
@ -39,6 +38,8 @@ struct process {
}; };
struct process* current_process; struct process* current_process;
void* _brk;
void* _get_stack() void* _get_stack()
{ {
asm("mov_rax,rsp"); asm("mov_rax,rsp");
@ -138,12 +139,7 @@ int sys_lseek(int fd, int offset, int whence, void, void, void)
int sys_brk(void* addr, void, void, void, void, void) int sys_brk(void* addr, void, void, void, void, void)
{ {
if (current_process->brk == NULL) { if (current_process->brk == NULL) {
current_process->brk = calloc(1, MAX_MIB_PER_PROC * 1024 * 1024); current_process->brk = _brk;
if (current_process->brk == NULL) {
fputs("Could not allocate memory for brk region.", stderr);
return addr;
}
current_process->memory = current_process->brk;
} }
if (addr == NULL) { if (addr == NULL) {
return current_process->brk; return current_process->brk;
@ -171,13 +167,13 @@ int sys_fork(void, void, void, void, void, void)
exit(1); exit(1);
} }
memcpy(current_process->saved_stack.address, current_process->saved_stack_pointer, current_process->saved_stack.length); memcpy(current_process->saved_stack.address, current_process->saved_stack_pointer, current_process->saved_stack.length);
current_process->saved_memory.length = current_process->brk - current_process->memory; current_process->saved_memory.length = current_process->brk - _brk;
current_process->saved_memory.address = malloc(current_process->saved_memory.length); current_process->saved_memory.address = malloc(current_process->saved_memory.length);
if (current_process->saved_stack.address == NULL ) { if (current_process->saved_stack.address == NULL ) {
fputs("Could not allocate memory for saved process memory.", stderr); fputs("Could not allocate memory for saved process memory.", stderr);
exit(1); exit(1);
} }
memcpy(current_process->saved_memory.address, current_process->memory, current_process->saved_memory.length); memcpy(current_process->saved_memory.address, _brk, current_process->saved_memory.length);
return 0; /* return as child */ return 0; /* return as child */
} }
@ -185,7 +181,8 @@ int sys_fork(void, void, void, void, void, void)
int sys_execve(char* file_name, char** argv, char** envp, void, void, void) int sys_execve(char* file_name, char** argv, char** envp, void, void, void)
{ {
if (current_process->forked) { if (current_process->forked) {
struct process* new = calloc(1, sizeof(struct process)); struct process* new;
new = calloc(1, sizeof(struct process));
if (new == NULL) { if (new == NULL) {
fputs("Could not allocate memory for new process metadata.", stderr); fputs("Could not allocate memory for new process metadata.", stderr);
exit(1); exit(1);
@ -220,12 +217,13 @@ void sys_exit(unsigned value, void, void, void, void, void)
exit(value); exit(value);
} }
current_process->parent->child_exit_code = value; current_process->parent->child_exit_code = value;
struct process* child = current_process; struct process* child;
child = current_process;
current_process = current_process->parent; current_process = current_process->parent;
free(child); free(child);
memcpy(current_process->saved_stack_pointer, current_process->saved_stack.address, current_process->saved_stack.length); memcpy(current_process->saved_stack_pointer, current_process->saved_stack.address, current_process->saved_stack.length);
memcpy(current_process->memory, current_process->saved_memory.address, current_process->saved_memory.length); memcpy(_brk, current_process->saved_memory.address, current_process->saved_memory.length);
free(current_process->saved_stack.address); free(current_process->saved_stack.address);
free(current_process->saved_memory.address); free(current_process->saved_memory.address);
current_process->brk = current_process->saved_brk; current_process->brk = current_process->saved_brk;
@ -404,17 +402,23 @@ int main(int argc, char** argv, char** envp)
exit(2); exit(2);
} }
current_process = calloc(1, sizeof(process)); current_process = calloc(1, sizeof(struct process));
if (current_process == NULL) { if (current_process == NULL) {
fputs("Could not allocate memory for current process metadata.", stderr); fputs("Could not allocate memory for current process metadata.", stderr);
exit(1); exit(3);
}
_brk = malloc(MAX_MIB_PER_PROC * 1024 * 1024);
if (_brk == NULL) {
fputs("Could not allocate memory brk area.", stderr);
exit(4);
} }
/* Load binary into memory */ /* Load binary into memory */
int rval = load_elf(file_in, current_process); int rval = load_elf(file_in, current_process);
if (rval == 1) { if (rval == 1) {
fputs("ELF magic header was not found.\n", stderr); fputs("ELF magic header was not found.\n", stderr);
exit(3); exit(5);
} }
current_process->entry_point = entry_point(current_process->program.address); current_process->entry_point = entry_point(current_process->program.address);