1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2013-2014 Synopsys, Inc. All rights reserved.
8 #include <asm/arcregs.h>
9 #include <asm/ptrace.h>
11 /* Bit values in STATUS32 */
12 #define E1_MASK (1 << 1) /* Level 1 interrupts enable */
13 #define E2_MASK (1 << 2) /* Level 2 interrupts enable */
15 int interrupt_init(void)
21 * returns true if interrupts had been enabled before we disabled them
23 int disable_interrupts(void)
25 int status = read_aux_reg(ARC_AUX_STATUS32);
26 int state = (status & (E1_MASK | E2_MASK)) ? 1 : 0;
28 status &= ~(E1_MASK | E2_MASK);
29 /* STATUS32 register is updated indirectly with "FLAG" instruction */
30 __asm__("flag %0" : : "r" (status));
34 void enable_interrupts(void)
36 unsigned int status = read_aux_reg(ARC_AUX_STATUS32);
38 status |= E1_MASK | E2_MASK;
39 /* STATUS32 register is updated indirectly with "FLAG" instruction */
40 __asm__("flag %0" : : "r" (status));
43 static void print_reg_file(long *reg_rev, int start_num)
47 /* Print 3 registers per line */
48 for (i = start_num; i < start_num + 25; i++) {
49 printf("r%02u: 0x%08lx\t", i, (unsigned long)*reg_rev);
50 if (((i + 1) % 3) == 0)
53 /* Because pt_regs has registers reversed */
57 /* Add new-line if none was inserted in the end of loop above */
58 if (((i + 1) % 3) != 0)
62 void show_regs(struct pt_regs *regs)
64 printf("ECR:\t0x%08lx\n", regs->ecr);
65 printf("RET:\t0x%08lx\nBLINK:\t0x%08lx\nSTAT32:\t0x%08lx\n",
66 regs->ret, regs->blink, regs->status32);
67 printf("GP: 0x%08lx\t r25: 0x%08lx\t\n", regs->r26, regs->r25);
68 printf("BTA: 0x%08lx\t SP: 0x%08lx\t FP: 0x%08lx\n", regs->bta,
70 printf("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n", regs->lp_start,
71 regs->lp_end, regs->lp_count);
73 print_reg_file(&(regs->r0), 0);
76 void bad_mode(struct pt_regs *regs)
81 panic("Resetting CPU ...\n");
84 void do_memory_error(unsigned long address, struct pt_regs *regs)
86 printf("Memory error exception @ 0x%lx\n", address);
90 void do_instruction_error(unsigned long address, struct pt_regs *regs)
92 printf("Instruction error exception @ 0x%lx\n", address);
96 void do_machine_check_fault(unsigned long address, struct pt_regs *regs)
98 printf("Machine check exception @ 0x%lx\n", address);
102 void do_interrupt_handler(void)
104 printf("Interrupt fired\n");
108 void do_itlb_miss(struct pt_regs *regs)
110 printf("I TLB miss exception\n");
114 void do_dtlb_miss(struct pt_regs *regs)
116 printf("D TLB miss exception\n");
120 void do_tlb_prot_violation(unsigned long address, struct pt_regs *regs)
122 printf("TLB protection violation or misaligned access @ 0x%lx\n",
127 void do_privilege_violation(struct pt_regs *regs)
129 printf("Privilege violation exception\n");
133 void do_trap(struct pt_regs *regs)
135 printf("Trap exception\n");
139 void do_extension(struct pt_regs *regs)
141 printf("Extension instruction exception\n");
145 #ifdef CONFIG_ISA_ARCV2
146 void do_swi(struct pt_regs *regs)
148 printf("Software Interrupt exception\n");
152 void do_divzero(unsigned long address, struct pt_regs *regs)
154 printf("Division by zero exception @ 0x%lx\n", address);
158 void do_dcerror(struct pt_regs *regs)
160 printf("Data cache consistency error exception\n");
164 void do_maligned(unsigned long address, struct pt_regs *regs)
166 printf("Misaligned data access exception @ 0x%lx\n", address);