Commit c4e944c3 authored by Paul Mackerras's avatar Paul Mackerras Committed by Linus Torvalds

[PATCH] ppc64 another log buffer length fix

This patch uses the firmware-defined error log buffer length for calls to
the firmware routine 'check-exception'.  It also simplifies code in rtasd.c
that is attempting to obtain the error log length.
Signed-off-by: default avatarLinas Vepstas <linas@linas.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ad15f36c
...@@ -161,7 +161,8 @@ ras_epow_interrupt(int irq, void *dev_id, struct pt_regs * regs) ...@@ -161,7 +161,8 @@ ras_epow_interrupt(int irq, void *dev_id, struct pt_regs * regs)
RAS_VECTOR_OFFSET, RAS_VECTOR_OFFSET,
virt_irq_to_real(irq_offset_down(irq)), virt_irq_to_real(irq_offset_down(irq)),
RTAS_EPOW_WARNING | RTAS_POWERMGM_EVENTS, RTAS_EPOW_WARNING | RTAS_POWERMGM_EVENTS,
critical, __pa(&ras_log_buf), RTAS_ERROR_LOG_MAX); critical, __pa(&ras_log_buf),
rtas_get_error_log_max());
udbg_printf("EPOW <0x%lx 0x%x 0x%x>\n", udbg_printf("EPOW <0x%lx 0x%x 0x%x>\n",
*((unsigned long *)&ras_log_buf), status, state); *((unsigned long *)&ras_log_buf), status, state);
...@@ -196,7 +197,8 @@ ras_error_interrupt(int irq, void *dev_id, struct pt_regs * regs) ...@@ -196,7 +197,8 @@ ras_error_interrupt(int irq, void *dev_id, struct pt_regs * regs)
RAS_VECTOR_OFFSET, RAS_VECTOR_OFFSET,
virt_irq_to_real(irq_offset_down(irq)), virt_irq_to_real(irq_offset_down(irq)),
RTAS_INTERNAL_ERROR, 1 /*Time Critical */, RTAS_INTERNAL_ERROR, 1 /*Time Critical */,
__pa(&ras_log_buf), RTAS_ERROR_LOG_MAX); __pa(&ras_log_buf),
rtas_get_error_log_max());
rtas_elog = (struct rtas_error_log *)ras_log_buf; rtas_elog = (struct rtas_error_log *)ras_log_buf;
......
...@@ -516,6 +516,26 @@ void rtas_stop_self(void) ...@@ -516,6 +516,26 @@ void rtas_stop_self(void)
} }
#endif /* CONFIG_HOTPLUG_CPU */ #endif /* CONFIG_HOTPLUG_CPU */
/*
* Return the firmware-specified size of the error log buffer
* for all rtas calls that require an error buffer argument.
* This includes 'check-exception' and 'rtas-last-error'.
*/
int rtas_get_error_log_max(void)
{
static int rtas_error_log_max;
if (rtas_error_log_max)
return rtas_error_log_max;
rtas_error_log_max = rtas_token ("rtas-error-log-max");
if ((rtas_error_log_max == RTAS_UNKNOWN_SERVICE) ||
(rtas_error_log_max > RTAS_ERROR_LOG_MAX)) {
printk (KERN_WARNING "RTAS: bad log buffer size %d\n", rtas_error_log_max);
rtas_error_log_max = RTAS_ERROR_LOG_MAX;
}
return rtas_error_log_max;
}
EXPORT_SYMBOL(rtas_firmware_flash_list); EXPORT_SYMBOL(rtas_firmware_flash_list);
EXPORT_SYMBOL(rtas_token); EXPORT_SYMBOL(rtas_token);
EXPORT_SYMBOL(rtas_call); EXPORT_SYMBOL(rtas_call);
...@@ -526,3 +546,4 @@ EXPORT_SYMBOL(rtas_get_sensor); ...@@ -526,3 +546,4 @@ EXPORT_SYMBOL(rtas_get_sensor);
EXPORT_SYMBOL(rtas_get_power_level); EXPORT_SYMBOL(rtas_get_power_level);
EXPORT_SYMBOL(rtas_set_power_level); EXPORT_SYMBOL(rtas_set_power_level);
EXPORT_SYMBOL(rtas_set_indicator); EXPORT_SYMBOL(rtas_set_indicator);
EXPORT_SYMBOL(rtas_get_error_log_max);
...@@ -373,21 +373,8 @@ static int get_eventscan_parms(void) ...@@ -373,21 +373,8 @@ static int get_eventscan_parms(void)
rtas_event_scan_rate = *ip; rtas_event_scan_rate = *ip;
DEBUG("rtas-event-scan-rate %d\n", rtas_event_scan_rate); DEBUG("rtas-event-scan-rate %d\n", rtas_event_scan_rate);
ip = (int *)get_property(node, "rtas-error-log-max", NULL);
if (ip == NULL) {
printk(KERN_ERR "rtasd: no rtas-error-log-max\n");
of_node_put(node);
return -1;
}
rtas_error_log_max = *ip;
DEBUG("rtas-error-log-max %d\n", rtas_error_log_max);
if (rtas_error_log_max > RTAS_ERROR_LOG_MAX) {
printk(KERN_ERR "rtasd: truncated error log from %d to %d bytes\n", rtas_error_log_max, RTAS_ERROR_LOG_MAX);
rtas_error_log_max = RTAS_ERROR_LOG_MAX;
}
/* Make room for the sequence number */ /* Make room for the sequence number */
rtas_error_log_max = rtas_get_error_log_max();
rtas_error_log_buffer_max = rtas_error_log_max + sizeof(int); rtas_error_log_buffer_max = rtas_error_log_max + sizeof(int);
of_node_put(node); of_node_put(node);
......
...@@ -211,8 +211,14 @@ extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal); ...@@ -211,8 +211,14 @@ extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal);
#define RTAS_DEBUG KERN_DEBUG "RTAS: " #define RTAS_DEBUG KERN_DEBUG "RTAS: "
#define RTAS_ERROR_LOG_MAX 2048 #define RTAS_ERROR_LOG_MAX 2048
/*
* Return the firmware-specified size of the error log buffer
* for all rtas calls that require an error buffer argument.
* This includes 'check-exception' and 'rtas-last-error'.
*/
extern int rtas_get_error_log_max(void);
/* Event Scan Parameters */ /* Event Scan Parameters */
#define EVENT_SCAN_ALL_EVENTS 0xf0000000 #define EVENT_SCAN_ALL_EVENTS 0xf0000000
#define SURVEILLANCE_TOKEN 9000 #define SURVEILLANCE_TOKEN 9000
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment