diff options
author | Frans Kaashoek <[email protected]> | 2019-07-22 15:38:08 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 2019-07-22 15:38:08 -0400 |
commit | b2e9c8eea5d4f4edb43ae7be9e15986dbfce5b95 (patch) | |
tree | 22f78e4caee4b4481d30a1b83acd13b84841a06e /kernel | |
parent | 38b430687cc248d7d2928e3b7cedf9d220b96013 (diff) | |
download | xv6-labs-b2e9c8eea5d4f4edb43ae7be9e15986dbfce5b95.tar.gz xv6-labs-b2e9c8eea5d4f4edb43ae7be9e15986dbfce5b95.tar.bz2 xv6-labs-b2e9c8eea5d4f4edb43ae7be9e15986dbfce5b95.zip |
Clear U bit for second stack page so that it functions as a guard page
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/defs.h | 3 | ||||
-rw-r--r-- | kernel/exec.c | 1 | ||||
-rw-r--r-- | kernel/vm.c | 10 |
3 files changed, 13 insertions, 1 deletions
diff --git a/kernel/defs.h b/kernel/defs.h index 3172cb3..fb2672e 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -192,9 +192,10 @@ void unmappages(pagetable_t, uint64, uint64, int); uint64 walkaddr(pagetable_t, uint64); int copyout(pagetable_t, uint64, char *, uint64); int copyin(pagetable_t, char *, uint64, uint64); -int copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max); +int copyinstr(pagetable_t, char *, uint64, uint64); char* map_kstack(); uint64 kernelpa(uint64); +void clearpteu(pagetable_t, uint64); // plic.c void plicinit(void); diff --git a/kernel/exec.c b/kernel/exec.c index b21afbb..c25dfb0 100644 --- a/kernel/exec.c +++ b/kernel/exec.c @@ -68,6 +68,7 @@ exec(char *path, char **argv) sz = PGROUNDUP(sz); if((sz = uvmalloc(pagetable, sz, sz + 2*PGSIZE)) == 0) goto bad; + clearpteu(pagetable, sz-2*PGSIZE); sp = sz; stackbase = sp - PGSIZE; diff --git a/kernel/vm.c b/kernel/vm.c index 96f2ffa..cbea684 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -436,3 +436,13 @@ kernelpa(uint64 va) { pa = PTE2PA(*pte); return pa+off; } + +void +clearpteu(pagetable_t pagetable, uint64 va) { + pte_t *pte; + + pte = walk(pagetable, va, 0); + if(pte == 0) + panic("clearpteu"); + *pte &= ~PTE_U; +} |