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

Function LDTRSW

arch/arm64/disassembler/decode2.c:16250–16314  ·  view source on GitHub ↗

ldtrsw.xml */

Source from the content-addressed store, hash-verified

16248
16249/* ldtrsw.xml */
16250int LDTRSW(context *ctx, Instruction *instr)
16251{
16252 int rc = DECODE_STATUS_UNMATCHED;
16253 /* class iclass_base_plus_offset */
16254 /* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
16255 if((INSWORD & 0xFFE00C00)==0xB8800800) {
16256 decode_fields32(ENC_LDTRSW_64_LDST_UNPRIV, ctx, instr);
16257 ctx->wback = FALSE;
16258 ctx->postindex = FALSE;
16259 ctx->scale = UINT(ctx->size);
16260 ctx->offset = SignExtend(ctx->imm9,9);
16261 OK(ENC_LDTRSW_64_LDST_UNPRIV);
16262 }
16263 /* post-decode pcode */
16264 ctx->n = UINT(ctx->Rn);
16265 ctx->t = UINT(ctx->Rt);
16266 ctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);
16267 ctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;
16268 ctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
16269 if(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {
16270 ctx->acctype = ctx->AccType_UNPRIV;
16271 }
16272 else {
16273 ctx->acctype = ctx->AccType_NORMAL;
16274 }
16275 if(SLICE(ctx->opc,1,1)==0) {
16276 if(SLICE(ctx->opc,0,0)==1) {
16277 ctx->memop = MemOp_LOAD;
16278 };
16279 if(ctx->size==3) {
16280 ctx->regsize = 0x40;
16281 };
16282 ctx->signed_ = FALSE;
16283 }
16284 else {
16285 if(ctx->size==3) {
16286 UNDEFINED;
16287 }
16288 else {
16289 ctx->memop = MemOp_LOAD;
16290 if(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {
16291 UNDEFINED;
16292 }
16293 if(SLICE(ctx->opc,0,0)==1) {
16294 ctx->regsize = 0x20;
16295 };
16296 ctx->signed_ = TRUE;
16297 }
16298 }
16299 ctx->datasize = (8) << (ctx->scale);
16300 ctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);
16301 ctx->wb_unknown = FALSE;
16302 ctx->rt_unknown = FALSE;
16303 if(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {
16304 // assignment from ConstrainUnpredictable()
16305 // assert
16306 // switch on constraint
16307 }

Callers 1

Calls 3

decode_fields32Function · 0.85
SignExtendFunction · 0.85
EL2EnabledFunction · 0.85

Tested by

no test coverage detected