hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/powerpc/kernel/rtas.c
....@@ -52,10 +52,10 @@
5252 EXPORT_SYMBOL(rtas);
5353
5454 DEFINE_SPINLOCK(rtas_data_buf_lock);
55
-EXPORT_SYMBOL(rtas_data_buf_lock);
55
+EXPORT_SYMBOL_GPL(rtas_data_buf_lock);
5656
57
-char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned;
58
-EXPORT_SYMBOL(rtas_data_buf);
57
+char rtas_data_buf[RTAS_DATA_BUF_SIZE] __aligned(SZ_4K);
58
+EXPORT_SYMBOL_GPL(rtas_data_buf);
5959
6060 unsigned long rtas_rmo_buf;
6161
....@@ -64,7 +64,7 @@
6464 * This is done like this so rtas_flash can be a module.
6565 */
6666 void (*rtas_flash_term_hook)(int);
67
-EXPORT_SYMBOL(rtas_flash_term_hook);
67
+EXPORT_SYMBOL_GPL(rtas_flash_term_hook);
6868
6969 /* RTAS use home made raw locking instead of spin_lock_irqsave
7070 * because those can be called from within really nasty contexts
....@@ -312,7 +312,7 @@
312312
313313 spin_unlock(&progress_lock);
314314 }
315
-EXPORT_SYMBOL(rtas_progress); /* needed by rtas_flash module */
315
+EXPORT_SYMBOL_GPL(rtas_progress); /* needed by rtas_flash module */
316316
317317 int rtas_token(const char *service)
318318 {
....@@ -322,7 +322,7 @@
322322 tokp = of_get_property(rtas.dev, service, NULL);
323323 return tokp ? be32_to_cpu(*tokp) : RTAS_UNKNOWN_SERVICE;
324324 }
325
-EXPORT_SYMBOL(rtas_token);
325
+EXPORT_SYMBOL_GPL(rtas_token);
326326
327327 int rtas_service_present(const char *service)
328328 {
....@@ -399,7 +399,7 @@
399399 buf = kmalloc(RTAS_ERROR_LOG_MAX, GFP_ATOMIC);
400400 }
401401 if (buf)
402
- memcpy(buf, rtas_err_buf, RTAS_ERROR_LOG_MAX);
402
+ memmove(buf, rtas_err_buf, RTAS_ERROR_LOG_MAX);
403403 }
404404
405405 return buf;
....@@ -482,7 +482,7 @@
482482 }
483483 return ret;
484484 }
485
-EXPORT_SYMBOL(rtas_call);
485
+EXPORT_SYMBOL_GPL(rtas_call);
486486
487487 /* For RTAS_BUSY (-2), delay for 1 millisecond. For an extended busy status
488488 * code of 990n, perform the hinted delay of 10^n (last digit) milliseconds.
....@@ -517,7 +517,7 @@
517517
518518 return ms;
519519 }
520
-EXPORT_SYMBOL(rtas_busy_delay);
520
+EXPORT_SYMBOL_GPL(rtas_busy_delay);
521521
522522 static int rtas_error_rc(int rtas_rc)
523523 {
....@@ -563,7 +563,7 @@
563563 return rtas_error_rc(rc);
564564 return rc;
565565 }
566
-EXPORT_SYMBOL(rtas_get_power_level);
566
+EXPORT_SYMBOL_GPL(rtas_get_power_level);
567567
568568 int rtas_set_power_level(int powerdomain, int level, int *setlevel)
569569 {
....@@ -581,7 +581,7 @@
581581 return rtas_error_rc(rc);
582582 return rc;
583583 }
584
-EXPORT_SYMBOL(rtas_set_power_level);
584
+EXPORT_SYMBOL_GPL(rtas_set_power_level);
585585
586586 int rtas_get_sensor(int sensor, int index, int *state)
587587 {
....@@ -599,7 +599,7 @@
599599 return rtas_error_rc(rc);
600600 return rc;
601601 }
602
-EXPORT_SYMBOL(rtas_get_sensor);
602
+EXPORT_SYMBOL_GPL(rtas_get_sensor);
603603
604604 int rtas_get_sensor_fast(int sensor, int index, int *state)
605605 {
....@@ -660,7 +660,7 @@
660660 return rtas_error_rc(rc);
661661 return rc;
662662 }
663
-EXPORT_SYMBOL(rtas_set_indicator);
663
+EXPORT_SYMBOL_GPL(rtas_set_indicator);
664664
665665 /*
666666 * Ignoring RTAS extended delay
....@@ -715,6 +715,7 @@
715715
716716 /* Must be in the RMO region, so we place it here */
717717 static char rtas_os_term_buf[2048];
718
+static s32 ibm_os_term_token = RTAS_UNKNOWN_SERVICE;
718719
719720 void rtas_os_term(char *str)
720721 {
....@@ -726,16 +727,20 @@
726727 * this property may terminate the partition which we want to avoid
727728 * since it interferes with panic_timeout.
728729 */
729
- if (RTAS_UNKNOWN_SERVICE == rtas_token("ibm,os-term") ||
730
- RTAS_UNKNOWN_SERVICE == rtas_token("ibm,extended-os-term"))
730
+ if (ibm_os_term_token == RTAS_UNKNOWN_SERVICE)
731731 return;
732732
733733 snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str);
734734
735
+ /*
736
+ * Keep calling as long as RTAS returns a "try again" status,
737
+ * but don't use rtas_busy_delay(), which potentially
738
+ * schedules.
739
+ */
735740 do {
736
- status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL,
741
+ status = rtas_call(ibm_os_term_token, 1, 1, NULL,
737742 __pa(rtas_os_term_buf));
738
- } while (rtas_busy_delay(status));
743
+ } while (rtas_busy_delay_time(status));
739744
740745 if (status != 0)
741746 printk(KERN_EMERG "ibm,os-term call failed %d\n", status);
....@@ -1267,6 +1272,13 @@
12671272 no_entry = of_property_read_u32(rtas.dev, "linux,rtas-entry", &entry);
12681273 rtas.entry = no_entry ? rtas.base : entry;
12691274
1275
+ /*
1276
+ * Discover these now to avoid device tree lookups in the
1277
+ * panic path.
1278
+ */
1279
+ if (of_property_read_bool(rtas.dev, "ibm,extended-os-term"))
1280
+ ibm_os_term_token = rtas_token("ibm,os-term");
1281
+
12701282 /* If RTAS was found, allocate the RMO buffer for it and look for
12711283 * the stop-self token if any
12721284 */