hw4: argument passing now works

This commit is contained in:
Claudio Maggioni 2020-04-28 14:34:43 +02:00
parent ed609d68b7
commit 8a004c4604

View file

@ -78,37 +78,37 @@ start_process (void *file_name_)
token = strtok_r(NULL, " ", &save_ptr)) { token = strtok_r(NULL, " ", &save_ptr)) {
struct arg* it = malloc(sizeof(struct arg)); struct arg* it = malloc(sizeof(struct arg));
it->data = token; it->data = token;
printf("list_elem pushed: %s\n", token);
list_push_back(&arg_list, it); list_push_back(&arg_list, it);
} }
char* program_name = list_entry(list_front(&arg_list), struct arg, elem)->data;
/* Initialize interrupt frame and load executable. */
memset (&if_, 0, sizeof if_);
if_.gs = if_.fs = if_.es = if_.ds = if_.ss = SEL_UDSEG;
if_.cs = SEL_UCSEG;
if_.eflags = FLAG_IF | FLAG_MBS;
success = load (program_name, &if_.eip, &if_.esp);
list_reverse(&arg_list); list_reverse(&arg_list);
printf("ciao mamma!\n");
struct list_elem* e;
for (e = list_begin(&arg_list); e != list_end(&arg_list); e = list_next(e)) {
struct arg* i = list_entry(e, struct arg, elem);
printf("list_elem: %s\n", i->data);
}
// put argv[i][...] on stack and keep track of addresses // put argv[i][...] on stack and keep track of addresses
char* program_name; struct list_elem* e;
for (e = list_begin(&arg_list); e != list_end(&arg_list); e = list_next(e)) { for (e = list_begin(&arg_list); e != list_end(&arg_list); e = list_next(e)) {
struct arg* i = list_entry(e, struct arg, elem); struct arg* i = list_entry(e, struct arg, elem);
size_t bytes = strlen(i->data) + 1; size_t bytes = strlen(i->data) + 1;
if_.esp -= bytes; if_.esp -= bytes;
i->addr = if_.esp; i->addr = if_.esp;
memcpy(&(if_.esp), i->data, bytes); memcpy(if_.esp, i->data, bytes);
} }
// put terminator of argv[] (argv[4] in example) // put terminator of argv[] (argv[4] in example)
size_t bytes = sizeof(void*); // size of pointers on stack size_t bytes = sizeof(void*); // size of pointers on stack
if_.esp -= bytes; if_.esp -= bytes;
printf("bytes: %d %X\n", bytes, if_.esp);
{ {
uint32_t write[1] = {0}; uint32_t write[1] = {0};
memcpy(&(if_.esp), write, sizeof(uint32_t)); memcpy(if_.esp, write, sizeof(uint32_t));
} }
// put addresses of argv[i] on stack // put addresses of argv[i] on stack
@ -117,7 +117,7 @@ start_process (void *file_name_)
if_.esp -= bytes; if_.esp -= bytes;
{ {
uint32_t write[1] = {i->addr}; uint32_t write[1] = {i->addr};
memcpy(&(if_.esp), write, sizeof(uint32_t)); memcpy(if_.esp, write, sizeof(uint32_t));
} }
e = list_next(e); e = list_next(e);
@ -127,28 +127,21 @@ start_process (void *file_name_)
if_.esp -= bytes; if_.esp -= bytes;
{ {
uint32_t write[1] = {if_.esp + bytes}; uint32_t write[1] = {if_.esp + bytes};
memcpy(&(if_.esp), write, sizeof(uint32_t)); memcpy(if_.esp, write, sizeof(uint32_t));
} }
//put argc //put argc
if_.esp -= bytes; if_.esp -= bytes;
{ {
uint32_t write[1] = {list_size(&arg_list) - 1}; uint32_t write[1] = {list_size(&arg_list) - 1};
memcpy(&(if_.esp), write, sizeof(uint32_t)); memcpy(if_.esp, write, sizeof(uint32_t));
} }
//put return address //put return address
if_.esp -= bytes; if_.esp -= bytes;
{ {
uint32_t write[1] = {0}; uint32_t write[1] = {0};
memcpy(&(if_.esp), write, sizeof(uint32_t)); memcpy(if_.esp, write, sizeof(uint32_t));
} }
/* Initialize interrupt frame and load executable. */
memset (&if_, 0, sizeof if_);
if_.gs = if_.fs = if_.es = if_.ds = if_.ss = SEL_UDSEG;
if_.cs = SEL_UCSEG;
if_.eflags = FLAG_IF | FLAG_MBS;
success = load (program_name, &if_.eip, &if_.esp);
/* If load failed, quit. */ /* If load failed, quit. */
palloc_free_page (program_name); palloc_free_page (program_name);