306 lines
8.0 KiB
C++
306 lines
8.0 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: hal.h
|
|
//
|
|
// Note:
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#define UNICODE
|
|
#define _UNICODE
|
|
|
|
/////////////////////////////////////////// Core types used by runtime system.
|
|
//
|
|
|
|
typedef __wchar_t bartok_char;
|
|
|
|
typedef char int8;
|
|
typedef short int16;
|
|
typedef int int32;
|
|
typedef __int64 int64;
|
|
|
|
typedef unsigned char uint8;
|
|
typedef unsigned short uint16;
|
|
typedef unsigned int uint32;
|
|
typedef unsigned __int64 uint64;
|
|
|
|
typedef float float32;
|
|
typedef double float64;
|
|
|
|
#if defined(PTR_SIZE_32)
|
|
typedef int intptr;
|
|
typedef unsigned int uintptr;
|
|
#else
|
|
typedef __int64 intptr;
|
|
typedef unsigned __int64 uintptr;
|
|
#endif
|
|
|
|
struct uintPtr
|
|
{
|
|
uintptr value;
|
|
};
|
|
|
|
struct intPtr
|
|
{
|
|
intptr value;
|
|
};
|
|
|
|
typedef struct uintPtr *UIntPtr;
|
|
typedef struct intPtr *IntPtr;
|
|
|
|
/////////////////////////////////////////////////////////////// Static Assert.
|
|
//
|
|
// Compile-time (not run-time) assertion. Code will not compile if
|
|
// expr is false. Note: there is no non-debug version of this; we
|
|
// want this for all builds. The compiler optimizes the code away.
|
|
//
|
|
template <bool x> struct STATIC_ASSERT_FAILURE;
|
|
template <> struct STATIC_ASSERT_FAILURE<true> { };
|
|
template <int x> struct static_assert_test { };
|
|
|
|
#define STATIC_CAT_INNER(x,y) x##y
|
|
#define STATIC_CAT(x,y) STATIC_CAT_INNER(x,y)
|
|
#define STATIC_ASSERT(condition) \
|
|
typedef static_assert_test< \
|
|
sizeof(STATIC_ASSERT_FAILURE<(bool)(condition)>)> \
|
|
STATIC_CAT(__static_assert_typedef_, __COUNTER__)
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
#define OFFSETOF(s,m) ((uintptr)&(((s *)0)->m))
|
|
#define ARRAYOF(a) (sizeof(a)/sizeof(a[0]))
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
typedef signed int INT;
|
|
typedef signed char INT8;
|
|
typedef signed short INT16;
|
|
typedef signed long INT32;
|
|
typedef signed __int64 INT64;
|
|
typedef unsigned int UINT;
|
|
typedef unsigned char UINT8;
|
|
typedef unsigned short UINT16;
|
|
typedef unsigned long UINT32;
|
|
typedef unsigned __int64 UINT64;
|
|
|
|
typedef wchar_t WCHAR;
|
|
typedef unsigned char UCHAR;
|
|
|
|
typedef void *PVOID;
|
|
typedef uintptr ULONG_PTR;
|
|
typedef uint64 ULARGEST;
|
|
typedef int64 LARGEST;
|
|
|
|
typedef int BOOL;
|
|
|
|
typedef struct
|
|
{
|
|
UINT64 _lo;
|
|
UINT64 _hi;
|
|
} UINT128;
|
|
|
|
#define NULL 0
|
|
|
|
extern "C" {
|
|
extern UINT32 ProcessorContextOffset;
|
|
};
|
|
|
|
|
|
#if SINGULARITY_KERNEL
|
|
|
|
#ifndef _VA_LIST_DEFINED
|
|
typedef char *va_list;
|
|
#define _VA_LIST_DEFINED
|
|
|
|
#if PTR_SIZE_32
|
|
|
|
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
|
|
#define va_start(ap,v) ap = (va_list)&v + _INTSIZEOF(v)
|
|
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
|
|
#define va_end(ap) ap = (va_list)0
|
|
|
|
#else // PTR_SIZE_64
|
|
|
|
// the following extern "C" code is needed to ensure the
|
|
// compiler intrinsic IV_VA_START is invoked.
|
|
extern "C" void __cdecl __va_start(va_list *, ...);
|
|
|
|
#define va_dcl va_list va_alist;
|
|
#define va_start(ap,x) ( __va_start(&ap, x) )
|
|
#define va_arg(ap, t) \
|
|
( ( sizeof(t) > sizeof(__int64) || ( sizeof(t) & (sizeof(t) - 1) ) != 0 ) \
|
|
? **(t **)( ( ap += sizeof(__int64) ) - sizeof(__int64) ) \
|
|
: *(t *)( ( ap += sizeof(__int64) ) - sizeof(__int64) ) )
|
|
#define va_end(ap) ( ap = (va_list)0 )
|
|
|
|
#endif // PTR_SIZE_64
|
|
#endif // _VA_LIST_DEFINED
|
|
|
|
#ifndef MAX_CPU
|
|
#define MAX_CPU 1
|
|
#endif // MAX_CPU
|
|
|
|
#endif // SINGULARITY_KERNEL
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
#if SINGULARITY_PROCESS
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
struct Struct_System_ObjectHeader
|
|
{
|
|
int32 syncBlockValue;
|
|
};
|
|
|
|
#define MAKE_STRING(s,v) \
|
|
struct _##s \
|
|
{ \
|
|
Struct_System_ObjectHeader header; \
|
|
union \
|
|
{ \
|
|
struct \
|
|
{ \
|
|
Class_System_VTable * vable; \
|
|
int32 arrayLength; \
|
|
int32 stringLength; \
|
|
wchar_t chars[sizeof(v)]; \
|
|
}; \
|
|
Class_System_String string; \
|
|
}; \
|
|
} s = { \
|
|
{}, \
|
|
(Class_System_VTable *)&Class_System_String::_vtable, \
|
|
sizeof(v), \
|
|
sizeof(v)/sizeof(wchar_t) - 1, \
|
|
v \
|
|
}
|
|
|
|
#endif // SINGULARITY_PROCESS
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma warning(disable: 4201) // Allow nameless struct/union
|
|
#pragma warning(disable: 4127) // 4127: warning about constant conditional
|
|
|
|
#define EXCEPTION_ACCESS_VIOLATION 1
|
|
#define EXCEPTION_CONTINUE_EXECUTION 2
|
|
#define EXCEPTION_CONTINUE_SEARCH 3
|
|
#define EXCEPTION_FLT_DIVIDE_BY_ZERO 4
|
|
#define EXCEPTION_INT_DIVIDE_BY_ZERO 5
|
|
#define EXCEPTION_INT_OVERFLOW 6
|
|
#define EXCEPTION_STACK_OVERFLOW 7
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Used to pass various data through "int 29"
|
|
struct KdDebugTrapData
|
|
{
|
|
enum Tag
|
|
{
|
|
FIRST_CHANCE_EXCEPTION,
|
|
LOADED_BINARY,
|
|
UNLOADED_BINARY
|
|
} tag;
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
uintptr throwAddr;
|
|
} firstChanceException;
|
|
struct
|
|
{
|
|
UIntPtr baseAddress;
|
|
UIntPtr bytes;
|
|
UIntPtr name;
|
|
uint32 checksum;
|
|
uint32 timestamp;
|
|
bool silent;
|
|
bool ret;
|
|
} loadedBinary;
|
|
struct
|
|
{
|
|
UIntPtr baseAddress;
|
|
bool silent;
|
|
bool ret;
|
|
} unloadedBinary;
|
|
};
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
#pragma warning(disable: 4103)
|
|
#include "halclass.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
struct ClassVector : Class_System_Object
|
|
{
|
|
uint32 length;
|
|
};
|
|
|
|
struct ClassVector_uint8 : ClassVector
|
|
{
|
|
static struct Class_System_VTable ClassVector_uint8::_vtable;
|
|
|
|
uint8 values[1];
|
|
};
|
|
|
|
struct ClassVector_ClassVector_uint8 : ClassVector
|
|
{
|
|
static struct Class_System_VTable ClassVector_ClassVector_uint8::_vtable;
|
|
|
|
ClassVector_uint8 * values[1];
|
|
};
|
|
|
|
struct ClassVector_bartok_char : ClassVector
|
|
{
|
|
static struct Class_System_VTable ClassVector_bartok_char::_vtable;
|
|
|
|
bartok_char values[1];
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////// Dynamic Assert.
|
|
//
|
|
#if DEBUG
|
|
#if SINGULARITY_KERNEL
|
|
extern void fail_assert(const char *expr);
|
|
#define __fail_assert(expr, file, line) fail_assert("assert(" #expr ") failed at " file ":" #line)
|
|
#define Assert(expr) { if (!(expr)) { __fail_assert(expr, __FILE__, __LINE__); } }
|
|
#elif SINGULARITY_PROCESS
|
|
extern void fail_assert(Class_System_String *message);
|
|
#define Assert(expr) { if (!(expr)) { static MAKE_STRING(msg, L"assert(" L#expr L") failed"); fail_assert(&msg.string); } }
|
|
#endif
|
|
#else //DEBUG
|
|
#define Assert(expr) { 0; }
|
|
#endif//DEBUG
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
int printf(const char *pszFmt, ...);
|
|
|
|
void Cls(void);
|
|
|
|
#if SINGULARITY_KERNEL
|
|
void ProcessorInitialize(Class_Microsoft_Singularity_Hal_Cpu* processor);
|
|
#endif
|
|
void KdNotifyTrap(KdDebugTrapData *data);
|
|
void KdNotifyException(Class_System_Exception *exception, unsigned int throwAddr);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define arrayof(a) (sizeof(a)/sizeof(a[0]))
|
|
#define offsetof(s,m) (size_t)&(((s *)0)->m)
|
|
|
|
#pragma warning(disable: 4100) // allow unreferenced formal parameters
|
|
|
|
// Include standard compiler intrinsics
|
|
#include "intrinsics.h"
|
|
|
|
////////////////////////////////////////////////////////////////// End of File.
|