foreign import ccall "register_signal"
register_signal :: IO ()
-foreign export ccall mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
-mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
-mateHandler reip reax rebx resi = do
+foreign export ccall mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
+mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
+mateHandler reip reax rebx resi resp = do
tmap <- getTrapMap
let reipw32 = fromIntegral reip
(deleteMe, ret_nreip) <- case M.lookup reipw32 tmap of
patchWithHarpy patcher reip >>= delTrue
(Just (InstanceOf patcher)) ->
patchWithHarpy (patcher reax) reip >>= delFalse
+ (Just (ThrowException patcher)) ->
+ patchWithHarpy (patcher reax resp) reip >>= delFalse
(Just (NewObject patcher)) ->
patchWithHarpy patcher reip >>= delTrue
(Just (VirtualCall False mi io_offset)) ->
>>= delFalse
Nothing -> case resi of
0x13371234 -> delFalse (-1)
- _ -> error $ "getTrapType: abort :-( " ++ showHex reip ". "
- ++ concatMap (`showHex` ", ") (M.keys tmap)
+ _ -> error $ "getTrapType: abort :-( eip: "
+ ++ showHex reip ". " ++ concatMap (`showHex` ", ") (M.keys tmap)
when deleteMe $ setTrapMap $ M.delete reipw32 tmap
return ret_nreip
where
let entry = Just (intPtrToPtr (fromIntegral reip), fixme)
let cgconfig = defaultCodeGenConfig { customCodeBuffer = entry }
(_, Right right) <- runCodeGenWithConfig (withDisasm $ patcher reip) () () cgconfig
- when mateDEBUG $ mapM_ (printfJit . printf "patched: %s\n" . showAtt) $ snd right
+ when mateDEBUG $ mapM_ (printfJit . printf "patched: %s\n" . showIntel) $ snd right
return $ fst right
withDisasm :: CodeGen e s CPtrdiff -> CodeGen e s (CPtrdiff, [Instruction])
vmap <- liftIO getVirtualMap
let newmi = MethodInfo methname (vmap M.! fromIntegral method_table) msig
offset <- liftIO io_offset
- entryAddr <- liftIO $ getMethodEntry newmi
+ (entryAddr, _) <- liftIO $ getMethodEntry newmi
call32Eax (Disp offset)
-- patch entry in table
let call_insn = intPtrToPtr . fromIntegral $ table2patch + fromIntegral offset