+ /* 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 == 5)) {
+ /* 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;
+
+ /* ATTENTION: The _mc->gregs layout is completely crazy! The
+ registers are reversed starting with number 4 for REG_EDI
+ (see /usr/include/sys/ucontext.h). We have to convert that
+ here. */
+
+ val = _mc->gregs[REG_EAX - d];
+ }
+ else {
+ /* this was a normal NPE */
+
+ type = EXCEPTION_HARDWARE_NULLPOINTER;
+ }
+
+ /* generate appropriate exception */
+
+ e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val);
+
+ /* set registers */