summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-07-12 21:42:26 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2020-07-12 21:42:26 +0200
commit77ddc8c654824962149160af822f849b78cc6cc0 (patch)
tree2bc8bd6478419c8d4b7aec1bd022ba2d9bd491c1
parent11fcf41472411fc0b683cc4431c42301e06124fe (diff)
downloadplan9front-77ddc8c654824962149160af822f849b78cc6cc0.tar.xz
kernel: make segments non-executable when icache is not maintained
This change makes it mandatory for programs to call segflush() on code that is not in the text segment if they want to execute it. As a side effect, this means that everything but the text segment will be non-executable by default, even without the SG_NOEXEC attribute. Segments with the SG_NOEXEC attribute never become executable, even when segflush() is called on them.
-rw-r--r--sys/src/9/port/fault.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/src/9/port/fault.c b/sys/src/9/port/fault.c
index 9e499b722..6e317a6e0 100644
--- a/sys/src/9/port/fault.c
+++ b/sys/src/9/port/fault.c
@@ -221,7 +221,7 @@ fixfault(Segment *s, uintptr addr, int read)
}
#ifdef PTENOEXEC
- if((s->type & SG_NOEXEC) != 0)
+ if((s->type & SG_NOEXEC) != 0 || s->flushme == 0)
mmuphys |= PTENOEXEC;
#endif
@@ -242,6 +242,8 @@ mapphys(Segment *s, uintptr addr, int attr)
pg.ref = 1;
pg.va = addr;
pg.pa = s->pseg->pa+(addr-s->base);
+ if(s->flushme)
+ pg.txtflush = ~0;
mmuphys = PPN(pg.pa) | PTEVALID;
if((attr & SG_RONLY) == 0)
@@ -250,7 +252,7 @@ mapphys(Segment *s, uintptr addr, int attr)
mmuphys |= PTERONLY;
#ifdef PTENOEXEC
- if((attr & SG_NOEXEC) != 0)
+ if((attr & SG_NOEXEC) != 0 || s->flushme == 0)
mmuphys |= PTENOEXEC;
#endif
@@ -303,7 +305,7 @@ fault(uintptr addr, uintptr pc, int read)
attr |= s->pseg->attr;
if((attr & SG_FAULT) != 0
- || read? (attr & SG_NOEXEC) != 0 && (addr & -BY2PG) == (pc & -BY2PG):
+ || read? ((attr & SG_NOEXEC) != 0 || s->flushme == 0) && (addr & -BY2PG) == (pc & -BY2PG):
(attr & SG_RONLY) != 0) {
qunlock(s);
up->psstate = sps;