Comment 2 for bug 1243022

Revision history for this message
Victor Kamensky (vkamensky) wrote :

4.7 vs 4.8
----------

Checked the same code under 4.7. linaro 4.7-2013.04-20130415 does not have
this problem. Note instruction at 0x8030602c that does store relative $r7
and it updates $r7. Whereas in 4.8 similar instruction comes at address
0x80319548 which is after instruction that corrupts saved on stack register.

4.7
---

(gdb) disassemble xhci_check_trb_in_td_math
Dump of assembler code for function xhci_check_trb_in_td_math:
   0x8030600c <+0>: stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr} <---
   0x80306010 <+4>: sub sp, #436 ; 0x1b4 <----------------------
   0x80306012 <+6>: push {lr} <----------------------
   0x80306014 <+8>: bl 0x8000cdcc <__gnu_mcount_nc> <------------------
   0x80306018 <+12>: add r7, sp, #432 ; 0x1b0 <----------------------
   0x8030601a <+14>: mov r9, r0
   0x8030601c <+16>: ldr r1, [r0, #116] ; 0x74
   0x8030601e <+18>: add r3, sp, #176 ; 0xb0
   0x80306020 <+20>: ldr r2, [r0, #96] ; 0x60
   0x80306022 <+22>: movs r0, #0
   0x80306024 <+24>: movs r4, #0
   0x80306026 <+26>: ldr.w r8, [r1]
   0x8030602a <+30>: movs r1, #0
   0x8030602c <+32>: strd r0, r1, [r7, #-384]! ; 0x180 <--------------
   0x80306030 <+36>: mov r6, r4
   0x80306032 <+38>: ldr r2, [r2, #0]
   0x80306034 <+40>: ldr.w r1, [r8]
   0x80306038 <+44>: str r4, [sp, #40] ; 0x28
   0x8030603a <+46>: ldrd r10, r11, [r2, #8]
   0x8030603e <+50>: add.w r0, r1, #1008 ; 0x3f0
   0x80306042 <+54>: str r1, [sp, #28]
   0x80306044 <+56>: str r0, [sp, #44] ; 0x2c
   0x80306046 <+58>: ldrd r0, r1, [r8, #8]
   0x8030604a <+62>: strd r10, r11, [sp, #32]
   0x8030604e <+66>: ldrd r10, r11, [r8, #8]
   0x80306052 <+70>: adds r1, #64 ; 0x40
   0x80306054 <+72>: ldr r5, [r2, #0]
   0x80306056 <+74>: adc.w r0, r0, #0
   0x8030605a <+78>: str.w r8, [r3]
   0x8030605e <+82>: subs.w r11, r11, #16
   0x80306062 <+86>: strd r0, r1, [r3, #112] ; 0x70
   0x80306066 <+90>: ldrd r0, r1, [r8, #8]
   0x8030606a <+94>: adc.w r10, r10, #4294967295
   0x8030606e <+98>: strd r10, r11, [r7, #16] <-------------------------

4.8
---

(gdb) disassemble xhci_check_trb_in_td_math
Dump of assembler code for function xhci_check_trb_in_td_math:
   0x803194e4 <+0>: stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr} <---
   0x803194e8 <+4>: sub sp, #444 ; 0x1bc <----------------------
   0x803194ea <+6>: push {lr} <----------------------
   0x803194ec <+8>: bl 0x8000cc8c <__gnu_mcount_nc> <------------------
   0x803194f0 <+12>: mov r9, r0
   0x803194f2 <+14>: movs r5, #0
   0x803194f4 <+16>: ldr r0, [r0, #116] ; 0x74
   0x803194f6 <+18>: mov r11, r5
   0x803194f8 <+20>: ldr.w r1, [r9, #96] ; 0x60
   0x803194fc <+24>: add.w lr, sp, #184 ; 0xb8
   0x80319500 <+28>: str r5, [sp, #32]
   0x80319502 <+30>: add r7, sp, #440 ; 0x1b8 <----------------------
   0x80319504 <+32>: ldr.w r8, [r0]
   0x80319508 <+36>: ldr r0, [r1, #0]
   0x8031950a <+38>: str r5, [sp, #36] ; 0x24
   0x8031950c <+40>: str r5, [sp, #52] ; 0x34
   0x8031950e <+42>: ldrd r4, r5, [r8, #8]
   0x80319512 <+46>: ldr r2, [r0, #0]
   0x80319514 <+48>: ldr.w r10, [r8]
   0x80319518 <+52>: adds.w r3, r5, #64 ; 0x40
   0x8031951c <+56>: str.w r8, [lr]
   0x80319520 <+60>: str.w r2, [lr, #68] ; 0x44
   0x80319524 <+64>: adc.w r2, r4, #0
   0x80319528 <+68>: strd r2, r3, [lr, #112] ; 0x70
   0x8031952c <+72>: subs.w r3, r5, #16
   0x80319530 <+76>: adc.w r2, r4, #4294967295
   0x80319534 <+80>: add.w r6, r10, #1008 ; 0x3f0
   0x80319538 <+84>: strd r2, r3, [r7, #16] <-----------------------------
   0x8031953c <+88>: ldrd r2, r3, [sp, #32]
   0x80319540 <+92>: str r6, [sp, #48] ; 0x30
   0x80319542 <+94>: str.w r6, [lr, #8]
   0x80319546 <+98>: mov r6, r11
   0x80319548 <+100>: strd r2, r3, [r7, #-384]! ; 0x180 <---------------
   0x8031954c <+104>: movw r3, #12272 ; 0x2ff0
   0x80319550 <+108>: movt r3, #32859 ; 0x805b