- pv = NULL; /* is resolved during stackframeinfo creation */
- sp = (u1 *) _mc->gregs[REG_RSP];
- xpc = (u1 *) _mc->gregs[REG_RIP];
- ra = xpc; /* return address is equal to XPC */
-
-#if 0
- /* check for StackOverflowException */
-
- threads_check_stackoverflow(sp);
-#endif
-
- /* get exception-throwing instruction */
-
- opc = M_ALD_MEM_GET_OPC(xpc);
- mod = M_ALD_MEM_GET_MOD(xpc);
- rm = M_ALD_MEM_GET_RM(xpc);
-
- /* for values see emit_mov_mem_reg and emit_mem */
-
- if ((opc == 0x8b) && (mod == 0) && (rm == 4)) {
- /* this was a hardware-exception */
-
- d = M_ALD_MEM_GET_REG(xpc);
- disp = M_ALD_MEM_GET_DISP(xpc);
-
- /* we use the exception type as load displacement */
-
- type = disp;
-
- /* XXX FIX ME! */
-
- /* ATTENTION: The _mc->gregs layout is even worse than on
- i386! See /usr/include/sys/ucontext.h. We need a
- switch-case here... */
-
- switch (d) {
- case 0: /* REG_RAX == 13 */
- d = REG_RAX;
- break;
- case 1: /* REG_RCX == 14 */
- d = REG_RCX;
- break;
- case 2: /* REG_RDX == 12 */
- d = REG_RDX;
- break;
- case 3: /* REG_RBX == 11 */
- d = REG_RBX;
- break;
- case 4: /* REG_RSP == 15 */
- d = REG_RSP;
- break;
- case 5: /* REG_RBP == 10 */
- d = REG_RBP;
- break;
- case 6: /* REG_RSI == 9 */
- d = REG_RSI;
- break;
- case 7: /* REG_RDI == 8 */
- d = REG_RDI;
- break;
- case 8: /* REG_R8 == 0 */
- case 9: /* REG_R9 == 1 */
- case 10: /* REG_R10 == 2 */
- case 11: /* REG_R11 == 3 */
- case 12: /* REG_R12 == 4 */
- case 13: /* REG_R13 == 5 */
- case 14: /* REG_R14 == 6 */
- case 15: /* REG_R15 == 7 */
- d = d - 8;
- break;
- }
-
- val = _mc->gregs[d];
-
- if (type == TRAP_COMPILER) {
- /* The PV from the compiler stub is equal to the XPC. */
-
- pv = xpc;
-
- /* We use a framesize of zero here because the call pushed
- the return addres onto the stack. */
-
- ra = md_stacktrace_get_returnaddress(sp, 0);
-
- /* Skip the RA on the stack. */
-
- sp = sp + 1 * SIZEOF_VOID_P;
-
- /* The XPC is the RA minus 1, because the RA points to the
- instruction after the call. */
-
- xpc = ra - 3;
- }
- }
- else {
- /* this was a normal NPE */
-
- type = TRAP_NullPointerException;
- val = 0;
- }
-
- /* Handle the trap. */
-
- p = trap_handle(type, val, pv, sp, ra, xpc, _p);
-
- /* Set registers. */