copy_user.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:17k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * Optimized version of the copy_user() routine.
  4.  * It is used to copy date across the kernel/user boundary.
  5.  *
  6.  * The source and destination are always on opposite side of
  7.  * the boundary. When reading from user space we must catch
  8.  * faults on loads. When writing to user space we must catch
  9.  * errors on stores. Note that because of the nature of the copy
  10.  * we don't need to worry about overlapping regions.
  11.  *
  12.  *
  13.  * Inputs:
  14.  * in0 address of source buffer
  15.  * in1 address of destination buffer
  16.  * in2 number of bytes to copy
  17.  *
  18.  * Outputs:
  19.  * ret0 0 in case of success. The number of bytes NOT copied in
  20.  * case of error.
  21.  *
  22.  * Copyright (C) 2000-2001 Hewlett-Packard Co
  23.  * Stephane Eranian <eranian@hpl.hp.com>
  24.  *
  25.  * Fixme:
  26.  * - handle the case where we have more than 16 bytes and the alignment
  27.  *   are different.
  28.  * - more benchmarking
  29.  * - fix extraneous stop bit introduced by the EX() macro.
  30.  */
  31. #include <asm/asmmacro.h>
  32. //
  33. // Tuneable parameters
  34. //
  35. #define COPY_BREAK 16 // we do byte copy below (must be >=16)
  36. #define PIPE_DEPTH 21 // pipe depth
  37. #define EPI p[PIPE_DEPTH-1]
  38. //
  39. // arguments
  40. //
  41. #define dst in0
  42. #define src in1
  43. #define len in2
  44. //
  45. // local registers
  46. //
  47. #define t1 r2 // rshift in bytes
  48. #define t2 r3 // lshift in bytes
  49. #define rshift r14 // right shift in bits
  50. #define lshift r15 // left shift in bits
  51. #define word1 r16
  52. #define word2 r17
  53. #define cnt r18
  54. #define len2 r19
  55. #define saved_lc r20
  56. #define saved_pr r21
  57. #define tmp r22
  58. #define val r23
  59. #define src1 r24
  60. #define dst1 r25
  61. #define src2 r26
  62. #define dst2 r27
  63. #define len1 r28
  64. #define enddst r29
  65. #define endsrc r30
  66. #define saved_pfs r31
  67. GLOBAL_ENTRY(__copy_user)
  68. .prologue
  69. .save ar.pfs, saved_pfs
  70. alloc saved_pfs=ar.pfs,3,((2*PIPE_DEPTH+7)&~7),0,((2*PIPE_DEPTH+7)&~7)
  71. .rotr val1[PIPE_DEPTH],val2[PIPE_DEPTH]
  72. .rotp p[PIPE_DEPTH]
  73. adds len2=-1,len // br.ctop is repeat/until
  74. mov ret0=r0
  75. ;; // RAW of cfm when len=0
  76. cmp.eq p8,p0=r0,len // check for zero length
  77. .save ar.lc, saved_lc
  78. mov saved_lc=ar.lc // preserve ar.lc (slow)
  79. (p8) br.ret.spnt.many rp // empty mempcy()
  80. ;;
  81. add enddst=dst,len // first byte after end of source
  82. add endsrc=src,len // first byte after end of destination
  83. .save pr, saved_pr
  84. mov saved_pr=pr // preserve predicates
  85. .body
  86. mov dst1=dst // copy because of rotation
  87. mov ar.ec=PIPE_DEPTH
  88. mov pr.rot=1<<16 // p16=true all others are false
  89. mov src1=src // copy because of rotation
  90. mov ar.lc=len2 // initialize lc for small count
  91. cmp.lt p10,p7=COPY_BREAK,len // if len > COPY_BREAK then long copy
  92. xor tmp=src,dst // same alignment test prepare
  93. (p10) br.cond.dptk .long_copy_user
  94. ;; // RAW pr.rot/p16 ?
  95. //
  96. // Now we do the byte by byte loop with software pipeline
  97. //
  98. // p7 is necessarily false by now
  99. 1:
  100. EX(.failure_in_pipe1,(p16) ld1 val1[0]=[src1],1)
  101. EX(.failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
  102. br.ctop.dptk.few 1b
  103. ;;
  104. mov ar.lc=saved_lc
  105. mov pr=saved_pr,0xffffffffffff0000
  106. mov ar.pfs=saved_pfs // restore ar.ec
  107. br.ret.sptk.many rp // end of short memcpy
  108. //
  109. // Not 8-byte aligned
  110. //
  111. .diff_align_copy_user:
  112. // At this point we know we have more than 16 bytes to copy
  113. // and also that src and dest do _not_ have the same alignment.
  114. and src2=0x7,src1 // src offset
  115. and dst2=0x7,dst1 // dst offset
  116. ;;
  117. // The basic idea is that we copy byte-by-byte at the head so
  118. // that we can reach 8-byte alignment for both src1 and dst1.
  119. // Then copy the body using software pipelined 8-byte copy,
  120. // shifting the two back-to-back words right and left, then copy
  121. // the tail by copying byte-by-byte.
  122. //
  123. // Fault handling. If the byte-by-byte at the head fails on the
  124. // load, then restart and finish the pipleline by copying zeros
  125. // to the dst1. Then copy zeros for the rest of dst1.
  126. // If 8-byte software pipeline fails on the load, do the same as
  127. // failure_in3 does. If the byte-by-byte at the tail fails, it is
  128. // handled simply by failure_in_pipe1.
  129. //
  130. // The case p14 represents the source has more bytes in the
  131. // the first word (by the shifted part), whereas the p15 needs to
  132. // copy some bytes from the 2nd word of the source that has the
  133. // tail of the 1st of the destination.
  134. //
  135. //
  136. // Optimization. If dst1 is 8-byte aligned (quite common), we don't need
  137. // to copy the head to dst1, to start 8-byte copy software pipeline.
  138. // We know src1 is not 8-byte aligned in this case.
  139. //
  140. cmp.eq p14,p15=r0,dst2
  141. (p15) br.cond.spnt 1f
  142. ;;
  143. sub t1=8,src2
  144. mov t2=src2
  145. ;;
  146. shl rshift=t2,3
  147. sub len1=len,t1 // set len1
  148. ;;
  149. sub lshift=64,rshift
  150. ;;
  151. br.cond.spnt .word_copy_user
  152. ;;
  153. 1:
  154. cmp.leu p14,p15=src2,dst2
  155. sub t1=dst2,src2
  156. ;;
  157. .pred.rel "mutex", p14, p15
  158. (p14) sub word1=8,src2 // (8 - src offset)
  159. (p15) sub t1=r0,t1 // absolute value
  160. (p15) sub word1=8,dst2 // (8 - dst offset)
  161. ;;
  162. // For the case p14, we don't need to copy the shifted part to
  163. // the 1st word of destination.
  164. sub t2=8,t1
  165. (p14) sub word1=word1,t1
  166. ;;
  167. sub len1=len,word1 // resulting len
  168. (p15) shl rshift=t1,3 // in bits
  169. (p14) shl rshift=t2,3
  170. ;;
  171. (p14) sub len1=len1,t1
  172. adds cnt=-1,word1
  173. ;;
  174. sub lshift=64,rshift
  175. mov ar.ec=PIPE_DEPTH
  176. mov pr.rot=1<<16 // p16=true all others are false
  177. mov ar.lc=cnt
  178. ;;
  179. 2:
  180. EX(.failure_in_pipe2,(p16) ld1 val1[0]=[src1],1)
  181. EX(.failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
  182. br.ctop.dptk.few 2b
  183. ;;
  184. clrrrb
  185. ;;
  186. .word_copy_user:
  187. cmp.gtu p9,p0=16,len1
  188. (p9) br.cond.spnt 4f // if (16 > len1) skip 8-byte copy
  189. ;;
  190. shr.u cnt=len1,3 // number of 64-bit words
  191. ;;
  192. adds cnt=-1,cnt
  193. ;;
  194. .pred.rel "mutex", p14, p15
  195. (p14) sub src1=src1,t2
  196. (p15) sub src1=src1,t1
  197. //
  198. // Now both src1 and dst1 point to an 8-byte aligned address. And
  199. // we have more than 8 bytes to copy.
  200. //
  201. mov ar.lc=cnt
  202. mov ar.ec=PIPE_DEPTH
  203. mov pr.rot=1<<16 // p16=true all others are false
  204. ;;
  205. 3:
  206. //
  207. // The pipleline consists of 3 stages:
  208. // 1 (p16): Load a word from src1
  209. // 2 (EPI_1): Shift right pair, saving to tmp
  210. // 3 (EPI): Store tmp to dst1
  211. //
  212. // To make it simple, use at least 2 (p16) loops to set up val1[n]
  213. // because we need 2 back-to-back val1[] to get tmp.
  214. // Note that this implies EPI_2 must be p18 or greater.
  215. //
  216. #define EPI_1 p[PIPE_DEPTH-2]
  217. #define SWITCH(pred, shift) cmp.eq pred,p0=shift,rshift
  218. #define CASE(pred, shift)
  219. (pred) br.cond.spnt .copy_user_bit##shift
  220. #define BODY(rshift)
  221. .copy_user_bit##rshift:
  222. 1:
  223. EX(.failure_out,(EPI) st8 [dst1]=tmp,8);
  224. (EPI_1) shrp tmp=val1[PIPE_DEPTH-3],val1[PIPE_DEPTH-2],rshift;
  225. EX(3f,(p16) ld8 val1[0]=[src1],8);
  226. br.ctop.dptk 1b;
  227. ;;
  228. br.cond.sptk.many .diff_align_do_tail;
  229. 2:
  230. (EPI) st8 [dst1]=tmp,8;
  231. (EPI_1) shrp tmp=val1[PIPE_DEPTH-3],val1[PIPE_DEPTH-2],rshift;
  232. 3:
  233. (p16) mov val1[0]=r0;
  234. br.ctop.dptk 2b;
  235. ;;
  236. br.cond.sptk.many .failure_in2
  237. //
  238. // Since the instruction 'shrp' requires a fixed 128-bit value
  239. // specifying the bits to shift, we need to provide 7 cases
  240. // below.
  241. //
  242. SWITCH(p6, 8)
  243. SWITCH(p7, 16)
  244. SWITCH(p8, 24)
  245. SWITCH(p9, 32)
  246. SWITCH(p10, 40)
  247. SWITCH(p11, 48)
  248. SWITCH(p12, 56)
  249. ;;
  250. CASE(p6, 8)
  251. CASE(p7, 16)
  252. CASE(p8, 24)
  253. CASE(p9, 32)
  254. CASE(p10, 40)
  255. CASE(p11, 48)
  256. CASE(p12, 56)
  257. ;;
  258. BODY(8)
  259. BODY(16)
  260. BODY(24)
  261. BODY(32)
  262. BODY(40)
  263. BODY(48)
  264. BODY(56)
  265. ;;
  266. .diff_align_do_tail:
  267. .pred.rel "mutex", p14, p15
  268. (p14) sub src1=src1,t1
  269. (p14) adds dst1=-8,dst1
  270. (p15) sub dst1=dst1,t1
  271. ;;
  272. 4:
  273. // Tail correction.
  274. //
  275. // The problem with this piplelined loop is that the last word is not
  276. // loaded and thus parf of the last word written is not correct.
  277. // To fix that, we simply copy the tail byte by byte.
  278. sub len1=endsrc,src1,1
  279. clrrrb
  280. ;;
  281. mov ar.ec=PIPE_DEPTH
  282. mov pr.rot=1<<16 // p16=true all others are false
  283. mov ar.lc=len1
  284. ;;
  285. 5:
  286. EX(.failure_in_pipe1,(p16) ld1 val1[0]=[src1],1)
  287. EX(.failure_out,(EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1)
  288. br.ctop.dptk.few 5b
  289. ;;
  290. mov ar.lc=saved_lc
  291. mov pr=saved_pr,0xffffffffffff0000
  292. mov ar.pfs=saved_pfs
  293. br.ret.sptk.many rp
  294. //
  295. // Beginning of long mempcy (i.e. > 16 bytes)
  296. //
  297. .long_copy_user:
  298. tbit.nz p6,p7=src1,0 // odd alignement
  299. and tmp=7,tmp
  300. ;;
  301. cmp.eq p10,p8=r0,tmp
  302. mov len1=len // copy because of rotation
  303. (p8) br.cond.dpnt .diff_align_copy_user
  304. ;;
  305. // At this point we know we have more than 16 bytes to copy
  306. // and also that both src and dest have the same alignment
  307. // which may not be the one we want. So for now we must move
  308. // forward slowly until we reach 16byte alignment: no need to
  309. // worry about reaching the end of buffer.
  310. //
  311. EX(.failure_in1,(p6) ld1 val1[0]=[src1],1) // 1-byte aligned
  312. (p6) adds len1=-1,len1;;
  313. tbit.nz p7,p0=src1,1
  314. ;;
  315. EX(.failure_in1,(p7) ld2 val1[1]=[src1],2) // 2-byte aligned
  316. (p7) adds len1=-2,len1;;
  317. tbit.nz p8,p0=src1,2
  318. ;;
  319. //
  320. // Stop bit not required after ld4 because if we fail on ld4
  321. // we have never executed the ld1, therefore st1 is not executed.
  322. //
  323. EX(.failure_in1,(p8) ld4 val2[0]=[src1],4) // 4-byte aligned
  324. ;;
  325. EX(.failure_out,(p6) st1 [dst1]=val1[0],1)
  326. tbit.nz p9,p0=src1,3
  327. ;;
  328. //
  329. // Stop bit not required after ld8 because if we fail on ld8
  330. // we have never executed the ld2, therefore st2 is not executed.
  331. //
  332. EX(.failure_in1,(p9) ld8 val2[1]=[src1],8) // 8-byte aligned
  333. EX(.failure_out,(p7) st2 [dst1]=val1[1],2)
  334. (p8) adds len1=-4,len1
  335. ;;
  336. EX(.failure_out, (p8) st4 [dst1]=val2[0],4)
  337. (p9) adds len1=-8,len1;;
  338. shr.u cnt=len1,4 // number of 128-bit (2x64bit) words
  339. ;;
  340. EX(.failure_out, (p9) st8 [dst1]=val2[1],8)
  341. tbit.nz p6,p0=len1,3
  342. cmp.eq p7,p0=r0,cnt
  343. adds tmp=-1,cnt // br.ctop is repeat/until
  344. (p7) br.cond.dpnt .dotail // we have less than 16 bytes left
  345. ;;
  346. adds src2=8,src1
  347. adds dst2=8,dst1
  348. mov ar.lc=tmp
  349. ;;
  350. //
  351. // 16bytes/iteration
  352. //
  353. 2:
  354. EX(.failure_in3,(p16) ld8 val1[0]=[src1],16)
  355. (p16) ld8 val2[0]=[src2],16
  356. EX(.failure_out, (EPI) st8 [dst1]=val1[PIPE_DEPTH-1],16)
  357. (EPI) st8 [dst2]=val2[PIPE_DEPTH-1],16
  358. br.ctop.dptk 2b
  359. ;; // RAW on src1 when fall through from loop
  360. //
  361. // Tail correction based on len only
  362. //
  363. // No matter where we come from (loop or test) the src1 pointer
  364. // is 16 byte aligned AND we have less than 16 bytes to copy.
  365. //
  366. .dotail:
  367. EX(.failure_in1,(p6) ld8 val1[0]=[src1],8) // at least 8 bytes
  368. tbit.nz p7,p0=len1,2
  369. ;;
  370. EX(.failure_in1,(p7) ld4 val1[1]=[src1],4) // at least 4 bytes
  371. tbit.nz p8,p0=len1,1
  372. ;;
  373. EX(.failure_in1,(p8) ld2 val2[0]=[src1],2) // at least 2 bytes
  374. tbit.nz p9,p0=len1,0
  375. ;;
  376. EX(.failure_out, (p6) st8 [dst1]=val1[0],8)
  377. ;;
  378. EX(.failure_in1,(p9) ld1 val2[1]=[src1]) // only 1 byte left
  379. mov ar.lc=saved_lc
  380. ;;
  381. EX(.failure_out,(p7) st4 [dst1]=val1[1],4)
  382. mov pr=saved_pr,0xffffffffffff0000
  383. ;;
  384. EX(.failure_out, (p8) st2 [dst1]=val2[0],2)
  385. mov ar.pfs=saved_pfs
  386. ;;
  387. EX(.failure_out, (p9) st1 [dst1]=val2[1])
  388. br.ret.sptk.many rp
  389. //
  390. // Here we handle the case where the byte by byte copy fails
  391. // on the load.
  392. // Several factors make the zeroing of the rest of the buffer kind of
  393. // tricky:
  394. // - the pipeline: loads/stores are not in sync (pipeline)
  395. //
  396. //   In the same loop iteration, the dst1 pointer does not directly
  397. //   reflect where the faulty load was.
  398. //
  399. // - pipeline effect
  400. //   When you get a fault on load, you may have valid data from
  401. //   previous loads not yet store in transit. Such data must be
  402. //   store normally before moving onto zeroing the rest.
  403. //
  404. // - single/multi dispersal independence.
  405. //
  406. // solution:
  407. // - we don't disrupt the pipeline, i.e. data in transit in
  408. //   the software pipeline will be eventually move to memory.
  409. //   We simply replace the load with a simple mov and keep the
  410. //   pipeline going. We can't really do this inline because
  411. //   p16 is always reset to 1 when lc > 0.
  412. //
  413. .failure_in_pipe1:
  414. sub ret0=endsrc,src1 // number of bytes to zero, i.e. not copied
  415. 1:
  416. (p16) mov val1[0]=r0
  417. (EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1
  418. br.ctop.dptk 1b
  419. ;;
  420. mov pr=saved_pr,0xffffffffffff0000
  421. mov ar.lc=saved_lc
  422. mov ar.pfs=saved_pfs
  423. br.ret.sptk.many rp
  424. //
  425. // This is the case where the byte by byte copy fails on the load
  426. // when we copy the head. We need to finish the pipeline and copy
  427. // zeros for the rest of the destination. Since this happens
  428. // at the top we still need to fill the body and tail.
  429. .failure_in_pipe2:
  430. sub ret0=endsrc,src1 // number of bytes to zero, i.e. not copied
  431. 2:
  432. (p16) mov val1[0]=r0
  433. (EPI) st1 [dst1]=val1[PIPE_DEPTH-1],1
  434. br.ctop.dptk 2b
  435. ;;
  436. sub len=enddst,dst1,1 // precompute len
  437. br.cond.dptk.many .failure_in1bis
  438. ;;
  439. //
  440. // Here we handle the head & tail part when we check for alignment.
  441. // The following code handles only the load failures. The
  442. // main diffculty comes from the fact that loads/stores are
  443. // scheduled. So when you fail on a load, the stores corresponding
  444. // to previous successful loads must be executed.
  445. //
  446. // However some simplifications are possible given the way
  447. // things work.
  448. //
  449. // 1) HEAD
  450. // Theory of operation:
  451. //
  452. //  Page A   | Page B
  453. //  ---------|-----
  454. //          1|8 x
  455. //   1 2|8 x
  456. //     4|8 x
  457. //   1 4|8 x
  458. //        2 4|8 x
  459. //      1 2 4|8 x
  460. //      |1
  461. //      |2 x
  462. //      |4 x
  463. //
  464. // page_size >= 4k (2^12).  (x means 4, 2, 1)
  465. // Here we suppose Page A exists and Page B does not.
  466. //
  467. // As we move towards eight byte alignment we may encounter faults.
  468. // The numbers on each page show the size of the load (current alignment).
  469. //
  470. // Key point:
  471. // - if you fail on 1, 2, 4 then you have never executed any smaller
  472. //   size loads, e.g. failing ld4 means no ld1 nor ld2 executed
  473. //   before.
  474. //
  475. // This allows us to simplify the cleanup code, because basically you
  476. // only have to worry about "pending" stores in the case of a failing
  477. // ld8(). Given the way the code is written today, this means only
  478. // worry about st2, st4. There we can use the information encapsulated
  479. // into the predicates.
  480. //
  481. // Other key point:
  482. // - if you fail on the ld8 in the head, it means you went straight
  483. //   to it, i.e. 8byte alignment within an unexisting page.
  484. // Again this comes from the fact that if you crossed just for the ld8 then
  485. // you are 8byte aligned but also 16byte align, therefore you would
  486. // either go for the 16byte copy loop OR the ld8 in the tail part.
  487. // The combination ld1, ld2, ld4, ld8 where you fail on ld8 is impossible
  488. // because it would mean you had 15bytes to copy in which case you
  489. // would have defaulted to the byte by byte copy.
  490. //
  491. //
  492. // 2) TAIL
  493. // Here we now we have less than 16 bytes AND we are either 8 or 16 byte
  494. // aligned.
  495. //
  496. // Key point:
  497. // This means that we either:
  498. // - are right on a page boundary
  499. // OR
  500. // - are at more than 16 bytes from a page boundary with
  501. //   at most 15 bytes to copy: no chance of crossing.
  502. //
  503. // This allows us to assume that if we fail on a load we haven't possibly
  504. // executed any of the previous (tail) ones, so we don't need to do
  505. // any stores. For instance, if we fail on ld2, this means we had
  506. // 2 or 3 bytes left to copy and we did not execute the ld8 nor ld4.
  507. //
  508. // This means that we are in a situation similar the a fault in the
  509. // head part. That's nice!
  510. //
  511. .failure_in1:
  512. sub ret0=endsrc,src1 // number of bytes to zero, i.e. not copied
  513. sub len=endsrc,src1,1
  514. //
  515. // we know that ret0 can never be zero at this point
  516. // because we failed why trying to do a load, i.e. there is still
  517. // some work to do.
  518. // The failure_in1bis and length problem is taken care of at the
  519. // calling side.
  520. //
  521. ;;
  522. .failure_in1bis: // from (.failure_in3)
  523. mov ar.lc=len // Continue with a stupid byte store.
  524. ;;
  525. 5:
  526. st1 [dst1]=r0,1
  527. br.cloop.dptk 5b
  528. ;;
  529. mov pr=saved_pr,0xffffffffffff0000
  530. mov ar.lc=saved_lc
  531. mov ar.pfs=saved_pfs
  532. br.ret.sptk.many rp
  533. //
  534. // Here we simply restart the loop but instead
  535. // of doing loads we fill the pipeline with zeroes
  536. // We can't simply store r0 because we may have valid
  537. // data in transit in the pipeline.
  538. // ar.lc and ar.ec are setup correctly at this point
  539. //
  540. // we MUST use src1/endsrc here and not dst1/enddst because
  541. // of the pipeline effect.
  542. //
  543. .failure_in3:
  544. sub ret0=endsrc,src1 // number of bytes to zero, i.e. not copied
  545. ;;
  546. 2:
  547. (p16) mov val1[0]=r0
  548. (p16) mov val2[0]=r0
  549. (EPI) st8 [dst1]=val1[PIPE_DEPTH-1],16
  550. (EPI) st8 [dst2]=val2[PIPE_DEPTH-1],16
  551. br.ctop.dptk 2b
  552. ;;
  553. cmp.ne p6,p0=dst1,enddst // Do we need to finish the tail ?
  554. sub len=enddst,dst1,1 // precompute len
  555. (p6) br.cond.dptk .failure_in1bis
  556. ;;
  557. mov pr=saved_pr,0xffffffffffff0000
  558. mov ar.lc=saved_lc
  559. mov ar.pfs=saved_pfs
  560. br.ret.sptk.many rp
  561. .failure_in2:
  562. sub ret0=endsrc,src1
  563. cmp.ne p6,p0=dst1,enddst // Do we need to finish the tail ?
  564. sub len=enddst,dst1,1 // precompute len
  565. (p6) br.cond.dptk .failure_in1bis
  566. ;;
  567. mov pr=saved_pr,0xffffffffffff0000
  568. mov ar.lc=saved_lc
  569. mov ar.pfs=saved_pfs
  570. br.ret.sptk.many rp
  571. //
  572. // handling of failures on stores: that's the easy part
  573. //
  574. .failure_out:
  575. sub ret0=enddst,dst1
  576. mov pr=saved_pr,0xffffffffffff0000
  577. mov ar.lc=saved_lc
  578. mov ar.pfs=saved_pfs
  579. br.ret.sptk.many rp
  580. END(__copy_user)