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

Function LDTRSB

arch/arm64/disassembler/decode2.c:16114–16179  ·  view source on GitHub ↗

ldtrsb.xml */

Source from the content-addressed store, hash-verified

16112
16113/* ldtrsb.xml */
16114int LDTRSB(context *ctx, Instruction *instr)
16115{
16116 int rc = DECODE_STATUS_UNMATCHED;
16117 /* class iclass_base_plus_offset */
16118 /* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
16119 if((INSWORD & 0xFFA00C00)==0x38800800) {
16120 decode_fields32(ENC_LDTRSB_32_LDST_UNPRIV, ctx, instr);
16121 ctx->wback = FALSE;
16122 ctx->postindex = FALSE;
16123 ctx->scale = UINT(ctx->size);
16124 ctx->offset = SignExtend(ctx->imm9,9);
16125 if(ctx->opc==3) OK(ENC_LDTRSB_32_LDST_UNPRIV);
16126 if(ctx->opc==2) OK(ENC_LDTRSB_64_LDST_UNPRIV);
16127 }
16128 /* post-decode pcode */
16129 ctx->n = UINT(ctx->Rn);
16130 ctx->t = UINT(ctx->Rt);
16131 ctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);
16132 ctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;
16133 ctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
16134 if(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {
16135 ctx->acctype = ctx->AccType_UNPRIV;
16136 }
16137 else {
16138 ctx->acctype = ctx->AccType_NORMAL;
16139 }
16140 if(SLICE(ctx->opc,1,1)==0) {
16141 if(SLICE(ctx->opc,0,0)==1) {
16142 ctx->memop = MemOp_LOAD;
16143 };
16144 if(ctx->size==3) {
16145 ctx->regsize = 0x40;
16146 };
16147 ctx->signed_ = FALSE;
16148 }
16149 else {
16150 if(ctx->size==3) {
16151 UNDEFINED;
16152 }
16153 else {
16154 ctx->memop = MemOp_LOAD;
16155 if(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {
16156 UNDEFINED;
16157 }
16158 if(SLICE(ctx->opc,0,0)==1) {
16159 ctx->regsize = 0x20;
16160 };
16161 ctx->signed_ = TRUE;
16162 }
16163 }
16164 ctx->datasize = (8) << (ctx->scale);
16165 ctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);
16166 ctx->wb_unknown = FALSE;
16167 ctx->rt_unknown = FALSE;
16168 if(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {
16169 // assignment from ConstrainUnpredictable()
16170 // assert
16171 // switch on constraint

Callers 1

Calls 3

decode_fields32Function · 0.85
SignExtendFunction · 0.85
EL2EnabledFunction · 0.85

Tested by

no test coverage detected