+#ifdef DEBUG
+ if ((mmudebug & MDB_WBFOLLOW) || MDB_ISPID(p->p_pid)) {
+ printf(" pushing %s to PA %x, data %x",
+ f7sz[(f->f_ssw & SSW4_SZMASK) >> 5],
+ f->f_fa, f->f_pd0);
+ if ((f->f_ssw & SSW4_SZMASK) == SSW4_SZLN)
+ printf("/%x/%x/%x",
+ f->f_pd1, f->f_pd2, f->f_pd3);
+ printf("\n");
+ }
+ if (f->f_wb1s & SSW4_WBSV)
+ panic("writeback: cache push with WB1S valid");
+ wbstats.cpushes++;
+#endif
+ /*
+ * XXX there are security problems if we attempt to do a
+ * cache push after a signal handler has been called.
+ */
+ if (docachepush) {
+ pmap_enter(kernel_pmap, (vm_offset_t)vmmap,
+ trunc_page(f->f_fa), VM_PROT_WRITE, TRUE);
+ fa = (u_int)&vmmap[(f->f_fa & PGOFSET) & ~0xF];
+ bcopy((caddr_t)&f->f_pd0, (caddr_t)fa, 16);
+ DCFL(pmap_extract(kernel_pmap, (vm_offset_t)fa));
+ pmap_remove(kernel_pmap, (vm_offset_t)vmmap,
+ (vm_offset_t)&vmmap[NBPG]);
+ } else
+ printf("WARNING: pid %d(%s) uid %d: CPUSH not done\n",
+ p->p_pid, p->p_comm, p->p_ucred->cr_uid);
+ } else if ((f->f_ssw & (SSW4_RW|SSW4_TTMASK)) == SSW4_TTM16) {
+ /*
+ * MOVE16 fault.
+ * Line-align the address and write out the push data to
+ * the indicated virtual address.
+ */
+#ifdef DEBUG
+ if ((mmudebug & MDB_WBFOLLOW) || MDB_ISPID(p->p_pid))
+ printf(" MOVE16 to VA %x(%x), data %x/%x/%x/%x\n",
+ f->f_fa, f->f_fa & ~0xF, f->f_pd0, f->f_pd1,
+ f->f_pd2, f->f_pd3);
+ if (f->f_wb1s & SSW4_WBSV)
+ panic("writeback: MOVE16 with WB1S valid");
+ wbstats.move16s++;
+#endif
+ if (KDFAULT(f->f_wb1s))
+ bcopy((caddr_t)&f->f_pd0, (caddr_t)(f->f_fa & ~0xF), 16);
+ else
+ err = suline((caddr_t)(f->f_fa & ~0xF), (caddr_t)&f->f_pd0);
+ if (err) {
+ fa = f->f_fa & ~0xF;
+#ifdef DEBUG
+ if (mmudebug & MDB_WBFAILED)
+ printf(wberrstr, p->p_pid, p->p_comm,
+ "MOVE16", fp->f_pc, f->f_fa,
+ f->f_fa & ~0xF, f->f_pd0);
+#endif
+ }
+ } else if (f->f_wb1s & SSW4_WBSV) {
+ /*
+ * Writeback #1.
+ * Position the "memory-aligned" data and write it out.
+ */
+ register u_int wb1d = f->f_wb1d;
+ register int off;
+
+#ifdef DEBUG
+ if ((mmudebug & MDB_WBFOLLOW) || MDB_ISPID(p->p_pid))
+ dumpwb(1, f->f_wb1s, f->f_wb1a, f->f_wb1d);
+ wbstats.wb1s++;
+ wbstats.wbsize[(f->f_wb2s&SSW4_SZMASK)>>5]++;
+#endif
+ off = (f->f_wb1a & 3) * 8;
+ switch (f->f_wb1s & SSW4_SZMASK) {
+ case SSW4_SZLW:
+ if (off)
+ wb1d = (wb1d >> (32 - off)) | (wb1d << off);
+ if (KDFAULT(f->f_wb1s))
+ *(long *)f->f_wb1a = wb1d;
+ else
+ err = suword((caddr_t)f->f_wb1a, wb1d);
+ break;
+ case SSW4_SZB:
+ off = 24 - off;
+ if (off)
+ wb1d >>= off;
+ if (KDFAULT(f->f_wb1s))
+ *(char *)f->f_wb1a = wb1d;
+ else
+ err = subyte((caddr_t)f->f_wb1a, wb1d);
+ break;
+ case SSW4_SZW:
+ off = (off + 16) % 32;
+ if (off)
+ wb1d = (wb1d >> (32 - off)) | (wb1d << off);
+ if (KDFAULT(f->f_wb1s))
+ *(short *)f->f_wb1a = wb1d;
+ else
+ err = susword((caddr_t)f->f_wb1a, wb1d);
+ break;
+ }
+ if (err) {
+ fa = f->f_wb1a;
+#ifdef DEBUG
+ if (mmudebug & MDB_WBFAILED)
+ printf(wberrstr, p->p_pid, p->p_comm,
+ "#1", fp->f_pc, f->f_fa,
+ f->f_wb1a, f->f_wb1d);
+#endif
+ }