diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-11-30 18:40:27 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-11-30 18:40:27 +0000 |
commit | da563911f75aa7905fc1ea4103641b1b20c67cf0 (patch) | |
tree | 542ad1afeec92bcabcfbe5dab25751ba32bbcfb3 | |
parent | 9522e056233b2d58cfd2b4ce269b40b17ef856f0 (diff) |
integrate 040 MDP_UNCACHE_WX cache changes by niklas & deraadt
-rw-r--r-- | sys/arch/mac68k/include/proc.h | 2 | ||||
-rw-r--r-- | sys/arch/mac68k/mac68k/machdep.c | 17 | ||||
-rw-r--r-- | sys/arch/mac68k/mac68k/pmap.c | 7 |
3 files changed, 26 insertions, 0 deletions
diff --git a/sys/arch/mac68k/include/proc.h b/sys/arch/mac68k/include/proc.h index c343f3a496c..7707df4d577 100644 --- a/sys/arch/mac68k/include/proc.h +++ b/sys/arch/mac68k/include/proc.h @@ -48,3 +48,5 @@ struct mdproc { #define MDP_STACKADJ 0x0002 /* Frame SP adjusted, might have to undo when system call returns ERESTART. */ +#define MDP_UNCACHE_WX 0x0004 /* The process might modify code, so + don't cache writeable executable pages. */ diff --git a/sys/arch/mac68k/mac68k/machdep.c b/sys/arch/mac68k/mac68k/machdep.c index 20f1b8ec68c..d410a95d648 100644 --- a/sys/arch/mac68k/mac68k/machdep.c +++ b/sys/arch/mac68k/mac68k/machdep.c @@ -123,6 +123,11 @@ #include <dev/cons.h> +#ifdef COMPAT_SUNOS +#include <compat/sunos/sunos_syscall.h> +extern struct emul emul_sunos; +#endif + #include "via.h" #include "macrom.h" #include "ether.h" @@ -478,6 +483,18 @@ setregs(p, pack, sp, retval) if (fpu_type) { m68881_restore(&p->p_addr->u_pcb.pcb_fpregs); } + +#ifdef COMPAT_SUNOS + /* + * SunOS' ld.so does self-modifying code without knowing + * about the 040's cache purging needs. So we need to uncache + * writeable executable pages. + */ + if (p->p_emul == &emul_sunos) + p->p_md.md_flags |= MDP_UNCACHE_WX; + else + p->p_md.md_flags &= ~MDP_UNCACHE_WX; +#endif } #define SS_RTEFRAME 1 diff --git a/sys/arch/mac68k/mac68k/pmap.c b/sys/arch/mac68k/mac68k/pmap.c index 8d504e68e82..d9f3b1cc551 100644 --- a/sys/arch/mac68k/mac68k/pmap.c +++ b/sys/arch/mac68k/mac68k/pmap.c @@ -1381,6 +1381,13 @@ validate: npte = pa | pte_prot(pmap, prot) | (*pte & (PG_M|PG_U)) | PG_V; if (wired) npte |= PG_W; + + /* Don't cache if process can't take it, like SunOS ones. */ + if (mmutype == MMU_68040 && pmap != pmap_kernel() && + (curproc->p_md.md_flags & MDP_UNCACHE_WX) && + (prot & VM_PROT_EXECUTE) && (prot & VM_PROT_WRITE)) + checkpv = cacheable = FALSE; + if (!checkpv && !cacheable) npte |= PG_CI; #if defined(M68040) |