ci <- getClassInfo path
return $ ciFile ci
-getStaticFieldOffset :: B.ByteString -> B.ByteString -> IO CUInt
+getStaticFieldOffset :: B.ByteString -> B.ByteString -> IO CPtrdiff
getStaticFieldOffset path field = do
ci <- getClassInfo path
return $ fromIntegral $ ciStaticMap ci M.! field
-- one slot for "method-table-ptr"
return $ (1 + fsize) * 4
-getStaticFieldAddr :: CUInt -> IO CUInt
+getStaticFieldAddr :: CPtrdiff -> IO CPtrdiff
getStaticFieldAddr from = do
trapmap <- getTrapMap
let w32_from = fromIntegral from
printfStr "mallocString: %d\n" size
mallocBytes size
-foreign export ccall mallocObject :: Int -> IO CUInt
-mallocObject :: Int -> IO CUInt
+foreign export ccall mallocObject :: Int -> IO CPtrdiff
+mallocObject :: Int -> IO CPtrdiff
mallocObject size = do
ptr <- mallocBytes size
printfStr "mallocObject: %d\n" size
code_void :: FunPtr (IO ()) -> IO ()
-getMethodEntry :: CUInt -> CUInt -> IO CUInt
+getMethodEntry :: CPtrdiff -> CPtrdiff -> IO CPtrdiff
getMethodEntry signal_from methodtable = do
mmap <- getMethodMap
tmap <- getTrapMap
addMethodRef :: Word32 -> MethodInfo -> [B.ByteString] -> IO ()
compileBB :: RawMethod -> MethodInfo -> IO Word32
executeFuncPtr :: Word32 -> IO ()
-getMethodEntry :: CUInt -> CUInt -> IO CUInt
+getMethodEntry :: CPtrdiff -> CPtrdiff -> IO CPtrdiff
fsize <- getObjectSize "java/lang/String"
printfStr "string: fsize: %d (should be 4 * 5)\n" fsize
tblptr <- mallocObject $ fromIntegral fsize
- let ptr = intPtrToPtr (fromIntegral tblptr) :: Ptr CUInt
+ let ptr = intPtrToPtr (fromIntegral tblptr) :: Ptr CPtrdiff
mtbl <- getMethodTable "java/lang/String"
poke ptr $ fromIntegral mtbl
copyBytes (plusPtr newstr 4) arr strlen
printfStr "new str ptr: (%s)@%d\n" (toString str) strlen
- let newstr_length = castPtr newstr :: Ptr CUInt
+ let newstr_length = castPtr newstr :: Ptr CPtrdiff
poke newstr_length $ fromIntegral strlen
-- set value pointer
- poke (plusPtr ptr 4) (fromIntegral (ptrToIntPtr newstr) :: CUInt)
+ poke (plusPtr ptr 4) (fromIntegral (ptrToIntPtr newstr) :: CPtrdiff)
-- set count field
- poke (plusPtr ptr 8) (fromIntegral strlen :: CUInt)
+ poke (plusPtr ptr 8) (fromIntegral strlen :: CPtrdiff)
-- set hash code (TODO)
- poke (plusPtr ptr 12) (0 :: CUInt)
+ poke (plusPtr ptr 12) (0 :: CPtrdiff)
-- set offset
- poke (plusPtr ptr 16) (0 :: CUInt)
+ poke (plusPtr ptr 16) (0 :: CPtrdiff)
return $ fromIntegral tblptr
foreign import ccall "&mallocObject"
- mallocObjectAddr :: FunPtr (Int -> IO CUInt)
+ mallocObjectAddr :: FunPtr (Int -> IO CPtrdiff)
type EntryPoint = Ptr Word8
type EntryPointOffset = Int
| VirtualMethodCall Bool
| InterfaceMethodCall Bool
-getTrapType :: TrapMap -> CUInt -> CUInt -> TrapType
+getTrapType :: TrapMap -> CPtrdiff -> CPtrdiff -> TrapType
getTrapType tmap signal_from from2 =
case M.lookup (fromIntegral signal_from) tmap of
(Just (StaticMethod _)) -> StaticMethodCall
(Just _) -> error "getTrapType: abort #1 :-("
Nothing -> error $ "getTrapType: abort #2 :-(" ++ show signal_from ++ ", " ++ show from2 ++ ", " ++ show tmap
-foreign export ccall mateHandler :: CUInt -> CUInt -> CUInt -> CUInt -> IO CUInt
-mateHandler :: CUInt -> CUInt -> CUInt -> CUInt -> IO CUInt
+foreign export ccall mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
+mateHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> CPtrdiff -> IO CPtrdiff
mateHandler eip eax ebx esp = do
callerAddr <- callerAddrFromStack esp
tmap <- getTrapMap
VirtualMethodCall imm8 -> invokeHandler eax eax esp imm8
InterfaceMethodCall imm8 -> invokeHandler eax ebx esp imm8
-staticCallHandler :: CUInt -> IO CUInt
+staticCallHandler :: CPtrdiff -> IO CPtrdiff
staticCallHandler eip = do
-- the actual insn to patch is displaced by two bytes
let insn_ptr = intPtrToPtr (fromIntegral (eip - 2)) :: Ptr CUChar
-- call offset is displaced by one byte
- let imm_ptr = intPtrToPtr (fromIntegral (eip - 1)) :: Ptr CUInt
+ let imm_ptr = intPtrToPtr (fromIntegral (eip - 1)) :: Ptr CPtrdiff
-- in codegen we set the immediate to some magic value
-- in order to produce a SIGILL signal. we also do a safety
-- check here, if we're really the "owner" of this signal.
return (eip - 2)
else error "staticCallHandler: something is wrong here. abort\n"
-staticFieldHandler :: CUInt -> IO CUInt
+staticFieldHandler :: CPtrdiff -> IO CPtrdiff
staticFieldHandler eip = do
-- patch the offset here, first two bytes are part of the insn (opcode + reg)
- let imm_ptr = intPtrToPtr (fromIntegral (eip + 2)) :: Ptr CUInt
+ let imm_ptr = intPtrToPtr (fromIntegral (eip + 2)) :: Ptr CPtrdiff
checkMe <- peek imm_ptr
if checkMe == 0x00000000 then
do
return eip
else error "staticFieldHandler: something is wrong here. abort.\n"
-invokeHandler :: CUInt -> CUInt -> CUInt -> Bool -> IO CUInt
+invokeHandler :: CPtrdiff -> CPtrdiff -> CPtrdiff -> Bool -> IO CPtrdiff
invokeHandler method_table table2patch esp imm8 = do
-- table2patch: note, that can be a method-table or a interface-table
callerAddr <- callerAddrFromStack esp
return entryAddr
-callerAddrFromStack :: CUInt -> IO CUInt
+callerAddrFromStack :: CPtrdiff -> IO CPtrdiff
callerAddrFromStack = peek . intPtrToPtr . fromIntegral
-offsetOfCallInsn8 :: CUInt -> IO CUInt
+offsetOfCallInsn8 :: CPtrdiff -> IO CPtrdiff
offsetOfCallInsn8 esp = do
- let ret_ptr = intPtrToPtr (fromIntegral esp) :: Ptr CUInt
+ let ret_ptr = intPtrToPtr (fromIntegral esp) :: Ptr CPtrdiff
ret <- peek ret_ptr
retval <- peek (intPtrToPtr (fromIntegral (ret - 1)) :: Ptr CUChar)
return $ fromIntegral retval
-offsetOfCallInsn32 :: CUInt -> IO CUInt
+offsetOfCallInsn32 :: CPtrdiff -> IO CPtrdiff
offsetOfCallInsn32 esp = do
- let ret_ptr = intPtrToPtr (fromIntegral esp) :: Ptr CUInt
+ let ret_ptr = intPtrToPtr (fromIntegral esp) :: Ptr CPtrdiff
ret <- peek ret_ptr
peek (intPtrToPtr $ fromIntegral (ret - 4))
(l) check different types (byte, long, ...)
-(l) get rid of CUInt where appropriate
- -> CPtrdiff and CSize (ptrdiff_t and size_t) is more portable
-
(l) floating point support
(h) better code generation
#include <stdio.h>
#include <stdlib.h>
+#include <stddef.h>
#include "../debug.h"
#include <sys/ucontext.h>
-unsigned int mateHandler(unsigned int, unsigned int, unsigned int, unsigned int);
+ptrdiff_t mateHandler(ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t);
#ifdef DBG_TRAP
#define dprintf(args...) do { printf (args); } while (0);
{
mcontext_t *mctx = &((ucontext_t *) ctx)->uc_mcontext;
- unsigned int eip = (unsigned int) mctx->gregs[REG_EIP];
- unsigned int eax = (unsigned int) mctx->gregs[REG_EAX];
- unsigned int ebx = (unsigned int) mctx->gregs[REG_EBX];
- unsigned int esp = (unsigned int) mctx->gregs[REG_ESP];
+ ptrdiff_t eip = (ptrdiff_t) mctx->gregs[REG_EIP];
+ ptrdiff_t eax = (ptrdiff_t) mctx->gregs[REG_EAX];
+ ptrdiff_t ebx = (ptrdiff_t) mctx->gregs[REG_EBX];
+ ptrdiff_t esp = (ptrdiff_t) mctx->gregs[REG_ESP];
dprintf("trap: type %d, eip 0x%08x, eax 0x%08x, ebx 0x%08x, "
"esp 0x%08x, *esp 0x%08x\n", nSignal, eip,
- eax, ebx, esp, *(unsigned int*) esp);
+ eax, ebx, esp, *(ptrdiff_t*) esp);
mctx->gregs[REG_EIP] = mateHandler(eip, eax, ebx, esp);
}