Annotation of kernel/machdep/ppc/cswtch.s, revision 1.1.1.1

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:        1997/05/16      Rene Vega-- Cleanup sync/isync usage.
                     28: */
                     29: 
                     30: /*
                     31:  * Copyright 1996 1995 by Open Software Foundation, Inc. 1997 1996 1995 1994 1993 1992 1991  
                     32:  *              All Rights Reserved 
                     33:  *  
                     34:  * Permission to use, copy, modify, and distribute this software and 
                     35:  * its documentation for any purpose and without fee is hereby granted, 
                     36:  * provided that the above copyright notice appears in all copies and 
                     37:  * that both the copyright notice and this permission notice appear in 
                     38:  * supporting documentation. 
                     39:  *  
                     40:  * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
                     41:  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
                     42:  * FOR A PARTICULAR PURPOSE. 
                     43:  *  
                     44:  * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
                     45:  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
                     46:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
                     47:  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
                     48:  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
                     49:  */
                     50: /*
                     51:  * MKLINUX-1.0DR2
                     52:  */
                     53: 
                     54: #include <machdep/ppc/asm.h>
                     55: #include <machdep/ppc/proc_reg.h>
                     56: #include <cpus.h>
                     57: #include <assym.h>
                     58: #include <debug.h>
                     59: #include <mach/ppc/vm_param.h>
                     60:        
                     61:        .text
                     62:        .align 2
                     63:        
                     64: /*
                     65:  * void     load_context(thread_t        thread)
                     66:  *
                     67:  * Load the context for the first kernel thread, and go.
                     68:  * TODO NMGS - assumes single CPU.
                     69:  *
                     70:  * NOTE - if DEBUG is set, the former routine is a piece
                     71:  * of C capable of printing out debug info before calling the latter,
                     72:  * otherwise both entry points are identical.
                     73:  */
                     74: 
                     75: #if DEBUG
                     76: ENTRY(Load_context, TAG_NO_FRAME_USED)
                     77: #else
                     78: ENTRY2(load_context, Load_context, TAG_NO_FRAME_USED)
                     79: #endif /* DEBUG */     
                     80: 
                     81:        /*
                     82:         * Since this is the first thread, we came in on the interrupt
                     83:         * stack. The first thread never returns, so there is no need to
                     84:         * worry about saving its frame, hence we can reset the istackptr
                     85:         * back to the saved_state structure at it's top
                     86:         */
                     87: 
                     88:        addis   r11,    0,      ha16(EXT(intstack_top_ss))
                     89:        addi    r11,    r11,    lo16(EXT(intstack_top_ss))
                     90:        lwz     r0,     0(r11)
                     91: 
                     92:        addis   r11,    0,      ha16(EXT(istackptr))
                     93:        addi    r11,    r11,    lo16(EXT(istackptr))
                     94:        stw     r0,     0(r11)
                     95: 
                     96:         /*
                     97:          * get new thread pointer and set it into the active_threads pointer
                     98:          *
                     99:          * Never set any break points in these instructions since it
                    100:          * may cause a kernel stack overflow. (warning from HP code)
                    101:          */
                    102: 
                    103:        mfsprg  r2,     0       /* HACK - need to get around r2 problem */
                    104:        lwz     r11,    PP_CPU_DATA(r2)
                    105:        stw     ARG0,   CPU_ACTIVE_THREAD(r11)
                    106: 
                    107:        /* Find the new stack and store it in active_stacks */
                    108: 
                    109:        lwz     r1,     THREAD_KERNEL_STACK(ARG0)
                    110:        lwz     r12,    PP_ACTIVE_STACKS(r2)
                    111:        stw     r1,     0(r12)
                    112: 
                    113:         /*
                    114:          * This is the end of the no break points region.
                    115:          */
                    116: 
                    117:        /* Restore the callee save registers. The KS constants are
                    118:         * from the bottom of the stack, pointing to a structure
                    119:         * at the top of the stack
                    120:         */
                    121:        lwz     r13,    KS_R13(r1)
                    122:        lwz     r14,    KS_R13+1*4(r1)
                    123:        lwz     r15,    KS_R13+2*4(r1)
                    124:        lwz     r16,    KS_R13+3*4(r1)
                    125:        lwz     r17,    KS_R13+4*4(r1)
                    126:        lwz     r18,    KS_R13+5*4(r1)
                    127:        lwz     r19,    KS_R13+6*4(r1)
                    128:        lwz     r20,    KS_R13+7*4(r1)
                    129:        lwz     r21,    KS_R13+8*4(r1)
                    130:        lwz     r22,    KS_R13+9*4(r1)
                    131:        lwz     r23,    KS_R13+10*4(r1)
                    132:        lwz     r24,    KS_R13+11*4(r1)
                    133:        lwz     r25,    KS_R13+12*4(r1)
                    134:        lwz     r26,    KS_R13+13*4(r1)
                    135:        lwz     r27,    KS_R13+14*4(r1)
                    136:        lwz     r28,    KS_R13+15*4(r1)
                    137:        lwz     r29,    KS_R13+16*4(r1)
                    138:        lwz     r30,    KS_R13+17*4(r1)
                    139:        lwz     r31,    KS_R13+18*4(r1)
                    140:        
                    141:         /*
                    142:          * Since this is the first thread, we make sure that thread_continue
                    143:          * gets a zero as its argument.
                    144:          */
                    145: 
                    146:        li      ARG0,   0
                    147: 
                    148:        lwz     r0,     KS_CR(r1)
                    149:        mtcrf   0xFF,r0
                    150:        lwz     r0,     KS_LR(r1)
                    151:        mtlr    r0
                    152:        lwz     r1,     KS_R1(r1)               /* Load new stack pointer */
                    153:        stw     ARG0,   FM_BACKPTR(r1)          /* zero backptr */
                    154:        blr                     /* Jump to the continuation */
                    155:        
                    156: /* void Call_continuation( void (*continuation)(void),  vm_offset_t stack_ptr)
                    157:  */
                    158: 
                    159: ENTRY(Call_continuation, TAG_NO_FRAME_USED)
                    160:        mtlr    r3
                    161:        mr      r1, r4          /* Load new stack pointer */
                    162:        blr                     /* Jump to the continuation */
                    163: 
                    164: 
                    165: 
                    166: /* struct thread_t Switch_context(thread_t     old,
                    167:  *                               void          (*cont)(void),
                    168:  *                               thread_t      *new)
                    169:  *
                    170:  * Switch from one thread to another. If a continuation is supplied, then
                    171:  * we do not need to save callee save registers.
                    172:  *
                    173:  * TODO NMGS Assumes single CPU
                    174:  */
                    175: 
                    176: ENTRY(Switch_context, TAG_NO_FRAME_USED)
                    177: 
                    178:        /*
                    179:         * Get the old kernel stack, and store into the thread structure.
                    180:         * See if a continuation is supplied, and skip state save if so.
                    181:         * NB. Continuations are no longer used, so this test is omitted,
                    182:         * as should the second argument, but it is in generic code.
                    183:         * We always save state. This does not hurt even if continuations
                    184:         * are put back in.
                    185:         */
                    186: 
                    187:        stw     r2,     FM_TOC_SAVE(r1)
                    188:        mfsprg  r2,     0       /* HACK - need to get around r2 problem */
                    189:        lwz     r12,    PP_ACTIVE_STACKS(r2)
                    190:        cmpwi   CR0,    ARG1,   0               /* Continuation? */
                    191:        lwz     r11,    0(r12)
                    192:        stw     ARG1,   THREAD_SWAPFUNC(ARG0)
                    193:        stw     r11,    THREAD_KERNEL_STACK(ARG0)
                    194:        bne     CR0,    .L_sw_ctx_no_save       /* Yes, skip save */
                    195:        /*
                    196:         * Save all the callee save registers plus state.
                    197:         */
                    198: 
                    199:        /* the KS_ constants point to the offset from the bottom of the
                    200:         * stack to the ppc_kernel_state structure at the top, thus
                    201:         * r11 can be used directly
                    202:         */     
                    203:        stw     r1,     KS_R1(r11)
                    204:        lwz     r0,     FM_TOC_SAVE(r1)
                    205:        stw     r0,     KS_R2(r11)
                    206:        stw     r13,    KS_R13(r11)
                    207:        stw     r14,    KS_R13+1*4(r11)
                    208:        stw     r15,    KS_R13+2*4(r11)
                    209:        stw     r16,    KS_R13+3*4(r11)
                    210:        stw     r17,    KS_R13+4*4(r11)
                    211:        stw     r18,    KS_R13+5*4(r11)
                    212:        stw     r19,    KS_R13+6*4(r11)
                    213:        stw     r20,    KS_R13+7*4(r11)
                    214:        stw     r21,    KS_R13+8*4(r11)
                    215:        stw     r22,    KS_R13+9*4(r11)
                    216:        stw     r23,    KS_R13+10*4(r11)
                    217:        stw     r24,    KS_R13+11*4(r11)
                    218:        stw     r25,    KS_R13+12*4(r11)
                    219:        stw     r26,    KS_R13+13*4(r11)
                    220:        stw     r27,    KS_R13+14*4(r11)
                    221:        stw     r28,    KS_R13+15*4(r11)
                    222:        stw     r29,    KS_R13+16*4(r11)
                    223:        stw     r30,    KS_R13+17*4(r11)
                    224:        stw     r31,    KS_R13+18*4(r11)
                    225:        
                    226:        mfcr    r0
                    227:        stw     r0,     KS_CR(r11)
                    228:        mflr    r0
                    229:        stw     r0,     KS_LR(r11)
                    230: 
                    231:        /*
                    232:         * Make the new thread the current thread.
                    233:         */
                    234: .L_sw_ctx_no_save:
                    235:        
                    236:        lwz     r11,    PP_CPU_DATA(r2)
                    237:        stw     ARG2,   CPU_ACTIVE_THREAD(r11)
                    238:        
                    239:        lwz     r11,    THREAD_KERNEL_STACK(ARG2)
                    240: 
                    241:        lwz     r10,    PP_ACTIVE_STACKS(r2)
                    242:        stw     r11,    0(r10)
                    243: 
                    244:        /*
                    245:         * Restore all the callee save registers.
                    246:         */
                    247:        lwz     r1,     KS_R1(r11)      /* Restore stack pointer */
                    248: 
                    249:        /* Restore the callee save registers */
                    250:        lwz     r13,    KS_R13(r11)
                    251:        lwz     r14,    KS_R13+1*4(r11)
                    252:        lwz     r15,    KS_R13+2*4(r11)
                    253:        lwz     r16,    KS_R13+3*4(r11)
                    254:        lwz     r17,    KS_R13+4*4(r11)
                    255:        lwz     r18,    KS_R13+5*4(r11)
                    256:        lwz     r19,    KS_R13+6*4(r11)
                    257:        lwz     r20,    KS_R13+7*4(r11)
                    258:        lwz     r21,    KS_R13+8*4(r11)
                    259:        lwz     r22,    KS_R13+9*4(r11)
                    260:        lwz     r23,    KS_R13+10*4(r11)
                    261:        lwz     r24,    KS_R13+11*4(r11)
                    262:        lwz     r25,    KS_R13+12*4(r11)
                    263:        lwz     r26,    KS_R13+13*4(r11)
                    264:        lwz     r27,    KS_R13+14*4(r11)
                    265:        lwz     r28,    KS_R13+15*4(r11)
                    266:        lwz     r29,    KS_R13+16*4(r11)
                    267:        lwz     r30,    KS_R13+17*4(r11)
                    268:        lwz     r31,    KS_R13+18*4(r11)
                    269: 
                    270:        lwz     r2,     KS_R2(r11)
                    271:        lwz     r0,     KS_CR(r11)
                    272:        mtcrf   0xFF,   r0
                    273:        lwz     r0,     KS_LR(r11)
                    274:        mtlr    r0
                    275:        
                    276:        /* ARG0 still holds old thread pointer, we return this */
                    277:        
                    278:        blr             /* Jump into the new thread */
                    279: 

unix.superglobalmegacorp.com

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