mirror of https://github.com/OpenIPC/firmware.git
100 lines
2.8 KiB
Diff
100 lines
2.8 KiB
Diff
diff -drupN a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
|
|
--- a/arch/arm/kernel/process.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/arch/arm/kernel/process.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -80,6 +80,7 @@ void arch_cpu_idle_prepare(void)
|
|
|
|
void arch_cpu_idle_enter(void)
|
|
{
|
|
+ idle_notifier_call_chain(IDLE_START);
|
|
ledtrig_cpu(CPU_LED_IDLE_START);
|
|
#ifdef CONFIG_PL310_ERRATA_769419
|
|
wmb();
|
|
@@ -89,6 +90,78 @@ void arch_cpu_idle_enter(void)
|
|
void arch_cpu_idle_exit(void)
|
|
{
|
|
ledtrig_cpu(CPU_LED_IDLE_END);
|
|
+ idle_notifier_call_chain(IDLE_END);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * dump a block of kernel memory from around the given address
|
|
+ */
|
|
+static void show_data(unsigned long addr, int nbytes, const char *name)
|
|
+{
|
|
+ int i, j;
|
|
+ int nlines;
|
|
+ u32 *p;
|
|
+
|
|
+ /*
|
|
+ * don't attempt to dump non-kernel addresses or
|
|
+ * values that are probably just small negative numbers
|
|
+ */
|
|
+ if (addr < PAGE_OFFSET || addr > -256UL)
|
|
+ return;
|
|
+
|
|
+ printk("\n%s: %#lx:\n", name, addr);
|
|
+
|
|
+ /*
|
|
+ * round address down to a 32 bit boundary
|
|
+ * and always dump a multiple of 32 bytes
|
|
+ */
|
|
+ p = (u32 *)(addr & ~(sizeof(u32) - 1));
|
|
+ nbytes += (addr & (sizeof(u32) - 1));
|
|
+ nlines = (nbytes + 31) / 32;
|
|
+
|
|
+
|
|
+ for (i = 0; i < nlines; i++) {
|
|
+ /*
|
|
+ * just display low 16 bits of address to keep
|
|
+ * each line of the dump < 80 characters
|
|
+ */
|
|
+ printk("%04lx ", (unsigned long)p & 0xffff);
|
|
+ for (j = 0; j < 8; j++) {
|
|
+ u32 data;
|
|
+ if (probe_kernel_address(p, data)) {
|
|
+ pr_cont(" ********");
|
|
+ } else {
|
|
+ pr_cont(" %08x", data);
|
|
+ }
|
|
+ ++p;
|
|
+ }
|
|
+ pr_cont("\n");
|
|
+ }
|
|
+}
|
|
+
|
|
+static void show_extra_register_data(struct pt_regs *regs, int nbytes)
|
|
+{
|
|
+ mm_segment_t fs;
|
|
+
|
|
+ fs = get_fs();
|
|
+ set_fs(KERNEL_DS);
|
|
+ show_data(regs->ARM_pc - nbytes, nbytes * 2, "PC");
|
|
+ show_data(regs->ARM_lr - nbytes, nbytes * 2, "LR");
|
|
+ show_data(regs->ARM_sp - nbytes, nbytes * 2, "SP");
|
|
+ show_data(regs->ARM_ip - nbytes, nbytes * 2, "IP");
|
|
+ show_data(regs->ARM_fp - nbytes, nbytes * 2, "FP");
|
|
+ show_data(regs->ARM_r0 - nbytes, nbytes * 2, "R0");
|
|
+ show_data(regs->ARM_r1 - nbytes, nbytes * 2, "R1");
|
|
+ show_data(regs->ARM_r2 - nbytes, nbytes * 2, "R2");
|
|
+ show_data(regs->ARM_r3 - nbytes, nbytes * 2, "R3");
|
|
+ show_data(regs->ARM_r4 - nbytes, nbytes * 2, "R4");
|
|
+ show_data(regs->ARM_r5 - nbytes, nbytes * 2, "R5");
|
|
+ show_data(regs->ARM_r6 - nbytes, nbytes * 2, "R6");
|
|
+ show_data(regs->ARM_r7 - nbytes, nbytes * 2, "R7");
|
|
+ show_data(regs->ARM_r8 - nbytes, nbytes * 2, "R8");
|
|
+ show_data(regs->ARM_r9 - nbytes, nbytes * 2, "R9");
|
|
+ show_data(regs->ARM_r10 - nbytes, nbytes * 2, "R10");
|
|
+ set_fs(fs);
|
|
}
|
|
|
|
void __show_regs(struct pt_regs *regs)
|
|
@@ -182,6 +255,8 @@ void __show_regs(struct pt_regs *regs)
|
|
printk("Control: %08x%s\n", ctrl, buf);
|
|
}
|
|
#endif
|
|
+
|
|
+ show_extra_register_data(regs, 128);
|
|
}
|
|
|
|
void show_regs(struct pt_regs * regs)
|