|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.