Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2cc932a4 authored by Dima Zavin's avatar Dima Zavin Committed by Ruchi Kandoi
Browse files

ARM: add option to flush console before reboot



If the console_lock was held while the system was rebooted, the messages
in the temporary logbuffer would not have propogated to all the console
drivers.

This force releases the console lock if it failed to be acquired.

Change-Id: I193dcf7b968be17966833e50b8b8bc70d5d9fe89
Signed-off-by: default avatarDima Zavin <dima@android.com>
parent 00e6d24c
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1790,6 +1790,15 @@ config XEN
	help
	  Say Y if you want to run Linux in a Virtual Machine on Xen on ARM.

config ARM_FLUSH_CONSOLE_ON_RESTART
	bool "Force flush the console on restart"
	help
	  If the console is locked while the system is rebooted, the messages
	  in the temporary logbuffer would not have propogated to all the
	  console drivers. This option forces the console lock to be
	  released if it failed to be acquired, which will cause all the
	  pending messages to be flushed.

endmenu

menu "Boot options"
+31 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <linux/hw_breakpoint.h>
#include <linux/leds.h>
#include <linux/reboot.h>
#include <linux/console.h>

#include <asm/cacheflush.h>
#include <asm/idmap.h>
@@ -74,6 +75,31 @@ void arch_trigger_all_cpu_backtrace(void)
extern void call_with_stack(void (*fn)(void *), void *arg, void *sp);
typedef void (*phys_reset_t)(unsigned long);

#ifdef CONFIG_ARM_FLUSH_CONSOLE_ON_RESTART
void arm_machine_flush_console(void)
{
	printk("\n");
	pr_emerg("Restarting %s\n", linux_banner);
	if (console_trylock()) {
		console_unlock();
		return;
	}

	mdelay(50);

	local_irq_disable();
	if (!console_trylock())
		pr_emerg("arm_restart: Console was locked! Busting\n");
	else
		pr_emerg("arm_restart: Console was locked!\n");
	console_unlock();
}
#else
void arm_machine_flush_console(void)
{
}
#endif

/*
 * A temporary stack to use for CPU reset. This is static so that we
 * don't clobber it with the identity mapping. When running with this
@@ -237,6 +263,11 @@ void machine_restart(char *cmd)
	local_irq_disable();
	smp_send_stop();


	/* Flush the console to make sure all the relevant messages make it
	 * out to the console drivers */
	arm_machine_flush_console();

	if (arm_pm_restart)
		arm_pm_restart(reboot_mode, cmd);
	else