sparc-memset.patch 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. This makes memset follow the standard (instead of returning 0 on success). This
  2. is needed when certain versions of gcc optimizes around memset calls and assume
  3. that the address argument is preserved in %o0.
  4. Signed-off-by: Andreas Larsson <andreas@gaisler.com>
  5. diff -Nur linux-3.16.2.orig/arch/sparc/lib/memset.S linux-3.16.2/arch/sparc/lib/memset.S
  6. --- linux-3.16.2.orig/arch/sparc/lib/memset.S 2014-09-06 01:37:11.000000000 +0200
  7. +++ linux-3.16.2/arch/sparc/lib/memset.S 2014-09-18 09:53:49.563047773 +0200
  8. @@ -65,6 +65,8 @@
  9. .globl __memset_start, __memset_end
  10. __memset_start:
  11. memset:
  12. + mov %o0, %g1
  13. + mov 1, %g4
  14. and %o1, 0xff, %g3
  15. sll %g3, 8, %g2
  16. or %g3, %g2, %g3
  17. @@ -89,6 +91,7 @@
  18. sub %o0, %o2, %o0
  19. __bzero:
  20. + clr %g4
  21. mov %g0, %g3
  22. 1:
  23. cmp %o1, 7
  24. @@ -151,8 +154,8 @@
  25. bne,a 8f
  26. EX(stb %g3, [%o0], and %o1, 1)
  27. 8:
  28. - retl
  29. - clr %o0
  30. + b 0f
  31. + nop
  32. 7:
  33. be 13b
  34. orcc %o1, 0, %g0
  35. @@ -164,6 +167,12 @@
  36. bne 8b
  37. EX(stb %g3, [%o0 - 1], add %o1, 1)
  38. 0:
  39. + andcc %g4, 1, %g0
  40. + be 5f
  41. + nop
  42. + retl
  43. + mov %g1, %o0
  44. +5:
  45. retl
  46. clr %o0
  47. __memset_end: