(svn r3008) [ 1247535 ] Native Support for Win64 (compile&run only) (michi_cc)

Fix warning in graph_gui.c with const problem
This commit is contained in:
Darkvater
2005-10-02 22:39:56 +00:00
parent e8fac6c6cb
commit a3d40a29fc
13 changed files with 127 additions and 24 deletions

72
win32.c
View File

@@ -61,6 +61,11 @@ bool LoadLibraryList(Function proc[], const char* dll)
}
#ifdef _MSC_VER
# ifdef _M_AMD64
void* _get_save_esp(void);
uint64 _rdtsc(void);
# endif
static const char *_exception_string;
#endif
@@ -452,6 +457,37 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
if (_exception_string)
output += sprintf(output, "Reason: %s\r\n", _exception_string);
#ifdef _M_AMD64
output += sprintf(output, "Exception %.8X at %.16IX\r\n"
"Registers:\r\n"
"RAX: %.16llX RBX: %.16llX RCX: %.16llX RDX: %.16llX\r\n"
"RSI: %.16llX RDI: %.16llX RBP: %.16llX RSP: %.16llX\r\n"
"R8: %.16llX R9: %.16llX R10: %.16llX R11: %.16llX\r\n"
"R12: %.16llX R13: %.16llX R14: %.16llX R15: %.16llX\r\n"
"RIP: %.16llX EFLAGS: %.8X\r\n"
"\r\nBytes at CS:RIP:\r\n",
ep->ExceptionRecord->ExceptionCode,
ep->ExceptionRecord->ExceptionAddress,
ep->ContextRecord->Rax,
ep->ContextRecord->Rbx,
ep->ContextRecord->Rcx,
ep->ContextRecord->Rdx,
ep->ContextRecord->Rsi,
ep->ContextRecord->Rdi,
ep->ContextRecord->Rbp,
ep->ContextRecord->Rsp,
ep->ContextRecord->R8,
ep->ContextRecord->R9,
ep->ContextRecord->R10,
ep->ContextRecord->R11,
ep->ContextRecord->R12,
ep->ContextRecord->R13,
ep->ContextRecord->R14,
ep->ContextRecord->R15,
ep->ContextRecord->Rip,
ep->ContextRecord->EFlags
);
#else
output += sprintf(output, "Exception %.8X at %.8X\r\n"
"Registers:\r\n"
" EAX: %.8X EBX: %.8X ECX: %.8X EDX: %.8X\r\n"
@@ -471,9 +507,14 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
ep->ContextRecord->Eip,
ep->ContextRecord->EFlags
);
#endif
{
#ifdef _M_AMD64
byte *b = (byte*)ep->ContextRecord->Rip;
#else
byte *b = (byte*)ep->ContextRecord->Eip;
#endif
int i;
for (i = 0; i != 24; i++) {
if (IsBadReadPtr(b, 1)) {
@@ -491,7 +532,11 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
{
int i,j;
#ifdef _M_AMD64
uint32 *b = (uint32*)ep->ContextRecord->Rsp;
#else
uint32 *b = (uint32*)ep->ContextRecord->Esp;
#endif
for (j = 0; j != 24; j++) {
for (i = 0; i != 8; i++) {
if (IsBadReadPtr(b,sizeof(uint32))) {
@@ -530,8 +575,13 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
CloseConsoleLogIfActive();
if (_safe_esp) {
#ifdef _M_AMD64
ep->ContextRecord->Rip = (DWORD64)Handler2;
ep->ContextRecord->Rsp = (DWORD64)_safe_esp;
#else
ep->ContextRecord->Eip = (DWORD)Handler2;
ep->ContextRecord->Esp = (DWORD)_safe_esp;
#endif
return EXCEPTION_CONTINUE_EXECUTION;
}
@@ -541,9 +591,13 @@ static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
static void Win32InitializeExceptions(void)
{
#ifdef _M_AMD64
_safe_esp = _get_save_esp();
#else
_asm {
mov _safe_esp, esp
}
#endif
SetUnhandledExceptionFilter(ExceptionHandler);
}
@@ -997,8 +1051,8 @@ static int ParseCommandLine(char *line, char **argv, int max_argc)
}
#if defined(_MSC_VER)
uint32 _declspec(naked) rdtsc(void)
#if defined(_MSC_VER) && !defined(_M_AMD64)
uint64 _declspec(naked) _rdtsc(void)
{
_asm {
rdtsc
@@ -1025,9 +1079,9 @@ void CreateConsole(void)
// redirect unbuffered STDIN, STDOUT, STDERR to the console
#if !defined(__CYGWIN__)
*stdout = *_fdopen( _open_osfhandle((long)hand, _O_TEXT), "w" );
*stdin = *_fdopen(_open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT), "r" );
*stderr = *_fdopen(_open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE), _O_TEXT), "w" );
*stdout = *_fdopen( _open_osfhandle((intptr_t)hand, _O_TEXT), "w" );
*stdin = *_fdopen(_open_osfhandle((intptr_t)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT), "r" );
*stderr = *_fdopen(_open_osfhandle((intptr_t)GetStdHandle(STD_ERROR_HANDLE), _O_TEXT), "w" );
#else
// open_osfhandle is not in cygwin
*stdout = *fdopen(1, "w" );
@@ -1082,9 +1136,9 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
// setup random seed to something quite random
#if defined(_MSC_VER)
{
uint64 seed = rdtsc();
_random_seeds[0][0] = GB(seed, 0, 32);
_random_seeds[0][1] = GB(seed, 32, 32);
ULARGE_INTEGER seed; seed.QuadPart = _rdtsc();
_random_seeds[0][0] = seed.LowPart;
_random_seeds[0][1] = seed.HighPart;
}
#else
_random_seeds[0][0] = GetTickCount();
@@ -1155,6 +1209,7 @@ int CDECL snprintf(char *str, size_t size, const char *format, ...)
return ret;
}
#if _MSC_VER < 1400 /* Already defined in VS 2005 */
int CDECL vsnprintf(char *str, size_t size, const char *format, va_list ap)
{
int ret;
@@ -1162,6 +1217,7 @@ int CDECL vsnprintf(char *str, size_t size, const char *format, va_list ap)
if (ret < 0) str[size - 1] = '\0';
return ret;
}
#endif
/**
* Insert a chunk of text from the clipboard onto the textbuffer. Get TEXT clipboard