From 65ae6ebe0280ae677e6903d114ba7eff3a807f0b Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Tue, 31 Aug 2021 19:46:36 -0700 Subject: [PATCH] added more lifters :yawn: --- include/vm_lifters.hpp | 9 ++++++--- src/lifters/shl.cpp | 17 ++++++++++++++++- src/lifters/shld.cpp | 0 src/lifters/sreg.cpp | 11 +++++++++++ src/lifters/write.cpp | 9 +++++++++ 5 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/lifters/shld.cpp diff --git a/include/vm_lifters.hpp b/include/vm_lifters.hpp index e829453..b8cd77c 100644 --- a/include/vm_lifters.hpp +++ b/include/vm_lifters.hpp @@ -32,16 +32,16 @@ namespace vm lconstbsxdw; static lifter_callback_t addq, adddw, addw, addb; - static lifter_callback_t sregq, sregdw, sregb; + static lifter_callback_t sregq, sregdw, sregw, sregb; static lifter_callback_t lregq, lregdw; static lifter_callback_t imulq, imuldw; static lifter_callback_t pushvsp; static lifter_callback_t popvsp; - static lifter_callback_t writeq, writedw, writeb; + static lifter_callback_t writeq, writedw, writew, writeb; static lifter_callback_t readq, readdw, readw, readb; static lifter_callback_t nandq, nanddw, nandw, nandb; static lifter_callback_t shrq, shrdw; - static lifter_callback_t shlq; + static lifter_callback_t shlq, shldw; static lifter_callback_t jmp; static lifter_callback_t lflagsq; static lifter_callback_t vmexit; @@ -63,12 +63,14 @@ namespace vm { vm::handler::SHRQ, &shrq }, { vm::handler::SHRDW, &shrdw }, { vm::handler::SHLQ, &shlq }, + { vm::handler::SHLDW, &shldw }, { vm::handler::IMULQ, &imulq }, { vm::handler::IMULDW, &imuldw }, { vm::handler::PUSHVSPQ, &pushvsp }, { vm::handler::POPVSPQ, &popvsp }, { vm::handler::SREGQ, &sregq }, { vm::handler::SREGDW, &sregdw }, + { vm::handler::SREGW, &sregw }, { vm::handler::SREGB, &sregb }, { vm::handler::LREGQ, &lregq }, { vm::handler::LREGDW, &lregdw }, @@ -78,6 +80,7 @@ namespace vm { vm::handler::READB, &readb }, { vm::handler::WRITEQ, &writeq }, { vm::handler::WRITEDW, &writedw }, + { vm::handler::WRITEW, &writew }, { vm::handler::WRITEB, &writeb }, { vm::handler::NANDQ, &nandq }, { vm::handler::NANDDW, &nanddw }, diff --git a/src/lifters/shl.cpp b/src/lifters/shl.cpp index 60ce8f5..fa34a94 100644 --- a/src/lifters/shl.cpp +++ b/src/lifters/shl.cpp @@ -16,4 +16,19 @@ namespace vm rtn->push( 8, t4 ); rtn->push( 8, rtn->load_value( 8, vmp_rtn->flags ) ); }; -} \ No newline at end of file + + lifters_t::lifter_callback_t lifters_t::shldw = + [ & ]( vm::devirt_t *rtn, const vm::instrs::code_block_t &vm_code_block, const vm::instrs::virt_instr_t &vinstr, + llvm::IRBuilder<> *ir_builder ) { + auto t1 = rtn->pop( 4 ); + auto t2 = rtn->pop( 2 ); + auto t3 = ir_builder->CreateIntCast( t2, llvm::IntegerType::get( *rtn->llvm_ctx, 32 ), false ); + auto t4 = ir_builder->CreateShl( t1, t3 ); + + auto &vmp_rtn = rtn->vmp_rtns.back(); + // TODO: update rflags... + + rtn->push( 4, t4 ); + rtn->push( 8, rtn->load_value( 8, vmp_rtn->flags ) ); + }; +} // namespace vm \ No newline at end of file diff --git a/src/lifters/shld.cpp b/src/lifters/shld.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/lifters/sreg.cpp b/src/lifters/sreg.cpp index 97e6c9e..46e1502 100644 --- a/src/lifters/sreg.cpp +++ b/src/lifters/sreg.cpp @@ -20,6 +20,17 @@ namespace vm ir_builder->CreateStore( ir_builder->CreateIntCast( t1, ir_builder->getInt64Ty(), false ), vreg ); }; + lifters_t::lifter_callback_t lifters_t::sregw = + [ & ]( vm::devirt_t *rtn, const vm::instrs::code_block_t &vm_code_block, const vm::instrs::virt_instr_t &vinstr, + llvm::IRBuilder<> *ir_builder ) { + auto t1 = rtn->pop( 2 ); + auto &vmp_rtn = rtn->vmp_rtns.back(); + auto vreg = vmp_rtn->virtual_registers[ vinstr.operand.imm.u ? vinstr.operand.imm.u / 8 : 0 ]; + ir_builder->CreateStore( + ir_builder->CreateIntCast( t1, ir_builder->getInt16Ty(), false ), + ir_builder->CreatePointerCast( vreg, llvm::PointerType::get( ir_builder->getInt16Ty(), 0ull ) ) ); + }; + lifters_t::lifter_callback_t lifters_t::sregb = [ & ]( vm::devirt_t *rtn, const vm::instrs::code_block_t &vm_code_block, const vm::instrs::virt_instr_t &vinstr, llvm::IRBuilder<> *ir_builder ) { diff --git a/src/lifters/write.cpp b/src/lifters/write.cpp index 89e61de..9097ff8 100644 --- a/src/lifters/write.cpp +++ b/src/lifters/write.cpp @@ -20,6 +20,15 @@ namespace vm ir_builder->CreateStore( t2, t3 ); }; + lifters_t::lifter_callback_t lifters_t::writew = + [ & ]( vm::devirt_t *rtn, const vm::instrs::code_block_t &vm_code_block, const vm::instrs::virt_instr_t &vinstr, + llvm::IRBuilder<> *ir_builder ) { + auto t1 = rtn->pop( 8 ); + auto t2 = rtn->pop( 2 ); + auto t3 = ir_builder->CreateIntToPtr( t1, llvm::PointerType::get( ir_builder->getInt16Ty(), 0ull ) ); + ir_builder->CreateStore( t2, t3 ); + }; + lifters_t::lifter_callback_t lifters_t::writeb = [ & ]( vm::devirt_t *rtn, const vm::instrs::code_block_t &vm_code_block, const vm::instrs::virt_instr_t &vinstr, llvm::IRBuilder<> *ir_builder ) {