diff options
author | jhibbits <jhibbits@FreeBSD.org> | 2015-07-06 05:08:57 +0000 |
---|---|---|
committer | jhibbits <jhibbits@FreeBSD.org> | 2015-07-06 05:08:57 +0000 |
commit | 48723535b4d1ead4bceb5e3766c7dd7364ba5f54 (patch) | |
tree | 603a57fa74dbc4b6663d3f2fbedc65c5759a97b9 /sys/powerpc/booke | |
parent | 67af1c5d962a5f455169a191f0ca66dcd3137538 (diff) | |
download | FreeBSD-src-48723535b4d1ead4bceb5e3766c7dd7364ba5f54.zip FreeBSD-src-48723535b4d1ead4bceb5e3766c7dd7364ba5f54.tar.gz |
Merge booke and aim interrupt.c files.
Summary:
Both booke and AIM interrupt.c files contain nearly identical code. This merges
the two files, to reduce duplication.
Reviewers: #powerpc, marcel
Reviewed By: marcel
Subscribers: imp
Differential Revision: https://reviews.freebsd.org/D2991
Diffstat (limited to 'sys/powerpc/booke')
-rw-r--r-- | sys/powerpc/booke/interrupt.c | 169 | ||||
-rw-r--r-- | sys/powerpc/booke/trap_subr.S | 20 |
2 files changed, 13 insertions, 176 deletions
diff --git a/sys/powerpc/booke/interrupt.c b/sys/powerpc/booke/interrupt.c deleted file mode 100644 index 3786c68..0000000 --- a/sys/powerpc/booke/interrupt.c +++ /dev/null @@ -1,169 +0,0 @@ -/*- - * Copyright (C) 2006 Semihalf, Rafal Jaworowski <raj@semihalf.com> - * Copyright 2002 by Peter Grehan. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -/* - * Interrupts are dispatched to here from locore asm - */ - -#include "opt_hwpmc_hooks.h" - -#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/interrupt.h> -#include <sys/kernel.h> -#include <sys/kthread.h> -#include <sys/ktr.h> -#include <sys/lock.h> -#include <sys/malloc.h> -#include <sys/mutex.h> -#ifdef HWPMC_HOOKS -#include <sys/pmckern.h> -#endif -#include <sys/proc.h> -#include <sys/smp.h> -#include <sys/unistd.h> -#include <sys/vmmeter.h> - -#include <machine/cpu.h> -#include <machine/db_machdep.h> -#include <machine/frame.h> -#include <machine/intr_machdep.h> -#include <machine/md_var.h> -#include <machine/pcb.h> -#include <machine/psl.h> -#include <machine/trap.h> - -#include "pic_if.h" - -extern void decr_intr(struct trapframe *); - -void powerpc_decr_interrupt(struct trapframe *); -void powerpc_extr_interrupt(struct trapframe *); -void powerpc_crit_interrupt(struct trapframe *); -void powerpc_mchk_interrupt(struct trapframe *); -#ifdef HWPMC_HOOKS -void powerpc_pmc_interrupt(struct trapframe *framep); -#endif - -static void dump_frame(struct trapframe *framep); - -static void -dump_frame(struct trapframe *frame) -{ - int i; - - printf("\n*** *** STACK FRAME DUMP *** ***\n"); - printf(" exc = 0x%x\n", frame->exc); - printf(" srr0 = 0x%08x\n", frame->srr0); - printf(" srr1 = 0x%08x\n", frame->srr1); - printf(" dear = 0x%08x\n", frame->dar); - printf(" esr = 0x%08x\n", frame->cpu.booke.esr); - printf(" lr = 0x%08x\n", frame->lr); - printf(" cr = 0x%08x\n", frame->cr); - printf(" sp = 0x%08x\n", frame->fixreg[1]); - - for (i = 0; i < 32; i++) { - printf(" R%02d = 0x%08x", i, frame->fixreg[i]); - if ((i & 0x3) == 3) - printf("\n"); - } - printf("\n"); -} - -void powerpc_crit_interrupt(struct trapframe *framep) -{ - - printf("powerpc_crit_interrupt: critical interrupt!\n"); - dump_frame(framep); - trap(framep); -} - -void powerpc_mchk_interrupt(struct trapframe *framep) -{ - - printf("powerpc_mchk_interrupt: machine check interrupt!\n"); - dump_frame(framep); - trap(framep); -} - -/* - * Decrementer interrupt routine - */ -void -powerpc_decr_interrupt(struct trapframe *framep) -{ - struct thread *td; - struct trapframe *oldframe; - - td = curthread; - critical_enter(); - atomic_add_int(&td->td_intr_nesting_level, 1); - oldframe = td->td_intr_frame; - td->td_intr_frame = framep; - decr_intr(framep); - td->td_intr_frame = oldframe; - atomic_subtract_int(&td->td_intr_nesting_level, 1); - critical_exit(); - framep->srr1 &= ~PSL_WE; -} - -/* - * External input interrupt routine - */ -void -powerpc_extr_interrupt(struct trapframe *framep) -{ - - critical_enter(); - PIC_DISPATCH(root_pic, framep); - critical_exit(); - framep->srr1 &= ~PSL_WE; -} - -#ifdef HWPMC_HOOKS -/* - * Performance Counter interrupt routine - */ -void -powerpc_pmc_interrupt(struct trapframe *framep) -{ - - critical_enter(); - KASSERT(pmc_intr != NULL, ("Performance exception, but no handler!")); - (*pmc_intr)(PCPU_GET(cpuid), framep); - critical_exit(); - if (pmc_hook && (PCPU_GET(curthread)->td_pflags & TDP_CALLCHAIN)) - pmc_hook(PCPU_GET(curthread), PMC_FN_USER_CALLCHAIN, framep); -} -#endif diff --git a/sys/powerpc/booke/trap_subr.S b/sys/powerpc/booke/trap_subr.S index c585f14..9e240f4 100644 --- a/sys/powerpc/booke/trap_subr.S +++ b/sys/powerpc/booke/trap_subr.S @@ -401,7 +401,7 @@ INTERRUPT(int_critical_input) STANDARD_PROLOG(SPR_SPRG2, PC_BOOKE_CRITSAVE, SPR_CSRR0, SPR_CSRR1) FRAME_SETUP(SPR_SPRG2, PC_BOOKE_CRITSAVE, EXC_CRIT) addi %r3, %r1, 8 - bl CNAME(powerpc_crit_interrupt) + bl CNAME(powerpc_interrupt) FRAME_LEAVE(SPR_CSRR0, SPR_CSRR1) rfci @@ -413,7 +413,7 @@ INTERRUPT(int_machine_check) STANDARD_PROLOG(SPR_SPRG3, PC_BOOKE_MCHKSAVE, SPR_MCSRR0, SPR_MCSRR1) FRAME_SETUP(SPR_SPRG3, PC_BOOKE_MCHKSAVE, EXC_MCHK) addi %r3, %r1, 8 - bl CNAME(powerpc_mchk_interrupt) + bl CNAME(powerpc_interrupt) FRAME_LEAVE(SPR_MCSRR0, SPR_MCSRR1) rfmci @@ -443,8 +443,8 @@ INTERRUPT(int_external_input) STANDARD_PROLOG(SPR_SPRG1, PC_TEMPSAVE, SPR_SRR0, SPR_SRR1) FRAME_SETUP(SPR_SPRG1, PC_TEMPSAVE, EXC_EXI) addi %r3, %r1, 8 - bl CNAME(powerpc_extr_interrupt) - b trapexit + bl CNAME(powerpc_interrupt) + b clear_we INTERRUPT(int_alignment) @@ -475,8 +475,8 @@ INTERRUPT(int_decrementer) STANDARD_PROLOG(SPR_SPRG1, PC_TEMPSAVE, SPR_SRR0, SPR_SRR1) FRAME_SETUP(SPR_SPRG1, PC_TEMPSAVE, EXC_DECR) addi %r3, %r1, 8 - bl CNAME(powerpc_decr_interrupt) - b trapexit + bl CNAME(powerpc_interrupt) + b clear_we /***************************************************************************** @@ -505,7 +505,7 @@ INTERRUPT(int_performance_counter) STANDARD_PROLOG(SPR_SPRG3, PC_TEMPSAVE, SPR_SRR0, SPR_SRR1) FRAME_SETUP(SPR_SPRG3, PC_TEMPSAVE, EXC_PERF) addi %r3, %r1, 8 - bl CNAME(powerpc_pmc_interrupt) + bl CNAME(powerpc_interrupt) b trapexit #endif @@ -879,6 +879,12 @@ dbleave: rfi #endif /* KDB */ +clear_we: + lwz %r3, (FRAME_SRR1+8)(%r1) + rlwinm %r3, %r3, 0, 14, 12 + stw %r3, (FRAME_SRR1+8)(%r1) + b trapexit + #ifdef SMP ENTRY(tlb_lock) GET_CPUINFO(%r5) |