X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FX86TrapHandling.hs;h=82ed7ca0d738ca3ad52b1a0f23562ac8ae0e9597;hb=HEAD;hp=e8695aa1a97b07d93ce15cb0d13a3d3d4f6e5814;hpb=4c360eaabc8e7259b3011f69397501dcfca17786;p=mate.git diff --git a/Mate/X86TrapHandling.hs b/Mate/X86TrapHandling.hs index e8695aa..82ed7ca 100644 --- a/Mate/X86TrapHandling.hs +++ b/Mate/X86TrapHandling.hs @@ -26,9 +26,9 @@ import Harpy.X86Disassembler 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 @@ -40,6 +40,8 @@ mateHandler reip reax rebx resi = do 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)) -> @@ -50,8 +52,8 @@ mateHandler reip reax rebx resi = do >>= 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 @@ -67,7 +69,7 @@ patchWithHarpy patcher reip = do 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]) @@ -92,7 +94,7 @@ patchInvoke (MethodInfo methname _ msig) method_table table2patch io_offset rei 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