Annotation of kernel/machdep/ppc/diag.c, revision 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: /*
        !            26:        File:           diag.c
        !            27: 
        !            28:        Contains:       Kernel diagnostics
        !            29: 
        !            30:        Copyright:      1997 by Apple Computer, Inc., all rights reserved
        !            31: 
        !            32:        File Ownership:
        !            33: 
        !            34:                DRI:               Thomas Mason
        !            35: 
        !            36:                Other Contact:     Brett Halle
        !            37: 
        !            38:                Technology:        Kernel/IO
        !            39: 
        !            40:        Writers:
        !            41: 
        !            42:                (tjm)   Thomas Mason
        !            43: 
        !            44:        Change History (most recent first):
        !            45: */
        !            46: 
        !            47: #include <machdep/ppc/exception.h>
        !            48: #include <kern/thread.h>
        !            49: #include <machdep/ppc/PseudoKernel.h>
        !            50: #include <kern/ipc_tt.h>
        !            51: #include <ipc/ipc_port.h>
        !            52: 
        !            53: #define printf kprintf
        !            54: 
        !            55: #if    DEBUG
        !            56: 
        !            57: /*
        !            58: **     Profiling Counters
        !            59: */
        !            60: unsigned long shandler_cnt = 0;
        !            61: unsigned long thandler_cnt = 0;
        !            62: unsigned long ihandler_cnt = 0;
        !            63: unsigned long gdbhandler_cnt = 0;
        !            64: unsigned long fpu_switch_cnt = 0;
        !            65: 
        !            66: #define        TST_BCOPY_SIZE  (256)
        !            67: #define        TST_MOVE_SIZE   (TST_BCOPY_SIZE/2)
        !            68: unsigned long sb[TST_BCOPY_SIZE];              /* source buffer */
        !            69: unsigned long db[TST_BCOPY_SIZE];              /* destination buffer */
        !            70: 
        !            71: 
        !            72: /*
        !            73: **
        !            74: **     test_bcopy()
        !            75: **
        !            76: **     Test the various configurations of bcopy for correctness
        !            77: **     this does the table first, then cache aligned, the byte < 7
        !            78: **
        !            79: */
        !            80: test_bcopy()
        !            81: {
        !            82:     int        i, j, k, l;
        !            83:     char        *src, *dst, *cmpsrc, *cmpdst;
        !            84:     boolean_t  succeeded;
        !            85: 
        !            86: 
        !            87:     cmpsrc = (char *)sb;
        !            88:     /* Initialize the source buffer */
        !            89:     for (i = 0; i < TST_BCOPY_SIZE; i++)
        !            90:     {
        !            91:         *cmpsrc++ = (char)i;
        !            92:     }
        !            93: 
        !            94:     /* test the variants */
        !            95: 
        !            96:     /* setup initial src and dst ptrs */
        !            97:     dst = (char *)db;
        !            98:     for (i = 0; i < 4; i++)
        !            99:     {
        !           100:        src = (char *)sb;
        !           101:        for (j = 0; j < 4; j++)
        !           102:        {
        !           103:             for (k = TST_MOVE_SIZE; k < TST_MOVE_SIZE+4; k++)
        !           104:             {
        !           105:                cmpdst = (char *)db;
        !           106:                /* jumble the destination buffer */
        !           107:                for (l = 0; l < TST_BCOPY_SIZE; l++)
        !           108:                {
        !           109:                    *cmpdst++ = 0xA5;
        !           110:                }
        !           111: 
        !           112:                cmpsrc = src;
        !           113:                cmpdst = dst;
        !           114:                bcopy(src, dst, k);
        !           115:                succeeded = TRUE;
        !           116:                for (l = 0; l < k; l++)
        !           117:                {
        !           118:                    if (*cmpsrc++ != *cmpdst++)
        !           119:                    {
        !           120:                        succeeded = FALSE;
        !           121:                    }
        !           122:                }
        !           123:                printf("mm%ds%dc%d (src=0x%x,dst=0x%x,llen=%d) ",((int)dst&3),((int)src&3),(k&3),src, dst, k);
        !           124:                switch (succeeded) {
        !           125:                case FALSE:
        !           126:                    printf("FAILED!\n");
        !           127:                    break;
        !           128:                case TRUE:
        !           129:                    printf("SUCCEEDED!\n");
        !           130:                    break;
        !           131:                }
        !           132:            }
        !           133:            src++;
        !           134:        }
        !           135:        dst++;
        !           136:     }
        !           137:     /* update to original ptrs */
        !           138:     src = (char *)sb;
        !           139:     dst = (char *)db;
        !           140: 
        !           141:     /* do cache aligned */
        !           142:     cmpsrc = src;
        !           143:     cmpdst = dst;
        !           144:     bcopy(src, dst, TST_MOVE_SIZE);
        !           145:     succeeded = TRUE;
        !           146:     for (l = 0; l < TST_MOVE_SIZE; l++)
        !           147:     {
        !           148:        if (*cmpsrc++ != *cmpdst++)
        !           149:        {
        !           150:            succeeded = FALSE;
        !           151:        }
        !           152:     }
        !           153:     printf("cache aligned bcopy (src=0x%x,dst=0x%x,len=%d) ",src,dst,TST_MOVE_SIZE);
        !           154:     switch (succeeded) {
        !           155:     case FALSE:
        !           156:        printf("FAILED!\n");
        !           157:        break;
        !           158:     case TRUE:
        !           159:        printf("SUCCEEDED!\n");
        !           160:        break;
        !           161:     }
        !           162: 
        !           163:     /* do byte only */
        !           164:     cmpsrc = src;
        !           165:     cmpdst = dst;
        !           166:     bcopy(src, dst, 7);
        !           167:     succeeded = TRUE;
        !           168:     for (l = 0; l < 7; l++)
        !           169:     {
        !           170:        if (*cmpsrc++ != *cmpdst++)
        !           171:        {
        !           172:            succeeded = FALSE;
        !           173:        }
        !           174:     }
        !           175:     printf("byte only bcopy(src=0x%x,dst=0x%x,len=%d) ",src,dst,7);
        !           176:     switch (succeeded) {
        !           177:     case FALSE:
        !           178:        printf("FAILED!\n");
        !           179:        break;
        !           180:     case TRUE:
        !           181:        printf("SUCCEEDED!\n");
        !           182:        break;
        !           183:     }
        !           184: 
        !           185:     /* do copy in place */
        !           186:     cmpsrc = src;
        !           187:     cmpdst = dst+4;
        !           188:     bcopy(dst, dst+4, 7);
        !           189:     succeeded = TRUE;
        !           190:     for (l = 0; l < 7; l++)
        !           191:     {
        !           192:        if (*cmpsrc++ != *cmpdst++)
        !           193:        {
        !           194:            succeeded = FALSE;
        !           195:        }
        !           196:     }
        !           197:     printf("copy in place bcopy(src=0x%x,dst=0x%x,len=%d) ",dst,dst+4,7);
        !           198:     switch (succeeded) {
        !           199:     case FALSE:
        !           200:        printf("FAILED!\n");
        !           201:        break;
        !           202:     case TRUE:
        !           203:        printf("SUCCEEDED!\n");
        !           204:        break;
        !           205:     }
        !           206: }
        !           207: 
        !           208: 
        !           209: struct bcopy_callers {
        !           210:        int     caller;
        !           211:        int     count;
        !           212: };
        !           213: 
        !           214: typedef struct bcopy_callers bcopy_callers_t, *bcopy_callers_tPtr;
        !           215: 
        !           216: bcopy_callers_t        bcc[1024];
        !           217: boolean_t bcc_inited = FALSE;
        !           218: 
        !           219: 
        !           220: void bcopy_diag (
        !           221:     int        caller
        !           222:     )
        !           223: {
        !           224:     int i;
        !           225: 
        !           226: 
        !           227:     if (bcc_inited == FALSE)
        !           228:     {
        !           229:        for (i = 0; i < 1024; i++)
        !           230:        {
        !           231:            bcc[i].caller = 0;
        !           232:            bcc[i].count = 0;
        !           233:            bcc_inited = TRUE;
        !           234:        }
        !           235:     }
        !           236:     for (i = 0; i < 1024; i++)
        !           237:     {
        !           238:        if ( bcc[i].caller == caller )
        !           239:        {
        !           240:            bcc[i].count++;
        !           241:            return;
        !           242:        }
        !           243:        else if ((bcc[i].caller == 0) && (i < 1024))
        !           244:        {
        !           245:            bcc[i].caller = caller;
        !           246:            bcc[i].count = 1;
        !           247:            return;
        !           248:        }
        !           249:     }
        !           250: }
        !           251: 
        !           252: #endif /* DEBUG */
        !           253: 

unix.superglobalmegacorp.com

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