From 34939ca19d5f608efb04dcb2cdd97dd3f922d4a6 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sun, 2 Sep 2012 12:12:01 +0200 Subject: [PATCH] athrow: add trapskeleton for it --- Mate/Types.hs | 2 ++ Mate/X86CodeGen.hs | 10 ++++++++-- Mate/X86TrapHandling.hs | 8 +++++--- ffi/trap.c | 4 ++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Mate/Types.hs b/Mate/Types.hs index 7de8493..67ac2a5 100644 --- a/Mate/Types.hs +++ b/Mate/Types.hs @@ -68,11 +68,13 @@ type TrapMap = M.Map NativeWord TrapCause type TrapPatcher = CPtrdiff -> CodeGen () () CPtrdiff type TrapPatcherEax = CPtrdiff -> CPtrdiff -> CodeGen () () CPtrdiff +type TrapPatcherEsp = TrapPatcherEax data TrapCause = StaticMethod TrapPatcher -- for static calls | VirtualCall Bool MethodInfo (IO NativeWord) -- for invoke{interface,virtual} | InstanceOf TrapPatcherEax + | ThrowException TrapPatcherEsp | NewObject TrapPatcher | StaticField StaticFieldInfo | ObjectField TrapPatcher diff --git a/Mate/X86CodeGen.hs b/Mate/X86CodeGen.hs index 23cf7a3..7d17a9d 100644 --- a/Mate/X86CodeGen.hs +++ b/Mate/X86CodeGen.hs @@ -224,6 +224,13 @@ emitFromBB cls method = do return reip return $ Just (trapaddr, NewObject patcher) + emit' ATHROW = do + trapaddr <- emitSigIllTrap 2 + let patcher resp reip = do + emitSigIllTrap 2 + return reip + return $ Just (trapaddr, ThrowException patcher) + emit' insn = emit insn >> return Nothing emit :: J.Instruction -> CodeGen e s () @@ -279,8 +286,6 @@ emitFromBB cls method = do push eax -- push ref again emit (CHECKCAST _) = nop -- TODO(bernhard): ... - emit ATHROW = -- TODO(bernhard): ... - emit32 (0xffffffff :: Word32) emit I2C = do pop eax and eax (0x000000ff :: Word32) @@ -367,6 +372,7 @@ emitFromBB cls method = do emitSigIllTrap :: Int -> CodeGen e s NativeWord emitSigIllTrap traplen = do + when (traplen < 2) (error "emitSigIllTrap: trap len too short") trapaddr <- getCurrentOffset -- 0xffff causes SIGILL emit8 (0xff :: Word8); emit8 (0xff :: Word8) diff --git a/Mate/X86TrapHandling.hs b/Mate/X86TrapHandling.hs index 5f993a6..b7b81d6 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 resp) reip >>= delFalse (Just (NewObject patcher)) -> patchWithHarpy patcher reip >>= delTrue (Just (VirtualCall False mi io_offset)) -> diff --git a/ffi/trap.c b/ffi/trap.c index c550658..f6281d0 100644 --- a/ffi/trap.c +++ b/ffi/trap.c @@ -20,7 +20,7 @@ #include -ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); +ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); #ifdef DBG_TRAP #define dprintf(args...) do { printf (args); } while (0); @@ -43,7 +43,7 @@ void chandler(int nSignal, siginfo_t *info, void *ctx) "esp 0x%08x, *esp 0x%08x, *(ebp+8) 0x%08x\n", nSignal, eip, eax, ebx, esp, *(ptrdiff_t*) esp, *(ptrdiff_t *) (ebp + 8)); - ptrdiff_t ret = mateHandler(eip, eax, ebx, esi); + ptrdiff_t ret = mateHandler(eip, eax, ebx, esi, esp); if (ret == -1) { dprintf("regdump @ EIP: 0x%08x\n", regs[REG_EIP]); dprintf("\tEAX: 0x%08lx EBX: 0x%08lx ECX: 0x%08lx EDX: 0x%08lx\n", -- 2.25.1