From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753452AbdCAWFs (ORCPT ); Wed, 1 Mar 2017 17:05:48 -0500 Received: from mail-ot0-f195.google.com ([74.125.82.195]:36527 "EHLO mail-ot0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751106AbdCAWFl (ORCPT ); Wed, 1 Mar 2017 17:05:41 -0500 MIME-Version: 1.0 In-Reply-To: <20170301165355.w2kmdmbql2f2ouzg@treble> References: <20161010125709.1870563-1-arnd@arndb.de> <20161011150541.opini6gbolmnpzy5@treble> <20161011155146.icyl3zewdvmms2h2@treble> <2252957.Vm1BYSSRqP@wuerfel> <20170301144008.3ocnbvry4sbl3cnu@treble> <20170301165355.w2kmdmbql2f2ouzg@treble> From: Arnd Bergmann Date: Wed, 1 Mar 2017 23:05:39 +0100 X-Google-Sender-Auth: gwJbrsX6QLzwS5hlTNNU068j9W0 Message-ID: Subject: Re: [PATCH] [RFC] x86: avoid -mtune=atom for objtool warnings To: Josh Poimboeuf Cc: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Linux Kernel Mailing List , Denys Vlasenko Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Mar 1, 2017 at 5:53 PM, Josh Poimboeuf wrote: > On Wed, Mar 01, 2017 at 04:27:29PM +0100, Arnd Bergmann wrote: >> On Wed, Mar 1, 2017 at 3:40 PM, Josh Poimboeuf wrote: >> > On Wed, Mar 01, 2017 at 10:45:03AM +0100, Arnd Bergmann wrote: >> >> >> Actually, something must have changed in gcc since last month, I also >> >> just got a report in another file: >> >> >> >> drivers/i2c/busses/i2c-img-scb.o: warning: objtool: img_i2c_probe() >> >> falls through to next function img_i2c_read_fifo() >> > >> > This one looks like it could be related to some recent objtool changes >> > which affect how it interprets 'ud2'. Which commit were you testing >> > with? Can you provide the .config file, and the object file if it's not >> > too big? >> >> This is with my randconfig test series on top of latest linux-next. >> I see it with the latest gcc-7.0.1 snapshot as well as an earlier gcc-7.0.0 >> build (20161201), but not with gcc-6.3.1 > > I wonder if this is another gcc bug. gcc inserted two ud2 instructions > in img_i2c_probe() for no apparent reason. Here's one of them: > > 5c3: e8 00 00 00 00 callq 5c8 > 5c4: R_X86_64_PC32 dev_warn-0x4 > 5c8: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # 5ce > 5ca: R_X86_64_PC32 .data+0xec > 5ce: 89 83 70 06 00 00 mov %eax,0x670(%rbx) > 5d4: 0f 0b ud2 > > Which corresponds to the following code block: > > if (i2c->bitrate > timings[ARRAY_SIZE(timings) - 1].max_bitrate) { > dev_warn(i2c->adap.dev.parent, > "requested bitrate (%u) is higher than the max bitrate supported (%u)\n", > i2c->bitrate, > timings[ARRAY_SIZE(timings) - 1].max_bitrate); > timing = timings[ARRAY_SIZE(timings) - 1]; > i2c->bitrate = timing.max_bitrate; > } > > I see no apparent reason for the ud2. > > Can you rebuild the object with CONFIG_DEBUG_INFO and use addr2line to > see what code lines are associated with the ud2's? $ addr2line -e drivers/i2c/busses/i2c-img-scb.o 0x5bc /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1187: i2c->bitrate = timing.max_bitrate; 0x65d /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1181: if (i2c->bitrate > timings[ARRAY_SIZE(timings) - 1].max_bitrate) { and from the .s file with line numbers: .type img_i2c_probe, @function img_i2c_probe: .LFB1968: .loc 1 1323 0 .cfi_startproc .LVL40: 1: call __fentry__ pushq %rbp # .cfi_def_cfa_offset 16 .cfi_offset 6, -16 .LBB757: .LBB758: # /git/arm-soc/include/linux/device.h:668: return devm_kmalloc(dev, size, gfp | __GFP_ZERO); .file 5 "/git/arm-soc/include/linux/device.h" .loc 5 668 0 movl $21004480, %edx #, movl $1992, %esi #, .LBE758: .LBE757: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1323: { .loc 1 1323 0 movq %rsp, %rbp #, .cfi_def_cfa_register 6 pushq %r15 # pushq %r14 # .cfi_offset 15, -24 .cfi_offset 14, -32 # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1330: i2c = devm_kzalloc(&pdev->dev, sizeof(struct img_i2c), GFP_KERNEL); .loc 1 1330 0 leaq 16(%rdi), %r14 #, _1 # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1323: { .loc 1 1323 0 pushq %r13 # pushq %r12 # pushq %rbx # .cfi_offset 13, -40 .cfi_offset 12, -48 .cfi_offset 3, -56 movq %rdi, %r12 # pdev, pdev subq $24, %rsp #, # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1324: struct device_node *node = pdev->dev.of_node; .loc 1 1324 0 movq 864(%rdi), %r15 # pdev_19(D)->dev.of_node, node .LVL41: .LBB760: .LBB759: # /git/arm-soc/include/linux/device.h:668: return devm_kmalloc(dev, size, gfp | __GFP_ZERO); .loc 5 668 0 movq %r14, %rdi # _1, .LVL42: call devm_kmalloc # .LVL43: .LBE759: .LBE760: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1331: if (!i2c) .loc 1 1331 0 testq %rax, %rax # _29 je .L62 #, # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1334: res = platform_get_resource(pdev, IORESOURCE_MEM, 0); .loc 1 1334 0 xorl %edx, %edx # movl $512, %esi #, movq %r12, %rdi # pdev, movq %rax, %rbx #, _29 call platform_get_resource # .LVL44: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1335: i2c->base = devm_ioremap_resource(&pdev->dev, res); .loc 1 1335 0 movq %r14, %rdi # _1, .LVL45: movq %rax, %rsi # res, call devm_ioremap_resource # .LVL46: .LBB761: .LBB762: # /git/arm-soc/include/linux/err.h:35: return IS_ERR_VALUE((unsigned long)ptr); .file 6 "/git/arm-soc/include/linux/err.h" .loc 6 35 0 xorl %esi, %esi # tmp128 cmpq $-4096, %rax #, _2 .LBE762: .LBE761: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1335: i2c->base = devm_ioremap_resource(&pdev->dev, res); .loc 1 1335 0 movq %rax, %r13 #, _2 .LBB766: .LBB764: # /git/arm-soc/include/linux/err.h:35: return IS_ERR_VALUE((unsigned long)ptr); .loc 6 35 0 seta %sil #, tmp128 .LBE764: .LBE766: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1335: i2c->base = devm_ioremap_resource(&pdev->dev, res); .loc 1 1335 0 movq %rax, 1624(%rbx) # _2, MEM[(struct img_i2c *)_29].base .LBB767: .LBB765: .LBB763: # /git/arm-soc/include/linux/err.h:35: return IS_ERR_VALUE((unsigned long)ptr); .loc 6 35 0 xorl %edx, %edx # movq $______f.2078, %rdi #, call ftrace_likely_update # .LVL47: .LBE763: .LBE765: .LBE767: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1336: if (IS_ERR(i2c->base)) .loc 1 1336 0 cmpq $-4096, %r13 #, _2 jbe .L54 #, # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1337: return PTR_ERR(i2c->base); .loc 1 1337 0 movl 1624(%rbx), %r13d # MEM[(struct img_i2c *)_29].base, .LVL48: .L52: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1405: } .loc 1 1405 0 addq $24, %rsp #, movl %r13d, %eax # , popq %rbx # .cfi_remember_state .cfi_restore 3 popq %r12 # .cfi_restore 12 .LVL49: popq %r13 # .cfi_restore 13 popq %r14 # .cfi_restore 14 popq %r15 # .cfi_restore 15 .LVL50: popq %rbp # .cfi_restore 6 .cfi_def_cfa 7, 8 ret .LVL51: .L54: .cfi_restore_state # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1339: irq = platform_get_irq(pdev, 0); .loc 1 1339 0 xorl %esi, %esi # movq %r12, %rdi # pdev, call platform_get_irq # .LVL52: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1340: if (irq < 0) { .loc 1 1340 0 testl %eax, %eax # # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1339: irq = platform_get_irq(pdev, 0); .loc 1 1339 0 movl %eax, %r13d #, # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1340: if (irq < 0) { .loc 1 1340 0 js .L65 #, .LBB768: .LBB769: # /git/arm-soc/include/linux/interrupt.h:173: return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags, .file 7 "/git/arm-soc/include/linux/interrupt.h" .loc 7 173 0 movq (%r12), %r9 # pdev_19(D)->name, .LBE769: .LBE768: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1345: i2c->sys_clk = devm_clk_get(&pdev->dev, "sys"); .loc 1 1345 0 movq $0, 1640(%rbx) #, MEM[(struct img_i2c *)_29].sys_clk .LBB772: .LBB770: # /git/arm-soc/include/linux/interrupt.h:173: return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags, .loc 7 173 0 xorl %r8d, %r8d # .LBE770: .LBE772: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1351: i2c->scb_clk = devm_clk_get(&pdev->dev, "scb"); .loc 1 1351 0 movq $0, 1632(%rbx) #, MEM[(struct img_i2c *)_29].scb_clk .LBB773: .LBB771: # /git/arm-soc/include/linux/interrupt.h:173: return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags, .loc 7 173 0 xorl %ecx, %ecx # movq %rbx, (%rsp) # _29, movq $img_i2c_isr, %rdx #, movl %eax, %esi # , movq %r14, %rdi # _1, call devm_request_threaded_irq # .LVL53: .LBE771: .LBE773: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1359: if (ret) { .loc 1 1359 0 testl %eax, %eax # _62 movl %eax, -52(%rbp) # _62, %sfp jne .L66 #, .LBB774: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1365: init_timer(&i2c->check_timer); .loc 1 1365 0 leaq 1864(%rbx), %rdi #, tmp131 xorl %esi, %esi # movq $__key.25244, %rcx #, movq $.LC7, %rdx #, call init_timer_key # .LVL54: .LBE774: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1369: i2c->bitrate = timings[0].max_bitrate; .loc 1 1369 0 movl timings+8(%rip), %eax # timings[0].max_bitrate, timings[0].max_bitrate .LBB775: .LBB776: .LBB777: # /git/arm-soc/include/linux/of.h:458: int ret = of_property_read_variable_u32_array(np, propname, out_values, .file 8 "/git/arm-soc/include/linux/of.h" .loc 8 458 0 leaq -44(%rbp), %rdx #, tmp161 xorl %r8d, %r8d # .LBE777: .LBE776: .LBE775: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1366: i2c->check_timer.function = img_i2c_check_timer; .loc 1 1366 0 movq $img_i2c_check_timer, 1888(%rbx) #, MEM[(struct img_i2c *)_29].check_timer.function # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1367: i2c->check_timer.data = (unsigned long)i2c; .loc 1 1367 0 movq %rbx, 1896(%rbx) # _29, MEM[(struct img_i2c *)_29].check_timer.data .LBB782: .LBB780: .LBB778: # /git/arm-soc/include/linux/of.h:458: int ret = of_property_read_variable_u32_array(np, propname, out_values, .loc 8 458 0 movl $1, %ecx #, movq $.LC8, %rsi #, movq %r15, %rdi # node, .LBE778: .LBE780: .LBE782: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1369: i2c->bitrate = timings[0].max_bitrate; .loc 1 1369 0 movl %eax, 1648(%rbx) # timings[0].max_bitrate, MEM[(struct img_i2c *)_29].bitrate .LBB783: .LBB781: .LBB779: # /git/arm-soc/include/linux/of.h:458: int ret = of_property_read_variable_u32_array(np, propname, out_values, .loc 8 458 0 call of_property_read_variable_u32_array # .LVL55: # /git/arm-soc/include/linux/of.h:460: if (ret >= 0) .loc 8 460 0 testl %eax, %eax # ret js .L57 #, .LVL56: .LBE779: .LBE781: .LBE783: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1371: i2c->bitrate = val; .loc 1 1371 0 movl -44(%rbp), %eax # val, val .LVL57: movl %eax, 1648(%rbx) # val, MEM[(struct img_i2c *)_29].bitrate .LVL58: .L57: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1379: i2c->adap.nr = pdev->id; .loc 1 1379 0 movl 8(%r12), %eax # pdev_19(D)->id, pdev_19(D)->id .LVL59: .LBB784: .LBB785: # /git/arm-soc/include/linux/spinlock.h:288: return &lock->rlock; .loc 4 288 0 leaq 1752(%rbx), %rdi #, tmp142 .LBE785: .LBE784: .LBB786: .LBB787: .LBB788: # /git/arm-soc/include/linux/device.h:1033: dev->driver_data = data; .loc 5 1033 0 movq %rbx, 512(%rbx) # _29, MEM[(struct device *)_29 + 240B].driver_data .LBE788: .LBE787: .LBE786: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1374: i2c->adap.dev.parent = &pdev->dev; .loc 1 1374 0 movq %r14, 240(%rbx) # _1, MEM[(struct img_i2c *)_29].adap.dev.parent # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1375: i2c->adap.dev.of_node = node; .loc 1 1375 0 movq %r15, 1088(%rbx) # node, MEM[(struct img_i2c *)_29].adap.dev.of_node .LBB789: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1383: spin_lock_init(&i2c->lock); .loc 1 1383 0 movq $__key.25245, %rdx #, .LBE789: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1376: i2c->adap.owner = THIS_MODULE; .loc 1 1376 0 movq $__this_module, (%rbx) #, MEM[(struct img_i2c *)_29].adap.owner # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1377: i2c->adap.algo = &img_i2c_algo; .loc 1 1377 0 movq $img_i2c_algo, 16(%rbx) #, MEM[(struct img_i2c *)_29].adap.algo .LBB790: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1383: spin_lock_init(&i2c->lock); .loc 1 1383 0 movq $.LC9, %rsi #, .LBE790: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1379: i2c->adap.nr = pdev->id; .loc 1 1379 0 movl %eax, 1280(%rbx) # pdev_19(D)->id, MEM[(struct img_i2c *)_29].adap.nr # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1380: snprintf(i2c->adap.name, sizeof(i2c->adap.name), "IMG SCB I2C"); .loc 1 1380 0 movabsq $2324494381979487561, %rax #, tmp162 # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1378: i2c->adap.retries = 5; .loc 1 1378 0 movl $5, 236(%rbx) #, MEM[(struct img_i2c *)_29].adap.retries # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1380: snprintf(i2c->adap.name, sizeof(i2c->adap.name), "IMG SCB I2C"); .loc 1 1380 0 movq %rax, 1284(%rbx) # tmp162, MEM[(void *)_29 + 1284B] movl $4403785, 1292(%rbx) #, MEM[(void *)_29 + 1284B] .LBB791: .LBB792: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:443: i2c->mode = mode; .loc 1 443 0 movl $0, 1848(%rbx) #, MEM[(struct img_i2c *)_29].mode # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:444: i2c->int_enable = img_i2c_int_enable_by_mode[mode]; .loc 1 444 0 movq $0, 1852(%rbx) #, MEM[(unsigned int *)_29 + 1852B] .LBE792: .LBE791: .LBB793: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1383: spin_lock_init(&i2c->lock); .loc 1 1383 0 call __raw_spin_lock_init # .LVL60: .LBE793: .LBB794: .LBB795: .LBB796: # /git/arm-soc/include/linux/completion.h:79: init_waitqueue_head(&x->wait); .file 9 "/git/arm-soc/include/linux/completion.h" .loc 9 79 0 leaq 1664(%rbx), %rdi #, tmp144 .LBE796: # /git/arm-soc/include/linux/completion.h:78: x->done = 0; .loc 9 78 0 movl $0, 1656(%rbx) #, MEM[(struct completion *)_29 + 1656B].done .LBB797: # /git/arm-soc/include/linux/completion.h:79: init_waitqueue_head(&x->wait); .loc 9 79 0 movq $__key.8818, %rdx #, movq $.LC10, %rsi #, call __init_waitqueue_head # .LVL61: .LBE797: .LBE795: .LBE794: .LBB798: .LBB799: .LBB800: .LBB801: # /git/arm-soc/include/linux/clk.h:191: might_sleep(); .loc 2 191 0 xorl %edx, %edx # .LBE801: .LBE800: .LBE799: .LBE798: .LBB805: .LBB806: .LBB807: # /git/arm-soc/include/linux/device.h:1033: dev->driver_data = data; .loc 5 1033 0 movq %rbx, 288(%r12) # _29, MEM[(struct device *)pdev_19(D) + 16B].driver_data .LBE807: .LBE806: .LBE805: .LBB808: .LBB804: .LBB803: .LBB802: # /git/arm-soc/include/linux/clk.h:191: might_sleep(); .loc 2 191 0 movl $191, %esi #, movq $.LC0, %rdi #, call __might_sleep # .LVL62: .LBE802: .LBE803: .LBE804: .LBE808: .LBB809: .LBB810: .LBB811: .LBB812: .LBB813: .LBB814: xorl %edx, %edx # movl $191, %esi #, movq $.LC0, %rdi #, call __might_sleep # .LVL63: .LBE814: .LBE813: .LBE812: .LBE811: .LBB815: .LBB816: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:418: return readl(i2c->base + offset); .loc 1 418 0 movq 1624(%rbx), %rax # MEM[(struct img_i2c *)_29].base, MEM[(struct img_i2c *)_29].base .LBB817: .LBB818: # /git/arm-soc/arch/x86/include/asm/io.h:58: build_mmio_read(readl, "l", unsigned int, "=r", :"memory") .loc 3 58 0 #APP # 58 "/git/arm-soc/arch/x86/include/asm/io.h" 1 movl 128(%rax),%eax # MEM[(volatile unsigned int *)_81], ret # 0 "" 2 .LVL64: #NO_APP .LBE818: .LBE817: .LBE816: .LBE815: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1161: if ((rev & 0x00ffffff) < 0x00020200) { .loc 1 1161 0 movl %eax, %edx # ret, tmp147 andl $16777215, %edx #, tmp147 cmpl $131583, %edx #, tmp147 jbe .L67 #, # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1176: if (i2c->bitrate <= timings[i].max_bitrate) { .loc 1 1176 0 movl 1648(%rbx), %edx # MEM[(struct img_i2c *)_29].bitrate, _99 cmpl timings+8(%rip), %edx # timings[0].max_bitrate, _99 # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1171: i2c->need_wr_rd_fence = true; .loc 1 1171 0 movb $1, 1652(%rbx) #, MEM[(struct img_i2c *)_29].need_wr_rd_fence movl timings+48(%rip), %ecx # timings[1].max_bitrate, pretmp_260 # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1176: if (i2c->bitrate <= timings[i].max_bitrate) { .loc 1 1176 0 jbe .L59 #, cmpl %ecx, %edx # pretmp_260, _99 jbe .L60 #, .L61: .LBB819: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1182: dev_warn(i2c->adap.dev.parent, .loc 1 1182 0 movq 240(%rbx), %rdi # MEM[(struct img_i2c *)_29].adap.dev.parent, MEM[(struct img_i2c *)_29].adap.dev.parent movq $.LC12, %rsi #, call dev_warn # .LVL65: # /git/arm-soc/drivers/i2c/busses/i2c-img-scb.c:1187: i2c->bitrate = timing.max_bitrate; .loc 1 1187 0 movl timings+48(%rip), %eax # MEM[(struct img_i2c_timings *)&timings + 48B], MEM[(struct img_i2c_timings *)&timings + 48B] movl %eax, 1648(%rbx) # MEM[(struct img_i2c_timings *)&timings + 48B], MEM[(struct img_i2c *)_29].bitrate .LVL66: .L60: ud2 .LVL67: .L66: .LBE819: .LBE810: .LBE809: