Date: Mon, 6 Jul 2015 05:08:58 +0000 (UTC) From: Justin Hibbits <jhibbits@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r285195 - in head/sys: conf powerpc/aim powerpc/booke powerpc/powerpc Message-ID: <201507060508.t6658w0J006681@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhibbits Date: Mon Jul 6 05:08:57 2015 New Revision: 285195 URL: https://svnweb.freebsd.org/changeset/base/285195 Log: 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 Added: head/sys/powerpc/powerpc/interrupt.c - copied unchanged from r284893, head/sys/powerpc/aim/interrupt.c Deleted: head/sys/powerpc/aim/interrupt.c head/sys/powerpc/booke/interrupt.c Modified: head/sys/conf/files.powerpc head/sys/powerpc/booke/trap_subr.S Modified: head/sys/conf/files.powerpc ============================================================================== --- head/sys/conf/files.powerpc Mon Jul 6 04:31:24 2015 (r285194) +++ head/sys/conf/files.powerpc Mon Jul 6 05:08:57 2015 (r285195) @@ -99,7 +99,6 @@ libkern/qdivrem.c optional powerpc libkern/ucmpdi2.c optional powerpc libkern/udivdi3.c optional powerpc libkern/umoddi3.c optional powerpc -powerpc/aim/interrupt.c optional aim powerpc/aim/locore.S optional aim no-obj powerpc/aim/aim_machdep.c optional aim powerpc/aim/mmu_oea.c optional aim powerpc @@ -108,7 +107,6 @@ powerpc/aim/moea64_if.m optional aim powerpc/aim/moea64_native.c optional aim powerpc/aim/mp_cpudep.c optional aim powerpc/aim/slb.c optional aim powerpc64 -powerpc/booke/interrupt.c optional booke powerpc/booke/locore.S optional booke no-obj powerpc/booke/booke_machdep.c optional booke powerpc/booke/machdep_e500.c optional booke_e500 @@ -197,6 +195,7 @@ powerpc/powerpc/fpu.c standard powerpc/powerpc/fuswintr.c standard powerpc/powerpc/gdb_machdep.c optional gdb powerpc/powerpc/in_cksum.c optional inet | inet6 +powerpc/powerpc/interrupt.c standard powerpc/powerpc/intr_machdep.c standard powerpc/powerpc/iommu_if.m standard powerpc/powerpc/machdep.c standard Modified: head/sys/powerpc/booke/trap_subr.S ============================================================================== --- head/sys/powerpc/booke/trap_subr.S Mon Jul 6 04:31:24 2015 (r285194) +++ head/sys/powerpc/booke/trap_subr.S Mon Jul 6 05:08:57 2015 (r285195) @@ -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) Copied: head/sys/powerpc/powerpc/interrupt.c (from r284893, head/sys/powerpc/aim/interrupt.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/powerpc/powerpc/interrupt.c Mon Jul 6 05:08:57 2015 (r285195, copy of r284893, head/sys/powerpc/aim/interrupt.c) @@ -0,0 +1,122 @@ +/*- + * 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. + * + * $FreeBSD$ + */ + +/* + * Interrupts are dispatched to here from locore asm + */ + +#include "opt_hwpmc_hooks.h" + +#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ + +#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/clock.h> +#include <machine/db_machdep.h> +#include <machine/fpu.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 <machine/spr.h> +#include <machine/sr.h> + +#include "pic_if.h" + +/* + * A very short dispatch, to try and maximise assembler code use + * between all exception types. Maybe 'true' interrupts should go + * here, and the trap code can come in separately + */ +void +powerpc_interrupt(struct trapframe *framep) +{ + struct thread *td; + struct trapframe *oldframe; + register_t ee; + + td = curthread; + + CTR2(KTR_INTR, "%s: EXC=%x", __func__, framep->exc); + + switch (framep->exc) { + case EXC_EXI: + critical_enter(); + PIC_DISPATCH(root_pic, framep); + critical_exit(); + break; + + case EXC_DECR: + 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(); + break; +#ifdef HWPMC_HOOKS + case EXC_PERF: + critical_enter(); + KASSERT(pmc_intr != NULL, ("Performance exception, but no handler!")); + (*pmc_intr)(PCPU_GET(cpuid), framep); + if (pmc_hook && (PCPU_GET(curthread)->td_pflags & TDP_CALLCHAIN)) + pmc_hook(PCPU_GET(curthread), PMC_FN_USER_CALLCHAIN, framep); + critical_exit(); + break; +#endif + + default: + /* Re-enable interrupts if applicable. */ + ee = framep->srr1 & PSL_EE; + if (ee != 0) + mtmsr(mfmsr() | ee); + trap(framep); + } +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507060508.t6658w0J006681>