uboot/arch/arm/lib/interrupts.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2003
   4 * Texas Instruments <www.ti.com>
   5 *
   6 * (C) Copyright 2002
   7 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
   8 * Marius Groeger <mgroeger@sysgo.de>
   9 *
  10 * (C) Copyright 2002
  11 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  12 * Alex Zuepke <azu@sysgo.de>
  13 *
  14 * (C) Copyright 2002-2004
  15 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
  16 *
  17 * (C) Copyright 2004
  18 * Philippe Robin, ARM Ltd. <philippe.robin@arm.com>
  19 */
  20
  21#include <common.h>
  22#include <efi_loader.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
  54static void show_efi_loaded_images(struct pt_regs *regs)
  55{
  56        efi_print_image_infos((void *)instruction_pointer(regs));
  57}
  58
  59void show_regs (struct pt_regs *regs)
  60{
  61        unsigned long __maybe_unused flags;
  62        const char __maybe_unused *processor_modes[] = {
  63        "USER_26",      "FIQ_26",       "IRQ_26",       "SVC_26",
  64        "UK4_26",       "UK5_26",       "UK6_26",       "UK7_26",
  65        "UK8_26",       "UK9_26",       "UK10_26",      "UK11_26",
  66        "UK12_26",      "UK13_26",      "UK14_26",      "UK15_26",
  67        "USER_32",      "FIQ_32",       "IRQ_32",       "SVC_32",
  68        "UK4_32",       "UK5_32",       "UK6_32",       "ABT_32",
  69        "UK8_32",       "UK9_32",       "HYP_32",       "UND_32",
  70        "UK12_32",      "UK13_32",      "UK14_32",      "SYS_32",
  71        };
  72
  73        flags = condition_codes (regs);
  74
  75        printf("pc : [<%08lx>]     lr : [<%08lx>]\n",
  76               instruction_pointer(regs), regs->ARM_lr);
  77        if (gd->flags & GD_FLG_RELOC) {
  78                printf("reloc pc : [<%08lx>]       lr : [<%08lx>]\n",
  79                       instruction_pointer(regs) - gd->reloc_off,
  80                       regs->ARM_lr - gd->reloc_off);
  81        }
  82        printf("sp : %08lx  ip : %08lx   fp : %08lx\n",
  83               regs->ARM_sp, regs->ARM_ip, regs->ARM_fp);
  84        printf ("r10: %08lx  r9 : %08lx  r8 : %08lx\n",
  85                regs->ARM_r10, regs->ARM_r9, regs->ARM_r8);
  86        printf ("r7 : %08lx  r6 : %08lx  r5 : %08lx  r4 : %08lx\n",
  87                regs->ARM_r7, regs->ARM_r6, regs->ARM_r5, regs->ARM_r4);
  88        printf ("r3 : %08lx  r2 : %08lx  r1 : %08lx  r0 : %08lx\n",
  89                regs->ARM_r3, regs->ARM_r2, regs->ARM_r1, regs->ARM_r0);
  90        printf ("Flags: %c%c%c%c",
  91                flags & CC_N_BIT ? 'N' : 'n',
  92                flags & CC_Z_BIT ? 'Z' : 'z',
  93                flags & CC_C_BIT ? 'C' : 'c', flags & CC_V_BIT ? 'V' : 'v');
  94        printf ("  IRQs %s  FIQs %s  Mode %s%s\n",
  95                interrupts_enabled (regs) ? "on" : "off",
  96                fast_interrupts_enabled (regs) ? "on" : "off",
  97                processor_modes[processor_mode (regs)],
  98                thumb_mode (regs) ? " (T)" : "");
  99}
 100
 101/* fixup PC to point to the instruction leading to the exception */
 102static inline void fixup_pc(struct pt_regs *regs, int offset)
 103{
 104        uint32_t pc = instruction_pointer(regs) + offset;
 105        regs->ARM_pc = pc | (regs->ARM_pc & PCMASK);
 106}
 107
 108void do_undefined_instruction (struct pt_regs *pt_regs)
 109{
 110        efi_restore_gd();
 111        printf ("undefined instruction\n");
 112        fixup_pc(pt_regs, -4);
 113        show_regs (pt_regs);
 114        show_efi_loaded_images(pt_regs);
 115        bad_mode ();
 116}
 117
 118void do_software_interrupt (struct pt_regs *pt_regs)
 119{
 120        efi_restore_gd();
 121        printf ("software interrupt\n");
 122        fixup_pc(pt_regs, -4);
 123        show_regs (pt_regs);
 124        show_efi_loaded_images(pt_regs);
 125        bad_mode ();
 126}
 127
 128void do_prefetch_abort (struct pt_regs *pt_regs)
 129{
 130        efi_restore_gd();
 131        printf ("prefetch abort\n");
 132        fixup_pc(pt_regs, -8);
 133        show_regs (pt_regs);
 134        show_efi_loaded_images(pt_regs);
 135        bad_mode ();
 136}
 137
 138void do_data_abort (struct pt_regs *pt_regs)
 139{
 140        efi_restore_gd();
 141        printf ("data abort\n");
 142        fixup_pc(pt_regs, -8);
 143        show_regs (pt_regs);
 144        show_efi_loaded_images(pt_regs);
 145        bad_mode ();
 146}
 147
 148void do_not_used (struct pt_regs *pt_regs)
 149{
 150        efi_restore_gd();
 151        printf ("not used\n");
 152        fixup_pc(pt_regs, -8);
 153        show_regs (pt_regs);
 154        show_efi_loaded_images(pt_regs);
 155        bad_mode ();
 156}
 157
 158void do_fiq (struct pt_regs *pt_regs)
 159{
 160        efi_restore_gd();
 161        printf ("fast interrupt request\n");
 162        fixup_pc(pt_regs, -8);
 163        show_regs (pt_regs);
 164        show_efi_loaded_images(pt_regs);
 165        bad_mode ();
 166}
 167
 168void do_irq (struct pt_regs *pt_regs)
 169{
 170        efi_restore_gd();
 171        printf ("interrupt request\n");
 172        fixup_pc(pt_regs, -8);
 173        show_regs (pt_regs);
 174        show_efi_loaded_images(pt_regs);
 175        bad_mode ();
 176}
 177