MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / LDTRB

Function LDTRB

arch/arm64/disassembler/decode2.c:15980–16044  ·  view source on GitHub ↗

ldtrb.xml */

Source from the content-addressed store, hash-verified

15978
15979/* ldtrb.xml */
15980int LDTRB(context *ctx, Instruction *instr)
15981{
15982 int rc = DECODE_STATUS_UNMATCHED;
15983 /* class iclass_base_plus_offset */
15984 /* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
15985 if((INSWORD & 0xFFE00C00)==0x38400800) {
15986 decode_fields32(ENC_LDTRB_32_LDST_UNPRIV, ctx, instr);
15987 ctx->wback = FALSE;
15988 ctx->postindex = FALSE;
15989 ctx->scale = UINT(ctx->size);
15990 ctx->offset = SignExtend(ctx->imm9,9);
15991 OK(ENC_LDTRB_32_LDST_UNPRIV);
15992 }
15993 /* post-decode pcode */
15994 ctx->n = UINT(ctx->Rn);
15995 ctx->t = UINT(ctx->Rt);
15996 ctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);
15997 ctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;
15998 ctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
15999 if(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {
16000 ctx->acctype = ctx->AccType_UNPRIV;
16001 }
16002 else {
16003 ctx->acctype = ctx->AccType_NORMAL;
16004 }
16005 if(SLICE(ctx->opc,1,1)==0) {
16006 if(SLICE(ctx->opc,0,0)==1) {
16007 ctx->memop = MemOp_LOAD;
16008 };
16009 if(ctx->size==3) {
16010 ctx->regsize = 0x40;
16011 };
16012 ctx->signed_ = FALSE;
16013 }
16014 else {
16015 if(ctx->size==3) {
16016 UNDEFINED;
16017 }
16018 else {
16019 ctx->memop = MemOp_LOAD;
16020 if(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {
16021 UNDEFINED;
16022 }
16023 if(SLICE(ctx->opc,0,0)==1) {
16024 ctx->regsize = 0x20;
16025 };
16026 ctx->signed_ = TRUE;
16027 }
16028 }
16029 ctx->datasize = (8) << (ctx->scale);
16030 ctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);
16031 ctx->wb_unknown = FALSE;
16032 ctx->rt_unknown = FALSE;
16033 if(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {
16034 // assignment from ConstrainUnpredictable()
16035 // assert
16036 // switch on constraint
16037 }

Callers 1

Calls 3

decode_fields32Function · 0.85
SignExtendFunction · 0.85
EL2EnabledFunction · 0.85

Tested by

no test coverage detected