^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Mostly IRQ support for Hexagon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2010-2012, The Linux Foundation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/sched/debug.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/registers.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/hardirq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * show_regs - print pt_regs structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * @regs: pointer to pt_regs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * To-do: add all the accessor definitions to registers.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * Will make this routine a lot easier to write.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) void show_regs(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) show_regs_print_info(KERN_EMERG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) printk(KERN_EMERG "restart_r0: \t0x%08lx syscall_nr: %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) regs->restart_r0, regs->syscall_nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) printk(KERN_EMERG "preds: \t\t0x%08lx\n", regs->preds);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) printk(KERN_EMERG "lc0: \t0x%08lx sa0: 0x%08lx m0: 0x%08lx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) regs->lc0, regs->sa0, regs->m0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) printk(KERN_EMERG "lc1: \t0x%08lx sa1: 0x%08lx m1: 0x%08lx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) regs->lc1, regs->sa1, regs->m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) printk(KERN_EMERG "gp: \t0x%08lx ugp: 0x%08lx usr: 0x%08lx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) regs->gp, regs->ugp, regs->usr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) printk(KERN_EMERG "cs0: \t0x%08lx cs1: 0x%08lx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) regs->cs0, regs->cs1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) printk(KERN_EMERG "r0: \t0x%08lx %08lx %08lx %08lx\n", regs->r00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) regs->r01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) regs->r02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) regs->r03);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) printk(KERN_EMERG "r4: \t0x%08lx %08lx %08lx %08lx\n", regs->r04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) regs->r05,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) regs->r06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) regs->r07);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) printk(KERN_EMERG "r8: \t0x%08lx %08lx %08lx %08lx\n", regs->r08,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) regs->r09,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) regs->r10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) regs->r11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) printk(KERN_EMERG "r12: \t0x%08lx %08lx %08lx %08lx\n", regs->r12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) regs->r13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) regs->r14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) regs->r15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) printk(KERN_EMERG "r16: \t0x%08lx %08lx %08lx %08lx\n", regs->r16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) regs->r17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) regs->r18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) regs->r19);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) printk(KERN_EMERG "r20: \t0x%08lx %08lx %08lx %08lx\n", regs->r20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) regs->r21,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) regs->r22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) regs->r23);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) printk(KERN_EMERG "r24: \t0x%08lx %08lx %08lx %08lx\n", regs->r24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) regs->r25,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) regs->r26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) regs->r27);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) printk(KERN_EMERG "r28: \t0x%08lx %08lx %08lx %08lx\n", regs->r28,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) regs->r29,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) regs->r30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) regs->r31);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) printk(KERN_EMERG "elr: \t0x%08lx cause: 0x%08lx user_mode: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) pt_elr(regs), pt_cause(regs), user_mode(regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) printk(KERN_EMERG "psp: \t0x%08lx badva: 0x%08lx int_enabled: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) pt_psp(regs), pt_badva(regs), ints_enabled(regs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) void dummy_handler(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) unsigned int elr = pt_elr(regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) printk(KERN_ERR "Unimplemented handler; ELR=0x%08x\n", elr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) void arch_do_IRQ(struct pt_regs *regs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) int irq = pt_cause(regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct pt_regs *old_regs = set_irq_regs(regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) irq_enter();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) generic_handle_irq(irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) irq_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) set_irq_regs(old_regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }