diff options
| author | msaitoh <msaitoh@NetBSD.org> | 2000-01-03 02:55:25 +0000 |
|---|---|---|
| committer | msaitoh <msaitoh@NetBSD.org> | 2000-01-03 02:55:25 +0000 |
| commit | 518cfb0bde416bd0c7d2492ca194301f8e376ec8 (patch) | |
| tree | 86145863c3d845fd7b639d7b14e0a0caa148e663 /sys | |
| parent | b0b4797dfba0c3967200950fe82aa0190cf4d61f (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.c | 25 |
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); } |
