1ea0364f1SPeter Tyser /* 2ea0364f1SPeter Tyser * (C) Copyright 2003 3ea0364f1SPeter Tyser * Texas Instruments <www.ti.com> 4ea0364f1SPeter Tyser * 5ea0364f1SPeter Tyser * (C) Copyright 2002 6ea0364f1SPeter Tyser * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 7ea0364f1SPeter Tyser * Marius Groeger <mgroeger@sysgo.de> 8ea0364f1SPeter Tyser * 9ea0364f1SPeter Tyser * (C) Copyright 2002 10ea0364f1SPeter Tyser * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 11ea0364f1SPeter Tyser * Alex Zuepke <azu@sysgo.de> 12ea0364f1SPeter Tyser * 13ea0364f1SPeter Tyser * (C) Copyright 2002-2004 14ea0364f1SPeter Tyser * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> 15ea0364f1SPeter Tyser * 16ea0364f1SPeter Tyser * (C) Copyright 2004 17ea0364f1SPeter Tyser * Philippe Robin, ARM Ltd. <philippe.robin@arm.com> 18ea0364f1SPeter Tyser * 191a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 20ea0364f1SPeter Tyser */ 21ea0364f1SPeter Tyser 22ea0364f1SPeter Tyser #include <common.h> 23ea0364f1SPeter Tyser #include <asm/proc-armv/ptrace.h> 24ea0364f1SPeter Tyser 25ea0364f1SPeter Tyser DECLARE_GLOBAL_DATA_PTR; 26ea0364f1SPeter Tyser 27f1d2b313SHeiko Schocher #ifdef CONFIG_USE_IRQ 28ea0364f1SPeter Tyser int interrupt_init (void) 29ea0364f1SPeter Tyser { 30ea0364f1SPeter Tyser /* 31ea0364f1SPeter Tyser * setup up stacks if necessary 32ea0364f1SPeter Tyser */ 33f1d2b313SHeiko Schocher IRQ_STACK_START = gd->irq_sp - 4; 34f1d2b313SHeiko Schocher IRQ_STACK_START_IN = gd->irq_sp + 8; 35ea0364f1SPeter Tyser FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ; 36ea0364f1SPeter Tyser 37ea0364f1SPeter Tyser return arch_interrupt_init(); 38ea0364f1SPeter Tyser } 39ea0364f1SPeter Tyser 40ea0364f1SPeter Tyser /* enable IRQ interrupts */ 41ea0364f1SPeter Tyser void enable_interrupts (void) 42ea0364f1SPeter Tyser { 43ea0364f1SPeter Tyser unsigned long temp; 44ea0364f1SPeter Tyser __asm__ __volatile__("mrs %0, cpsr\n" 45ea0364f1SPeter Tyser "bic %0, %0, #0x80\n" 46ea0364f1SPeter Tyser "msr cpsr_c, %0" 47ea0364f1SPeter Tyser : "=r" (temp) 48ea0364f1SPeter Tyser : 49ea0364f1SPeter Tyser : "memory"); 50ea0364f1SPeter Tyser } 51ea0364f1SPeter Tyser 52ea0364f1SPeter Tyser 53ea0364f1SPeter Tyser /* 54ea0364f1SPeter Tyser * disable IRQ/FIQ interrupts 55ea0364f1SPeter Tyser * returns true if interrupts had been enabled before we disabled them 56ea0364f1SPeter Tyser */ 57ea0364f1SPeter Tyser int disable_interrupts (void) 58ea0364f1SPeter Tyser { 59ea0364f1SPeter Tyser unsigned long old,temp; 60ea0364f1SPeter Tyser __asm__ __volatile__("mrs %0, cpsr\n" 61ea0364f1SPeter Tyser "orr %1, %0, #0xc0\n" 62ea0364f1SPeter Tyser "msr cpsr_c, %1" 63ea0364f1SPeter Tyser : "=r" (old), "=r" (temp) 64ea0364f1SPeter Tyser : 65ea0364f1SPeter Tyser : "memory"); 66ea0364f1SPeter Tyser return (old & 0x80) == 0; 67ea0364f1SPeter Tyser } 68ea0364f1SPeter Tyser #else 69f1d2b313SHeiko Schocher int interrupt_init (void) 70f1d2b313SHeiko Schocher { 71f1d2b313SHeiko Schocher /* 72f1d2b313SHeiko Schocher * setup up stacks if necessary 73f1d2b313SHeiko Schocher */ 74f1d2b313SHeiko Schocher IRQ_STACK_START_IN = gd->irq_sp + 8; 75f1d2b313SHeiko Schocher 76f1d2b313SHeiko Schocher return 0; 77f1d2b313SHeiko Schocher } 78f1d2b313SHeiko Schocher 79ea0364f1SPeter Tyser void enable_interrupts (void) 80ea0364f1SPeter Tyser { 81ea0364f1SPeter Tyser return; 82ea0364f1SPeter Tyser } 83ea0364f1SPeter Tyser int disable_interrupts (void) 84ea0364f1SPeter Tyser { 85ea0364f1SPeter Tyser return 0; 86ea0364f1SPeter Tyser } 87ea0364f1SPeter Tyser #endif 88ea0364f1SPeter Tyser 89ea0364f1SPeter Tyser 90ea0364f1SPeter Tyser void bad_mode (void) 91ea0364f1SPeter Tyser { 92ea0364f1SPeter Tyser panic ("Resetting CPU ...\n"); 93ea0364f1SPeter Tyser reset_cpu (0); 94ea0364f1SPeter Tyser } 95ea0364f1SPeter Tyser 96ea0364f1SPeter Tyser void show_regs (struct pt_regs *regs) 97ea0364f1SPeter Tyser { 98ea0364f1SPeter Tyser unsigned long flags; 99ea0364f1SPeter Tyser const char *processor_modes[] = { 100ea0364f1SPeter Tyser "USER_26", "FIQ_26", "IRQ_26", "SVC_26", 101ea0364f1SPeter Tyser "UK4_26", "UK5_26", "UK6_26", "UK7_26", 102ea0364f1SPeter Tyser "UK8_26", "UK9_26", "UK10_26", "UK11_26", 103ea0364f1SPeter Tyser "UK12_26", "UK13_26", "UK14_26", "UK15_26", 104ea0364f1SPeter Tyser "USER_32", "FIQ_32", "IRQ_32", "SVC_32", 105ea0364f1SPeter Tyser "UK4_32", "UK5_32", "UK6_32", "ABT_32", 106*b726d22dSMarc Zyngier "UK8_32", "UK9_32", "HYP_32", "UND_32", 107ea0364f1SPeter Tyser "UK12_32", "UK13_32", "UK14_32", "SYS_32", 108ea0364f1SPeter Tyser }; 109ea0364f1SPeter Tyser 110ea0364f1SPeter Tyser flags = condition_codes (regs); 111ea0364f1SPeter Tyser 112ea0364f1SPeter Tyser printf ("pc : [<%08lx>] lr : [<%08lx>]\n" 113ea0364f1SPeter Tyser "sp : %08lx ip : %08lx fp : %08lx\n", 114ea0364f1SPeter Tyser instruction_pointer (regs), 115ea0364f1SPeter Tyser regs->ARM_lr, regs->ARM_sp, regs->ARM_ip, regs->ARM_fp); 116ea0364f1SPeter Tyser printf ("r10: %08lx r9 : %08lx r8 : %08lx\n", 117ea0364f1SPeter Tyser regs->ARM_r10, regs->ARM_r9, regs->ARM_r8); 118ea0364f1SPeter Tyser printf ("r7 : %08lx r6 : %08lx r5 : %08lx r4 : %08lx\n", 119ea0364f1SPeter Tyser regs->ARM_r7, regs->ARM_r6, regs->ARM_r5, regs->ARM_r4); 120ea0364f1SPeter Tyser printf ("r3 : %08lx r2 : %08lx r1 : %08lx r0 : %08lx\n", 121ea0364f1SPeter Tyser regs->ARM_r3, regs->ARM_r2, regs->ARM_r1, regs->ARM_r0); 122ea0364f1SPeter Tyser printf ("Flags: %c%c%c%c", 123ea0364f1SPeter Tyser flags & CC_N_BIT ? 'N' : 'n', 124ea0364f1SPeter Tyser flags & CC_Z_BIT ? 'Z' : 'z', 125ea0364f1SPeter Tyser flags & CC_C_BIT ? 'C' : 'c', flags & CC_V_BIT ? 'V' : 'v'); 126ea0364f1SPeter Tyser printf (" IRQs %s FIQs %s Mode %s%s\n", 127ea0364f1SPeter Tyser interrupts_enabled (regs) ? "on" : "off", 128ea0364f1SPeter Tyser fast_interrupts_enabled (regs) ? "on" : "off", 129ea0364f1SPeter Tyser processor_modes[processor_mode (regs)], 130ea0364f1SPeter Tyser thumb_mode (regs) ? " (T)" : ""); 131ea0364f1SPeter Tyser } 132ea0364f1SPeter Tyser 133ea0364f1SPeter Tyser void do_undefined_instruction (struct pt_regs *pt_regs) 134ea0364f1SPeter Tyser { 135ea0364f1SPeter Tyser printf ("undefined instruction\n"); 136ea0364f1SPeter Tyser show_regs (pt_regs); 137ea0364f1SPeter Tyser bad_mode (); 138ea0364f1SPeter Tyser } 139ea0364f1SPeter Tyser 140ea0364f1SPeter Tyser void do_software_interrupt (struct pt_regs *pt_regs) 141ea0364f1SPeter Tyser { 142ea0364f1SPeter Tyser printf ("software interrupt\n"); 143ea0364f1SPeter Tyser show_regs (pt_regs); 144ea0364f1SPeter Tyser bad_mode (); 145ea0364f1SPeter Tyser } 146ea0364f1SPeter Tyser 147ea0364f1SPeter Tyser void do_prefetch_abort (struct pt_regs *pt_regs) 148ea0364f1SPeter Tyser { 149ea0364f1SPeter Tyser printf ("prefetch abort\n"); 150ea0364f1SPeter Tyser show_regs (pt_regs); 151ea0364f1SPeter Tyser bad_mode (); 152ea0364f1SPeter Tyser } 153ea0364f1SPeter Tyser 154ea0364f1SPeter Tyser void do_data_abort (struct pt_regs *pt_regs) 155ea0364f1SPeter Tyser { 1561551df35STom Rini printf ("data abort\n"); 157ea0364f1SPeter Tyser show_regs (pt_regs); 158ea0364f1SPeter Tyser bad_mode (); 159ea0364f1SPeter Tyser } 160ea0364f1SPeter Tyser 161ea0364f1SPeter Tyser void do_not_used (struct pt_regs *pt_regs) 162ea0364f1SPeter Tyser { 163ea0364f1SPeter Tyser printf ("not used\n"); 164ea0364f1SPeter Tyser show_regs (pt_regs); 165ea0364f1SPeter Tyser bad_mode (); 166ea0364f1SPeter Tyser } 167ea0364f1SPeter Tyser 168ea0364f1SPeter Tyser void do_fiq (struct pt_regs *pt_regs) 169ea0364f1SPeter Tyser { 170ea0364f1SPeter Tyser printf ("fast interrupt request\n"); 171ea0364f1SPeter Tyser show_regs (pt_regs); 172ea0364f1SPeter Tyser bad_mode (); 173ea0364f1SPeter Tyser } 174ea0364f1SPeter Tyser 175ea0364f1SPeter Tyser #ifndef CONFIG_USE_IRQ 176ea0364f1SPeter Tyser void do_irq (struct pt_regs *pt_regs) 177ea0364f1SPeter Tyser { 178ea0364f1SPeter Tyser printf ("interrupt request\n"); 179ea0364f1SPeter Tyser show_regs (pt_regs); 180ea0364f1SPeter Tyser bad_mode (); 181ea0364f1SPeter Tyser } 182ea0364f1SPeter Tyser #endif 183