|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* HISTORY ! 26: * ! 27: * 1998/02/25 Umesh Vaishampayan ([email protected]) ! 28: * Moved kdp_flush_icache() to cache.s ! 29: * ! 30: * 1997/10/14 Umesh Vaishampayan ([email protected]) ! 31: * Added disable_ee() and restore_ee() for the use of mcount. ! 32: * ! 33: * 1997/05/16 Rene Vega -- Cleanup sync/isync usage. ! 34: */ ! 35: ! 36: /* ! 37: * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991 ! 38: * All Rights Reserved ! 39: * ! 40: * Permission to use, copy, modify, and distribute this software and ! 41: * its documentation for any purpose and without fee is hereby granted, ! 42: * provided that the above copyright notice appears in all copies and ! 43: * that both the copyright notice and this permission notice appear in ! 44: * supporting documentation. ! 45: * ! 46: * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE ! 47: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ! 48: * FOR A PARTICULAR PURPOSE. ! 49: * ! 50: * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR ! 51: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ! 52: * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, ! 53: * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION ! 54: * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ! 55: */ ! 56: /* ! 57: * MKLINUX-1.0DR2 ! 58: */ ! 59: ! 60: #include <assym.h> ! 61: #include <machdep/ppc/asm.h> ! 62: #include <machdep/ppc/proc_reg.h> ! 63: #include <mach/ppc/vm_param.h> ! 64: #include <machdep/ppc/powermac.h> ! 65: ! 66: /* Disable external interrupts and return the previous value of msr */ ! 67: /* These routines are used by mcount() */ ! 68: ENTRY(disable_ee, TAG_NO_FRAME_USED) ! 69: mfmsr r3 ! 70: rlwinm r0, r3, 0, MSR_EE_BIT+1, MSR_EE_BIT-1 ! 71: mtmsr r0 ! 72: blr ! 73: ! 74: /* /Restore the msr to the value passed in the first parameter */ ! 75: ENTRY(restore_ee, TAG_NO_FRAME_USED) ! 76: mtmsr r3 ! 77: blr ! 78: ! 79: /* Mask and unmask interrupts at the processor level */ ! 80: ENTRY(interrupt_disable, TAG_NO_FRAME_USED) ! 81: mfmsr r0 ! 82: rlwinm r0, r0, 0, MSR_EE_BIT+1, MSR_EE_BIT-1 ! 83: mtmsr r0 ! 84: blr ! 85: ! 86: ENTRY(interrupt_enable, TAG_NO_FRAME_USED) ! 87: mfmsr r0 ! 88: ori r0, r0, MASK(MSR_EE) ! 89: mtmsr r0 ! 90: blr ! 91: ! 92: ! 93: /* ! 94: ** get_timebase() ! 95: ** ! 96: ** Entry - R3 contains pointer to 64 bit structure. ! 97: ** ! 98: ** Exit - 64 bit structure filled in. ! 99: ** ! 100: */ ! 101: ENTRY(get_timebase, TAG_NO_FRAME_USED) ! 102: loop: ! 103: mftbu r4 ! 104: mftb r5 ! 105: mftbu r6 ! 106: cmpw r6, r4 ! 107: bne loop ! 108: ! 109: stw r4, 0(r3) ! 110: stw r5, 4(r3) ! 111: ! 112: blr ! 113: ! 114: ! 115: /* ! 116: * Boolean test_and_set (UInt32 theBit, UInt8 *theAddress) ! 117: *{ ! 118: * UInt32 theValue; ! 119: * UInt32 theMask; ! 120: * ! 121: * theAddress += theBit / 8; ! 122: * theBit %= 8; ! 123: * ! 124: * theBit += (theAddress % 4) * 8; ! 125: * theAddress &= ~(0x00000003); // long-align the address ! 126: * ! 127: * theMask = 1 << (31 - theBit); ! 128: * ! 129: * while (true) { ! 130: * theValue = __lwarx(theAddress); ! 131: * if ((theValue & theMask) != 0) ! 132: * return true; ! 133: * ! 134: * if (__stwcx(theValue | theMask, theAddress)) ! 135: * return false; ! 136: * } ! 137: *} ! 138: */ ! 139: ENTRY(test_and_set, TAG_NO_FRAME_USED) ! 140: ! 141: rlwinm r7, r3, (32 - 3), 3,31 // r7 = theBit / 8 ! 142: rlwinm r3, r3, 0, 29,31 // theBit %= 8 ! 143: add r4, r4, r7 // theAddress += theBit / 8 ! 144: rlwinm r7, r4, 3, 27,28 // r7 = (theAddress % 4) * 8 ! 145: add r3, r3, r7 // theBit += (theAddress %4)*8 ! 146: rlwinm r4, r4, 0, 0,29 // long-align the address ! 147: li r7, 1 ! 148: nor r3, r3, r3 // theBit = 31 - theBit ! 149: rlwnm r7, r7, r3, 0,31 // theMask = 1 << (31 - theBit) ! 150: ! 151: li r3, 1 // assume it is already set ! 152: ! 153: Ltasl: ! 154: sync ! 155: lwarx r5, 0, r4 ! 156: and. r8, r5, r7 // was the masked bit set? ! 157: bnelr // it was already set, return ! 158: ! 159: or r5, r5, r7 // set the bit ! 160: sync ! 161: stwcx. r5, 0, r4 ! 162: bne- Ltasl ! 163: isync ! 164: li r3, 0 ! 165: ! 166: blr ! 167:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.