Mercurial > hg > truffle
comparison src/os/windows/vm/os_windows.cpp @ 4872:aa3d708d67c4
7141200: log some interesting information in ring buffers for crashes
Reviewed-by: kvn, jrose, kevinw, brutisso, twisti, jmasa
author | never |
---|---|
date | Wed, 01 Feb 2012 07:59:01 -0800 |
parents | d7e3846464d0 |
children | 379b22e03c32 |
comparison
equal
deleted
inserted
replaced
4871:f067b4e0e04b | 4872:aa3d708d67c4 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
2086 #ifdef _M_IA64 | 2086 #ifdef _M_IA64 |
2087 assert(0, "Fix Handle_IDiv_Exception"); | 2087 assert(0, "Fix Handle_IDiv_Exception"); |
2088 #elif _M_AMD64 | 2088 #elif _M_AMD64 |
2089 PCONTEXT ctx = exceptionInfo->ContextRecord; | 2089 PCONTEXT ctx = exceptionInfo->ContextRecord; |
2090 address pc = (address)ctx->Rip; | 2090 address pc = (address)ctx->Rip; |
2091 NOT_PRODUCT(Events::log("idiv overflow exception at " INTPTR_FORMAT , pc)); | |
2092 assert(pc[0] == 0xF7, "not an idiv opcode"); | 2091 assert(pc[0] == 0xF7, "not an idiv opcode"); |
2093 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); | 2092 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); |
2094 assert(ctx->Rax == min_jint, "unexpected idiv exception"); | 2093 assert(ctx->Rax == min_jint, "unexpected idiv exception"); |
2095 // set correct result values and continue after idiv instruction | 2094 // set correct result values and continue after idiv instruction |
2096 ctx->Rip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes | 2095 ctx->Rip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes |
2098 ctx->Rdx = (DWORD)0; // remainder | 2097 ctx->Rdx = (DWORD)0; // remainder |
2099 // Continue the execution | 2098 // Continue the execution |
2100 #else | 2099 #else |
2101 PCONTEXT ctx = exceptionInfo->ContextRecord; | 2100 PCONTEXT ctx = exceptionInfo->ContextRecord; |
2102 address pc = (address)ctx->Eip; | 2101 address pc = (address)ctx->Eip; |
2103 NOT_PRODUCT(Events::log("idiv overflow exception at " INTPTR_FORMAT , pc)); | |
2104 assert(pc[0] == 0xF7, "not an idiv opcode"); | 2102 assert(pc[0] == 0xF7, "not an idiv opcode"); |
2105 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); | 2103 assert((pc[1] & ~0x7) == 0xF8, "cannot handle non-register operands"); |
2106 assert(ctx->Eax == min_jint, "unexpected idiv exception"); | 2104 assert(ctx->Eax == min_jint, "unexpected idiv exception"); |
2107 // set correct result values and continue after idiv instruction | 2105 // set correct result values and continue after idiv instruction |
2108 ctx->Eip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes | 2106 ctx->Eip = (DWORD)pc + 2; // idiv reg, reg is 2 bytes |
5329 _OpenProcessToken != NULL && | 5327 _OpenProcessToken != NULL && |
5330 _LookupPrivilegeValue != NULL; | 5328 _LookupPrivilegeValue != NULL; |
5331 } | 5329 } |
5332 | 5330 |
5333 #endif | 5331 #endif |
5334 |