The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/libkern/ppc/OSAtomic.s

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
    3  *
    4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
    5  * 
    6  * This file contains Original Code and/or Modifications of Original Code
    7  * as defined in and that are subject to the Apple Public Source License
    8  * Version 2.0 (the 'License'). You may not use this file except in
    9  * compliance with the License. The rights granted to you under the License
   10  * may not be used to create, or enable the creation or redistribution of,
   11  * unlawful or unlicensed copies of an Apple operating system, or to
   12  * circumvent, violate, or enable the circumvention or violation of, any
   13  * terms of an Apple operating system software license agreement.
   14  * 
   15  * Please obtain a copy of the License at
   16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
   17  * 
   18  * The Original Code and all software distributed under the License are
   19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
   20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
   21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
   22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
   23  * Please see the License for the specific language governing rights and
   24  * limitations under the License.
   25  * 
   26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
   27  */
   28  /*
   29  * Copyright (c) 1997-1998 Apple Computer, Inc.
   30  *
   31  *
   32  * HISTORY
   33  *
   34  * sdouglas  22 Oct 97 - first checked in from DriverServices
   35  * sdouglas  28 Jul 98 - start IOKit
   36  */
   37 
   38 #include <architecture/ppc/asm_help.h>
   39 
   40 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   41 ;
   42 ; ENTRY         functionName
   43 ;
   44 ; Assembly directives to begin an exported function.
   45 ;
   46 ; Takes: functionName - name of the exported function
   47 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   48 
   49 .macro ENTRY
   50     .text
   51     .align      2
   52     .globl      $0
   53 $0:
   54 .endmacro
   55 
   56 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   57 
   58 /*
   59 int     OSCompareAndSwap( UInt32 oldVal, UInt32 newVal, UInt32 * addr )
   60     This is now an alias to hw_compare_and_store, see xnu/libkern/Makefile.
   61 
   62 void *  OSDequeueAtomic(void ** inList, SInt32 inOffset)
   63     This is also aliased, to hw_dequeue_atomic.
   64     
   65 void    OSEnqueueAtomic(void ** inList, void * inNewLink, SInt32 inOffset)
   66     This is aliased to hw_queue_atomic.
   67 */
   68 
   69 /*
   70 Note:  We can not use the hw_atomic routines provided by osfmk/ppc as
   71 the return the result of the addition not the original value.
   72 */
   73 /*
   74 SInt32  OSDecrementAtomic(SInt32 * value)
   75 */
   76     ENTRY       _OSDecrementAtomic
   77     mr          r4, r3
   78     li          r3, -1
   79     b           _OSAddAtomic
   80 
   81 /*
   82 SInt32  OSIncrementAtomic(SInt32 * value)
   83 */
   84 
   85     .align      5
   86 
   87     ENTRY       _OSIncrementAtomic
   88     mr          r4, r3
   89     li          r3, 1
   90 
   91 /*
   92 SInt32  OSAddAtomic(SInt32 amount, SInt32 * value)
   93 */
   94 
   95     ENTRY       _OSAddAtomic
   96     ENTRY       _OSAddAtomicLong
   97 
   98     mr          r5,r3           /* Save the increment */
   99 .L_AAretry:
  100     lwarx       r3, 0, r4       /* Grab the area value */
  101     add         r6, r3, r5      /* Add the value */
  102     stwcx.      r6, 0, r4       /* Try to save the new value */
  103     bne-        .L_AAretry      /* Didn't get it, try again... */
  104     blr                         /* Return the original value */

Cache object: 716d9ae678ddd58bbb2fcc1936f6687f


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.