Fix _brk issues and workaround some M2-Planet assign on initialization bugs.
This commit is contained in:
parent
008899d565
commit
c7c827a1e9
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue