Annotation of XNU/osfmk/ppc/misc_asm.s, revision 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:  * @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: 

unix.superglobalmegacorp.com

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