diff options
author | kettenis <kettenis@openbsd.org> | 2020-06-22 18:15:50 +0000 |
---|---|---|
committer | kettenis <kettenis@openbsd.org> | 2020-06-22 18:15:50 +0000 |
commit | be00ebe64ffda37c7ac803f330b1c897f12b55ea (patch) | |
tree | de2f748158dc97b88158f2a224ce2da09ecab6ac | |
parent | Handle data storage and data segment interrupts from userland as well. (diff) | |
download | wireguard-openbsd-be00ebe64ffda37c7ac803f330b1c897f12b55ea.tar.xz wireguard-openbsd-be00ebe64ffda37c7ac803f330b1c897f12b55ea.zip |
Enable interrupts when they were enabled before the trap (except when we
are handling "genuine" interrupts like the decrementer and hypervisor
virtualization interrupts).
-rw-r--r-- | sys/arch/powerpc64/powerpc64/trap.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/sys/arch/powerpc64/powerpc64/trap.c b/sys/arch/powerpc64/powerpc64/trap.c index 3807aca55de..12aa0f8f2c3 100644 --- a/sys/arch/powerpc64/powerpc64/trap.c +++ b/sys/arch/powerpc64/powerpc64/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.12 2020/06/22 18:03:22 kettenis Exp $ */ +/* $OpenBSD: trap.c,v 1.13 2020/06/22 18:15:50 kettenis Exp $ */ /* * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org> @@ -56,6 +56,9 @@ trap(struct trapframe *frame) return; } + if (frame->srr1 & PSL_EE) + intr_enable(); + if (frame->srr1 & PSL_PR) { type |= EXC_USER; p->p_md.md_regs = frame; @@ -110,7 +113,6 @@ trap(struct trapframe *frame) goto fatal; case EXC_DSE|EXC_USER: - intr_enable(); pm = p->p_vmspace->vm_map.pmap; slbd = pmap_slbd_lookup(pm, frame->dar); if (slbd) { @@ -120,7 +122,6 @@ trap(struct trapframe *frame) /* FALLTHROUGH */ case EXC_DSI|EXC_USER: - intr_enable(); map = &p->p_vmspace->vm_map; va = frame->dar; if (frame->dsisr & DSISR_STORE) @@ -135,7 +136,6 @@ trap(struct trapframe *frame) break; case EXC_ISE|EXC_USER: - intr_enable(); pm = p->p_vmspace->vm_map.pmap; slbd = pmap_slbd_lookup(pm, frame->srr0); if (slbd) { @@ -145,7 +145,6 @@ trap(struct trapframe *frame) /* FALLTHROUGH */ case EXC_ISI|EXC_USER: - intr_enable(); map = &p->p_vmspace->vm_map; va = frame->srr0; ftype = PROT_READ | PROT_EXEC; @@ -157,13 +156,11 @@ trap(struct trapframe *frame) break; case EXC_SC|EXC_USER: - intr_enable(); syscall(frame); return; case EXC_AST|EXC_USER: p->p_md.md_astpending = 0; - intr_enable(); uvmexp.softs++; mi_ast(p, ci->ci_want_resched); break; |