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

Function LDTR

arch/arm64/disassembler/decode2.c:15912–15977  ·  view source on GitHub ↗

ldtr.xml */

Source from the content-addressed store, hash-verified

15910
15911/* ldtr.xml */
15912int LDTR(context *ctx, Instruction *instr)
15913{
15914 int rc = DECODE_STATUS_UNMATCHED;
15915 /* class iclass_base_plus_offset */
15916 /* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
15917 if((INSWORD & 0xBFE00C00)==0xB8400800) {
15918 decode_fields32(ENC_LDTR_32_LDST_UNPRIV, ctx, instr);
15919 ctx->wback = FALSE;
15920 ctx->postindex = FALSE;
15921 ctx->scale = UINT(ctx->size);
15922 ctx->offset = SignExtend(ctx->imm9,9);
15923 if(ctx->size==2) OK(ENC_LDTR_32_LDST_UNPRIV);
15924 if(ctx->size==3) OK(ENC_LDTR_64_LDST_UNPRIV);
15925 }
15926 /* post-decode pcode */
15927 ctx->n = UINT(ctx->Rn);
15928 ctx->t = UINT(ctx->Rt);
15929 ctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);
15930 ctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;
15931 ctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
15932 if(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {
15933 ctx->acctype = ctx->AccType_UNPRIV;
15934 }
15935 else {
15936 ctx->acctype = ctx->AccType_NORMAL;
15937 }
15938 if(SLICE(ctx->opc,1,1)==0) {
15939 if(SLICE(ctx->opc,0,0)==1) {
15940 ctx->memop = MemOp_LOAD;
15941 };
15942 if(ctx->size==3) {
15943 ctx->regsize = 0x40;
15944 };
15945 ctx->signed_ = FALSE;
15946 }
15947 else {
15948 if(ctx->size==3) {
15949 UNDEFINED;
15950 }
15951 else {
15952 ctx->memop = MemOp_LOAD;
15953 if(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {
15954 UNDEFINED;
15955 }
15956 if(SLICE(ctx->opc,0,0)==1) {
15957 ctx->regsize = 0x20;
15958 };
15959 ctx->signed_ = TRUE;
15960 }
15961 }
15962 ctx->datasize = (8) << (ctx->scale);
15963 ctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);
15964 ctx->wb_unknown = FALSE;
15965 ctx->rt_unknown = FALSE;
15966 if(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {
15967 // assignment from ConstrainUnpredictable()
15968 // assert
15969 // switch on constraint

Callers 1

Calls 3

decode_fields32Function · 0.85
SignExtendFunction · 0.85
EL2EnabledFunction · 0.85

Tested by

no test coverage detected