Annotation of XNU/osfmk/ppc/POWERMAC/mp/MPPlugIn.h, 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_FREE_COPYRIGHT@
        !            24:  */
        !            25: /*
        !            26:  * @APPLE_FREE_COPYRIGHT@
        !            27:  */
        !            28: 
        !            29: /*
        !            30:        MPPlugIn.h
        !            31: 
        !            32:        Herein we find all the global MP plugin stuff
        !            33: 
        !            34:        Lovingly crafted by Bill Angell using traditional methods
        !            35: 
        !            36: */
        !            37: 
        !            38: 
        !            39: /*
        !            40:  *     External hook completion codes
        !            41:  *
        !            42:  *     The MP plugin's external interrupt hook returns one of these codes
        !            43:  */
        !            44: 
        !            45: #define kMPVainInterrupt 0                                                     /* Interruption in vain -- ignore it */
        !            46: #define kMPIOInterruptPending 1                                                /* This is an I/O interruption -- handle it */
        !            47: #define kMPSignalPending 2                                                     /* This is a pending signal -- handle it */
        !            48: 
        !            49: 
        !            50: /* ***********************************************************************
        !            51:  * Entry point jump table entry numbers
        !            52:  * *********************************************************************** */
        !            53: 
        !            54: #define kCountProcessors               0
        !            55: #define kStartProcessor                1                                       /* ->cpu address, ->start address, ->pass-thru parm */
        !            56: #define kResumeProcessor               2                                       /* ->cpu address */
        !            57: #define kStopProcessor                         3                                       /* ->cpu address */
        !            58: #define kResetProcessor                4                                       /* ->cpu address */
        !            59: #define kSignalProcessor               5                                       /* ->cpu address */
        !            60: #define kStoreProcessorStatus  6                                       /* ->cpu address, ->status area address */
        !            61: #define kSynchClock                    7                                       /* ->cpu address */
        !            62: #define kExternalHook                  8                                       /* no parms */
        !            63: #define kProcessorState                9                                       /* ->cpu address */
        !            64: #define kRunSIGPRun                    10                                      /* no parms */
        !            65: #define kPhoneyFirmware                        11                                      /* Dummy kernel for alternate processors */
        !            66:        
        !            67: #define kMPPlugInMaxCall               11                                      /* set MPPlugInMaxCall to the highest-numbered call */
        !            68: 
        !            69: 
        !            70: /* ***********************************************************************
        !            71:  *     MP Plug-In specification
        !            72:  *
        !            73:  *     The address of this area is passed to the MP plugin by the initialization code. If the
        !            74:  *     version ID and the installed hardware match the MP plugin, it returns its memory
        !            75:  *     requirements and a table of offsets to its entry points.
        !            76:  * *********************************************************************** */
        !            77: 
        !            78: #define kMPPlugInVersionID             1
        !            79: 
        !            80: #define kSIGPUninitializedState        0
        !            81: #define kSIGPResetState                        1
        !            82: #define kSIGPStoppedState              2
        !            83: #define kSIGPOperatingState            3
        !            84: #define kSIGPErrorState                        4
        !            85: 
        !            86: #define kSIGPnoErr                             0
        !            87: #define kSIGPInvalidStateErr   -3999
        !            88: #define kSIGPInterfaceBusyErr  -3998
        !            89: #define kSIGPPrivilegeErr              -3997
        !            90: #define kSIGPNoPlugInErr               -3996
        !            91: #define kTimeBaseSynchronizationErr            -3995
        !            92: #define kSIGPTargetAddrErr             -3994
        !            93: #define kSIGPInvalidStatusErr  -3993
        !            94: 
        !            95: #define kMPPlugInInstallFailed -4999
        !            96: #define kMPPlugInInternalError -4998
        !            97: 
        !            98: /* 
        !            99:  * ***********************************************************************
        !           100:  *     Signal processor request codes
        !           101:  * ***********************************************************************
        !           102:  */
        !           103: 
        !           104: #define SIGPast                                        0                                       /* Requests an ast on target processor */
        !           105: #define SIGPptlb                               1                                       /* Requests a total purge of the TLB */
        !           106: #define SIGPkdb                                        2                                       /* Requests a KDB entry */
        !           107: 
        !           108: /* 
        !           109:  * ***********************************************************************
        !           110:  *     Temporary debugging error codes (well, at least as temporary as the income tax)
        !           111:  * ***********************************************************************
        !           112:  */
        !           113: #define kMPPHairyPalms                 -10002
        !           114: #define kMPPOffline                            -10003
        !           115: #define kMPPBadState                   -10004
        !           116: #define kMPPInvalCPU                   -10005
        !           117: #define kMPPCantLock                   -10006
        !           118: #define kMPPNotReady                   -10007
        !           119: #define kMPPNotStopped                 -10008
        !           120: #define kMPPBadCPU                             -10009
        !           121: #define kMPPOnly1CPU                   -10010
        !           122: #define kMPPBadVers                            -10011
        !           123: #define kMPPNotRunning                 -10012
        !           124: #define kMPPTimeOut                            -10013
        !           125: #define kMPPInitTO1                            -10014
        !           126: #define kMPPInitTO2                            -10015
        !           127: #define kMPPInitTO3                            -10016
        !           128: 
        !           129: 
        !           130: /* 
        !           131:  * ***********************************************************************
        !           132:  *     Let's define some hardware stuff
        !           133:  * ***********************************************************************
        !           134:  */
        !           135:  
        !           136: #define Bandit1                        0xF2000000
        !           137: #define PCI1AdrReg             0xF2800000
        !           138: #define GrandCentral   0xF3000000
        !           139: #define EtherNetROM            0xF3019000
        !           140: #define HammerHead             0xF8000000
        !           141: #define ArbConfig              0x0090
        !           142: #define TwoCPU                 0x02
        !           143: #define WhoAmI                 0x00B0
        !           144: #define PriCPU                 0x10
        !           145: #define SecCPU                 0x08
        !           146: #define IntReg                 0x00C0
        !           147: #define SecInt                 0x80
        !           148: 
        !           149: 
        !           150: /* 
        !           151:  * ***********************************************************************
        !           152:  *     Let's define the flags for MPPInterface
        !           153:  * ***********************************************************************
        !           154:  */
        !           155: 
        !           156: #define SpinTimeOut            30000000
        !           157: 
        !           158: #define MPPICmsgp              0xc0000000                                      /* Message pending (busy + pass) */
        !           159: #define MPPICBusy              0x80000000                                      /* Processor area busy, i.e., locked */
        !           160: #define MPPICPass              0x40000000                                      /* Busy lock passed to receiving processor */
        !           161: #define MPPICOnline            0x20000000                                      /* Processor is online */
        !           162: #define MPPICReady             0x10000000                                      /* Processor is ready, i.e., started, not reset */
        !           163: #define MPPICStop              0x08000000                                      /* Processor is stopped */
        !           164: #define MPPICBset              0x000000FF                                      /* Processor that owns busy, i.e., the ID of */
        !           165:                                                                                                        /*   whomever set busy. When a busy is passed, */
        !           166:                                                                                                        /*   this is the requestor of the function. */
        !           167: #define MPPICfunc              0x0000FF00                                      /* Current function */
        !           168: #define MPPICfIdle             0x00                                            /* No function pending */
        !           169: #define MPPICfStrt             0x01                                            /* Start the processor, physical address in  */
        !           170:                                                                                                        /*   MPPIParm0 */
        !           171: #define MPPICfResm             0x02                                            /* Resume a stopped processor */
        !           172: #define MPPICfStop             0x03                                            /* Stop a processor */
        !           173: #define MPPICfSigp             0x04                                            /* Signal a processor */
        !           174: #define MPPICfStat             0x05                                            /* Store the processor machine state -  */
        !           175:                                                                                                        /*   physical address of response in MPPIParm0 */
        !           176: #define MPPICfTBsy             0x06                                            /* Synchronize timebase - */
        !           177:                                                                                                        /*   TB image in MPPIParm0 and MPPIParm1 */
        !           178: #define MPPICfReset            0x07                                            /* Reset the processor */
        !           179: #define MPPICfTBsy1            0x81                                            /* TB sync, phase 1 */
        !           180: #define MPPICfTBsy2            0x82                                            /* TB sync, phase 2 */
        !           181: #define MPPICSigp              0x80000000                                      /* Processor has signal pending (keep signal status when stopped) */
        !           182: #define MPPICXRun              0x40000000                                      /* Explicit SIGP run call */
        !           183: 
        !           184: 
        !           185:                        
        !           186: #ifndef __ASSEMBLER__
        !           187: 
        !           188: typedef unsigned char  CPUState;
        !           189: typedef unsigned int   CPUNotification;
        !           190: 
        !           191: struct MPPlugInSpec {                                                          /* This is MPSxxxx for assembler */
        !           192:                unsigned int            versionID;                              /* Version ID, must match */
        !           193:                unsigned int            *areaAddr;                              /* Virtual address of area to be */
        !           194:                                                                                                        /*  relocated to physical memory */
        !           195:                unsigned int            areaSize;                               /* Size of area to be relocated */
        !           196:                unsigned int            *offsetTableAddr;               /* Virtual address of table of entry offsets */
        !           197:                unsigned int            *baseAddr;                              /* Common base area - used for debugging */
        !           198:                unsigned int            *dataArea;                              /* Pointer to the MP workarea - used for debugging */
        !           199:                unsigned int            *CPUArea;                               /* Pointer to the CPU workarea - used for debugging */
        !           200:                unsigned int            *SIGPhandler;                   /* Physical address of signal interrupt filter */
        !           201: };
        !           202: 
        !           203: typedef struct MPPlugInSpec MPPlugInSpec;
        !           204: typedef MPPlugInSpec *MPPlugInSpecPtr;
        !           205: 
        !           206: struct MPEntryPts {    
        !           207:                unsigned int            EntAddr[kMPPlugInMaxCall+1];    /* Real addresses of all plugin entry points */
        !           208: };
        !           209: 
        !           210: typedef struct MPEntryPts MPEntryPts;
        !           211: 
        !           212: struct SystemRegister {
        !           213:                unsigned int            regno;
        !           214:                unsigned int            contents;
        !           215: };
        !           216: 
        !           217: typedef struct SystemRegister SystemRegister;
        !           218: 
        !           219: typedef struct FPRegs {
        !           220:                unsigned int            lo;
        !           221:                unsigned int            hi;
        !           222: } FPRegs;
        !           223: 
        !           224: struct BATregs {
        !           225:                unsigned int            upper;
        !           226:                unsigned int            lower;
        !           227: };
        !           228: 
        !           229: typedef struct BATregs BATregs;
        !           230: 
        !           231: 
        !           232: #define kSysRegCount 16
        !           233:                
        !           234: struct CPUStatusArea {                                                         /*  0000 This is CSAxxxxx for assembler */
        !           235: 
        !           236: /*
        !           237:  *             Note that this guy always has to be in one-to-one mapped area contiguously
        !           238:  */
        !           239:  
        !           240:                CPUState                        state;                                  /*  0000 */
        !           241:                unsigned char           regsAreValid;                   /*  0001 */
        !           242:                unsigned char           filler[2];                              /*  0002 */
        !           243:                unsigned int            gpr[32];                                /*  0004 */
        !           244:                FPRegs                          fpr[32];                                /*  0084 */
        !           245:                unsigned int            cr;                                             /*  0184 */
        !           246:                unsigned int            fpscr;                                  /*  0188 */
        !           247:                unsigned int            xer;                                    /*  018C */
        !           248:                unsigned int            lr;                                             /*  0190 */
        !           249:                unsigned int            ctr;                                    /*  0194 */
        !           250:                unsigned int            tbu;                                    /*  0198 This is rtcu on 601. */
        !           251:                unsigned int            tbl;                                    /*  019C This is rtcl on 601. */
        !           252:                unsigned int            pvr;                                    /*  01A0 */
        !           253:                BATregs                         ibat[4];                                /*  01A4 */
        !           254:                BATregs                         dbat[4];                                /*  01E4 */
        !           255:                unsigned int            sdr1;                                   /*  0224 */
        !           256:                unsigned int            sr[16];                                 /*  0228 */
        !           257:                unsigned int            dar;                                    /*  0268 */
        !           258:                unsigned int            dsisr;                                  /*  026C */
        !           259:                unsigned int            sprg[4];                                /*  0270 */
        !           260:                unsigned int            srr0;                                   /*  0280 */
        !           261:                unsigned int            srr1;                                   /*  0284 */
        !           262:                unsigned int            dec;                                    /*  0288 */
        !           263:                unsigned int            dabr;                                   /*  028C */
        !           264:                unsigned int            iabr;                                   /*  0290 */
        !           265:                unsigned int            ear;                                    /*  0294 */
        !           266:                unsigned int            hid[16];                                /*  0298 */
        !           267:                unsigned int            mmcr[2];                                /*  02D8 */
        !           268:                unsigned int            pmc[4];                                 /*  02E0 */
        !           269:                unsigned int            pir;                                    /*  02F0 */
        !           270:                unsigned int            sda;                                    /*  02F4 */
        !           271:                unsigned int            sia;                                    /*  02F8 */
        !           272:                unsigned int            mq;                                             /*  02FC */
        !           273:                
        !           274:                unsigned int            msr;                                    /*  0300 */
        !           275:                unsigned int            pc;                                             /*  0304 */
        !           276:                
        !           277:                SystemRegister          sysregs[kSysRegCount];  /*  0308 */
        !           278:                
        !           279:                unsigned int            filler2[6];                             /*  0388  Always pad up to 32-byte boundary */
        !           280:                                                                                                        /*  03A0 */
        !           281: };
        !           282: 
        !           283: typedef struct CPUStatusArea CPUStatusArea;
        !           284: typedef CPUStatusArea *CPUStatusAreaPtr;
        !           285: 
        !           286: extern CPUStatusArea CSA[NCPUS];
        !           287: 
        !           288: struct SenseInfo {
        !           289:        CPUNotification         notification;
        !           290:        CPUState                        state;
        !           291: };
        !           292: 
        !           293: typedef struct SenseInfo SenseInfo;
        !           294: typedef SenseInfo *SenseInfoPtr;
        !           295: 
        !           296: 
        !           297: struct MPPInterface {
        !           298: 
        !           299:        unsigned int                    MPPICStat;                                              /* Processor status (interlocked update for this one) */
        !           300:        unsigned int                    MPPICParm0;                     /* SIGP parm 0 */
        !           301:        unsigned int                    MPPICParm1;                     /* SIGP parm 1 */
        !           302:        unsigned int                    MPPICParm2;                     /* SIGP parm 2 */
        !           303:        unsigned int                    MPPICspare0;            /* unused */
        !           304:        unsigned int                    MPPICspare1;            /* unused */
        !           305:        unsigned int                    MPPICParm0BU;           /* Parm 0 backed up here at 'rupt time for safe keeping */
        !           306:        unsigned int                    MPPICPriv;                      /* Processor status (interlocked update for this one) */
        !           307: };
        !           308: 
        !           309: typedef struct MPPInterface MPPInterface;
        !           310: typedef MPPInterface *MPPInterfacePtr;
        !           311: 
        !           312: extern MPPInterface MPPICPUs[];
        !           313: 
        !           314: 
        !           315: /* ***********************************************************************
        !           316:  *     Function prototypes and data areas
        !           317:  * *********************************************************************** */
        !           318: 
        !           319: extern unsigned int    MPgetProcCount  (void);
        !           320: extern unsigned int    MPstart                 (unsigned int cpu, unsigned int sadr, unsigned int parm);
        !           321: extern unsigned int    MPexternalHook  (void);
        !           322: extern unsigned int    MPsignal                (unsigned int cpu, unsigned int SIGPparm);
        !           323: extern unsigned int    MPstop                  (unsigned int cpu);
        !           324: #if 0
        !           325: extern unsigned int    MPCPUAddress    (void);
        !           326: extern unsigned int    MPresume                (unsigned int cpu);
        !           327: extern unsigned int    MPreset                 (unsigned int cpu);
        !           328: extern unsigned int    MPSense                 (unsigned int cpu, unsigned int *info);
        !           329: extern unsigned int    MPstoreStatus   (unsigned int cpu, unsigned int *statusArea);
        !           330: extern unsigned int    MPSetStatus             (unsigned int cpu, unsigned int *statusArea);
        !           331: extern unsigned int    MPgetSignal             (void);
        !           332: extern unsigned int    MPsyncTB                (void);
        !           333: extern unsigned int    MPcheckPending  (void);
        !           334: #endif
        !           335: extern int MPinstall           (unsigned int physAddr, unsigned int band1, unsigned int hammerh, unsigned int grandc,
        !           336:                                                                unsigned int pci1ar, unsigned int enetr);
        !           337: extern unsigned int MPprobe    (MPPlugInSpecPtr spec, unsigned int hammerh);
        !           338: 
        !           339: extern void start_secondary    (void);
        !           340: extern void mp_intr    (void);
        !           341: 
        !           342: 
        !           343: extern MPPlugInSpec    MPspec;                                                 /* An area for the MP interfaces */
        !           344: extern MPEntryPts      MPEntries;                                              /* Real addresses of plugin routines */
        !           345: 
        !           346: #endif /* ndef __ASSEMBLER */

unix.superglobalmegacorp.com

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