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 * SPDX-License-Identifier:     GPL-2.0+
  20 */
  21
  22#include <common.h>
  23#include <asm/proc-armv/ptrace.h>
  24#include <asm/u-boot-arm.h>
  25#include <efi_loader.h>
  26
  27DECLARE_GLOBAL_DATA_PTR;
  28
  29int interrupt_init (void)
  30{
  31        /*
  32         * setup up stacks if necessary
  33         */
  34        IRQ_STACK_START_IN = gd->irq_sp + 8;
  35
  36        return 0;
  37}
  38
  39void enable_interrupts (void)
  40{
  41        return;
  42}
  43int disable_interrupts (void)
  44{
  45        return 0;
  46}
  47
  48void bad_mode (void)
  49{
  50        panic ("Resetting CPU ...\n");
  51        reset_cpu (0);
  52}
  53
  54void show_regs (struct pt_regs *regs)
  55{
  56        unsigned long __maybe_unused flags;
  57        const char __maybe_unused *processor_modes[] = {
  58        "USER_26",      "FIQ_26",       "IRQ_26",       "SVC_26",
  59        "UK4_26",       "UK5_26",       "UK6_26",       "UK7_26",
  60        "UK8_26",       "UK9_26",       "UK10_26",      "UK11_26",
  61        "UK12_26",      "UK13_26",      "UK14_26",      "UK15_26",
  62        "USER_32",      "FIQ_32",       "IRQ_32",       "SVC_32",
  63        "UK4_32",       "UK5_32",       "UK6_32",       "ABT_32",
  64        "UK8_32",       "UK9_32",       "HYP_32",       "UND_32",
  65        "UK12_32",      "UK13_32",      "UK14_32",      "SYS_32",
  66        };
  67
  68        flags = condition_codes (regs);
  69
  70        printf("pc : [<%08lx>]     lr : [<%08lx>]\n",
  71               instruction_pointer(regs), regs->ARM_lr);
  72        if (gd->flags & GD_FLG_RELOC) {
  73                printf("reloc pc : [<%08lx>]       lr : [<%08lx>]\n",
  74                       instruction_pointer(regs) - gd->reloc_off,
  75                       regs->ARM_lr - gd->reloc_off);
  76        }
  77        printf("sp : %08lx  ip : %08lx   fp : %08lx\n",
  78               regs->ARM_sp, regs->ARM_ip, regs->ARM_fp);
  79        printf ("r10: %08lx  r9 : %08lx  r8 : %08lx\n",
  80                regs->ARM_r10, regs->ARM_r9, regs->ARM_r8);
  81        printf ("r7 : %08lx  r6 : %08lx  r5 : %08lx  r4 : %08lx\n",
  82                regs->ARM_r7, regs->ARM_r6, regs->ARM_r5, regs->ARM_r4);
  83        printf ("r3 : %08lx  r2 : %08lx  r1 : %08lx  r0 : %08lx\n",
  84                regs->ARM_r3, regs->ARM_r2, regs->ARM_r1, regs->ARM_r0);
  85        printf ("Flags: %c%c%c%c",
  86                flags & CC_N_BIT ? 'N' : 'n',
  87                flags & CC_Z_BIT ? 'Z' : 'z',
  88                flags & CC_C_BIT ? 'C' : 'c', flags & CC_V_BIT ? 'V' : 'v');
  89        printf ("  IRQs %s  FIQs %s  Mode %s%s\n",
  90                interrupts_enabled (regs) ? "on" : "off",
  91                fast_interrupts_enabled (regs) ? "on" : "off",
  92                processor_modes[processor_mode (regs)],
  93                thumb_mode (regs) ? " (T)" : "");
  94}
  95
  96/* fixup PC to point to the instruction leading to the exception */
  97static inline void fixup_pc(struct pt_regs *regs, int offset)
  98{
  99        uint32_t pc = instruction_pointer(regs) + offset;
 100        regs->ARM_pc = pc | (regs->ARM_pc & PCMASK);
 101}
 102
 103void do_undefined_instruction (struct pt_regs *pt_regs)
 104{
 105        efi_restore_gd();
 106        printf ("undefined instruction\n");
 107        fixup_pc(pt_regs, -4);
 108        show_regs (pt_regs);
 109        bad_mode ();
 110}
 111
 112void do_software_interrupt (struct pt_regs *pt_regs)
 113{
 114        efi_restore_gd();
 115        printf ("software interrupt\n");
 116        fixup_pc(pt_regs, -4);
 117        show_regs (pt_regs);
 118        bad_mode ();
 119}
 120
 121void do_prefetch_abort (struct pt_regs *pt_regs)
 122{
 123        efi_restore_gd();
 124        printf ("prefetch abort\n");
 125        fixup_pc(pt_regs, -8);
 126        show_regs (pt_regs);
 127        bad_mode ();
 128}
 129
 130void do_data_abort (struct pt_regs *pt_regs)
 131{
 132        efi_restore_gd();
 133        printf ("data abort\n");
 134        fixup_pc(pt_regs, -8);
 135        show_regs (pt_regs);
 136        bad_mode ();
 137}
 138
 139void do_not_used (struct pt_regs *pt_regs)
 140{
 141        efi_restore_gd();
 142        printf ("not used\n");
 143        fixup_pc(pt_regs, -8);
 144        show_regs (pt_regs);
 145        bad_mode ();
 146}
 147
 148void do_fiq (struct pt_regs *pt_regs)
 149{
 150        efi_restore_gd();
 151        printf ("fast interrupt request\n");
 152        fixup_pc(pt_regs, -8);
 153        show_regs (pt_regs);
 154        bad_mode ();
 155}
 156
 157void do_irq (struct pt_regs *pt_regs)
 158{
 159        efi_restore_gd();
 160        printf ("interrupt request\n");
 161        fixup_pc(pt_regs, -8);
 162        show_regs (pt_regs);
 163        bad_mode ();
 164}
 165