aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of/unittest.c
diff options
context:
space:
mode:
authorGuenter Roeck <linux@roeck-us.net>2018-09-26 00:06:24 -0400
committerRob Herring <robh@kernel.org>2018-09-27 17:11:41 -0400
commitda08d8cb8cfc58a340fc5e163385b5dfd714d762 (patch)
tree0c29af4caa2f44d69980ed9573d268ab54b10361 /drivers/of/unittest.c
parent9b06e1c148ff9e05fe55cb256e5e28883743611b (diff)
of: unittest: Disable interrupt node tests for old world MAC systems
On systems with OF_IMAP_OLDWORLD_MAC set in of_irq_workarounds, the devicetree interrupt parsing code is different, causing unit tests of devicetree interrupt nodes to fail. Due to a bug in unittest code, which tries to dereference an uninitialized pointer, this results in a crash. OF: /testcase-data/phandle-tests/consumer-a: arguments longer than property Unable to handle kernel paging request for data at address 0x00bc616e Faulting instruction address: 0xc08e9468 Oops: Kernel access of bad area, sig: 11 [#1] BE PREEMPT PowerMac Modules linked in: CPU: 0 PID: 1 Comm: swapper Not tainted 4.14.72-rc1-yocto-standard+ #1 task: cf8e0000 task.stack: cf8da000 NIP: c08e9468 LR: c08ea5bc CTR: c08ea5ac REGS: cf8dbb50 TRAP: 0300 Not tainted (4.14.72-rc1-yocto-standard+) MSR: 00001032 <ME,IR,DR,RI> CR: 82004044 XER: 00000000 DAR: 00bc616e DSISR: 40000000 GPR00: c08ea5bc cf8dbc00 cf8e0000 c13ca517 c13ca517 c13ca8a0 00000066 00000002 GPR08: 00000063 00bc614e c0b05865 000affff 82004048 00000000 c00047f0 00000000 GPR16: c0a80000 c0a9cc34 c13ca517 c0ad1134 05ffffff 000affff c0b05860 c0abeef8 GPR24: cecec278 cecec278 c0a8c4d0 c0a885e0 c13ca8a0 05ffffff c13ca8a0 c13ca517 NIP [c08e9468] device_node_gen_full_name+0x30/0x15c LR [c08ea5bc] device_node_string+0x190/0x3c8 Call Trace: [cf8dbc00] [c007f670] trace_hardirqs_on_caller+0x118/0x1fc (unreliable) [cf8dbc40] [c08ea5bc] device_node_string+0x190/0x3c8 [cf8dbcb0] [c08eb794] pointer+0x25c/0x4d0 [cf8dbd00] [c08ebcbc] vsnprintf+0x2b4/0x5ec [cf8dbd60] [c08ec00c] vscnprintf+0x18/0x48 [cf8dbd70] [c008e268] vprintk_store+0x4c/0x22c [cf8dbda0] [c008ecac] vprintk_emit+0x94/0x130 [cf8dbdd0] [c008ff54] printk+0x5c/0x6c [cf8dbe10] [c0b8ddd4] of_unittest+0x2220/0x26f8 [cf8dbea0] [c0004434] do_one_initcall+0x4c/0x184 [cf8dbf00] [c0b4534c] kernel_init_freeable+0x13c/0x1d8 [cf8dbf30] [c0004814] kernel_init+0x24/0x118 [cf8dbf40] [c0013398] ret_from_kernel_thread+0x5c/0x64 The problem was observed when running a qemu test for the g3beige machine with devicetree unittests enabled. Disable interrupt node tests on affected systems to avoid both false unittest failures and the crash. With this patch in place, unittest on the affected system passes with the following message. dt-test ### end of unittest - 144 passed, 0 failed Fixes: 53a42093d96ef ("of: Add device tree selftests") Signed-off-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Frank Rowand <frank.rowand@sony.com> Signed-off-by: Rob Herring <robh@kernel.org>
Diffstat (limited to 'drivers/of/unittest.c')
-rw-r--r--drivers/of/unittest.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index 35b7886e9592..a3a6866765f2 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -775,6 +775,9 @@ static void __init of_unittest_parse_interrupts(void)
775 struct of_phandle_args args; 775 struct of_phandle_args args;
776 int i, rc; 776 int i, rc;
777 777
778 if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
779 return;
780
778 np = of_find_node_by_path("/testcase-data/interrupts/interrupts0"); 781 np = of_find_node_by_path("/testcase-data/interrupts/interrupts0");
779 if (!np) { 782 if (!np) {
780 pr_err("missing testcase data\n"); 783 pr_err("missing testcase data\n");
@@ -849,6 +852,9 @@ static void __init of_unittest_parse_interrupts_extended(void)
849 struct of_phandle_args args; 852 struct of_phandle_args args;
850 int i, rc; 853 int i, rc;
851 854
855 if (of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)
856 return;
857
852 np = of_find_node_by_path("/testcase-data/interrupts/interrupts-extended0"); 858 np = of_find_node_by_path("/testcase-data/interrupts/interrupts-extended0");
853 if (!np) { 859 if (!np) {
854 pr_err("missing testcase data\n"); 860 pr_err("missing testcase data\n");
@@ -1005,15 +1011,19 @@ static void __init of_unittest_platform_populate(void)
1005 pdev = of_find_device_by_node(np); 1011 pdev = of_find_device_by_node(np);
1006 unittest(pdev, "device 1 creation failed\n"); 1012 unittest(pdev, "device 1 creation failed\n");
1007 1013
1008 irq = platform_get_irq(pdev, 0); 1014 if (!(of_irq_workarounds & OF_IMAP_OLDWORLD_MAC)) {
1009 unittest(irq == -EPROBE_DEFER, "device deferred probe failed - %d\n", irq); 1015 irq = platform_get_irq(pdev, 0);
1016 unittest(irq == -EPROBE_DEFER,
1017 "device deferred probe failed - %d\n", irq);
1010 1018
1011 /* Test that a parsing failure does not return -EPROBE_DEFER */ 1019 /* Test that a parsing failure does not return -EPROBE_DEFER */
1012 np = of_find_node_by_path("/testcase-data/testcase-device2"); 1020 np = of_find_node_by_path("/testcase-data/testcase-device2");
1013 pdev = of_find_device_by_node(np); 1021 pdev = of_find_device_by_node(np);
1014 unittest(pdev, "device 2 creation failed\n"); 1022 unittest(pdev, "device 2 creation failed\n");
1015 irq = platform_get_irq(pdev, 0); 1023 irq = platform_get_irq(pdev, 0);
1016 unittest(irq < 0 && irq != -EPROBE_DEFER, "device parsing error failed - %d\n", irq); 1024 unittest(irq < 0 && irq != -EPROBE_DEFER,
1025 "device parsing error failed - %d\n", irq);
1026 }
1017 1027
1018 np = of_find_node_by_path("/testcase-data/platform-tests"); 1028 np = of_find_node_by_path("/testcase-data/platform-tests");
1019 unittest(np, "No testcase data in device tree\n"); 1029 unittest(np, "No testcase data in device tree\n");