topical media & game development

talk show tell print

lib-of-vs-libs-QTDevWin-CIncludes-MachineExceptions.h / h



  /*
       File:       MachineExceptions.h
   
       Contains:   Processor Exception Handling Interfaces.
   
       Version:    Technology: Mac OS 8
                   Release:    QuickTime 6.0.2
   
       Copyright:  (c) 1993-2001 by Apple Computer, Inc., all rights reserved.
   
       Bugs?:      For bug reports, consult the following page on
                   the World Wide Web:
   
                       http://developer.apple.com/bugreporter/
   
  */
  ifndef __MACHINEEXCEPTIONS__
  define __MACHINEEXCEPTIONS__
  
  ifndef __MACTYPES__
  include <MacTypes.h>
  endif
  
  ifndef __MIXEDMODE__
  include <MixedMode.h>
  endif
  
  if PRAGMA_ONCE
  #pragma once
  endif
  
  ifdef __cplusplus
  extern "C" {
  endif
  
  if PRAGMA_IMPORT
  #pragma import on
  endif
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=power
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(push, 2)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack(2)
  endif
  
  /* Some basic declarations used throughout the kernel */
  typedef struct OpaqueAreaID*            AreaID;
  if TARGET_OS_MAC
  /* Machine Dependent types for PowerPC: */
  
  struct MachineInformationPowerPC {
      UnsignedWide                    CTR;
      UnsignedWide                    LR;
      UnsignedWide                    PC;
      unsigned long                   CR;
      unsigned long                   XER;
      unsigned long                   MSR;
      unsigned long                   MQ;
      unsigned long                   ExceptKind;
      unsigned long                   DSISR;
      UnsignedWide                    DAR;
      UnsignedWide                    Reserved;
  };
  typedef struct MachineInformationPowerPC MachineInformationPowerPC;
  
  struct RegisterInformationPowerPC {
      UnsignedWide                    R0;
      UnsignedWide                    R1;
      UnsignedWide                    R2;
      UnsignedWide                    R3;
      UnsignedWide                    R4;
      UnsignedWide                    R5;
      UnsignedWide                    R6;
      UnsignedWide                    R7;
      UnsignedWide                    R8;
      UnsignedWide                    R9;
      UnsignedWide                    R10;
      UnsignedWide                    R11;
      UnsignedWide                    R12;
      UnsignedWide                    R13;
      UnsignedWide                    R14;
      UnsignedWide                    R15;
      UnsignedWide                    R16;
      UnsignedWide                    R17;
      UnsignedWide                    R18;
      UnsignedWide                    R19;
      UnsignedWide                    R20;
      UnsignedWide                    R21;
      UnsignedWide                    R22;
      UnsignedWide                    R23;
      UnsignedWide                    R24;
      UnsignedWide                    R25;
      UnsignedWide                    R26;
      UnsignedWide                    R27;
      UnsignedWide                    R28;
      UnsignedWide                    R29;
      UnsignedWide                    R30;
      UnsignedWide                    R31;
  };
  typedef struct RegisterInformationPowerPC RegisterInformationPowerPC;
  
  struct FPUInformationPowerPC {
      UnsignedWide                    Registers[32];
      unsigned long                   FPSCR;
      unsigned long                   Reserved;
  };
  typedef struct FPUInformationPowerPC    FPUInformationPowerPC;
  
  union Vector128 {
  ifdef __VEC__
   vector unsigned long            v;
  endif
      unsigned long                   l[4];
      unsigned short                  s[8];
      unsigned char                   c[16];
  };
  typedef union Vector128                 Vector128;
  
  struct VectorInformationPowerPC {
      Vector128                       Registers[32];
      Vector128                       VSCR;
      UInt32                          VRsave;
  };
  typedef struct VectorInformationPowerPC VectorInformationPowerPC;
  /* Exception related declarations */
  enum {
      kWriteReference             = 0,
      kReadReference              = 1,
      kFetchReference             = 2,
      writeReference              = kWriteReference,              /* Obsolete name*/
      readReference               = kReadReference,               /* Obsolete name*/
      fetchReference              = kFetchReference               /* Obsolete name*/
  };
  
  typedef unsigned long                   MemoryReferenceKind;
  
  struct MemoryExceptionInformation {
      AreaID                          theArea;
      LogicalAddress                  theAddress;
      OSStatus                        theError;
      MemoryReferenceKind             theReference;
  };
  typedef struct MemoryExceptionInformation MemoryExceptionInformation;
  enum {
      kUnknownException           = 0,
      kIllegalInstructionException = 1,
      kTrapException              = 2,
      kAccessException            = 3,
      kUnmappedMemoryException    = 4,
      kExcludedMemoryException    = 5,
      kReadOnlyMemoryException    = 6,
      kUnresolvablePageFaultException = 7,
      kPrivilegeViolationException = 8,
      kTraceException             = 9,
      kInstructionBreakpointException = 10,
      kDataBreakpointException    = 11,
      kIntegerException           = 12,
      kFloatingPointException     = 13,
      kStackOverflowException     = 14,
      kTaskTerminationException   = 15,
      kTaskCreationException      = 16,
      kDataAlignmentException     = 17
  };
  
  if OLDROUTINENAMES
  enum {
      unknownException            = kUnknownException,            /* Obsolete name*/
      illegalInstructionException = kIllegalInstructionException, /* Obsolete name*/
      trapException               = kTrapException,               /* Obsolete name*/
      accessException             = kAccessException,             /* Obsolete name*/
      unmappedMemoryException     = kUnmappedMemoryException,     /* Obsolete name*/
      excludedMemoryException     = kExcludedMemoryException,     /* Obsolete name*/
      readOnlyMemoryException     = kReadOnlyMemoryException,     /* Obsolete name*/
      unresolvablePageFaultException = kUnresolvablePageFaultException, /* Obsolete name*/
      privilegeViolationException = kPrivilegeViolationException, /* Obsolete name*/
      traceException              = kTraceException,              /* Obsolete name*/
      instructionBreakpointException = kInstructionBreakpointException, /* Obsolete name*/
      dataBreakpointException     = kDataBreakpointException,     /* Obsolete name*/
      integerException            = kIntegerException,            /* Obsolete name*/
      floatingPointException      = kFloatingPointException,      /* Obsolete name*/
      stackOverflowException      = kStackOverflowException,      /* Obsolete name*/
      terminationException        = kTaskTerminationException,    /* Obsolete name*/
      kTerminationException       = kTaskTerminationException     /* Obsolete name*/
  };
  
  endif  /* OLDROUTINENAMES */
  
  typedef unsigned long                   ExceptionKind;
  
  union ExceptionInfo {
      MemoryExceptionInformation *    memoryInfo;
  };
  typedef union ExceptionInfo             ExceptionInfo;
  
  struct ExceptionInformationPowerPC {
      ExceptionKind                   theKind;
      MachineInformationPowerPC *     machineState;
      RegisterInformationPowerPC *    registerImage;
      FPUInformationPowerPC *         FPUImage;
      ExceptionInfo                   info;
      VectorInformationPowerPC *      vectorImage;
  };
  typedef struct ExceptionInformationPowerPC ExceptionInformationPowerPC;
  if TARGET_CPU_PPC || TARGET_CPU_68K
  
  typedef ExceptionInformationPowerPC     ExceptionInformation;
  typedef MachineInformationPowerPC       MachineInformation;
  typedef RegisterInformationPowerPC      RegisterInformation;
  typedef FPUInformationPowerPC           FPUInformation;
  typedef VectorInformationPowerPC        VectorInformation;
  endif  /* TARGET_CPU_PPC || TARGET_CPU_68K */
  
  /* 
      Note:   An ExceptionHandler is NOT a UniversalProcPtr, except in Carbon.
              It must be a PowerPC function pointer with NO routine descriptor, 
              except on Carbon, where it must be a UniversalProcPtr (TPP actually)
              to allow the interface to work from both CFM and Mach-O.
  */
  typedef CALLBACK_API_C( OSStatus , ExceptionHandlerProcPtr )(ExceptionInformation *theException);
  typedef TVECTOR_UPP_TYPE(ExceptionHandlerProcPtr)               ExceptionHandlerUPP;
  if OPAQUE_UPP_TYPES
      EXTERN_API(ExceptionHandlerUPP)
      NewExceptionHandlerUPP         (ExceptionHandlerProcPtr userRoutine);
  
      EXTERN_API(void)
      DisposeExceptionHandlerUPP     (ExceptionHandlerUPP     userUPP);
  
      EXTERN_API(OSStatus)
      InvokeExceptionHandlerUPP      (ExceptionInformation *  theException,
                                      ExceptionHandlerUPP     userUPP);
  
  else
      #define NewExceptionHandlerUPP(userRoutine)                     (userRoutine)
      #define DisposeExceptionHandlerUPP(userUPP)                     
      #define InvokeExceptionHandlerUPP(theException, userUPP)        (*userUPP)(theException)
  endif
  /*
     ExceptionHandler function pointers (TPP):
     on classic PowerPC, use raw function pointers
     on classic PowerPC with OPAQUE_UPP_TYPES=1, use UPP's
     on Carbon, use UPP's
  */
  if TARGET_OS_MAC && !OPAQUE_UPP_TYPES
  /* use raw function pointers*/
  typedef ExceptionHandlerProcPtr         ExceptionHandlerTPP;
  else
  /* use UPP's*/
  typedef ExceptionHandlerUPP             ExceptionHandlerTPP;
  endif  /* TARGET_OS_MAC && !OPAQUE_UPP_TYPES */
  
  typedef ExceptionHandlerTPP             ExceptionHandler;
  /* Routine for installing per-process exception handlers */
  EXTERN_API( ExceptionHandlerTPP ) InstallExceptionHandler(ExceptionHandlerTPP theHandler);
  
  endif  /* TARGET_OS_MAC */
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=reset
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(pop)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack()
  endif
  
  ifdef PRAGMA_IMPORT_OFF
  #pragma import off
  #elif PRAGMA_IMPORT
  #pragma import reset
  endif
  
  ifdef __cplusplus
  }
  endif
  
  endif /* __MACHINEEXCEPTIONS__ */
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.