Fix SunOS emulation on 040
authorniklas <niklas@openbsd.org>
Tue, 28 Nov 1995 20:43:08 +0000 (20:43 +0000)
committerniklas <niklas@openbsd.org>
Tue, 28 Nov 1995 20:43:08 +0000 (20:43 +0000)
sys/arch/amiga/amiga/pmap.c
sys/arch/amiga/include/proc.h
sys/arch/m68k/m68k/sunos_machdep.c
sys/compat/sunos/sunos_exec.c

index 6069728..145fc82 100644 (file)
@@ -1390,9 +1390,15 @@ validate:
         * AMIGA pages in a MACH page.
         */
 #ifdef M68040
-       if (mmutype == MMU_68040 && pmap == pmap_kernel() && va >= AMIGA_UPTBASE && 
-           va < (AMIGA_UPTBASE + AMIGA_UPTMAXSIZE))
+       if (mmutype == MMU_68040 && pmap == pmap_kernel() &&
+           va >= AMIGA_UPTBASE && va < (AMIGA_UPTBASE + AMIGA_UPTMAXSIZE))
                cacheable = FALSE;      /* don't cache user page tables */
+
+       /* 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;
 #endif
        npte = (pa & PG_FRAME) | pte_prot(pmap, prot) | PG_V;
        npte |= (*(int *)pte & (PG_M|PG_U));
index 6ee0eef..03e0110 100644 (file)
@@ -50,4 +50,6 @@ 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.  */
 #endif /* !_MACHINE_PROC_H_ */
index a7c4df1..25e3ed7 100644 (file)
@@ -86,6 +86,22 @@ struct sunos_sigframe {
        struct sunos_sigcontext sf_sc;  /* I don't know if that's what 
                                           comes here */
 };
+
+/*
+ * SunOS' ld.so does self-modifying code without knowing about the 040's
+ * cache purging needs.  So we need to uncache writeable executable pages.
+ */
+void
+sunos_setregs(p, pack, stack, retval)
+       register struct proc *p;
+       struct exec_package *pack;
+       u_long stack;
+       register_t *retval;
+{
+       setregs(p, pack, stack, retval);
+       p->p_md.md_flags |= MDP_UNCACHE_WX;
+}
+
 /*
  * much simpler sendsig() for SunOS processes, as SunOS does the whole
  * context-saving in usermode. For now, no hardware information (ie.
index 3ed414f..e2ada6f 100644 (file)
@@ -68,6 +68,10 @@ extern struct sysent sunos_sysent[];
 extern char *sunos_syscallnames[];
 #endif
 extern void sunos_sendsig __P((sig_t, int, int, u_long));
+#ifdef m68k
+extern void sunos_setregs __P((struct proc *, struct exec_package *, u_long,
+                              register_t *));
+#endif
 extern char sigcode[], esigcode[];
 const char sunos_emul_path[] = "/emul/sunos";
 
@@ -89,7 +93,11 @@ struct emul emul_sunos = {
 #endif
        0,
        copyargs,
+#ifdef m68k
+       sunos_setregs,
+#else
        setregs,
+#endif
        sigcode,
        esigcode,
 };