uboot/arch/arm/lib/interrupts.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2003
   3 * Texas Instruments <www.ti.com>
   4 *
   5 * (C) Copyright 2002
   6 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
   7 * Marius Groeger <mgroeger@sysgo.de>
   8 *
   9 * (C) Copyright 2002
  10 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  11 * Alex Zuepke <azu@sysgo.de>
  12 *
  13 * (C) Copyright 2002-2004
  14 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
  15 *
  16 * (C) Copyright 2004
  17 * Philippe Robin, ARM Ltd. <philippe.robin@arm.com>
  18 *
  19 * See file CREDITS for list of people who contributed to this
  20 * project.
  21 *
  22 * This program is free software; you can redistribute it and/or
  23 * modify it under the terms of the GNU General Public License as
  24 * published by the Free Software Foundation; either version 2 of
  25 * the License, or (at your option) any later version.
  26 *
  27 * This program is distributed in the hope that it will be useful,
  28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  30 * GNU General Public License for more details.
  31 *
  32 * You should have received a copy of the GNU General Public License
  33 * along with this program; if not, write to the Free Software
  34 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  35 * MA 02111-1307 USA
  36 */
  37
  38#include <common.h>
  39#include <asm/proc-armv/ptrace.h>
  40
  41DECLARE_GLOBAL_DATA_PTR;
  42
  43#ifdef CONFIG_USE_IRQ
  44int interrupt_init (void)
  45{
  46        /*
  47         * setup up stacks if necessary
  48         */
  49        IRQ_STACK_START = gd->irq_sp - 4;
  50        IRQ_STACK_START_IN = gd->irq_sp + 8;
  51        FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;
  52
  53        return arch_interrupt_init();
  54}
  55
  56/* enable IRQ interrupts */
  57void enable_interrupts (void)
  58{
  59        unsigned long temp;
  60        __asm__ __volatile__("mrs %0, cpsr\n"
  61                             "bic %0, %0, #0x80\n"
  62                             "msr cpsr_c, %0"
  63                             : "=r" (temp)
  64                             :
  65                             : "memory");
  66}
  67
  68
  69/*
  70 * disable IRQ/FIQ interrupts
  71 * returns true if interrupts had been enabled before we disabled them
  72 */
  73int disable_interrupts (void)
  74{
  75        unsigned long old,temp;
  76        __asm__ __volatile__("mrs %0, cpsr\n"
  77                             "orr %1, %0, #0xc0\n"
  78                             "msr cpsr_c, %1"
  79                             : "=r" (old), "=r" (temp)
  80                             :
  81                             : "memory");
  82        return (old & 0x80) == 0;
  83}
  84#else
  85int interrupt_init (void)
  86{
  87        /*
  88         * setup up stacks if necessary
  89         */
  90        IRQ_STACK_START_IN = gd->irq_sp + 8;
  91
  92        return 0;
  93}
  94
  95void enable_interrupts (void)
  96{
  97        return;
  98}
  99int disable_interrupts (void)
 100{
 101        return 0;
 102}
 103#endif
 104
 105
 106void bad_mode (void)
 107{
 108        panic ("Resetting CPU ...\n");
 109        reset_cpu (0);
 110}
 111
 112void show_regs (struct pt_regs *regs)
 113{
 114        unsigned long flags;
 115        const char *processor_modes[] = {
 116        "USER_26",      "FIQ_26",       "IRQ_26",       "SVC_26",
 117        "UK4_26",       "UK5_26",       "UK6_26",       "UK7_26",
 118        "UK8_26",       "UK9_26",       "UK10_26",      "UK11_26",
 119        "UK12_26",      "UK13_26",      "UK14_26",      "UK15_26",
 120        "USER_32",      "FIQ_32",       "IRQ_32",       "SVC_32",
 121        "UK4_32",       "UK5_32",       "UK6_32",       "ABT_32",
 122        "UK8_32",       "UK9_32",       "UK10_32",      "UND_32",
 123        "UK12_32",      "UK13_32",      "UK14_32",      "SYS_32",
 124        };
 125
 126        flags = condition_codes (regs);
 127
 128        printf ("pc : [<%08lx>]    lr : [<%08lx>]\n"
 129                "sp : %08lx  ip : %08lx  fp : %08lx\n",
 130                instruction_pointer (regs),
 131                regs->ARM_lr, regs->ARM_sp, regs->ARM_ip, regs->ARM_fp);
 132        printf ("r10: %08lx  r9 : %08lx  r8 : %08lx\n",
 133                regs->ARM_r10, regs->ARM_r9, regs->ARM_r8);
 134        printf ("r7 : %08lx  r6 : %08lx  r5 : %08lx  r4 : %08lx\n",
 135                regs->ARM_r7, regs->ARM_r6, regs->ARM_r5, regs->ARM_r4);
 136        printf ("r3 : %08lx  r2 : %08lx  r1 : %08lx  r0 : %08lx\n",
 137                regs->ARM_r3, regs->ARM_r2, regs->ARM_r1, regs->ARM_r0);
 138        printf ("Flags: %c%c%c%c",
 139                flags & CC_N_BIT ? 'N' : 'n',
 140                flags & CC_Z_BIT ? 'Z' : 'z',
 141                flags & CC_C_BIT ? 'C' : 'c', flags & CC_V_BIT ? 'V' : 'v');
 142        printf ("  IRQs %s  FIQs %s  Mode %s%s\n",
 143                interrupts_enabled (regs) ? "on" : "off",
 144                fast_interrupts_enabled (regs) ? "on" : "off",
 145                processor_modes[processor_mode (regs)],
 146                thumb_mode (regs) ? " (T)" : "");
 147}
 148
 149void do_undefined_instruction (struct pt_regs *pt_regs)
 150{
 151        printf ("undefined instruction\n");
 152        show_regs (pt_regs);
 153        bad_mode ();
 154}
 155
 156void do_software_interrupt (struct pt_regs *pt_regs)
 157{
 158        printf ("software interrupt\n");
 159        show_regs (pt_regs);
 160        bad_mode ();
 161}
 162
 163void do_prefetch_abort (struct pt_regs *pt_regs)
 164{
 165        printf ("prefetch abort\n");
 166        show_regs (pt_regs);
 167        bad_mode ();
 168}
 169
 170void do_data_abort (struct pt_regs *pt_regs)
 171{
 172        printf ("data abort\n");
 173        show_regs (pt_regs);
 174        bad_mode ();
 175}
 176
 177void do_not_used (struct pt_regs *pt_regs)
 178{
 179        printf ("not used\n");
 180        show_regs (pt_regs);
 181        bad_mode ();
 182}
 183
 184void do_fiq (struct pt_regs *pt_regs)
 185{
 186        printf ("fast interrupt request\n");
 187        show_regs (pt_regs);
 188        bad_mode ();
 189}
 190
 191#ifndef CONFIG_USE_IRQ
 192void do_irq (struct pt_regs *pt_regs)
 193{
 194        printf ("interrupt request\n");
 195        show_regs (pt_regs);
 196        bad_mode ();
 197}
 198#endif
 199