Apply by doing:
cd /usr/src/sys/arch/powerpc/powerpc
patch < 001_trap.patch
build a new kernel, ie.
cd /usr/src/sys/arch/powerpc/conf
config GENERIC
cd ../compile/GENERIC
make
mv /bsd /bsd.1
cp bsd /bsd
reboot
Index: trap.c
===================================================================
RCS file: /cvs/src/sys/arch/powerpc/powerpc/trap.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- trap.c 1999/03/13 01:49:07 1.13
+++ trap.c 1999/04/22 06:08:06 1.14
@@ -133,7 +133,7 @@
ftype = VM_PROT_READ;
if (vm_fault(map, trunc_page(va), ftype, FALSE)
== KERN_SUCCESS)
- break;
+ return;
if (fb = p->p_addr->u_pcb.pcb_onfault) {
p->p_addr->u_pcb.pcb_onfault = 0;
frame->srr0 = fb->pc; /* PC */
@@ -465,8 +465,10 @@
faultbuf env;
u_int32_t v;
- if (setfault(env))
+ if (setfault(env)) {
+ curpcb->pcb_onfault = 0;
return EACCES;
+ }
switch(len) {
case 4:
v = *((volatile u_int32_t *)addr);
@@ -492,8 +494,10 @@
size_t l;
faultbuf env;
- if (setfault(env))
+ if (setfault(env)) {
+ curpcb->pcb_onfault = 0;
return EACCES;
+ }
while (len > 0) {
p = USER_ADDR + ((u_int)udaddr & ~SEGMENT_MASK);
l = (USER_ADDR + SEGMENT_LENGTH) - p;
@@ -520,6 +524,7 @@
faultbuf env;
if (setfault(env)) {
+ curpcb->pcb_onfault = 0;
return EACCES;
}
while (len > 0) {