Annotation of XNU/libkern/ppc/OSAtomic.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22:  /*
                     23:  * Copyright (c) 1997-1998 Apple Computer, Inc.
                     24:  *
                     25:  *
                     26:  * HISTORY
                     27:  *
                     28:  * sdouglas  22 Oct 97 - first checked in from DriverServices
                     29:  * sdouglas  28 Jul 98 - start IOKit
                     30:  */
                     31: 
                     32: #include <architecture/ppc/asm_help.h>
                     33: 
                     34: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                     35: ;
                     36: ; ENTRY                functionName
                     37: ;
                     38: ; Assembly directives to begin an exported function.
                     39: ;
                     40: ; Takes: functionName - name of the exported function
                     41: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                     42: 
                     43: .macro ENTRY
                     44:        .text
                     45:        .align          2
                     46:        .globl          $0
                     47: $0:
                     48: .endmacro
                     49: 
                     50: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                     51: 
                     52: /*
                     53: int OSCompareAndSwap( UInt32 oldVal, UInt32 newVal, UInt32 * addr )
                     54: */
                     55: 
                     56: 
                     57:        ENTRY   _OSCompareAndSwap
                     58: 
                     59:        lwarx   r6,     0,r5            /* CEMV10 */
                     60: .L_CASretry:
                     61:        lwarx   r6,     0,r5
                     62:        cmpw    r6,     r3
                     63:        bne-    .L_CASfail
                     64:        stwcx.  r4,     0,r5
                     65:        bne-    .L_CASretry
                     66:        isync
                     67:        li      r3,     1
                     68:        blr
                     69: .L_CASfail:
                     70:        li      r3,     0
                     71:        blr
                     72: 
                     73: 
                     74: /*
                     75: SInt32 OSDecrementAtomic(SInt32 * value)
                     76: */
                     77:        ENTRY   _OSDecrementAtomic
                     78:        mr      r4, r3
                     79:        li      r3, -1
                     80:        b       _OSAddAtomic
                     81: 
                     82: /*
                     83: SInt32 OSIncrementAtomic(SInt32 * value)
                     84: */
                     85: 
                     86:        ENTRY   _OSIncrementAtomic
                     87:        mr      r4, r3
                     88:        li      r3, 1
                     89: 
                     90: /*
                     91: SInt32 OSAddAtomic(SInt32 amount, SInt32 * value)
                     92: */
                     93: 
                     94:        ENTRY   _OSAddAtomic
                     95: 
                     96:        mr      r5,r3                           /* Save the increment */
                     97:        lwarx   r3,0,r4                         /* CEMV10 */
                     98: 
                     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 */
                    105: 
                    106: 
                    107: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.