diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-12-22 20:10:10 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-12-22 20:10:10 +0000 |
commit | a334319f6530564d22e775935d9c91663623a1b4 (patch) | |
tree | b5877475619e4c938e98757d518bb1e9cbead751 /nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h | |
parent | 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (diff) | |
download | glibc-a334319f6530564d22e775935d9c91663623a1b4.tar glibc-a334319f6530564d22e775935d9c91663623a1b4.tar.gz glibc-a334319f6530564d22e775935d9c91663623a1b4.tar.bz2 glibc-a334319f6530564d22e775935d9c91663623a1b4.zip |
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h')
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h | 352 |
1 files changed, 50 insertions, 302 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h index 97085bf018..40c2518af6 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -35,9 +35,6 @@ #define SYS_futex 202 #define FUTEX_WAIT 0 #define FUTEX_WAKE 1 -#define FUTEX_LOCK_PI 6 -#define FUTEX_UNLOCK_PI 7 -#define FUTEX_TRYLOCK_PI 8 /* Initializer for compatibility lock. */ @@ -49,130 +46,17 @@ #define BUSY_WAIT_NOP asm ("rep; nop") -#define LLL_STUB_UNWIND_INFO_START \ - ".section .eh_frame,\"a\",@progbits\n" \ -"7:\t" ".long 9f-8f # Length of Common Information Entry\n" \ -"8:\t" ".long 0x0 # CIE Identifier Tag\n\t" \ - ".byte 0x1 # CIE Version\n\t" \ - ".ascii \"zR\\0\" # CIE Augmentation\n\t" \ - ".uleb128 0x1 # CIE Code Alignment Factor\n\t" \ - ".sleb128 -8 # CIE Data Alignment Factor\n\t" \ - ".byte 0x10 # CIE RA Column\n\t" \ - ".uleb128 0x1 # Augmentation size\n\t" \ - ".byte 0x1b # FDE Encoding (pcrel sdata4)\n\t" \ - ".byte 0x12 # DW_CFA_def_cfa_sf\n\t" \ - ".uleb128 0x7\n\t" \ - ".sleb128 16\n\t" \ - ".align 8\n" \ -"9:\t" ".long 23f-10f # FDE Length\n" \ -"10:\t" ".long 10b-7b # FDE CIE offset\n\t" \ - ".long 1b-. # FDE initial location\n\t" \ - ".long 6b-1b # FDE address range\n\t" \ - ".uleb128 0x0 # Augmentation size\n\t" \ - ".byte 0x16 # DW_CFA_val_expression\n\t" \ - ".uleb128 0x10\n\t" \ - ".uleb128 12f-11f\n" \ -"11:\t" ".byte 0x80 # DW_OP_breg16\n\t" \ - ".sleb128 4b-1b\n" -#define LLL_STUB_UNWIND_INFO_END \ - ".byte 0x16 # DW_CFA_val_expression\n\t" \ - ".uleb128 0x10\n\t" \ - ".uleb128 14f-13f\n" \ -"13:\t" ".byte 0x80 # DW_OP_breg16\n\t" \ - ".sleb128 4b-2b\n" \ -"14:\t" ".byte 0x40 + (3b-2b) # DW_CFA_advance_loc\n\t" \ - ".byte 0x0e # DW_CFA_def_cfa_offset\n\t" \ - ".uleb128 0\n\t" \ - ".byte 0x16 # DW_CFA_val_expression\n\t" \ - ".uleb128 0x10\n\t" \ - ".uleb128 16f-15f\n" \ -"15:\t" ".byte 0x80 # DW_OP_breg16\n\t" \ - ".sleb128 4b-3b\n" \ -"16:\t" ".byte 0x40 + (4b-3b-1) # DW_CFA_advance_loc\n\t" \ - ".byte 0x0e # DW_CFA_def_cfa_offset\n\t" \ - ".uleb128 128\n\t" \ - ".byte 0x16 # DW_CFA_val_expression\n\t" \ - ".uleb128 0x10\n\t" \ - ".uleb128 20f-17f\n" \ -"17:\t" ".byte 0x80 # DW_OP_breg16\n\t" \ - ".sleb128 19f-18f\n\t" \ - ".byte 0x0d # DW_OP_const4s\n" \ -"18:\t" ".4byte 4b-.\n\t" \ - ".byte 0x1c # DW_OP_minus\n\t" \ - ".byte 0x0d # DW_OP_const4s\n" \ -"19:\t" ".4byte 24f-.\n\t" \ - ".byte 0x22 # DW_OP_plus\n" \ -"20:\t" ".byte 0x40 + (5b-4b+1) # DW_CFA_advance_loc\n\t" \ - ".byte 0x13 # DW_CFA_def_cfa_offset_sf\n\t" \ - ".sleb128 16\n\t" \ - ".byte 0x16 # DW_CFA_val_expression\n\t" \ - ".uleb128 0x10\n\t" \ - ".uleb128 22f-21f\n" \ -"21:\t" ".byte 0x80 # DW_OP_breg16\n\t" \ - ".sleb128 4b-5b\n" \ -"22:\t" ".align 8\n" \ -"23:\t" ".previous\n" - -/* Unwind info for - 1: leaq ..., %rdi - 2: subq $128, %rsp - 3: callq ... - 4: addq $128, %rsp - 5: jmp 24f - 6: - snippet. */ -#define LLL_STUB_UNWIND_INFO_5 \ -LLL_STUB_UNWIND_INFO_START \ -"12:\t" ".byte 0x40 + (2b-1b) # DW_CFA_advance_loc\n\t" \ -LLL_STUB_UNWIND_INFO_END - -/* Unwind info for - 1: leaq ..., %rdi - 0: movq ..., %rdx - 2: subq $128, %rsp - 3: callq ... - 4: addq $128, %rsp - 5: jmp 24f - 6: - snippet. */ -#define LLL_STUB_UNWIND_INFO_6 \ -LLL_STUB_UNWIND_INFO_START \ -"12:\t" ".byte 0x40 + (0b-1b) # DW_CFA_advance_loc\n\t" \ - ".byte 0x16 # DW_CFA_val_expression\n\t" \ - ".uleb128 0x10\n\t" \ - ".uleb128 26f-25f\n" \ -"25:\t" ".byte 0x80 # DW_OP_breg16\n\t" \ - ".sleb128 4b-0b\n" \ -"26:\t" ".byte 0x40 + (2b-0b) # DW_CFA_advance_loc\n\t" \ -LLL_STUB_UNWIND_INFO_END - - #define lll_futex_wait(futex, val) \ - ({ \ - int __status; \ + do { \ + int __ignore; \ register __typeof (val) _val asm ("edx") = (val); \ __asm __volatile ("xorq %%r10, %%r10\n\t" \ "syscall" \ - : "=a" (__status) \ + : "=a" (__ignore) \ : "0" (SYS_futex), "D" (futex), "S" (FUTEX_WAIT), \ "d" (_val) \ : "memory", "cc", "r10", "r11", "cx"); \ - __status; \ - }) - - -#define lll_futex_timed_wait(futex, val, timeout) \ - ({ \ - register const struct timespec *__to __asm__ ("r10") = timeout; \ - int __status; \ - register __typeof (val) _val asm ("edx") = (val); \ - __asm __volatile ("syscall" \ - : "=a" (__status) \ - : "0" (SYS_futex), "D" (futex), "S" (FUTEX_WAIT), \ - "d" (_val), "r" (__to) \ - : "memory", "cc", "r11", "cx"); \ - __status; \ - }) + } while (0) #define lll_futex_wake(futex, nr) \ @@ -212,16 +96,6 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden; ret; }) -#define lll_robust_mutex_trylock(futex, id) \ - ({ int ret; \ - __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1" \ - : "=a" (ret), "=m" (futex) \ - : "r" (id), "m" (futex), \ - "0" (LLL_MUTEX_LOCK_INITIALIZER) \ - : "memory"); \ - ret; }) - - #define lll_mutex_cond_trylock(futex) \ ({ int ret; \ __asm __volatile (LOCK_INSTR "cmpxchgl %2, %1" \ @@ -236,109 +110,51 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden; (void) ({ int ignore1, ignore2, ignore3; \ __asm __volatile (LOCK_INSTR "cmpxchgl %0, %2\n\t" \ "jnz 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_mutex_lock_%=, @function\n" \ - "_L_mutex_lock_%=:\n" \ - "1:\tleaq %2, %%rdi\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_mutex_lock_wait\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_mutex_lock_%=, 6b-1b\n\t" \ + ".subsection 1\n" \ + "1:\tleaq %2, %%rdi\n\t" \ + "subq $128, %%rsp\n\t" \ + "callq __lll_mutex_lock_wait\n\t" \ + "addq $128, %%rsp\n\t" \ + "jmp 2f\n\t" \ ".previous\n" \ - LLL_STUB_UNWIND_INFO_5 \ - "24:" \ + "2:" \ : "=S" (ignore1), "=&D" (ignore2), "=m" (futex),\ "=a" (ignore3) \ : "0" (1), "m" (futex), "3" (0) \ : "cx", "r11", "cc", "memory"); }) -#define lll_robust_mutex_lock(futex, id) \ - ({ int result, ignore1, ignore2; \ - __asm __volatile (LOCK_INSTR "cmpxchgl %0, %2\n\t" \ - "jnz 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_robust_mutex_lock_%=, @function\n" \ - "_L_robust_mutex_lock_%=:\n" \ - "1:\tleaq %2, %%rdi\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_robust_mutex_lock_wait\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_robust_mutex_lock_%=, 6b-1b\n\t" \ - ".previous\n" \ - LLL_STUB_UNWIND_INFO_5 \ - "24:" \ - : "=S" (ignore1), "=&D" (ignore2), "=m" (futex), \ - "=a" (result) \ - : "0" (id), "m" (futex), "3" (0) \ - : "cx", "r11", "cc", "memory"); \ - result; }) - - #define lll_mutex_cond_lock(futex) \ (void) ({ int ignore1, ignore2, ignore3; \ __asm __volatile (LOCK_INSTR "cmpxchgl %0, %2\n\t" \ "jnz 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_mutex_cond_lock_%=, @function\n" \ - "_L_mutex_cond_lock_%=:\n" \ - "1:\tleaq %2, %%rdi\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_mutex_lock_wait\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_mutex_cond_lock_%=, 6b-1b\n\t" \ + ".subsection 1\n" \ + "1:\tleaq %2, %%rdi\n\t" \ + "subq $128, %%rsp\n\t" \ + "callq __lll_mutex_lock_wait\n\t" \ + "addq $128, %%rsp\n\t" \ + "jmp 2f\n\t" \ ".previous\n" \ - LLL_STUB_UNWIND_INFO_5 \ - "24:" \ + "2:" \ : "=S" (ignore1), "=&D" (ignore2), "=m" (futex),\ "=a" (ignore3) \ : "0" (2), "m" (futex), "3" (0) \ : "cx", "r11", "cc", "memory"); }) -#define lll_robust_mutex_cond_lock(futex, id) \ - ({ int result, ignore1, ignore2; \ - __asm __volatile (LOCK_INSTR "cmpxchgl %0, %2\n\t" \ - "jnz 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_robust_mutex_cond_lock_%=, @function\n" \ - "_L_robust_mutex_cond_lock_%=:\n" \ - "1:\tleaq %2, %%rdi\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_robust_mutex_lock_wait\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_robust_mutex_cond_lock_%=, 6b-1b\n\t" \ - ".previous\n" \ - LLL_STUB_UNWIND_INFO_5 \ - "24:" \ - : "=S" (ignore1), "=&D" (ignore2), "=m" (futex), \ - "=a" (result) \ - : "0" (id | FUTEX_WAITERS), "m" (futex), "3" (0) \ - : "cx", "r11", "cc", "memory"); \ - result; }) - - #define lll_mutex_timedlock(futex, timeout) \ ({ int result, ignore1, ignore2, ignore3; \ __asm __volatile (LOCK_INSTR "cmpxchgl %2, %4\n\t" \ "jnz 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_mutex_timedlock_%=, @function\n" \ - "_L_mutex_timedlock_%=:\n" \ - "1:\tleaq %4, %%rdi\n" \ - "0:\tmovq %8, %%rdx\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_mutex_timedlock_wait\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_mutex_timedlock_%=, 6b-1b\n\t" \ + ".subsection 1\n" \ + "1:\tleaq %4, %%rdi\n\t" \ + "movq %8, %%rdx\n\t" \ + "subq $128, %%rsp\n\t" \ + "callq __lll_mutex_timedlock_wait\n\t" \ + "addq $128, %%rsp\n\t" \ + "jmp 2f\n\t" \ ".previous\n" \ - LLL_STUB_UNWIND_INFO_6 \ - "24:" \ + "2:" \ : "=a" (result), "=&D" (ignore1), "=S" (ignore2), \ "=&d" (ignore3), "=m" (futex) \ : "0" (0), "2" (1), "m" (futex), "m" (timeout) \ @@ -346,83 +162,23 @@ extern int __lll_mutex_unlock_wait (int *__futex) attribute_hidden; result; }) -#define lll_robust_mutex_timedlock(futex, timeout, id) \ - ({ int result, ignore1, ignore2, ignore3; \ - __asm __volatile (LOCK_INSTR "cmpxchgl %2, %4\n\t" \ - "jnz 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_robust_mutex_timedlock_%=, @function\n" \ - "_L_robust_mutex_timedlock_%=:\n" \ - "1:\tleaq %4, %%rdi\n" \ - "0:\tmovq %8, %%rdx\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_robust_mutex_timedlock_wait\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_robust_mutex_timedlock_%=, 6b-1b\n\t" \ - ".previous\n" \ - LLL_STUB_UNWIND_INFO_6 \ - "24:" \ - : "=a" (result), "=&D" (ignore1), "=S" (ignore2), \ - "=&d" (ignore3), "=m" (futex) \ - : "0" (0), "2" (id), "m" (futex), "m" (timeout) \ - : "memory", "cx", "cc", "r10", "r11"); \ - result; }) - - #define lll_mutex_unlock(futex) \ (void) ({ int ignore; \ __asm __volatile (LOCK_INSTR "decl %0\n\t" \ "jne 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_mutex_unlock_%=, @function\n" \ - "_L_mutex_unlock_%=:\n" \ - "1:\tleaq %0, %%rdi\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_mutex_unlock_wake\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_mutex_unlock_%=, 6b-1b\n\t" \ + ".subsection 1\n" \ + "1:\tleaq %0, %%rdi\n\t" \ + "subq $128, %%rsp\n\t" \ + "callq __lll_mutex_unlock_wake\n\t" \ + "addq $128, %%rsp\n\t" \ + "jmp 2f\n\t" \ ".previous\n" \ - LLL_STUB_UNWIND_INFO_5 \ - "24:" \ + "2:" \ : "=m" (futex), "=&D" (ignore) \ : "m" (futex) \ : "ax", "cx", "r11", "cc", "memory"); }) -#define lll_robust_mutex_unlock(futex) \ - (void) ({ int ignore; \ - __asm __volatile (LOCK_INSTR "andl %2, %0\n\t" \ - "jne 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_robust_mutex_unlock_%=, @function\n" \ - "_L_robust_mutex_unlock_%=:\n" \ - "1:\tleaq %0, %%rdi\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_mutex_unlock_wake\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_robust_mutex_unlock_%=, 6b-1b\n\t"\ - ".previous\n" \ - LLL_STUB_UNWIND_INFO_5 \ - "24:" \ - : "=m" (futex), "=&D" (ignore) \ - : "i" (FUTEX_WAITERS), "m" (futex) \ - : "ax", "cx", "r11", "cc", "memory"); }) - - -#define lll_robust_mutex_dead(futex) \ - (void) ({ int ignore; \ - __asm __volatile (LOCK_INSTR "orl %3, (%2)\n\t" \ - "syscall" \ - : "=m" (futex), "=a" (ignore) \ - : "D" (&(futex)), "i" (FUTEX_OWNER_DIED), \ - "S" (FUTEX_WAKE), "1" (__NR_futex), \ - "d" (1) \ - : "cx", "r11", "cc", "memory"); }) - - #define lll_mutex_islocked(futex) \ (futex != LLL_MUTEX_LOCK_INITIALIZER) @@ -481,21 +237,17 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden; "je 0f\n\t" \ "lock; cmpxchgl %0, %2\n\t" \ "jnz 1f\n\t" \ - "jmp 24f\n" \ + "jmp 2f\n" \ "0:\tcmpxchgl %0, %2\n\t" \ "jnz 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_lock_%=, @function\n" \ - "_L_lock_%=:\n" \ - "1:\tleaq %2, %%rdi\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_mutex_lock_wait\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_lock_%=, 6b-1b\n\t" \ + ".subsection 1\n" \ + "1:\tleaq %2, %%rdi\n\t" \ + "subq $128, %%rsp\n\t" \ + "callq __lll_mutex_lock_wait\n\t" \ + "addq $128, %%rsp\n\t" \ + "jmp 2f\n\t" \ ".previous\n" \ - LLL_STUB_UNWIND_INFO_5 \ - "24:" \ + "2:" \ : "=S" (ignore1), "=&D" (ignore2), "=m" (futex),\ "=a" (ignore3) \ : "0" (1), "m" (futex), "3" (0) \ @@ -508,21 +260,17 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden; "je 0f\n\t" \ "lock; decl %0\n\t" \ "jne 1f\n\t" \ - "jmp 24f\n" \ + "jmp 2f\n" \ "0:\tdecl %0\n\t" \ "jne 1f\n\t" \ - ".subsection 1\n\t" \ - ".type _L_unlock_%=, @function\n" \ - "_L_unlock_%=:\n" \ - "1:\tleaq %0, %%rdi\n" \ - "2:\tsubq $128, %%rsp\n" \ - "3:\tcallq __lll_mutex_unlock_wake\n" \ - "4:\taddq $128, %%rsp\n" \ - "5:\tjmp 24f\n" \ - "6:\t.size _L_unlock_%=, 6b-1b\n\t" \ + ".subsection 1\n" \ + "1:\tleaq %0, %%rdi\n\t" \ + "subq $128, %%rsp\n\t" \ + "callq __lll_mutex_unlock_wake\n\t" \ + "addq $128, %%rsp\n\t" \ + "jmp 2f\n\t" \ ".previous\n" \ - LLL_STUB_UNWIND_INFO_5 \ - "24:" \ + "2:" \ : "=m" (futex), "=&D" (ignore) \ : "m" (futex) \ : "ax", "cx", "r11", "cc", "memory"); }) |