+#ifdef i386
+ regs = p->p_regs;
+ /*
+ * XXX - privileged kernel state is scattered all over the
+ * user area. Only allow write access to areas known to
+ * be safe.
+ */
+#define GO_IF_SAFE(min, size) \
+ if ((u_int)ipc.addr >= (min) \
+ && (u_int)ipc.addr <= (min) + (size) - sizeof(int)) \
+ goto pt_write_u
+ /*
+ * Allow writing entire FPU state.
+ */
+ GO_IF_SAFE(offsetof(struct user, u_pcb)
+ + offsetof(struct pcb, pcb_savefpu),
+ sizeof(struct save87));
+ /*
+ * Allow writing ordinary registers. Changes to segment
+ * registers and to some bits in %eflags will be silently
+ * ignored. Such changes ought to be an error.
+ */
+/*
+ * XXX - there is no define for the base of the user area except USRSTACK.
+ * XXX - USRSTACK is not the base of the user stack. It is the base of the
+ * user area.
+ */
+#define USER_OFF(va) ((u_int)(va) - USRSTACK)
+ GO_IF_SAFE(USER_OFF(regs),
+ (curpcb->pcb_flags & FM_TRAP ? tSS + 1 : sSS + 1)
+ * sizeof *regs);
+ ipc.error = EFAULT;
+ break;
+#else