X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=Mate%2FX86TrapHandling.hs;h=5f993a6203304533635681149baa6ed09655d574;hb=60297de17a166656519429b9652c0cf059e900f1;hp=ecf346a2771e7249525ffadfd9d36a1ecd528efb;hpb=96f243da07244b563fed5d718a0c78cd727578db;p=mate.git diff --git a/Mate/X86TrapHandling.hs b/Mate/X86TrapHandling.hs index ecf346a..5f993a6 100644 --- a/Mate/X86TrapHandling.hs +++ b/Mate/X86TrapHandling.hs @@ -7,12 +7,12 @@ module Mate.X86TrapHandling ( import Numeric import qualified Data.Map as M -import qualified Data.ByteString.Lazy as B +import Control.Monad import Foreign import Foreign.C.Types -import Harpy +import Harpy hiding (fst) import Mate.Types import Mate.NativeSizes @@ -33,32 +33,30 @@ mateHandler reip reax rebx resi = do let reipw32 = fromIntegral reip (deleteMe, ret_nreip) <- case M.lookup reipw32 tmap of (Just (StaticMethod patcher)) -> - patchWithHarpy patcher reip >>= delTrue + patchWithHarpy patcher reip >>= delFalse (Just (StaticField _)) -> staticFieldHandler reip >>= delTrue (Just (ObjectField patcher)) -> patchWithHarpy patcher reip >>= delTrue - (Just (InstanceOf cn)) -> - patchWithHarpy (`patchInstanceOf` cn) reip >>= delFalse + (Just (InstanceOf patcher)) -> + patchWithHarpy (patcher reax) reip >>= delFalse (Just (NewObject patcher)) -> patchWithHarpy patcher reip >>= delTrue (Just (VirtualCall False mi io_offset)) -> patchWithHarpy (patchInvoke mi reax reax io_offset) reip - >>= delTrue + >>= delFalse (Just (VirtualCall True mi io_offset)) -> patchWithHarpy (patchInvoke mi rebx reax io_offset) reip - >>= delTrue + >>= delFalse Nothing -> case resi of - 0x13371234 -> return (-1) >>= delFalse - _ -> error $ "getTrapType: abort :-( " ++ (showHex reip ". ") - ++ (concatMap (`showHex` ", ") (M.keys tmap)) - if deleteMe - then setTrapMap $ M.delete reipw32 tmap - else return () + 0x13371234 -> delFalse (-1) + _ -> error $ "getTrapType: abort :-( " ++ showHex reip ". " + ++ concatMap (`showHex` ", ") (M.keys tmap) + when deleteMe $ setTrapMap $ M.delete reipw32 tmap return ret_nreip - where - delTrue = (\nreip -> return (False, nreip)) -- TODO: FIXME - delFalse = (\nreip -> return (False, nreip)) + where + delTrue x = return (True,x) + delFalse x = return (False,x) patchWithHarpy :: (CPtrdiff -> CodeGen () () CPtrdiff) -> CPtrdiff -> IO CPtrdiff @@ -69,10 +67,8 @@ patchWithHarpy patcher reip = do let entry = Just (intPtrToPtr (fromIntegral reip), fixme) let cgconfig = defaultCodeGenConfig { customCodeBuffer = entry } (_, Right right) <- runCodeGenWithConfig (withDisasm $ patcher reip) () () cgconfig - if mateDEBUG - then mapM_ (printfJit . printf "patched: %s\n" . showAtt) $ snd right - else return () - return reip + when mateDEBUG $ mapM_ (printfJit . printf "patched: %s\n" . showIntel) $ snd right + return $ fst right withDisasm :: CodeGen e s CPtrdiff -> CodeGen e s (CPtrdiff, [Instruction]) withDisasm patcher = do @@ -91,19 +87,13 @@ staticFieldHandler reip = do return reip else error "staticFieldHandler: something is wrong here. abort.\n" -patchInstanceOf :: CPtrdiff -> B.ByteString -> CodeGen e s CPtrdiff -patchInstanceOf reip classname = do - mtable <- liftIO $ getMethodTable classname - mov edx mtable - return reip - patchInvoke :: MethodInfo -> CPtrdiff -> CPtrdiff -> IO NativeWord -> CPtrdiff -> CodeGen e s CPtrdiff patchInvoke (MethodInfo methname _ msig) method_table table2patch io_offset reip = do - vmap <- liftIO $ getVirtualMap + vmap <- liftIO getVirtualMap let newmi = MethodInfo methname (vmap M.! fromIntegral method_table) msig offset <- liftIO io_offset entryAddr <- liftIO $ getMethodEntry newmi - call32_eax (Disp offset) + call32Eax (Disp offset) -- patch entry in table let call_insn = intPtrToPtr . fromIntegral $ table2patch + fromIntegral offset liftIO $ poke call_insn entryAddr