summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authormsaitoh <msaitoh@NetBSD.org>2000-01-03 02:55:25 +0000
committermsaitoh <msaitoh@NetBSD.org>2000-01-03 02:55:25 +0000
commit518cfb0bde416bd0c7d2492ca194301f8e376ec8 (patch)
tree86145863c3d845fd7b639d7b14e0a0caa148e663 /sys
parentb0b4797dfba0c3967200950fe82aa0190cf4d61f (diff)
userret() if the user process will be killed.
Now the NetBSD/sh3 works very stable!
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/sh3/sh3/trap.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/sys/arch/sh3/sh3/trap.c b/sys/arch/sh3/sh3/trap.c
index acdaefdc8d4..14edbdf2886 100644
--- a/sys/arch/sh3/sh3/trap.c
+++ b/sys/arch/sh3/sh3/trap.c
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.4 1999/12/05 11:56:35 ragge Exp $ */
+/* $NetBSD: trap.c,v 1.5 2000/01/03 02:55:25 msaitoh Exp $ */
/*-
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
@@ -603,6 +603,8 @@ tlb_handler(p1, p2, p3, p4, frame)
struct vmspace *vm;
vm_map_t map;
int rv;
+ u_quad_t sticks = 0;
+ int type = 0;
vm_prot_t ftype;
extern vm_map_t kernel_map;
unsigned nss;
@@ -610,6 +612,8 @@ tlb_handler(p1, p2, p3, p4, frame)
unsigned long pteh_save;
int exptype;
+ uvmexp.traps++;
+
va = (vaddr_t)SHREG_TEA;
va = trunc_page(va);
pde_index = pdei(va);
@@ -646,7 +650,20 @@ tlb_handler(p1, p2, p3, p4, frame)
if (p == NULL) {
rv = KERN_FAILURE;
goto nogo;
+ } else {
+#if 1
+ if (!KERNELMODE(frame.tf_r15)) {
+#else
+ if (!KERNELMODE(frame.tf_spc, frame.tf_ssr)) {
+#endif
+ type = T_USER;
+ sticks = p->p_sticks;
+ p->p_md.md_regs = &frame;
+ }
+ else
+ sticks = 0;
}
+
vm = p->p_vmspace;
/*
* It is only a kernel address space fault iff:
@@ -727,4 +744,10 @@ tlb_handler(p1, p2, p3, p4, frame)
trapsignal(p, SIGKILL, T_TLBINVALIDR);
} else
trapsignal(p, SIGSEGV, T_TLBINVALIDR);
+
+ if ((type & T_USER) == 0)
+ return;
+
+ if (p != NULL)
+ userret(p, frame.tf_spc, sticks);
}