/*++ Copyright (c) 1990 Microsoft Corporation Module Name: genmips.c Abstract: This module implements a program which generates MIPS machine dependent structure offset definitions for kernel structures that are accessed in assembly code. Author: David N. Cutler (davec) 27-Mar-1990 Revision History: --*/ #include "ki.h" #pragma hdrstop #define HEADER_FILE #include "excpt.h" #include "ntdef.h" #include "ntkeapi.h" #include "ntmips.h" #include "ntimage.h" #include "ntseapi.h" #include "ntobapi.h" #include "ntlpcapi.h" #include "ntioapi.h" #include "ntmmapi.h" #include "ntldr.h" #include "ntpsapi.h" #include "ntexapi.h" #include "ntnls.h" #include "nturtl.h" #include "ntcsrmsg.h" #include "ntcsrsrv.h" #include "ntxcapi.h" #include "arc.h" #include "ntstatus.h" #include "kxmips.h" #include "stdarg.h" #include "setjmp.h" // Define architecture specific generation macros. #define genAlt(Name, Type, Member) \ dumpf("#define " #Name " 0x%lx\n", OFFSET(Type, Member)) #define genCom(Comment) \ dumpf("\n"); \ dumpf("//\n"); \ dumpf("// " Comment "\n"); \ dumpf("//\n"); \ dumpf("\n") #define genDef(Prefix, Type, Member) \ dumpf("#define " #Prefix #Member " 0x%lx\n", OFFSET(Type, Member)) #define genVal(Name, Value) \ dumpf("#define " #Name " 0x%lx\n", Value) #define genSpc() dumpf("\n"); // Define member offset computation macro. #define OFFSET(type, field) ((LONG)(&((type *)0)->field)) FILE *KsMips; FILE *HalMips; // EnableInc(a) - Enables output to goto specified include file #define EnableInc(a) OutputEnabled |= a; // DisableInc(a) - Disables output to goto specified include file #define DisableInc(a) OutputEnabled &= ~a; ULONG OutputEnabled; #define KSMIPS 0x01 #define HALMIPS 0x02 #define KERNEL KSMIPS #define HAL HALMIPS VOID dumpf (const char *format, ...); // This routine returns the bit number right to left of a field. LONG t ( IN ULONG z ) { LONG i; for (i = 0; i < 32; i += 1) { if ((z >> i) & 1) { break; } } return i; } // This program generates the MIPS machine dependent assembler offset // definitions. VOID main (argc, argv) int argc; char *argv[]; { char *outName; LONG EventOffset; // Create file for output. if (argc == 2) { outName = argv[ 1 ]; } else { outName = "\\nt\\public\\sdk\\inc\\ksmips.h"; } outName = argc >= 2 ? argv[1] : "\\nt\\public\\sdk\\inc\\ksmips.h"; KsMips = fopen( outName, "w" ); if (KsMips == NULL) { fprintf( stderr, "GENMIPS: Cannot open %s for writing.\n", outName); } else { fprintf(stderr, "GENMIPS: Writing %s header file.\n", outName); } outName = argc >= 3 ? argv[2] : "\\nt\\private\\ntos\\inc\\halmips.h"; HalMips = fopen( outName, "w" ); if (HalMips == NULL) { fprintf( stderr, "GENMIPS: Cannot open %s for writing.\n", outName); } else { fprintf(stderr, "GENMIPS: Writing %s header file.\n", outName); } // Include statement for MIPS architecture static definitions. EnableInc (KSMIPS | HALMIPS); dumpf("#include \"kxmips.h\"\n"); DisableInc (HALMIPS); // Include architecture independent definitions. #include "..\genxx.inc" // Generate architecture dependent definitions. // Processor block structure definitions. EnableInc(HALMIPS); genCom("Processor Block Structure Offset Definitions"); genVal(PRCB_MINOR_VERSION, PRCB_MINOR_VERSION); genVal(PRCB_MAJOR_VERSION, PRCB_MAJOR_VERSION); genSpc(); genDef(Pb, KPRCB, MinorVersion); genDef(Pb, KPRCB, MajorVersion); genDef(Pb, KPRCB, CurrentThread); genDef(Pb, KPRCB, NextThread); genDef(Pb, KPRCB, IdleThread); genDef(Pb, KPRCB, Number); genDef(Pb, KPRCB, SetMember); genDef(Pb, KPRCB, RestartBlock); genDef(Pb, KPRCB, SystemReserved); genDef(Pb, KPRCB, HalReserved); DisableInc(HALMIPS); genDef(Pb, KPRCB, DpcTime); genDef(Pb, KPRCB, InterruptTime); genDef(Pb, KPRCB, KernelTime); genDef(Pb, KPRCB, UserTime); genDef(Pb, KPRCB, AdjustDpcThreshold); genDef(Pb, KPRCB, InterruptCount); genDef(Pb, KPRCB, ApcBypassCount); genDef(Pb, KPRCB, DpcBypassCount); genDef(Pb, KPRCB, IpiFrozen); genDef(Pb, KPRCB, ProcessorState); genAlt(PbAlignmentFixupCount, KPRCB, KeAlignmentFixupCount); genAlt(PbContextSwitches, KPRCB, KeContextSwitches); genAlt(PbDcacheFlushCount, KPRCB, KeDcacheFlushCount); genAlt(PbExceptionDispatchCount, KPRCB, KeExceptionDispatchCount); genAlt(PbFirstLevelTbFills, KPRCB, KeFirstLevelTbFills); genAlt(PbFloatingEmulationCount, KPRCB, KeFloatingEmulationCount); genAlt(PbIcacheFlushCount, KPRCB, KeIcacheFlushCount); genAlt(PbSecondLevelTbFills, KPRCB, KeSecondLevelTbFills); genAlt(PbSystemCalls, KPRCB, KeSystemCalls); genDef(Pb, KPRCB, CurrentPacket); genDef(Pb, KPRCB, TargetSet); genDef(Pb, KPRCB, WorkerRoutine); genDef(Pb, KPRCB, RequestSummary); genDef(Pb, KPRCB, SignalDone); genDef(Pb, KPRCB, DpcInterruptRequested); genDef(Pb, KPRCB, MaximumDpcQueueDepth); genDef(Pb, KPRCB, MinimumDpcRate); genDef(Pb, KPRCB, IpiCounts); genDef(Pb, KPRCB, StartCount); genDef(Pb, KPRCB, DpcLock); genDef(Pb, KPRCB, DpcListHead); genDef(Pb, KPRCB, DpcQueueDepth); genDef(Pb, KPRCB, DpcCount); genDef(Pb, KPRCB, DpcLastCount); genDef(Pb, KPRCB, DpcRequestRate); genDef(Pb, KPRCB, DpcRoutineActive); genVal(ProcessorBlockLength, ((sizeof(KPRCB) + 15) & ~15)); // Processor control register structure definitions. #if defined(_MIPS_) EnableInc(HALMIPS); genCom("Processor Control Registers Structure Offset Definitions"); genVal(PCR_MINOR_VERSION, PCR_MINOR_VERSION); genVal(PCR_MAJOR_VERSION, PCR_MAJOR_VERSION); genSpc(); genDef(Pc, KPCR, MinorVersion); genDef(Pc, KPCR, MajorVersion); genDef(Pc, KPCR, InterruptRoutine); genDef(Pc, KPCR, XcodeDispatch); genDef(Pc, KPCR, FirstLevelDcacheSize); genDef(Pc, KPCR, FirstLevelDcacheFillSize); genDef(Pc, KPCR, FirstLevelIcacheSize); genDef(Pc, KPCR, FirstLevelIcacheFillSize); genDef(Pc, KPCR, SecondLevelDcacheSize); genDef(Pc, KPCR, SecondLevelDcacheFillSize); genDef(Pc, KPCR, SecondLevelIcacheSize); genDef(Pc, KPCR, SecondLevelIcacheFillSize); genDef(Pc, KPCR, Prcb); genDef(Pc, KPCR, Teb); genDef(Pc, KPCR, TlsArray); genDef(Pc, KPCR, DcacheFillSize); genDef(Pc, KPCR, IcacheAlignment); genDef(Pc, KPCR, IcacheFillSize); genDef(Pc, KPCR, ProcessorId); genDef(Pc, KPCR, ProfileInterval); genDef(Pc, KPCR, ProfileCount); genDef(Pc, KPCR, StallExecutionCount); genDef(Pc, KPCR, StallScaleFactor); genDef(Pc, KPCR, Number); genDef(Pc, KPCR, DataBusError); genDef(Pc, KPCR, InstructionBusError); genDef(Pc, KPCR, CachePolicy); genDef(Pc, KPCR, IrqlMask); genDef(Pc, KPCR, IrqlTable); genDef(Pc, KPCR, CurrentIrql); genDef(Pc, KPCR, SetMember); genDef(Pc, KPCR, CurrentThread); genDef(Pc, KPCR, AlignedCachePolicy); genDef(Pc, KPCR, NotMember); genDef(Pc, KPCR, SystemReserved); genDef(Pc, KPCR, DcacheAlignment); genDef(Pc, KPCR, HalReserved); DisableInc(HALMIPS); genDef(Pc, KPCR, FirstLevelActive); genDef(Pc, KPCR, DpcRoutineActive); genDef(Pc, KPCR, CurrentPid); genDef(Pc, KPCR, OnInterruptStack); genDef(Pc, KPCR, SavedInitialStack); genDef(Pc, KPCR, SavedStackLimit); genDef(Pc, KPCR, SystemServiceDispatchStart); genDef(Pc, KPCR, SystemServiceDispatchEnd); genDef(Pc, KPCR, InterruptStack); genDef(Pc, KPCR, PanicStack); genDef(Pc, KPCR, InitialStack); genDef(Pc, KPCR, StackLimit); genDef(Pc, KPCR, SavedEpc); genDef(Pc, KPCR, SavedT7); genDef(Pc, KPCR, SavedT8); genDef(Pc, KPCR, SavedT9); genDef(Pc, KPCR, SystemGp); genDef(Pc, KPCR, QuantumEnd); genDef(Pc, KPCR, BadVaddr); genDef(Pc, KPCR, TmpVaddr); genVal(ProcessorControlRegisterLength, ((sizeof(KPCR) + 15) & ~15)); genSpc(); genDef(Pc2, KUSER_SHARED_DATA, TickCountLow); genDef(Pc2, KUSER_SHARED_DATA, TickCountMultiplier); genDef(Pc2, KUSER_SHARED_DATA, InterruptTime); genDef(Pc2, KUSER_SHARED_DATA, SystemTime); #endif // TB entry structure offset definitions. #if defined(_MIPS_) genCom("TB Entry Structure Offset Definitions"); genDef(Tb, TB_ENTRY, Entrylo0); genDef(Tb, TB_ENTRY, Entrylo1); genDef(Tb, TB_ENTRY, Entryhi); genDef(Tb, TB_ENTRY, Pagemask); #endif // Interprocessor command definitions. genCom("Immediate Interprocessor Command Definitions"); genVal(IPI_APC, IPI_APC); genVal(IPI_DPC, IPI_DPC); genVal(IPI_FREEZE, IPI_FREEZE); genVal(IPI_PACKET_READY, IPI_PACKET_READY); // Interprocessor interrupt count structure offset definitions. genCom("Interprocessor Interrupt Count Structure Offset Definitions"); genDef(Ic, KIPI_COUNTS, Freeze); genDef(Ic, KIPI_COUNTS, Packet); genDef(Ic, KIPI_COUNTS, DPC); genDef(Ic, KIPI_COUNTS, APC); genDef(Ic, KIPI_COUNTS, FlushSingleTb); genDef(Ic, KIPI_COUNTS, FlushMultipleTb); genDef(Ic, KIPI_COUNTS, FlushEntireTb); genDef(Ic, KIPI_COUNTS, GenericCall); genDef(Ic, KIPI_COUNTS, ChangeColor); genDef(Ic, KIPI_COUNTS, SweepDcache); genDef(Ic, KIPI_COUNTS, SweepIcache); genDef(Ic, KIPI_COUNTS, SweepIcacheRange); genDef(Ic, KIPI_COUNTS, FlushIoBuffers); genDef(Ic, KIPI_COUNTS, GratuitousDPC); // Context frame offset definitions and flag definitions. EnableInc (HALMIPS); genCom("Context Frame Offset and Flag Definitions"); genVal(CONTEXT_FULL, CONTEXT_FULL); genVal(CONTEXT_CONTROL, CONTEXT_CONTROL); genVal(CONTEXT_FLOATING_POINT, CONTEXT_FLOATING_POINT); genVal(CONTEXT_INTEGER, CONTEXT_INTEGER); genVal(CONTEXT_EXTENDED_FLOAT, CONTEXT_EXTENDED_FLOAT); genVal(CONTEXT_EXTENDED_INTEGER, CONTEXT_EXTENDED_INTEGER); genCom("32-bit Context Frame Offset Definitions"); genDef(Cx, CONTEXT, FltF0); genDef(Cx, CONTEXT, FltF1); genDef(Cx, CONTEXT, FltF2); genDef(Cx, CONTEXT, FltF3); genDef(Cx, CONTEXT, FltF4); genDef(Cx, CONTEXT, FltF5); genDef(Cx, CONTEXT, FltF6); genDef(Cx, CONTEXT, FltF7); genDef(Cx, CONTEXT, FltF8); genDef(Cx, CONTEXT, FltF9); genDef(Cx, CONTEXT, FltF10); genDef(Cx, CONTEXT, FltF11); genDef(Cx, CONTEXT, FltF12); genDef(Cx, CONTEXT, FltF13); genDef(Cx, CONTEXT, FltF14); genDef(Cx, CONTEXT, FltF15); genDef(Cx, CONTEXT, FltF16); genDef(Cx, CONTEXT, FltF17); genDef(Cx, CONTEXT, FltF18); genDef(Cx, CONTEXT, FltF19); genDef(Cx, CONTEXT, FltF20); genDef(Cx, CONTEXT, FltF21); genDef(Cx, CONTEXT, FltF22); genDef(Cx, CONTEXT, FltF23); genDef(Cx, CONTEXT, FltF24); genDef(Cx, CONTEXT, FltF25); genDef(Cx, CONTEXT, FltF26); genDef(Cx, CONTEXT, FltF27); genDef(Cx, CONTEXT, FltF28); genDef(Cx, CONTEXT, FltF29); genDef(Cx, CONTEXT, FltF30); genDef(Cx, CONTEXT, FltF31); genDef(Cx, CONTEXT, IntZero); genDef(Cx, CONTEXT, IntAt); genDef(Cx, CONTEXT, IntV0); genDef(Cx, CONTEXT, IntV1); genDef(Cx, CONTEXT, IntA0); genDef(Cx, CONTEXT, IntA1); genDef(Cx, CONTEXT, IntA2); genDef(Cx, CONTEXT, IntA3); genDef(Cx, CONTEXT, IntT0); genDef(Cx, CONTEXT, IntT1); genDef(Cx, CONTEXT, IntT2); genDef(Cx, CONTEXT, IntT3); genDef(Cx, CONTEXT, IntT4); genDef(Cx, CONTEXT, IntT5); genDef(Cx, CONTEXT, IntT6); genDef(Cx, CONTEXT, IntT7); genDef(Cx, CONTEXT, IntS0); genDef(Cx, CONTEXT, IntS1); genDef(Cx, CONTEXT, IntS2); genDef(Cx, CONTEXT, IntS3); genDef(Cx, CONTEXT, IntS4); genDef(Cx, CONTEXT, IntS5); genDef(Cx, CONTEXT, IntS6); genDef(Cx, CONTEXT, IntS7); genDef(Cx, CONTEXT, IntT8); genDef(Cx, CONTEXT, IntT9); genDef(Cx, CONTEXT, IntK0); genDef(Cx, CONTEXT, IntK1); genDef(Cx, CONTEXT, IntGp); genDef(Cx, CONTEXT, IntSp); genDef(Cx, CONTEXT, IntS8); genDef(Cx, CONTEXT, IntRa); genDef(Cx, CONTEXT, IntLo); genDef(Cx, CONTEXT, IntHi); genDef(Cx, CONTEXT, Fsr); genDef(Cx, CONTEXT, Fir); genDef(Cx, CONTEXT, Psr); genDef(Cx, CONTEXT, ContextFlags); genCom("64-bit Context Frame Offset Definitions"); genDef(Cx, CONTEXT, XFltF0); genDef(Cx, CONTEXT, XFltF1); genDef(Cx, CONTEXT, XFltF2); genDef(Cx, CONTEXT, XFltF3); genDef(Cx, CONTEXT, XFltF4); genDef(Cx, CONTEXT, XFltF5); genDef(Cx, CONTEXT, XFltF6); genDef(Cx, CONTEXT, XFltF7); genDef(Cx, CONTEXT, XFltF8); genDef(Cx, CONTEXT, XFltF9); genDef(Cx, CONTEXT, XFltF10); genDef(Cx, CONTEXT, XFltF11); genDef(Cx, CONTEXT, XFltF12); genDef(Cx, CONTEXT, XFltF13); genDef(Cx, CONTEXT, XFltF14); genDef(Cx, CONTEXT, XFltF15); genDef(Cx, CONTEXT, XFltF16); genDef(Cx, CONTEXT, XFltF17); genDef(Cx, CONTEXT, XFltF18); genDef(Cx, CONTEXT, XFltF19); genDef(Cx, CONTEXT, XFltF20); genDef(Cx, CONTEXT, XFltF21); genDef(Cx, CONTEXT, XFltF22); genDef(Cx, CONTEXT, XFltF23); genDef(Cx, CONTEXT, XFltF24); genDef(Cx, CONTEXT, XFltF25); genDef(Cx, CONTEXT, XFltF26); genDef(Cx, CONTEXT, XFltF27); genDef(Cx, CONTEXT, XFltF28); genDef(Cx, CONTEXT, XFltF29); genDef(Cx, CONTEXT, XFltF30); genDef(Cx, CONTEXT, XFltF31); genDef(Cx, CONTEXT, XFsr); genDef(Cx, CONTEXT, XFir); genDef(Cx, CONTEXT, XPsr); genDef(Cx, CONTEXT, XContextFlags); genDef(Cx, CONTEXT, XIntZero); genDef(Cx, CONTEXT, XIntAt); genDef(Cx, CONTEXT, XIntV0); genDef(Cx, CONTEXT, XIntV1); genDef(Cx, CONTEXT, XIntA0); genDef(Cx, CONTEXT, XIntA1); genDef(Cx, CONTEXT, XIntA2); genDef(Cx, CONTEXT, XIntA3); genDef(Cx, CONTEXT, XIntT0); genDef(Cx, CONTEXT, XIntT1); genDef(Cx, CONTEXT, XIntT2); genDef(Cx, CONTEXT, XIntT3); genDef(Cx, CONTEXT, XIntT4); genDef(Cx, CONTEXT, XIntT5); genDef(Cx, CONTEXT, XIntT6); genDef(Cx, CONTEXT, XIntT7); genDef(Cx, CONTEXT, XIntS0); genDef(Cx, CONTEXT, XIntS1); genDef(Cx, CONTEXT, XIntS2); genDef(Cx, CONTEXT, XIntS3); genDef(Cx, CONTEXT, XIntS4); genDef(Cx, CONTEXT, XIntS5); genDef(Cx, CONTEXT, XIntS6); genDef(Cx, CONTEXT, XIntS7); genDef(Cx, CONTEXT, XIntT8); genDef(Cx, CONTEXT, XIntT9); genDef(Cx, CONTEXT, XIntK0); genDef(Cx, CONTEXT, XIntK1); genDef(Cx, CONTEXT, XIntGp); genDef(Cx, CONTEXT, XIntSp); genDef(Cx, CONTEXT, XIntS8); genDef(Cx, CONTEXT, XIntRa); genDef(Cx, CONTEXT, XIntLo); genDef(Cx, CONTEXT, XIntHi); genVal(ContextFrameLength, sizeof(CONTEXT)); // Exception frame offset definitions. genCom("Exception Frame Offset Definitions and Length"); genAlt(ExArgs, KEXCEPTION_FRAME, Argument); genCom("32-bit Nonvolatile Floating State"); genDef(Ex, KEXCEPTION_FRAME, FltF20); genDef(Ex, KEXCEPTION_FRAME, FltF21); genDef(Ex, KEXCEPTION_FRAME, FltF22); genDef(Ex, KEXCEPTION_FRAME, FltF23); genDef(Ex, KEXCEPTION_FRAME, FltF24); genDef(Ex, KEXCEPTION_FRAME, FltF25); genDef(Ex, KEXCEPTION_FRAME, FltF26); genDef(Ex, KEXCEPTION_FRAME, FltF27); genDef(Ex, KEXCEPTION_FRAME, FltF28); genDef(Ex, KEXCEPTION_FRAME, FltF29); genDef(Ex, KEXCEPTION_FRAME, FltF30); genDef(Ex, KEXCEPTION_FRAME, FltF31); genCom("64-bit Nonvolatile Floating State"); genDef(Ex, KEXCEPTION_FRAME, XFltF20); genDef(Ex, KEXCEPTION_FRAME, XFltF22); genDef(Ex, KEXCEPTION_FRAME, XFltF24); genDef(Ex, KEXCEPTION_FRAME, XFltF26); genDef(Ex, KEXCEPTION_FRAME, XFltF28); genDef(Ex, KEXCEPTION_FRAME, XFltF30); genCom("32-bit Nonvolatile Integer State"); genDef(Ex, KEXCEPTION_FRAME, IntS0); genDef(Ex, KEXCEPTION_FRAME, IntS1); genDef(Ex, KEXCEPTION_FRAME, IntS2); genDef(Ex, KEXCEPTION_FRAME, IntS3); genDef(Ex, KEXCEPTION_FRAME, IntS4); genDef(Ex, KEXCEPTION_FRAME, IntS5); genDef(Ex, KEXCEPTION_FRAME, IntS6); genDef(Ex, KEXCEPTION_FRAME, IntS7); genDef(Ex, KEXCEPTION_FRAME, IntS8); genDef(Ex, KEXCEPTION_FRAME, SwapReturn); genDef(Ex, KEXCEPTION_FRAME, IntRa); genVal(ExceptionFrameLength, sizeof(KEXCEPTION_FRAME)); // Jump buffer offset definitions. DisableInc (HALMIPS); genCom("Jump Offset Definitions and Length"); genDef(Jb, _JUMP_BUFFER, FltF20); genDef(Jb, _JUMP_BUFFER, FltF21); genDef(Jb, _JUMP_BUFFER, FltF22); genDef(Jb, _JUMP_BUFFER, FltF23); genDef(Jb, _JUMP_BUFFER, FltF24); genDef(Jb, _JUMP_BUFFER, FltF25); genDef(Jb, _JUMP_BUFFER, FltF26); genDef(Jb, _JUMP_BUFFER, FltF27); genDef(Jb, _JUMP_BUFFER, FltF28); genDef(Jb, _JUMP_BUFFER, FltF29); genDef(Jb, _JUMP_BUFFER, FltF30); genDef(Jb, _JUMP_BUFFER, FltF31); genDef(Jb, _JUMP_BUFFER, IntS0); genDef(Jb, _JUMP_BUFFER, IntS1); genDef(Jb, _JUMP_BUFFER, IntS2); genDef(Jb, _JUMP_BUFFER, IntS3); genDef(Jb, _JUMP_BUFFER, IntS4); genDef(Jb, _JUMP_BUFFER, IntS5); genDef(Jb, _JUMP_BUFFER, IntS6); genDef(Jb, _JUMP_BUFFER, IntS7); genDef(Jb, _JUMP_BUFFER, IntS8); genDef(Jb, _JUMP_BUFFER, IntSp); genDef(Jb, _JUMP_BUFFER, Type); genDef(Jb, _JUMP_BUFFER, Fir); // Trap frame offset definitions. EnableInc (HALMIPS); genCom("Trap Frame Offset Definitions and Length"); genAlt(TrArgs, KTRAP_FRAME, Argument); genCom("32-bit Volatile Floating State"); genDef(Tr, KTRAP_FRAME, FltF0); genDef(Tr, KTRAP_FRAME, FltF1); genDef(Tr, KTRAP_FRAME, FltF2); genDef(Tr, KTRAP_FRAME, FltF3); genDef(Tr, KTRAP_FRAME, FltF4); genDef(Tr, KTRAP_FRAME, FltF5); genDef(Tr, KTRAP_FRAME, FltF6); genDef(Tr, KTRAP_FRAME, FltF7); genDef(Tr, KTRAP_FRAME, FltF8); genDef(Tr, KTRAP_FRAME, FltF9); genDef(Tr, KTRAP_FRAME, FltF10); genDef(Tr, KTRAP_FRAME, FltF11); genDef(Tr, KTRAP_FRAME, FltF12); genDef(Tr, KTRAP_FRAME, FltF13); genDef(Tr, KTRAP_FRAME, FltF14); genDef(Tr, KTRAP_FRAME, FltF15); genDef(Tr, KTRAP_FRAME, FltF16); genDef(Tr, KTRAP_FRAME, FltF17); genDef(Tr, KTRAP_FRAME, FltF18); genDef(Tr, KTRAP_FRAME, FltF19); genCom("64-bit Volatile Floating State"); genDef(Tr, KTRAP_FRAME, XFltF0); genDef(Tr, KTRAP_FRAME, XFltF1); genDef(Tr, KTRAP_FRAME, XFltF2); genDef(Tr, KTRAP_FRAME, XFltF3); genDef(Tr, KTRAP_FRAME, XFltF4); genDef(Tr, KTRAP_FRAME, XFltF5); genDef(Tr, KTRAP_FRAME, XFltF6); genDef(Tr, KTRAP_FRAME, XFltF7); genDef(Tr, KTRAP_FRAME, XFltF8); genDef(Tr, KTRAP_FRAME, XFltF9); genDef(Tr, KTRAP_FRAME, XFltF10); genDef(Tr, KTRAP_FRAME, XFltF11); genDef(Tr, KTRAP_FRAME, XFltF12); genDef(Tr, KTRAP_FRAME, XFltF13); genDef(Tr, KTRAP_FRAME, XFltF14); genDef(Tr, KTRAP_FRAME, XFltF15); genDef(Tr, KTRAP_FRAME, XFltF16); genDef(Tr, KTRAP_FRAME, XFltF17); genDef(Tr, KTRAP_FRAME, XFltF18); genDef(Tr, KTRAP_FRAME, XFltF19); genDef(Tr, KTRAP_FRAME, XFltF21); genDef(Tr, KTRAP_FRAME, XFltF23); genDef(Tr, KTRAP_FRAME, XFltF25); genDef(Tr, KTRAP_FRAME, XFltF27); genDef(Tr, KTRAP_FRAME, XFltF29); genDef(Tr, KTRAP_FRAME, XFltF31); genCom("64-bit Volatile Integer State"); genDef(Tr, KTRAP_FRAME, XIntZero); genDef(Tr, KTRAP_FRAME, XIntAt); genDef(Tr, KTRAP_FRAME, XIntV0); genDef(Tr, KTRAP_FRAME, XIntV1); genDef(Tr, KTRAP_FRAME, XIntA0); genDef(Tr, KTRAP_FRAME, XIntA1); genDef(Tr, KTRAP_FRAME, XIntA2); genDef(Tr, KTRAP_FRAME, XIntA3); genDef(Tr, KTRAP_FRAME, XIntT0); genDef(Tr, KTRAP_FRAME, XIntT1); genDef(Tr, KTRAP_FRAME, XIntT2); genDef(Tr, KTRAP_FRAME, XIntT3); genDef(Tr, KTRAP_FRAME, XIntT4); genDef(Tr, KTRAP_FRAME, XIntT5); genDef(Tr, KTRAP_FRAME, XIntT6); genDef(Tr, KTRAP_FRAME, XIntT7); genDef(Tr, KTRAP_FRAME, XIntS0); genDef(Tr, KTRAP_FRAME, XIntS1); genDef(Tr, KTRAP_FRAME, XIntS2); genDef(Tr, KTRAP_FRAME, XIntS3); genDef(Tr, KTRAP_FRAME, XIntS4); genDef(Tr, KTRAP_FRAME, XIntS5); genDef(Tr, KTRAP_FRAME, XIntS6); genDef(Tr, KTRAP_FRAME, XIntS7); genDef(Tr, KTRAP_FRAME, XIntT8); genDef(Tr, KTRAP_FRAME, XIntT9); genDef(Tr, KTRAP_FRAME, XIntGp); genDef(Tr, KTRAP_FRAME, XIntSp); genDef(Tr, KTRAP_FRAME, XIntS8); genDef(Tr, KTRAP_FRAME, XIntRa); genDef(Tr, KTRAP_FRAME, XIntLo); genDef(Tr, KTRAP_FRAME, XIntHi); genSpc(); genDef(Tr, KTRAP_FRAME, Fir); genDef(Tr, KTRAP_FRAME, Fsr); genDef(Tr, KTRAP_FRAME, Psr); genDef(Tr, KTRAP_FRAME, ExceptionRecord); genDef(Tr, KTRAP_FRAME, OldIrql); genDef(Tr, KTRAP_FRAME, PreviousMode); genDef(Tr, KTRAP_FRAME, SavedFlag); genAlt(TrOnInterruptStack, KTRAP_FRAME, u.OnInterruptStack); genAlt(TrTrapFrame, KTRAP_FRAME, u.TrapFrame); genVal(TrapFrameLength, sizeof(KTRAP_FRAME)); genVal(TrapFrameArguments, KTRAP_FRAME_ARGUMENTS); // Usermode callout kernel frame definitions DisableInc(HALMIPS); genCom("Usermode callout kernel frame definitions"); genDef(Cu, KCALLOUT_FRAME, F20); genDef(Cu, KCALLOUT_FRAME, F21); genDef(Cu, KCALLOUT_FRAME, F22); genDef(Cu, KCALLOUT_FRAME, F23); genDef(Cu, KCALLOUT_FRAME, F24); genDef(Cu, KCALLOUT_FRAME, F25); genDef(Cu, KCALLOUT_FRAME, F26); genDef(Cu, KCALLOUT_FRAME, F27); genDef(Cu, KCALLOUT_FRAME, F28); genDef(Cu, KCALLOUT_FRAME, F29); genDef(Cu, KCALLOUT_FRAME, F30); genDef(Cu, KCALLOUT_FRAME, F31); genDef(Cu, KCALLOUT_FRAME, S0); genDef(Cu, KCALLOUT_FRAME, S1); genDef(Cu, KCALLOUT_FRAME, S2); genDef(Cu, KCALLOUT_FRAME, S3); genDef(Cu, KCALLOUT_FRAME, S4); genDef(Cu, KCALLOUT_FRAME, S5); genDef(Cu, KCALLOUT_FRAME, S6); genDef(Cu, KCALLOUT_FRAME, S7); genDef(Cu, KCALLOUT_FRAME, S8); genDef(Cu, KCALLOUT_FRAME, CbStk); genDef(Cu, KCALLOUT_FRAME, TrFr); genDef(Cu, KCALLOUT_FRAME, Fsr); genDef(Cu, KCALLOUT_FRAME, InStk); genDef(Cu, KCALLOUT_FRAME, Ra); genVal(CuFrameLength, OFFSET(KCALLOUT_FRAME, A0)); genDef(Cu, KCALLOUT_FRAME, A0); genDef(Cu, KCALLOUT_FRAME, A1); // Usermode callout user frame definitions. genCom("Usermode callout user frame definitions"); genDef(Ck, UCALLOUT_FRAME, Buffer); genDef(Ck, UCALLOUT_FRAME, Length); genDef(Ck, UCALLOUT_FRAME, ApiNumber); genDef(Ck, UCALLOUT_FRAME, Sp); genDef(Ck, UCALLOUT_FRAME, Ra); EnableInc(HALMIPS); // Loader Parameter Block offset definitions. dumpf("\n"); dumpf("//\n"); dumpf("// Loader Parameter Block Offset Definitions\n"); dumpf("//\n"); dumpf("\n"); dumpf("#define LpbLoadOrderListHead 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, LoadOrderListHead)); dumpf("#define LpbMemoryDescriptorListHead 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, MemoryDescriptorListHead)); dumpf("#define LpbKernelStack 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, KernelStack)); dumpf("#define LpbPrcb 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, Prcb)); dumpf("#define LpbProcess 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, Process)); dumpf("#define LpbThread 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, Thread)); dumpf("#define LpbInterruptStack 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.InterruptStack)); dumpf("#define LpbFirstLevelDcacheSize 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.FirstLevelDcacheSize)); dumpf("#define LpbFirstLevelDcacheFillSize 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.FirstLevelDcacheFillSize)); dumpf("#define LpbFirstLevelIcacheSize 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.FirstLevelIcacheSize)); dumpf("#define LpbFirstLevelIcacheFillSize 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.FirstLevelIcacheFillSize)); dumpf("#define LpbGpBase 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.GpBase)); dumpf("#define LpbPanicStack 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.PanicStack)); dumpf("#define LpbPcrPage 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.PcrPage)); dumpf("#define LpbPdrPage 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.PdrPage)); dumpf("#define LpbSecondLevelDcacheSize 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.SecondLevelDcacheSize)); dumpf("#define LpbSecondLevelDcacheFillSize 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.SecondLevelDcacheFillSize)); dumpf("#define LpbSecondLevelIcacheSize 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.SecondLevelIcacheSize)); dumpf("#define LpbSecondLevelIcacheFillSize 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.SecondLevelIcacheFillSize)); dumpf("#define LpbPcrPage2 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, u.Mips.PcrPage2)); dumpf("#define LpbRegistryLength 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, RegistryLength)); dumpf("#define LpbRegistryBase 0x%lx\n", OFFSET(LOADER_PARAMETER_BLOCK, RegistryBase)); DisableInc (HALMIPS); // Define Client/Server data structure definitions. genCom("Client/Server Structure Definitions"); genDef(Cid, CLIENT_ID, UniqueProcess); genDef(Cid, CLIENT_ID, UniqueThread); // Address space layout definitions EnableInc(HALMIPS); genCom("Address Space Layout Definitions"); genVal(KUSEG_BASE, KUSEG_BASE); genVal(KSEG0_BASE, KSEG0_BASE); genVal(KSEG1_BASE, KSEG1_BASE); genVal(KSEG2_BASE, KSEG2_BASE); DisableInc(HALMIPS); genVal(CACHE_ERROR_VECTOR, CACHE_ERROR_VECTOR); genVal(SYSTEM_BASE, SYSTEM_BASE); genVal(PDE_BASE, PDE_BASE); genVal(PTE_BASE, PTE_BASE); genVal(PDE64_BASE, PDE64_BASE); genVal(PTE64_BASE, PTE64_BASE); // Page table and page directory entry definitions EnableInc(HALMIPS); genCom("Page Table and Directory Entry Definitions"); genVal(PAGE_SIZE, PAGE_SIZE); genVal(PAGE_SHIFT, PAGE_SHIFT); genVal(PDI_SHIFT, PDI_SHIFT); genVal(PTI_SHIFT, PTI_SHIFT); // Software interrupt request mask definitions genCom("Software Interrupt Request Mask Definitions"); genVal(APC_INTERRUPT, (1 << (APC_LEVEL + CAUSE_INTPEND - 1))); genVal(DISPATCH_INTERRUPT, (1 << (DISPATCH_LEVEL + CAUSE_INTPEND - 1))); DisableInc(HALMIPS); // Breakpoint instruction definitions EnableInc(HALMIPS); genCom("Breakpoint Definitions"); genVal(USER_BREAKPOINT, USER_BREAKPOINT); genVal(KERNEL_BREAKPOINT, KERNEL_BREAKPOINT); genVal(BREAKIN_BREAKPOINT, BREAKIN_BREAKPOINT); DisableInc(HALMIPS); genVal(BRANCH_TAKEN_BREAKPOINT, BRANCH_TAKEN_BREAKPOINT); genVal(BRANCH_NOT_TAKEN_BREAKPOINT, BRANCH_NOT_TAKEN_BREAKPOINT); genVal(SINGLE_STEP_BREAKPOINT, SINGLE_STEP_BREAKPOINT); genVal(DIVIDE_OVERFLOW_BREAKPOINT, DIVIDE_OVERFLOW_BREAKPOINT); genVal(DIVIDE_BY_ZERO_BREAKPOINT, DIVIDE_BY_ZERO_BREAKPOINT); genVal(RANGE_CHECK_BREAKPOINT, RANGE_CHECK_BREAKPOINT); genVal(STACK_OVERFLOW_BREAKPOINT, STACK_OVERFLOW_BREAKPOINT); genVal(MULTIPLY_OVERFLOW_BREAKPOINT, MULTIPLY_OVERFLOW_BREAKPOINT); genVal(DEBUG_PRINT_BREAKPOINT, DEBUG_PRINT_BREAKPOINT); genVal(DEBUG_PROMPT_BREAKPOINT, DEBUG_PROMPT_BREAKPOINT); genVal(DEBUG_STOP_BREAKPOINT, DEBUG_STOP_BREAKPOINT); genVal(DEBUG_LOAD_SYMBOLS_BREAKPOINT, DEBUG_LOAD_SYMBOLS_BREAKPOINT); genVal(DEBUG_UNLOAD_SYMBOLS_BREAKPOINT, DEBUG_UNLOAD_SYMBOLS_BREAKPOINT); // Miscellaneous definitions EnableInc(HALMIPS); genCom("Miscellaneous Definitions"); genVal(Executive, Executive); genVal(KernelMode, KernelMode); genVal(FALSE, FALSE); genVal(TRUE, TRUE); genVal(UNCACHED_POLICY, UNCACHED_POLICY); genVal(KiPcr, KIPCR); genVal(KiPcr2, KIPCR2); DisableInc(HALMIPS); genVal(UsPcr, USPCR); genVal(UsPcr2, USPCR2); genVal(BASE_PRIORITY_THRESHOLD, BASE_PRIORITY_THRESHOLD); genVal(EVENT_PAIR_INCREMENT, EVENT_PAIR_INCREMENT); genVal(LOW_REALTIME_PRIORITY, LOW_REALTIME_PRIORITY); genVal(KERNEL_STACK_SIZE, KERNEL_STACK_SIZE); genVal(KERNEL_LARGE_STACK_COMMIT, KERNEL_LARGE_STACK_COMMIT); genVal(XCODE_VECTOR_LENGTH, XCODE_VECTOR_LENGTH); genVal(MM_USER_PROBE_ADDRESS, MM_USER_PROBE_ADDRESS); genVal(ROUND_TO_NEAREST, ROUND_TO_NEAREST); genVal(ROUND_TO_ZERO, ROUND_TO_ZERO); genVal(ROUND_TO_PLUS_INFINITY, ROUND_TO_PLUS_INFINITY); genVal(ROUND_TO_MINUS_INFINITY, ROUND_TO_MINUS_INFINITY); genVal(CLOCK_QUANTUM_DECREMENT, CLOCK_QUANTUM_DECREMENT); genVal(READY_SKIP_QUANTUM, READY_SKIP_QUANTUM); genVal(THREAD_QUANTUM, THREAD_QUANTUM); genVal(WAIT_QUANTUM_DECREMENT, WAIT_QUANTUM_DECREMENT); genVal(ROUND_TRIP_DECREMENT_COUNT, ROUND_TRIP_DECREMENT_COUNT); // Close header file. fprintf(stderr, " Finished\n"); return; } VOID dumpf( const char *format, ... ) { va_list(arglist); va_start(arglist, format); if (((OutputEnabled & KSMIPS) != 0) && (KsMips != NULL)) { vfprintf (KsMips, format, arglist); } if (((OutputEnabled & HALMIPS) != 0) && (HalMips != NULL)) { vfprintf (HalMips, format, arglist); } va_end(arglist); }