mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-08 08:02:59 -04:00
Merge branch 'sparc64-jump-to-boot-prom'
Vijay Kumar says:
====================
sparc64: Jump to boot prom from console on panic
V3 changes:
- patch 02/04: Added SERIAL_SUNHV conditional group for
sunhv_migrate_hvcons_irq in smp_send_stop().
V2 changes:
- Added cover letter patch
Currently Stop-A (L1A) does not make the kernel switch to OBP on panic. This
patchset addresses this issue. Also, now we can cause a jump to OBP by sending
'break' twice from sunhv console. On bare metal, one can send a break by
typing Esc + 'B' + Sysrq (or whatever). On LDOM, press Ctrl + ] in telnet,
and then "send break" at the telnet prompt.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
9
Documentation/sparc/console.txt
Normal file
9
Documentation/sparc/console.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Steps for sending 'break' on sunhv console:
|
||||
===========================================
|
||||
|
||||
On Baremetal:
|
||||
1. press Esc + 'B'
|
||||
|
||||
On LDOM:
|
||||
1. press Ctrl + ']'
|
||||
2. telnet> send break
|
||||
@@ -59,8 +59,11 @@ extern atomic_t dcpage_flushes;
|
||||
extern atomic_t dcpage_flushes_xcall;
|
||||
|
||||
extern int sysctl_tsb_ratio;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SERIAL_SUNHV
|
||||
void sunhv_migrate_hvcons_irq(int cpu);
|
||||
#endif
|
||||
#endif
|
||||
void sun_do_break(void);
|
||||
extern int stop_a_enabled;
|
||||
extern int scons_pwroff;
|
||||
|
||||
@@ -1443,6 +1443,7 @@ void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs)
|
||||
|
||||
static void stop_this_cpu(void *dummy)
|
||||
{
|
||||
set_cpu_online(smp_processor_id(), false);
|
||||
prom_stopself();
|
||||
}
|
||||
|
||||
@@ -1451,9 +1452,15 @@ void smp_send_stop(void)
|
||||
int cpu;
|
||||
|
||||
if (tlb_type == hypervisor) {
|
||||
int this_cpu = smp_processor_id();
|
||||
#ifdef CONFIG_SERIAL_SUNHV
|
||||
sunhv_migrate_hvcons_irq(this_cpu);
|
||||
#endif
|
||||
for_each_online_cpu(cpu) {
|
||||
if (cpu == smp_processor_id())
|
||||
if (cpu == this_cpu)
|
||||
continue;
|
||||
|
||||
set_cpu_online(cpu, false);
|
||||
#ifdef CONFIG_SUN_LDOMS
|
||||
if (ldom_domaining_enabled) {
|
||||
unsigned long hv_err;
|
||||
|
||||
@@ -116,7 +116,7 @@ static int receive_chars_getchar(struct uart_port *port)
|
||||
|
||||
static int receive_chars_read(struct uart_port *port)
|
||||
{
|
||||
int saw_console_brk = 0;
|
||||
static int saw_console_brk;
|
||||
int limit = 10000;
|
||||
|
||||
while (limit-- > 0) {
|
||||
@@ -128,6 +128,9 @@ static int receive_chars_read(struct uart_port *port)
|
||||
bytes_read = 0;
|
||||
|
||||
if (stat == CON_BREAK) {
|
||||
if (saw_console_brk)
|
||||
sun_do_break();
|
||||
|
||||
if (uart_handle_break(port))
|
||||
continue;
|
||||
saw_console_brk = 1;
|
||||
@@ -151,6 +154,7 @@ static int receive_chars_read(struct uart_port *port)
|
||||
if (port->sysrq != 0 && *con_read_page) {
|
||||
for (i = 0; i < bytes_read; i++)
|
||||
uart_handle_sysrq_char(port, con_read_page[i]);
|
||||
saw_console_brk = 0;
|
||||
}
|
||||
|
||||
if (port->state == NULL)
|
||||
@@ -398,6 +402,12 @@ static struct uart_driver sunhv_reg = {
|
||||
|
||||
static struct uart_port *sunhv_port;
|
||||
|
||||
void sunhv_migrate_hvcons_irq(int cpu)
|
||||
{
|
||||
/* Migrate hvcons irq to param cpu */
|
||||
irq_force_affinity(sunhv_port->irq, cpumask_of(cpu));
|
||||
}
|
||||
|
||||
/* Copy 's' into the con_write_page, decoding "\n" into
|
||||
* "\r\n" along the way. We have to return two lengths
|
||||
* because the caller needs to know how much to advance
|
||||
|
||||
@@ -273,7 +273,8 @@ void panic(const char *fmt, ...)
|
||||
extern int stop_a_enabled;
|
||||
/* Make sure the user can actually press Stop-A (L1-A) */
|
||||
stop_a_enabled = 1;
|
||||
pr_emerg("Press Stop-A (L1-A) to return to the boot prom\n");
|
||||
pr_emerg("Press Stop-A (L1-A) from sun keyboard or send break\n"
|
||||
"twice on console to return to the boot prom\n");
|
||||
}
|
||||
#endif
|
||||
#if defined(CONFIG_S390)
|
||||
|
||||
Reference in New Issue
Block a user