2010-05-29 07:09:12 +04:00
/*
* Copyright 2010 Tilera Corporation . All Rights Reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation , version 2.
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE , GOOD TITLE or
* NON INFRINGEMENT . See the GNU General Public License for
* more details .
*/
# include <linux/console.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/string.h>
2012-03-28 21:30:03 +04:00
# include <linux/irqflags.h>
2013-04-30 03:17:18 +04:00
# include <linux/printk.h>
2010-05-29 07:09:12 +04:00
# include <asm/setup.h>
# include <hv/hypervisor.h>
static void early_hv_write ( struct console * con , const char * s , unsigned n )
{
hv_console_write ( ( HV_VirtAddr ) s , n ) ;
}
static struct console early_hv_console = {
. name = " earlyhv " ,
. write = early_hv_write ,
. flags = CON_PRINTBUFFER ,
. index = - 1 ,
} ;
/* Direct interface for emergencies */
static int early_console_complete ;
void early_panic ( const char * fmt , . . . )
{
va_list ap ;
2010-11-01 22:24:29 +03:00
arch_local_irq_disable_all ( ) ;
2010-05-29 07:09:12 +04:00
va_start ( ap , fmt ) ;
early_printk ( " Kernel panic - not syncing: " ) ;
early_vprintk ( fmt , ap ) ;
early_console - > write ( early_console , " \n " , 1 ) ;
va_end ( ap ) ;
dump_stack ( ) ;
hv_halt ( ) ;
}
static int __initdata keep_early ;
static int __init setup_early_printk ( char * str )
{
2013-04-30 03:17:18 +04:00
if ( early_console )
2010-05-29 07:09:12 +04:00
return 1 ;
if ( str ! = NULL & & strncmp ( str , " keep " , 4 ) = = 0 )
keep_early = 1 ;
early_console = & early_hv_console ;
register_console ( early_console ) ;
return 0 ;
}
void __init disable_early_printk ( void )
{
early_console_complete = 1 ;
2013-04-30 03:17:18 +04:00
if ( ! early_console )
2010-05-29 07:09:12 +04:00
return ;
if ( ! keep_early ) {
early_printk ( " disabling early console \n " ) ;
unregister_console ( early_console ) ;
2013-04-30 03:17:18 +04:00
early_console = NULL ;
2010-05-29 07:09:12 +04:00
} else {
early_printk ( " keeping early console \n " ) ;
}
}
void warn_early_printk ( void )
{
2013-04-30 03:17:18 +04:00
if ( early_console_complete | | early_console )
2010-05-29 07:09:12 +04:00
return ;
early_printk ( " \
Machine shutting down before console output is fully initialized . \ n \
You may wish to reboot and add the option ' earlyprintk ' to your \ n \
boot command line to see any diagnostic early console output . \ n \
" );
}
early_param ( " earlyprintk " , setup_early_printk ) ;