/*++ INTEL CORPORATION PROPRIETARY INFORMATION This software is supplied under the terms of a license agreement or nondisclosure agreement with Intel Corporation and may not be copied or disclosed except in accordance with the terms of that agreement. Copyright (c) 1992-1999 Intel Corporation. Module Name: ssc.h Abstract: This module is used by the NT device drivers for doing Gambit Simulation System Calls (SSC). It defines the SSC calls and the related data structures. Author: Ayelet Edrey (aedrey) 1-Jun-1995 Environment: IA-64 NT running on Gambit Revision History: --*/ #ifndef _SSC_H #define _SSC_H #if _MSC_VER > 1000 #pragma once #endif #ifdef WINNT # ifdef CDECL # undef CDECL # endif #define CDECL __cdecl #else #define CDECL #endif #define MAX_SSC_STRING 512 /* NOTE : all pointers are 64 bit addresses to physical memory */ /* Structures and Enums */ typedef unsigned int SSC_HANDLE; typedef int SSC_BOOL; typedef void *LARGE_POINTER; typedef unsigned short GB_U16; typedef unsigned long GB_U32; typedef unsigned int U32; typedef LONGLONG LARGE_RET_VAL; /* Disk */ #define SSC_ACCESS_READ 0x1 /* for OpenVolume */ #define SSC_ACCESS_WRITE 0x2 /* for OpenVolume */ #define SSC_MAX_VOLUMES 128 #define SSC_MAX_VOLUME_NAME 512 #define SSC_IO_BLOCK_SIZE 512 #define SSC_INVALID_HANDLE SSC_MAX_VOLUMES /* Disk Request */ typedef struct _SSC_DISK_REQUEST { LARGE_POINTER DiskBufferAddress; GB_U32 DiskByteCount; GB_U32 PaddingWord; } *PSSC_DISK_REQUEST, SSC_DISK_REQUEST; /* Disk Completion */ typedef struct _SSC_DISK_COMPLETION { SSC_HANDLE VolumeHandle; GB_U32 XferBytes; } *PSSC_DISK_COMPLETION, SSC_DISK_COMPLETION; /* interrupt */ typedef enum { SSC_INTERRUPT_NONE=0, SSC_DISK_INTERRUPT, SSC_MOUSE_INTERRUPT, SSC_KEYBOARD_INTERRUPT, SSC_CLOCK_TIMER_INTERRUPT, SSC_PROFILE_TIMER_INTERRUPT, SSC_APC_INTERRUPT, SSC_DPC_INTERRUPT, SSC_SERIAL_INTERRUPT, SSC_PERFMON_INTERRUPT, SSC_INTERRUPT_LAST } SSC_INTERRUPT; /* timer */ typedef struct _SSC_TIME_FIELDS { GB_U32 Year; GB_U32 Month; GB_U32 Day; GB_U32 Hour; GB_U32 Minute; GB_U32 Second; GB_U32 Milliseconds; GB_U32 WeekDay; } SSC_TIME_FIELDS, *PSSC_TIME_FIELDS; /* TAL VM */ typedef struct _SSC_TAL_VM_INFO { LARGE_INTEGER PageSize; LARGE_INTEGER NumberOfDataTr; LARGE_INTEGER NumberOfInstructionTr; LARGE_INTEGER NumberOfDataTc; LARGE_INTEGER NumberOfInstructionTc; LARGE_INTEGER UnifiedTlb; LARGE_INTEGER ProtectionKeySize; LARGE_INTEGER RegionIdSize; LARGE_INTEGER HardwareMissHandler; LARGE_INTEGER NumberOfProtectionId; LARGE_INTEGER VirtualAddressSize; LARGE_INTEGER PhysicalAddressSize; } SSC_TAL_VM_INFO,*PSSC_TAL_VM_INFO; /* TAL CACHE SUMMARY */ typedef struct _SSC_TAL_CACHE_SUMMARY { LARGE_INTEGER CacheLevel; LARGE_INTEGER UniqueCache; LARGE_INTEGER Snoop; } SSC_TAL_CACHE_SUMMARY,*PSSC_TAL_CACHE_SUMMARY; /* TAL CACHE INFO */ typedef struct _SSC_TAL_CACHE { LARGE_INTEGER LineSize; LARGE_INTEGER Stride; LARGE_INTEGER AliasBoundary; LARGE_INTEGER Hint; LARGE_INTEGER MemoryAttribute; LARGE_INTEGER CacheSize; LARGE_INTEGER LoadPenalty; LARGE_INTEGER StorePenalty; LARGE_INTEGER Associativity; LARGE_INTEGER Unified; } SSC_TAL_CACHE; typedef struct _SSC_TAL_CACHE_INFO { SSC_TAL_CACHE DataLevel0; SSC_TAL_CACHE DataLevel1; SSC_TAL_CACHE DataLevel2; SSC_TAL_CACHE InstLevel0; SSC_TAL_CACHE InstLevel1; SSC_TAL_CACHE InstLevel2; } SSC_TAL_CACHE_INFO, *PSSC_CACHE_INFO; typedef LARGE_INTEGER SSC_TAL_MEM_ATTRIB; typedef LARGE_POINTER SSC_TAL_FIXED_ADDR; /* TAL PROC ID */ typedef struct _SSC_TAL_PROC_ID { LARGE_INTEGER ArchitectureRevision; LARGE_INTEGER ProcessorModel; LARGE_INTEGER ProcessorRevision; LARGE_INTEGER Gr; char Vendor[32]; char Name[32]; } SSC_TAL_PROC_ID, *PSSC_TAL_PROC_ID; /* TAL DEBUG */ typedef struct _SSC_TAL_DEBUG_INFO { LARGE_INTEGER IRegister; LARGE_INTEGER DRegister; } SSC_TAL_DEBUG_INFO, *PSSC_TAL_DEBUG_INFO; /* Config TAL */ typedef struct _SSC_TAL { SSC_TAL_VM_INFO VmInfo; SSC_TAL_CACHE_SUMMARY CacheSummary; SSC_TAL_CACHE_INFO CacheInfo; SSC_TAL_MEM_ATTRIB MemoryAttrib; SSC_TAL_FIXED_ADDR FixedAddress; SSC_TAL_PROC_ID ProcessorId; SSC_TAL_DEBUG_INFO DebugInfo; } SSC_TAL, *PSSC_TAL; /* Config Mem */ typedef enum { SSC_MEM_TYPE_RAM = 0, SSC_MEM_TYPE_ROM, SSC_MEM_TYPE_IO } SSC_MEM_TYPE, *PSSC_MEM_TYPE; typedef struct _SSC_MEM { LARGE_POINTER StartAddress; LARGE_INTEGER Size; SSC_MEM_TYPE Type; char InitValue; char PaddingByte1; char PaddingByte2; char PaddingByte3; } SSC_MEM, *PSSC_MEM; /* VGA size */ typedef enum { SSC_SCREEN_SIZE_NONE = 0, SSC_SCREEN_SIZE_800x600, SSC_SCREEN_SIZE_640x480, SSC_SCREEN_SIZE_25x80, /* text mode */ SSC_SCREEN_SIZE_LAST } SSC_SCREEN_SIZE; /* Keyboard */ #define SSC_KBD_GET_SUCCESS 1 #define SSC_KBD_GET_NODATA 0 #define SSC_KBD_EXTENDED_KEY_VAL 0xE000 #define SSC_KBD_UP_KEY_VAL 0x80 typedef struct _SSC_KBD_LOCK { U32 KbdNumLock:1 , /* Num lock is ON */ KbdCapsLock:1, /* Caps lock is ON */ KbdScrollLock:1, /* Scroll lock is ON */ KbdFillers:29; } SSC_KBD_LOCK; /* Mouse */ typedef U32 SSC_MOUSEBUTTONS; /* SscMouseGetKeyEvent returns this structure. the prototype of the function returns int instead, for compilation reasons. */ typedef struct _SSC_MOUSEDATA { U32 MouseXLocation : 12, MouseYLocation : 12, MouseButtonLeft : 1, MouseButtonRight : 1, MouseButtonMiddle : 1, MouseValid :1, MouseFillers : 4; } SSC_MOUSEDATA; /* Kernel debug */ #define SSC_KD_SUCCESS 0 #define SSC_KD_ERROR -1 typedef struct _SSC_DEBUG_PARAMETERS { U32 CommunicationPort; U32 BaudRate; } SSC_DEBUG_PARAMETERS, *PSSC_DEBUG_PARAMETERS; #define MAX_SSC_MEM 50 #define MAX_SSC_PARAMS 10 /* Network */ #define SSC_SERIAL_SUCCESS 1 #define SSC_SERIAL_FAILED 0 #define SSC_SERIAL_GET_SUCCESS 1 /* data was returned, there may be more data */ #define SSC_SERIAL_GET_NODATA 0 #define SSC_SERIAL_MAX_FIFO_SIZE 512 typedef struct _SSC_INTERRUPT_INFO { SSC_HANDLE SerialHandle; GB_U32 CommEvent; GB_U32 ModemControl; GB_U32 ErrorFlags; U32 NumberOfChars; } *PSSC_INTERRUPT_INFO, SSC_INTERRUPT_INFO; /* CommEvent decodings */ #define SSC_EV_RXCHAR 0x0001 /* A character was received and placed in the input buffer */ #define SSC_EV_RXFLAG 0x0002 /* The event character was received and placed in the input buffer */ #define SSC_EV_TXEMPTY 0x0004 /* The last character in the output buffer was sent */ #define SSC_EV_CTS 0x0008 /* The CTS (clear-to-send) signal changed state */ #define SSC_EV_DSR 0x0010 /* The DSR (data-set-ready) signal changed */ #define SSC_EV_RLSD 0x0020 /* (receive-line-signal-detect) signal changed */ #define SSC_EV_BREAK 0x0040 /* A break was detected on input */ #define SSC_EV_ERR 0x0080 /* A line-status error occurred */ #define SSC_EV_RING 0x0100 /* A ring indicator was detected */ /* Modem control is one of the following */ #define SSC_MS_CTS_ON 0x0010 /* The CTS (clear-to-send) signal is on. */ #define SSC_MS_DSR_ON 0x0020 /* The DSR (data-set-ready) signal is on.*/ #define SSC_MS_RING_ON 0x0040 /* The ring indicator signal is on. */ #define SSC_MS_RLSD_ON 0x0080 /* The RLSD (receive-line-signal-detect) signal is on. */ /* Error Codes */ #define SSC_CE_RXOVER 0x0001 /* An input buffer overflow has occurred. There is either no room in the input buffer, or a character was received after the end-of-file (EOF) character. */ #define SSC_CE_OVERRUN 0x0002 /* A character-buffer overrun has occurred. The next character is lost. */ #define SSC_CE_RXPARITY 0x0004 /* The hardware detected a parity error */ #define SSC_CE_FRAME 0x0008 /* The hardware detected a framing error. */ #define SSC_CE_BREAK 0x0010 /* The hardware detected a break condition. */ #define SSC_CE_TXFULL 0x0100 /* The application tried to transmit a character, but the output buffer was full. */ #define SSC_CE_IOE 0x0400 /* An I/O error occurred during communications with the device. */ #define SSC_CE_MODE 0x8000 /* The requested mode is not supported, or the hFile parameter is invalid. If this value is specified, it is the only valid error. */ /* Config */ typedef struct _SSC_CONFIG { SSC_TAL Tal; SSC_MEM Memory[MAX_SSC_MEM]; LARGE_INTEGER Params[MAX_SSC_PARAMS]; } SSC_CONFIG, *PSSC_CONFIG; typedef struct _SSC_IMAGE_INFO { LARGE_POINTER LoadBase; /* base address for image load */ GB_U32 ImageSize; GB_U32 ImageType; LARGE_INTEGER ProcessID; GB_U32 LoadCount; } SSC_IMAGE_INFO, *PSSC_IMAGE_INFO; /* define types in Unix like style */ typedef SSC_CONFIG Ssc_config_t; typedef SSC_TAL_DEBUG_INFO Ssc_tal_debug_info_t; typedef SSC_TAL Ssc_tal_t; typedef SSC_MEM Ssc_mem_t; typedef SSC_MEM_TYPE Ssc_mem_type_t; typedef SSC_TAL_PROC_ID Ssc_tal_proc_id_t; typedef SSC_TAL_MEM_ATTRIB Ssc_tal_mem_attrib_t; typedef SSC_TAL_FIXED_ADDR Ssc_tal_fixed_addr_t; typedef SSC_TAL_CACHE Ssc_tal_cache_t; typedef SSC_TAL_CACHE_SUMMARY Ssc_tal_cache_summary_t; typedef SSC_TAL_CACHE_INFO Ssc_tal_cache_info_t; typedef SSC_TAL_VM_INFO Ssc_tal_vm_info_t; typedef SSC_TIME_FIELDS Ssc_time_fields_t; typedef SSC_DISK_COMPLETION Ssc_disk_completion_t; typedef SSC_DISK_REQUEST Ssc_disk_request_t; typedef SSC_INTERRUPT Ssc_interrupt_t; typedef SSC_SCREEN_SIZE Ssc_screen_size_t; typedef SSC_KBD_LOCK Ssc_kbd_lock_t; typedef SSC_MOUSEBUTTONS Ssc_mousebuttons_t; typedef SSC_MOUSEDATA Ssc_mousedata_t; typedef SSC_DEBUG_PARAMETERS Ssc_debug_parameters_t; typedef SSC_INTERRUPT_INFO Ssc_interrupt_info_t; typedef SSC_IMAGE_INFO Ssc_image_info_t; /* performance SSC return values */ #define SSC_SUCCESS 0 #define SSC_VIRTUAL_ADDRESS_NOT_FOUND 1 #define SSC_ILLEGAL_NAME 2 #define SSC_ILLEGAL_HANDLE 3 #define SSC_PERMISSION_DENIED 4 #define SSC_VIRTUAL_ADDRESS_NOT_LOCKED 5 #define GE_SSC_ERR_FIRST 6 #define GE_SSC_ERR_BUFF_TOO_SHORT 6 /* supplied buffer is too short for value */ #define GE_SSC_ERR_INVALID_HNDL 7 /* invalid object handl supplied */ #define GE_SSC_ERR_INVALID_TOOL 8 /* GE internal error */ #define GE_SSC_ERR_INVALID_GE_STAGE 9 /* GE internal error */ #define GE_SSC_ERR_NO_INIT 10 /* GE internal error */ #define GE_SSC_ERR_NOT_OWNER 11 /* object can not be set */ #define GE_SSC_ERR_NOT_ITEM 12 /* operation can be done only on an item object (not a family of objects) */ #define GE_SSC_ERR_OBJ_CLOSED 13 /* object is not available for use due to configuration */ #define GE_SSC_ERR_OBJ_NOT_OPENED 14 /* object is not available for use */ #define GE_SSC_ERR_OBJ_NOT_AVAILABLE 15 /* object not required for use in this session */ #define GE_SSC_ERR_OBJ_NOT_ACTIVE 16 /* object should be active befor used for this operation */ #define GE_SSC_ERR_OBJ_UNDER_TREATMENT 17 /* object is in use at the moment */ #define GE_SSC_ERR_WRONG_CLASS 18 /* specified class is invalid for this operation */ #define GE_SSC_ERR_WRONG_SIZE 19 /* specified wrong size */ #define GE_SSC_ERR_NO_OWNER 20 /* object is not available for use */ #define GE_SSC_ERR_OWNER_FAILURE 21 /* owner failed to handle the operation */ #define GE_SSC_ERR_UNKNOWN 22 /* unrecognized error number detected */ #define GE_SSC_ERR_LAST 22 /* SSC Functions */ /* Disk */ SSC_HANDLE CDECL SscDiskOpenVolume( LARGE_POINTER VolumeName, GB_U32 AccessMode ); SSC_BOOL CDECL SscDiskCloseVolume( SSC_HANDLE VolumeHandle ); int CDECL SscDiskReadVolume( SSC_HANDLE VolumeHandle, GB_U32 NReq, LARGE_POINTER RequestPtr, LARGE_INTEGER VolumeOffset ); int CDECL SscDiskWriteVolume( SSC_HANDLE VolumeHandle, GB_U32 NReq, LARGE_POINTER RequestPtr, LARGE_INTEGER VolumeOffset ); SSC_BOOL CDECL SscDiskGetCompletion( LARGE_POINTER DiskCompletionPtr ); SSC_BOOL CDECL SscDiskWaitIoCompletion( LARGE_POINTER DiskCompletionPtr ); /* the file SSC_HANDLE in low word, error code in high word */ LARGE_RET_VAL CDECL SscOpenHostFile (LARGE_POINTER HostPathNameAddress ); /* the file SSC_HANDLE in low word, error code in high word. Does not create a new file if a host file does not exist. */ LARGE_RET_VAL CDECL SscOpenHostFileNoCreate (LARGE_POINTER HostPathNameAddress ); U32 CDECL SscWriteHostFile( SSC_HANDLE SscFileHandle, LARGE_POINTER TransferBufferAddress, LARGE_POINTER TransferBufferSizeAddress ); U32 CDECL SscReadHostFile( SSC_HANDLE SscFileHandle, LARGE_POINTER TransferBufferAddress, LARGE_POINTER TransferBufferSizeAddress ); void CDECL SscCloseHostFile(SSC_HANDLE HostFileHandle ); /* Kernel debug */ U32 CDECL SscKdInitialize( LARGE_POINTER DebugParameters, SSC_BOOL Initialize ); U32 CDECL SscKdPortGetByte( LARGE_POINTER InputPtr ); void CDECL SscKdPortPutByte( unsigned char Output ); /* Video */ void CDECL SscDisplayString( LARGE_POINTER CharacterString ); U32 CDECL SscVideoSetPalette ( U32 iStart, U32 cEntries, LARGE_POINTER lppe ); /* Keyboard */ int CDECL SscKbdSynchronizeState( SSC_KBD_LOCK KbdLock ); GB_U32 CDECL SscKbdGetKeyCode( LARGE_POINTER KeyCodeAddress ); /* Mouse */ SSC_MOUSEBUTTONS CDECL SscMouseGetButtons(); int CDECL SscMouseGetKeyEvent(); /* Network */ SSC_HANDLE CDECL SscSerialOpen( GB_U32 SerialPortID ); GB_U32 CDECL SscSerialGetInterruptInfo( LARGE_POINTER SerialInterruptInfoPtr, LARGE_POINTER SerialMessegePtr ); GB_U32 CDECL SscSerialWriteChar( SSC_HANDLE SerialHandle, LARGE_POINTER SerialCharPtr, GB_U32 NumChars ); GB_U32 CDECL SscSerialClose( SSC_HANDLE SerialHandle ); /* Debug */ void CDECL SscDbgPrintf( LARGE_POINTER CharacterString ); /* Interrupt */ void CDECL SscConnectInterrupt( SSC_INTERRUPT InterruptSource, GB_U32 Vector ); void CDECL SscGenerateInterrupt( SSC_INTERRUPT InterruptSource ); void CDECL SscSetPeriodicInterruptInterval( GB_U32 InterruptSource, GB_U32 IntervalInNanoSeconds ); /* TAL */ void CDECL SscTalInitTC(); void CDECL SscTalHalt(); void CDECL SscGetConfig( LARGE_POINTER ConfigInfoPtr ); /* Video */ void CDECL SscVideoSetMode( SSC_SCREEN_SIZE ScreenSize ); /* Performance */ void CDECL SscCreateProcess( U32 ProcessID, U32 EProcess ); void CDECL SscCreateProcess64( LARGE_INTEGER ProcessID, LARGE_POINTER EProcess ); void CDECL SscCreateThread( U32 ProcessID, U32 ThreadID, U32 EThread ); void CDECL SscCreateThread64( LARGE_INTEGER ProcessID, LARGE_INTEGER ThreadID, LARGE_POINTER EThread ); void CDECL SscSwitchProcess64( LARGE_INTEGER NewProcessID, LARGE_POINTER NewEProcess ); void CDECL SscSwitchThread( U32 NewThreadID, U32 NewEThread ); void CDECL SscSwitchThread64( LARGE_INTEGER NewThreadID, LARGE_POINTER NewEThread ); void CDECL SscDeleteProcess( U32 ProcessID ); void CDECL SscDeleteProcess64( LARGE_INTEGER ProcessID ); void CDECL SscDeleteThread( U32 ThreadID ); void CDECL SscDeleteThread64( LARGE_INTEGER ThreadID ); /* image loading/unloading functions */ void SscLoadImage(LARGE_POINTER FullPathName, U32 LoadBase, U32 ImageSize, U32 ImageType, U32 ProcessID, U32 LoadCount); void SscUnloadImage(U32 LoadBase, U32 ProcessID, U32 LoadCount); GB_U32 CDECL SscLoadImage64( LARGE_POINTER FullPathNamePhysicalAddress, LARGE_POINTER ImageInfoPhysicalAddress ); GB_U32 CDECL SscUnloadImage64( LARGE_POINTER FullPathNamePhysicalAddress, LARGE_POINTER ImageInfoPhysicalAddress ); /* Performance Counter handoff call */ GB_U32 CDECL SscPerfCounterAddress( LARGE_POINTER CounterNamePhysicalAddress, LARGE_POINTER CounterPhysicalAddress ); /* Trace Generation Control */ GB_U32 CDECL SscPerfForm( U32 SwitchMode, LARGE_POINTER FormNamePhysicalAddress ); /* Generating and dispatching a send event. i.e. an application can put something in the trace pipe */ LARGE_RET_VAL CDECL SscPerfEventHandle( LARGE_POINTER EventNamePhysicalAddress ); LARGE_RET_VAL CDECL SscPerfHandleApp( LARGE_POINTER EventNameAddress ); GB_U32 CDECL SscPerfFormActivate( LARGE_POINTER FormName ); GB_U32 CDECL SscPerfFormDeActivate( LARGE_POINTER FormName ); GB_U32 CDECL SscPerfSendEvent( U32 Handle ); /* Simulated code access to data items in the Gambit Environment */ LARGE_RET_VAL CDECL SscPerfCounterHandle( LARGE_POINTER DataItemNamePhysicalAddress ); GB_U32 CDECL SscPerfSetCounter32( U32 Handle, U32 Value ); GB_U32 CDECL SscPerfGetNotifier32( U32 Handle ); GB_U32 CDECL SscPerfSetNotifier32( U32 Handle, U32 Value ); GB_U32 CDECL SscPerfSetCounter64( U32 Handle, LARGE_INTEGER Value ); GB_U32 CDECL SscPerfSetCounterStr( U32 Handle, LARGE_POINTER StringValuePhysicalAddress ); LARGE_RET_VAL CDECL SscPerfGetCounter32( U32 Handle ); LARGE_RET_VAL CDECL SscPerfGetCounter64( U32 Handle ); /* Misc. */ void CDECL SscTraceUserInfo( GB_U32 Mark ); void CDECL SscMakeBeep( GB_U32 Frequency ); void CDECL SscQueryRealTimeClock( LARGE_POINTER TimeFieldsPtr ); void CDECL SscExit( int ExitCode ); /* KDI */ #ifdef SSC_KDI /* GENERAL KDI INTERFACE to CALL any function in kernel */ typedef struct kdi_jmptable { int KdiMagic; /* Some known magic value */ int KdiVersion; /* Some version value */ LARGE_INTEGER *KdiActive; /* for internal OS use */ LARGE_INTEGER *KeiEnabled; /* kdi can be used now */ LARGE_POINTER *KdiBuffer; /* pointer to buffer area of */ /* size 4096 bytes */ LARGE_POINTER (*KdiCallFunc)(); /* function to call func */ LARGE_POINTER *KdiReserved[3]; /* reserved area */ /* FUNCTIONS EXPORTED VIA KDI */ LARGE_POINTER (*KdiMemoryRead)(); /* function for mem read */ LARGE_POINTER (*KdiMemoryWrite)(); /* function for mem write */ LARGE_POINTER (*KdiCopy)(); /* function for mem read/write */ LARGE_POINTER (*KdiBootInfo)(); /* function to provide call back info */ LARGE_POINTER (*KdiVirtualToPhysical)(); /* virtual -> physical */ LARGE_POINTER (*KdiPhysicalToVirtual)(); /* physical -> virtual */ LARGE_POINTER (*KdiMapUser)(); /* function to map user */ LARGE_POINTER (*KdiUnmapUser)(); /* function to unmap user */ LARGE_POINTER (*KdiFiller[25])(); /* fillers */ } kdi_jmptable_t; /* trap to the debugger with value to indicate an internal reason the value is passed to gb_t.opt.info.kdi */ int CDECL SscTrap( int Value ); typedef enum { SSC_KDI_STATUS_OK = 0, /* KDI or KDI call is OK */ SSC_KDI_STATUS_DISABLED, /* KDI not available right now */ SSC_KDI_STATUS_BUSY, /* KDI already in use */ SSC_KDI_STATUS_FAILED /* KDI call failed */ } SSC_kdi_status_t; /* return from a previous call of gambit to the kernel k_callf function return the return value of the function in ret_val and a status in status */ int CDECL SscReturn( int ReturnValue, Ssc_kdi_status_t Status ); #endif SSC_KDI /* Statistics */ /* Instruction Counter Functions */ U32 CDECL SscIcountGet( void ); /* Instruction Mix Collection */ typedef enum { SSC_COLLECT_START, SSC_COLLECT_STOP } SSC_imix_index_t; void CDECL SscInstrMixCollect( SSC_imix_index_t Index ); typedef enum { Enable=0, Disable=1 } Ssc_event_enable_t; /* CPROF requests */ typedef enum { SSC_CPROF_NONE = 0, SSC_CPROF_ON, SSC_CPROF_OFF, SSC_CPROF_RESET, SSC_CPROF_CLEAR, SSC_CPROF_PRINT } SSC_cprof_request; /* GEMSTONE requests */ typedef enum { SSC_GEMSTONE_NONE = 0, SSC_GEMSTONE_START, SSC_GEMSTONE_ON, SSC_GEMSTONE_OFF } SSC_gemstone_request; /* MP specific */ /* Set OS_RENDEZ address */ void CDECL SscSetOSRendez( LARGE_POINTER OsRendezEntryPoint ); /* MP interrupt association */ void CDECL SscConnectInterruptEx( SSC_INTERRUPT InterruptSource, GB_U32 Vector, GB_U16 LocalID ); /* Get number of CPUs in the MP system */ GB_U32 CDECL SscGetNumberOfCPUs( void ); /* Get LIDs of CPUs in the MP system */ void CDECL SscGetLIDs( LARGE_POINTER LIDs0, LARGE_POINTER LIDs1, LARGE_POINTER LIDs2, LARGE_POINTER LIDs3 ); void CDECL SscPlatformAssociateInterrupt( LARGE_POINTER VirtualAddr, GB_U32 Device, GB_U32 Vector); void CDECL SscPlatformMemSync( LARGE_POINTER PhysicalAddress, /* Physical address of the block */ GB_U32 Size, /* size of the block */ GB_U32 Operation); /* 0 = Read, 1 = Write */ void CDECL SscDevMemSync( LARGE_POINTER PhysicalPageAddress /* Physical address of the page written by device */ ); #endif /* _SSC_H */