linux-old/arch/x86_64/lib/thunk.S
<<
>>
Prefs
   1        /*
   2         * Save registers before calling assembly functions. This avoids
   3         * disturbance of register allocation in some inline assembly constructs.
   4         * Copyright 2001,2002 by Andi Kleen, SuSE Labs.
   5         * Subject to the GNU public license, v.2. No warranty of any kind.
   6         * $Id: thunk.S,v 1.2 2002/03/13 20:06:58 ak Exp $
   7         */
   8
   9        #include <linux/config.h>
  10        #include <linux/linkage.h>
  11        #include <asm/calling.h>                        
  12        #include <asm/rwlock.h>
  13                
  14        /* rdi: arg1 ... normal C conventions. rax is saved/restored. */        
  15        .macro thunk name,func
  16        .globl \name
  17\name:  
  18        SAVE_ARGS
  19        call \func
  20        jmp  restore
  21        .endm
  22
  23        /* rdi: arg1 ... normal C conventions. rax is passed from C. */         
  24        .macro thunk_retrax name,func
  25        .globl \name
  26\name:  
  27        SAVE_ARGS
  28        call \func
  29        jmp  restore_norax
  30        .endm
  31        
  32
  33#ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM
  34        thunk rwsem_down_read_failed_thunk,rwsem_down_read_failed
  35        thunk rwsem_down_write_failed_thunk,rwsem_down_write_failed
  36        thunk rwsem_wake_thunk,rwsem_wake
  37#endif  
  38        thunk do_softirq_thunk,do_softirq
  39        
  40        thunk __down_failed,__down
  41        thunk_retrax __down_failed_interruptible,__down_interruptible
  42        thunk_retrax __down_failed_trylock,__down_trylock
  43        thunk __up_wakeup,__up
  44        
  45restore:
  46        RESTORE_ARGS
  47        ret     
  48        
  49restore_norax:  
  50        RESTORE_ARGS 1
  51        ret
  52
  53#ifdef CONFIG_SMP
  54/* Support for read/write spinlocks. */
  55        
  56/* rax: pointer to rwlock_t */  
  57ENTRY(__write_lock_failed)
  58        lock
  59        addl $RW_LOCK_BIAS,(%rax)
  601:      rep
  61        nop
  62        cmpl $RW_LOCK_BIAS,(%rax)
  63        jne 1b
  64        lock 
  65        subl $RW_LOCK_BIAS,(%rax)
  66        jnz  __write_lock_failed
  67        ret
  68
  69/* rax: pointer to rwlock_t */  
  70ENTRY(__read_lock_failed)
  71        lock
  72        incl (%rax)
  731:      rep
  74        nop
  75        cmpl $1,(%rax)
  76        js 1b
  77        lock
  78        decl (%rax)
  79        js __read_lock_failed
  80        ret
  81#endif
  82
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.