--- /sys/src/9k/port/fault.c +++ /sys/src/9k/port/fault.c @@ -177,7 +177,11 @@ fixfault(Segment *s, uintptr addr, int read, int dommuput) if (checkaddr && addr == addr2check) (*checkaddr)(addr, s, *pg); - mmuphys = PPN((*pg)->pa) |PTEWRITE|PTEUNCACHED|PTEVALID; + mmuphys = PPN((*pg)->pa) | PTEVALID; + if((s->pseg->attr & SG_RONLY) == 0) + mmuphys |= PTEWRITE; + if((s->pseg->attr & SG_CACHED) == 0) + mmuphys |= PTEUNCACHED; (*pg)->modref = PG_MOD|PG_REF; break; } --- /sys/src/9k/port/portdat.h +++ /sys/src/9k/port/portdat.h @@ -360,6 +360,7 @@ enum SG_SHARED = 04, SG_PHYSICAL = 05, + SG_CACHED = 0020, /* Physseg can be cached */ SG_RONLY = 0040, /* Segment is read only */ SG_CEXEC = 0100, /* Detach at exec */ };