|
|
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: * @OSF_COPYRIGHT@ ! 24: */ ! 25: ! 26: #include <mach_kdb.h> ! 27: #include <mach_kgdb.h> ! 28: #include <mach_debug.h> ! 29: #include <assym.s> ! 30: #include <ppc/asm.h> ! 31: #include <ppc/proc_reg.h> ! 32: #include <mach/ppc/vm_param.h> ! 33: ! 34: /* ! 35: * vm_offset_t getrpc(void) - Return address of the function ! 36: * that called the current function ! 37: */ ! 38: ! 39: /* By using this function, we force the caller to save its LR in a known ! 40: * location, which we can pick up and return. See PowerPC ELF specs. ! 41: */ ! 42: ENTRY(getrpc, TAG_NO_FRAME_USED) ! 43: lwz ARG0, FM_BACKPTR(r1) /* Load our backchain ptr */ ! 44: lwz ARG0, FM_LR_SAVE(ARG0) /* Load previously saved LR */ ! 45: blr /* And return */ ! 46: ! 47: ! 48: /* Mask and unmask interrupts at the processor level */ ! 49: ENTRY(interrupt_disable, TAG_NO_FRAME_USED) ! 50: mfmsr r0 ! 51: rlwinm r0, r0, 0, MSR_EE_BIT+1, MSR_EE_BIT-1 ! 52: mtmsr r0 ! 53: blr ! 54: ! 55: ENTRY(interrupt_enable, TAG_NO_FRAME_USED) ! 56: ! 57: mfmsr r0 ! 58: ori r0, r0, MASK(MSR_EE) ! 59: mtmsr r0 ! 60: blr ! 61: ! 62: #if MACH_KDB ! 63: /* ! 64: * Kernel debugger versions of the spl*() functions. This allows breakpoints ! 65: * in the spl*() functions. ! 66: */ ! 67: ! 68: /* Mask and unmask interrupts at the processor level */ ! 69: ENTRY(db_interrupt_disable, TAG_NO_FRAME_USED) ! 70: mfmsr r0 ! 71: rlwinm r0, r0, 0, MSR_EE_BIT+1, MSR_EE_BIT-1 ! 72: mtmsr r0 ! 73: blr ! 74: ! 75: ENTRY(db_interrupt_enable, TAG_NO_FRAME_USED) ! 76: mfmsr r0 ! 77: ori r0, r0, MASK(MSR_EE) ! 78: mtmsr r0 ! 79: blr ! 80: #endif /* MACH_KDB */ ! 81: ! 82: /* ! 83: * General entry for all debuggers. This gets us onto the debug stack and ! 84: * then back off at exit. We need to pass back R3 to caller. ! 85: */ ! 86: ! 87: ENTRY(Call_Debugger, TAG_NO_FRAME_USED) ! 88: ! 89: mfmsr r7 ; Get the current MSR ! 90: mflr r0 ; Save the return ! 91: rlwinm r7,r7,0,MSR_EE_BIT+1,MSR_EE_BIT-1 ; Turn off interruptions ! 92: mtmsr r7 ; Do it ! 93: mfsprg r8,0 ; Get the per_proc block ! 94: stw r0,FM_LR_SAVE(r1) ; Save return on current stack ! 95: ! 96: lwz r9,PP_DEBSTACKPTR(r8) ; Get the debug stack ! 97: cmpwi r9,0 ; Are we already on it? ! 98: bne cdNewDeb ; No... ! 99: ! 100: mr r9,r1 ; We are already on the stack, so use the current value ! 101: subi r9,r9,FM_REDZONE+FM_SIZE ; Carve some extra space here ! 102: ! 103: cdNewDeb: li r0,0 ; Clear this out ! 104: stw r1,FM_ARG0(r9) ; Save the old stack pointer as if it were the first arg ! 105: ! 106: stw r0,PP_DEBSTACKPTR(r8) ; Mark debug stack as busy ! 107: ! 108: subi r1,r9,FM_SIZE ; Carve a new frame ! 109: stw r0,FM_BACKPTR(r1) ; Chain back ! 110: ! 111: bl EXT(Call_DebuggerC) ; Call the "C" phase of this ! 112: ! 113: mfmsr r0 ; Get the MSR just in case it was enabled ! 114: addi r1,r1,FM_SIZE ; Pop off first stack frame ! 115: rlwinm r0,r0,0,MSR_EE_BIT+1,MSR_EE_BIT-1 ; Turn off interruptions enable bit ! 116: mtmsr r0 ! 117: ! 118: mfsprg r8,0 ; Get the per_proc block address ! 119: ! 120: lwz r9,PP_DEBSTACK_TOP_SS(r8) ; Get the top of the stack ! 121: cmplw r1,r9 ; Have we hit the bottom of the debug stack? ! 122: lwz r1,FM_ARG0(r1) ; Get previous stack frame ! 123: lwz r0,FM_LR_SAVE(r1) ; Get return address ! 124: mtlr r0 ; Set the return point ! 125: bnelr ; Return if still on debug stack ! 126: ! 127: stw r9,PP_DEBSTACKPTR(r8) ; Mark debug stack as free ! 128: blr ! 129: ! 130: ! 131: /* The following routines are for C-support. They are usually ! 132: * inlined into the C using the specifications in proc_reg.h, ! 133: * but if optimisation is switched off, the inlining doesn't work ! 134: */ ! 135: ! 136: ENTRY(get_got, TAG_NO_FRAME_USED) ! 137: mr ARG0, r2 ! 138: blr ! 139: ! 140: ENTRY(mflr, TAG_NO_FRAME_USED) ! 141: mflr ARG0 ! 142: blr ! 143: ! 144: ENTRY(mfpvr, TAG_NO_FRAME_USED) ! 145: mfpvr ARG0 ! 146: blr ! 147: ! 148: ENTRY(mtmsr, TAG_NO_FRAME_USED) ! 149: mtmsr ARG0 ! 150: isync ! 151: blr ! 152: ! 153: ENTRY(mfmsr, TAG_NO_FRAME_USED) ! 154: mfmsr ARG0 ! 155: blr ! 156: ! 157: ENTRY(mtsrin, TAG_NO_FRAME_USED) ! 158: isync ! 159: mtsrin ARG0, ARG1 ! 160: isync ! 161: blr ! 162: ! 163: ENTRY(mfsrin, TAG_NO_FRAME_USED) ! 164: mfsrin ARG0, ARG0 ! 165: blr ! 166: ! 167: ENTRY(mtsdr1, TAG_NO_FRAME_USED) ! 168: mtsdr1 ARG0 ! 169: blr ! 170: ! 171: ENTRY(mtdar, TAG_NO_FRAME_USED) ! 172: mtdar ARG0 ! 173: blr ! 174: ! 175: ENTRY(mfdar, TAG_NO_FRAME_USED) ! 176: mfdar ARG0 ! 177: blr ! 178: ! 179: ENTRY(mtdec, TAG_NO_FRAME_USED) ! 180: mtdec ARG0 ! 181: blr ! 182: ! 183: /* Decrementer frequency and realtime|timebase processor registers ! 184: * are different between ppc601 and ppc603/4, we define them all. ! 185: */ ! 186: ! 187: ENTRY(isync_mfdec, TAG_NO_FRAME_USED) ! 188: isync ! 189: mfdec ARG0 ! 190: blr ! 191: ! 192: ! 193: ENTRY(mftb, TAG_NO_FRAME_USED) ! 194: mftb ARG0 ! 195: blr ! 196: ! 197: ENTRY(mftbu, TAG_NO_FRAME_USED) ! 198: mftbu ARG0 ! 199: blr ! 200: ! 201: ENTRY(mfrtcl, TAG_NO_FRAME_USED) ! 202: mfspr ARG0, 5 ! 203: blr ! 204: ! 205: ENTRY(mfrtcu, TAG_NO_FRAME_USED) ! 206: mfspr ARG0, 4 ! 207: blr ! 208: ! 209: ENTRY(tlbie, TAG_NO_FRAME_USED) ! 210: tlbie ARG0 ! 211: blr ! 212: ! 213: ! 214: /* ! 215: * Performance Monitor Register Support ! 216: */ ! 217: ! 218: ENTRY(mfmmcr0, TAG_NO_FRAME_USED) ! 219: mfspr r3,mmcr0 ! 220: blr ! 221: ! 222: ENTRY(mtmmcr0, TAG_NO_FRAME_USED) ! 223: mtspr mmcr0,r3 ! 224: blr ! 225: ! 226: ENTRY(mfmmcr1, TAG_NO_FRAME_USED) ! 227: mfspr r3,mmcr1 ! 228: blr ! 229: ! 230: ENTRY(mtmmcr1, TAG_NO_FRAME_USED) ! 231: mtspr mmcr1,r3 ! 232: blr ! 233: ! 234: ENTRY(mfmmcr2, TAG_NO_FRAME_USED) ! 235: mfspr r3,mmcr2 ! 236: blr ! 237: ! 238: ENTRY(mtmmcr2, TAG_NO_FRAME_USED) ! 239: mtspr mmcr2,r3 ! 240: blr ! 241: ! 242: ENTRY(mfpmc1, TAG_NO_FRAME_USED) ! 243: mfspr r3,pmc1 ! 244: blr ! 245: ! 246: ENTRY(mtpmc1, TAG_NO_FRAME_USED) ! 247: mtspr pmc1,r3 ! 248: blr ! 249: ! 250: ENTRY(mfpmc2, TAG_NO_FRAME_USED) ! 251: mfspr r3,pmc2 ! 252: blr ! 253: ! 254: ENTRY(mtpmc2, TAG_NO_FRAME_USED) ! 255: mtspr pmc2,r3 ! 256: blr ! 257: ! 258: ENTRY(mfpmc3, TAG_NO_FRAME_USED) ! 259: mfspr r3,pmc3 ! 260: blr ! 261: ! 262: ENTRY(mtpmc3, TAG_NO_FRAME_USED) ! 263: mtspr pmc3,r3 ! 264: blr ! 265: ! 266: ENTRY(mfpmc4, TAG_NO_FRAME_USED) ! 267: mfspr r3,pmc4 ! 268: blr ! 269: ! 270: ENTRY(mtpmc4, TAG_NO_FRAME_USED) ! 271: mtspr pmc4,r3 ! 272: blr ! 273: ! 274: ENTRY(mfsia, TAG_NO_FRAME_USED) ! 275: mfspr r3,sia ! 276: blr ! 277: ! 278: ENTRY(mfsda, TAG_NO_FRAME_USED) ! 279: mfspr r3,sda ! 280: blr ! 281:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.