static bool emergency_reboot() { util::vibrate(100, 150); util::vibrate(100, 150); util::vibrate(100, 150); util::vibrate(100, 150); util::vibrate(100, 150); LOGW("--- EMERGENCY REBOOT FROM MBTOOL ---"); // Some devices don't have /proc/last_kmsg, so we'll attempt to save the // kernel log to /data/media/0/MultiBoot/kernel.log if (!util::is_mounted("/data")) { LOGW("/data is not mounted. Attempting to mount /data"); struct stat sb; // Try mounting /data in case we couldn't get through the fstab mounting // steps. (This is an ugly brute force method...) for (const char **ptr = data_block_devs; *ptr; ++ptr) { const char *block_dev = *ptr; if (stat(block_dev, &sb) < 0) { continue; } if (mount(block_dev, "/data", "ext4", 0, "") == 0 || mount(block_dev, "/data", "f2fs", 0, "") == 0) { LOGW("Mounted %s at /data", block_dev); break; } } } LOGW("Dumping kernel log to %s", MULTIBOOT_LOG_KERNEL); // Remove old log remove(MULTIBOOT_LOG_KERNEL); // Write new log util::mkdir_parent(MULTIBOOT_LOG_KERNEL, 0775); dump_kernel_log(MULTIBOOT_LOG_KERNEL); // Set file attributes on log file fix_multiboot_permissions(); sync(); umount("/data"); // Does not return if successful reboot_directly("recovery"); return false; }
static void debug_exec(const char *cmd, unsigned *regs) { if (!strcmp(cmd, "pc")) { dprintf(" pc %08x cpsr %08x mode %s\n", regs[15], regs[16], mode_name(regs[16])); } else if (!strcmp(cmd, "regs")) { dprintf(" r0 %08x r1 %08x r2 %08x r3 %08x\n", regs[0], regs[1], regs[2], regs[3]); dprintf(" r4 %08x r5 %08x r6 %08x r7 %08x\n", regs[4], regs[5], regs[6], regs[7]); dprintf(" r8 %08x r9 %08x r10 %08x r11 %08x mode %s\n", regs[8], regs[9], regs[10], regs[11], mode_name(regs[16])); dprintf(" ip %08x sp %08x lr %08x pc %08x cpsr %08x\n", regs[10], regs[13], regs[14], regs[15], regs[16]); } else if (!strcmp(cmd, "reboot")) { if (msm_hw_reset_hook) msm_hw_reset_hook(); } else if (!strcmp(cmd, "irqs")) { dump_irqs(); } else if (!strcmp(cmd, "kmsg")) { dump_kernel_log(); } else if (!strcmp(cmd, "version")) { dprintf("%s\n", linux_banner); } else { if (debug_busy) { dprintf("command processor busy. trying to abort.\n"); debug_abort = -1; } else { strcpy(debug_cmd, cmd); debug_busy = 1; } msm_trigger_irq(debug_signal_irq); return; } debug_prompt(); }