Yet another inline asm worry: mtsp() macro (and may be other)?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello all,

Grant, in a first approach I would like to address this post to you because
all start from ccio-dma (again yes) when I figure out that in fact gcc-4.2 rob
a part this driver code???

My first worry was about the form takes the resulting code of <ccio_io_pdir_entry>
for remind:
    0:   cb 39 a0 60     movb,<> r25,r25,38 <ccio_io_pdir_entry+0x38>
    4:   34 1c 00 00     ldi 0,ret0
    8:   00 1c 58 20     mtsp ret0,sr1
    c:   22 60 0e 01     ldil L%-10000000,r19
   10:   0a 78 0a 13     add,l r24,r19,r19
   14:   d6 77 0c 14     depw r23,31,12,r19
   18:   0f 53 12 88     stw r19,4(r26)
   1c:   07 00 53 1c     lci r0(sr1,r24),ret0
   20:   d3 9c 1a 74     extrw,u ret0,19,12,ret0
   24:   d7 3c 0e 14     depw ret0,15,12,r25
   28:   0f 59 12 80     stw r25,0(r26)
   2c:   07 40 12 80     fdc r0(r26)
   30:   00 00 04 00     sync
   34:   e8 40 c0 02     bv,n r0(rp)
   38:   03 ff e0 1f     break 1f,1fff
   3c:   e8 1f 1f f7     b,l,n 3c <ccio_io_pdir_entry+0x3c>,r0

The question was why sr1 is always set to 0 when it's actualy a function
parameter (iirc 2d arg i.e. r25?)

Fwiw removing BUG_ON() seems to fix this issue?

btw as far as it must be KERNEL_SPACE, couldn't we simplify stuff: removing
sid parameter and replace mtsp macro call with a simple asm volatile("mtsp
%%r0,%%sr1":::"memory")?

Then I look for all the call to function (ccio_io_pdir_entry) even thought
it's inligned with those mtsp and lci it would be easy to find it.
The C code learn me that it would call in ccio_map_single() and thanks with
iommu_helper.h in ccio_map_sg(). But objdump -D ccio-dma.o shows me only one
place where this code is used 
00000000 <ccio_map_single>:
[snip]
  84:   34 14 00 00     ldi 0,r20
  88:   00 14 58 20     mtsp r20,sr1
  8c:   0a a3 0a 13     add,l r3,r21,r19
  90:   d6 65 0c 14     depw r5,31,12,r19
  94:   0f 53 12 88     stw r19,4(r26)   
  98:   04 60 53 1c     lci r0(sr1,r3),ret0
  9c:   d3 9c 1a 74     extrw,u ret0,19,12,ret0
  a0:   d6 9c 0e 14     depw ret0,15,12,r20
  a4:   0f 54 12 80     stw r20,0(r26)
  a8:   07 40 12 80     fdc r0(r26)
  ac:   00 00 04 00     sync
[snip]

and not in ccio_map_sg() (even not a call to ccio_io_pdir_entry() in case he
didn't reach to inline it).

And the wonder is that my system d380 is even booting and running despite this
lake???

That said with gcc-4.3, I find well this code iin the 2 functions.
And here commes my worry about mtsp() macro: here is the resulting code with
gcc-4.3:
00000000 <ccio_map_sg>:
[snip]
__ 1a0:   34 1a 00 00     ldi 0,r26__
 1a4:   20 a0 02 00     ldil L%10000000,r5
 1a8:   8e 80 61 28     cmpib,> 0,r20,244 <ccio_map_sg+0x244>
 1ac:   20 40 0e 01     ldil L%-10000000,rp
 1b0:   86 c0 21 88     cmpib,= 0,r22,27c <ccio_map_sg+0x27c>
 1b4:   34 19 00 00     ldi 0,r25
 1b8:   0f e0 10 9c     ldw 0(r31),ret0
 1bc:   0d 80 10 94     ldw 0(r12),r20
 1c0:   d7 80 1c 1e     depwi 0,31,2,ret0
 1c4:   4b b3 00 20     ldw 10(ret1),r19
 1c8:   0a 9c 04 1c     sub ret0,r20,ret0
 1cc:   0f f0 10 95     ldw 8(r31),r21 
 1d0:   d3 9c 1f 45     extrw,s ret0,26,27,ret0
 1d4:   0a b3 0a 13     add,l r19,r21,r19
 1d8:   d7 9c 09 8c     depw,z ret0,19,20,ret0
 1dc:   0f e8 10 94     ldw 4(r31),r20 
 1e0:   08 bc 0a 1c     add,l ret0,r5,ret0
 1e4:   6b b3 00 20     stw r19,10(ret1)
 1e8:   0a b9 0a 15     add,l r25,r21,r21
 1ec:   0a 9c 0a 14     add,l ret0,r20,r20
__ 1f0:   00 1a 58 20     mtsp r26,sr1  __
 1f4:   08 54 0a 1c     add,l r20,rp,ret0
 1f8:   d7 8e 0c 14     depw r14,31,12,ret0
 1fc:   0e dc 12 88     stw ret0,4(r22)
 200:   06 80 53 13     lci r0(sr1,r20),r19
 204:   d2 73 1a 74     extrw,u r19,19,12,r19
 208:   08 1a 02 5c     copy r26,ret0 
 20c:   d7 93 0e 14     depw r19,15,12,ret0
 210:   0e dc 12 80     stw ret0,0(r22)
 214:   06 c0 12 80     fdc r0(r22)
 218:   00 00 04 00     sync
[snip]
 
My worry is the number of insn between the ldi 0,r26 and the mtsp r26,sr1.

Here, I supposed it's harmless but may be different in other critical path?

Wouldn't it be interesting (if possible) to insure that the load of the reg
and mtsp stay close together? (or may be simply detect the case of a const == 0?)

What your opinion?

Tx again,
    J.

PS: I didn't find back gcc-4.0 to check if my previous perf test could failed
for this reason?



--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux SoC]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux