Windows2000/private/ntos/ke/mips/genmips.c
2020-09-30 17:12:32 +02:00

1014 lines
29 KiB
C

/*++
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);
}