Fix ARM assembly when building __PIC__
authorJussi Kivilinna <jussi.kivilinna@iki.fi>
Tue, 20 May 2014 17:35:51 +0000 (20:35 +0300)
committerJussi Kivilinna <jussi.kivilinna@iki.fi>
Tue, 20 May 2014 19:05:28 +0000 (22:05 +0300)
* cipher/camellia-arm.S (GET_DATA_POINTER): New.
(_gcry_camellia_arm_encrypt_block): Use GET_DATA_POINTER.
(_gcry_camellia_arm_decrypt_block): Ditto.
* cipher/cast5-arm.S (GET_DATA_POINTER): New.
(_gcry_cast5_arm_encrypt_block, _gcry_cast5_arm_decrypt_block)
(_gcry_cast5_arm_enc_blk2, _gcry_cast5_arm_dec_blk2): Use
GET_DATA_POINTER.
* cipher/rijndael-arm.S (GET_DATA_POINTER): New.
(_gcry_aes_arm_encrypt_block, _gcry_aes_arm_decrypt_block): Use
GET_DATA_POINTER.
* cipher/sha1-armv7-neon.S (GET_DATA_POINTER): New.
(.LK_VEC): Move from .text to .data section.
(_gcry_sha1_transform_armv7_neon): Use GET_DATA_POINTER.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
cipher/camellia-arm.S
cipher/cast5-arm.S
cipher/rijndael-arm.S
cipher/sha1-armv7-neon.S

index 255a246..a3d87d1 100644 (file)
 .syntax unified
 .arm
 
+#ifdef __PIC__
+#  define GET_DATA_POINTER(reg, name, rtmp) \
+               ldr reg, 1f; \
+               ldr rtmp, 2f; \
+               b 3f; \
+       1:      .word _GLOBAL_OFFSET_TABLE_-(3f+8); \
+       2:      .word name(GOT); \
+       3:      add reg, pc, reg; \
+               ldr reg, [reg, rtmp];
+#else
+#  define GET_DATA_POINTER(reg, name, rtmp) ldr reg, =name
+#endif
+
 /* struct camellia_ctx: */
 #define key_table 0
 
@@ -261,7 +274,7 @@ _gcry_camellia_arm_encrypt_block:
         */
        push {%r1, %r4-%r11, %ip, %lr};
 
-       ldr RTAB1, =.Lcamellia_sp1110;
+       GET_DATA_POINTER(RTAB1, .Lcamellia_sp1110, RTAB3);
        mov RMASK, #0xff;
        add RTAB3, RTAB1, #(2 * 4);
        push {%r3};
@@ -309,7 +322,7 @@ _gcry_camellia_arm_decrypt_block:
         */
        push {%r1, %r4-%r11, %ip, %lr};
 
-       ldr RTAB1, =.Lcamellia_sp1110;
+       GET_DATA_POINTER(RTAB1, .Lcamellia_sp1110, RTAB3);
        mov RMASK, #0xff;
        add RTAB3, RTAB1, #(2 * 4);
        mov RMASK, RMASK, lsl#4 /* byte mask */
index 57c89b7..76ddd2e 100644 (file)
 
 .extern _gcry_cast5_s1to4;
 
+#ifdef __PIC__
+#  define GET_DATA_POINTER(reg, name, rtmp) \
+               ldr reg, 1f; \
+               ldr rtmp, 2f; \
+               b 3f; \
+       1:      .word _GLOBAL_OFFSET_TABLE_-(3f+8); \
+       2:      .word name(GOT); \
+       3:      add reg, pc, reg; \
+               ldr reg, [reg, rtmp];
+#else
+#  define GET_DATA_POINTER(reg, name, rtmp) ldr reg, =name
+#endif
+
 /* structure of crypto context */
 #define Km 0
 #define Kr (Km + (16 * 4))
@@ -260,7 +273,7 @@ _gcry_cast5_arm_encrypt_block:
         */
        push {%r1, %r4-%r11, %ip, %lr};
 
-       ldr Rs1, =_gcry_cast5_s1to4;
+       GET_DATA_POINTER(Rs1, _gcry_cast5_s1to4, Rs2);
        mov RMASK, #(0xff << 2);
        add Rs2, Rs1, #(0x100*4);
        add Rs3, Rs1, #(0x100*4*2);
@@ -306,7 +319,7 @@ _gcry_cast5_arm_decrypt_block:
         */
        push {%r1, %r4-%r11, %ip, %lr};
 
-       ldr Rs1, =_gcry_cast5_s1to4;
+       GET_DATA_POINTER(Rs1, _gcry_cast5_s1to4, Rs2);
        mov RMASK, #(0xff << 2);
        add Rs2, Rs1, #(0x100 * 4);
        add Rs3, Rs1, #(0x100 * 4 * 2);
@@ -500,7 +513,7 @@ _gcry_cast5_arm_enc_blk2:
         */
        push {%lr};
 
-       ldr Rs1, =_gcry_cast5_s1to4;
+       GET_DATA_POINTER(Rs1, _gcry_cast5_s1to4, Rs2);
        mov RMASK, #(0xff << 2);
        add Rs2, Rs1, #(0x100 * 4);
 
@@ -631,7 +644,7 @@ _gcry_cast5_arm_dec_blk2:
         *      [RR0, RL0], [RR1, RL1]: dst
         */
 
-       ldr Rs1, =_gcry_cast5_s1to4;
+       GET_DATA_POINTER(Rs1, _gcry_cast5_s1to4, Rs2);
        mov RMASK, #(0xff << 2);
        add Rs2, Rs1, #(0x100 * 4);
 
index cea8c51..6004ce8 100644 (file)
 .syntax unified
 .arm
 
+#ifdef __PIC__
+#  define GET_DATA_POINTER(reg, name, rtmp) \
+               ldr reg, 1f; \
+               ldr rtmp, 2f; \
+               b 3f; \
+       1:      .word _GLOBAL_OFFSET_TABLE_-(3f+8); \
+       2:      .word name(GOT); \
+       3:      add reg, pc, reg; \
+               ldr reg, [reg, rtmp];
+#else
+#  define GET_DATA_POINTER(reg, name, rtmp) ldr reg, =name
+#endif
+
 /* register macros */
 #define CTX    %r0
 #define RTAB   %lr
@@ -249,7 +262,7 @@ _gcry_aes_arm_encrypt_block:
 2:
        sub     %sp, #16;
 
-       ldr     RTAB, =.LtableE0;
+       GET_DATA_POINTER(RTAB, .LtableE0, RMASK);
 
        str     %r1, [%sp, #4];         /* dst */
        mov     RMASK, #0xff;
@@ -503,7 +516,7 @@ _gcry_aes_arm_decrypt_block:
 2:
        sub     %sp, #16;
 
-       ldr     RTAB, =.LtableD0;
+       GET_DATA_POINTER(RTAB, .LtableD0, RMASK);
 
        mov     RMASK, #0xff;
        str     %r1, [%sp, #4];         /* dst */
index 0c19025..95b677d 100644 (file)
     defined(HAVE_COMPATIBLE_GCC_ARM_PLATFORM_AS) && \
     defined(HAVE_GCC_INLINE_ASM_NEON) && defined(USE_SHA1)
 
-.text
+.data
 
 .syntax unified
 .fpu neon
 .arm
 
+#ifdef __PIC__
+#  define GET_DATA_POINTER(reg, name, rtmp) \
+               ldr reg, 1f; \
+               ldr rtmp, 2f; \
+               b 3f; \
+       1:      .word _GLOBAL_OFFSET_TABLE_-(3f+8); \
+       2:      .word name(GOT); \
+       3:      add reg, pc, reg; \
+               ldr reg, [reg, rtmp];
+#else
+#  define GET_DATA_POINTER(reg, name, rtmp) ldr reg, =name
+#endif
+
 /* Context structure */
 
 #define state_h0 0
@@ -56,6 +69,8 @@ gcry_sha1_armv7_neon_K_VEC:
 .LK4:  .long K4, K4, K4, K4
 
 
+.text
+
 /* Register macros */
 
 #define RSTATE r0
@@ -314,7 +329,7 @@ _gcry_sha1_transform_armv7_neon:
   vpush {q4-q7};
 
   mov ROLDSTACK, sp;
-  ldr RK, =.LK_VEC;
+  GET_DATA_POINTER(RK, .LK_VEC, _a);
 
   /* Align stack. */
   sub sp, #(16*4);