summaryrefslogtreecommitdiff
path: root/exec.c
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2019-06-04 05:57:47 -0400
committerRobert Morris <[email protected]>2019-06-04 05:57:47 -0400
commit8baac760500980d4b83e8de2e90265bfaa19df13 (patch)
treeceb59412ec44ff98c1281627fb648deaeedb0d04 /exec.c
parentcefe223bf5e4b68e5c1202f2f089a164ad656621 (diff)
downloadxv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.tar.gz
xv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.tar.bz2
xv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.zip
support read() and write() bigger than one page
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/exec.c b/exec.c
index e6a0809..4c34a51 100644
--- a/exec.c
+++ b/exec.c
@@ -30,7 +30,7 @@ exec(char *path, char **argv)
ilock(ip);
// Check ELF header
- if(readi(ip, (char*)&elf, 0, sizeof(elf)) != sizeof(elf))
+ if(readi(ip, 0, (uint64)&elf, 0, sizeof(elf)) != sizeof(elf))
goto bad;
if(elf.magic != ELF_MAGIC)
goto bad;
@@ -41,7 +41,7 @@ exec(char *path, char **argv)
// Load program into memory.
sz = 0;
for(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof(ph)){
- if(readi(ip, (char*)&ph, off, sizeof(ph)) != sizeof(ph))
+ if(readi(ip, 0, (uint64)&ph, off, sizeof(ph)) != sizeof(ph))
goto bad;
if(ph.type != ELF_PROG_LOAD)
continue;
@@ -128,6 +128,7 @@ loadseg(pagetable_t pagetable, uint64 va, struct inode *ip, uint offset, uint sz
if((va % PGSIZE) != 0)
panic("loadseg: va must be page aligned");
+
for(i = 0; i < sz; i += PGSIZE){
pa = walkaddr(pagetable, va + i);
if(pa == 0)
@@ -136,8 +137,9 @@ loadseg(pagetable_t pagetable, uint64 va, struct inode *ip, uint offset, uint sz
n = sz - i;
else
n = PGSIZE;
- if(readi(ip, (char *)pa, offset+i, n) != n)
+ if(readi(ip, 0, (uint64)pa, offset+i, n) != n)
return -1;
}
+
return 0;
}