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

Function STTRH

arch/arm64/disassembler/decode2.c:26320–26384  ·  view source on GitHub ↗

sttrh.xml */

Source from the content-addressed store, hash-verified

26318
26319/* sttrh.xml */
26320int STTRH(context *ctx, Instruction *instr)
26321{
26322 int rc = DECODE_STATUS_UNMATCHED;
26323 /* class iclass_base_plus_offset */
26324 /* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
26325 if((INSWORD & 0xFFE00C00)==0x78000800) {
26326 decode_fields32(ENC_STTRH_32_LDST_UNPRIV, ctx, instr);
26327 ctx->wback = FALSE;
26328 ctx->postindex = FALSE;
26329 ctx->scale = UINT(ctx->size);
26330 ctx->offset = SignExtend(ctx->imm9,9);
26331 OK(ENC_STTRH_32_LDST_UNPRIV);
26332 }
26333 /* post-decode pcode */
26334 ctx->n = UINT(ctx->Rn);
26335 ctx->t = UINT(ctx->Rt);
26336 ctx->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(ctx->HCR_EL2_NV,ctx->HCR_EL2_NV1,1)==3);
26337 ctx->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(ctx->HCR_EL2_E2H,ctx->HCR_EL2_TGE,1)==3;
26338 ctx->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
26339 if(!ctx->user_access_override && (ctx->unpriv_at_el1 || ctx->unpriv_at_el2)) {
26340 ctx->acctype = ctx->AccType_UNPRIV;
26341 }
26342 else {
26343 ctx->acctype = ctx->AccType_NORMAL;
26344 }
26345 if(SLICE(ctx->opc,1,1)==0) {
26346 if(SLICE(ctx->opc,0,0)==1) {
26347 ctx->memop = MemOp_LOAD;
26348 };
26349 if(ctx->size==3) {
26350 ctx->regsize = 0x40;
26351 };
26352 ctx->signed_ = FALSE;
26353 }
26354 else {
26355 if(ctx->size==3) {
26356 UNDEFINED;
26357 }
26358 else {
26359 ctx->memop = MemOp_LOAD;
26360 if(ctx->size==2 && SLICE(ctx->opc,0,0)==1) {
26361 UNDEFINED;
26362 }
26363 if(SLICE(ctx->opc,0,0)==1) {
26364 ctx->regsize = 0x20;
26365 };
26366 ctx->signed_ = TRUE;
26367 }
26368 }
26369 ctx->datasize = (8) << (ctx->scale);
26370 ctx->tag_checked = ctx->memop!=MemOp_PREFETCH && (ctx->wback || ctx->n!=0x1f);
26371 ctx->wb_unknown = FALSE;
26372 ctx->rt_unknown = FALSE;
26373 if(ctx->memop==MemOp_LOAD && ctx->wback && ctx->n==ctx->t && ctx->n!=0x1f) {
26374 // assignment from ConstrainUnpredictable()
26375 // assert
26376 // switch on constraint
26377 }

Callers 1

Calls 3

decode_fields32Function · 0.85
SignExtendFunction · 0.85
EL2EnabledFunction · 0.85

Tested by

no test coverage detected