Let segmentop scripts follow natural parameter order

This commit is contained in:
caheckman 2021-07-27 14:31:12 -04:00
parent 8253b21bab
commit 05f292a5e7
10 changed files with 15 additions and 15 deletions

View file

@ -1363,8 +1363,8 @@ Address SegmentedResolver::resolve(uintb val,int4 sz,const Address &point,uintb
uintb base = glb->context->getTrackedValue(segop->getResolve(),point); uintb base = glb->context->getTrackedValue(segop->getResolve(),point);
fullEncoding = (base << 8 * innersz) + (val & calc_mask(innersz)); fullEncoding = (base << 8 * innersz) + (val & calc_mask(innersz));
vector<uintb> seginput; vector<uintb> seginput;
seginput.push_back(val);
seginput.push_back(base); seginput.push_back(base);
seginput.push_back(val);
val = segop->execute(seginput); val = segop->execute(seginput);
return Address(spc,AddrSpace::addressToByte(val,spc->getWordSize())); return Address(spc,AddrSpace::addressToByte(val,spc->getWordSize()));
} }
@ -1375,8 +1375,8 @@ Address SegmentedResolver::resolve(uintb val,int4 sz,const Address &point,uintb
uintb base = (val >> 8*innersz) & calc_mask(outersz); uintb base = (val >> 8*innersz) & calc_mask(outersz);
val = val & calc_mask(innersz); val = val & calc_mask(innersz);
vector<uintb> seginput; vector<uintb> seginput;
seginput.push_back(val);
seginput.push_back(base); seginput.push_back(base);
seginput.push_back(val);
val = segop->execute(seginput); val = segop->execute(seginput);
return Address(spc,AddrSpace::addressToByte(val,spc->getWordSize())); return Address(spc,AddrSpace::addressToByte(val,spc->getWordSize()));
} }

View file

@ -644,12 +644,12 @@ int4 ActionSegmentize::apply(Funcdata &data)
} }
if (segdef->getNumVariableTerms()==1) if (segdef->getNumVariableTerms()==1)
bindlist[1] = data.newConstant(4,0); bindlist[0] = data.newConstant(4,0);
// Redefine the op as a segmentop // Redefine the op as a segmentop
data.opSetOpcode(segroot,CPUI_SEGMENTOP); data.opSetOpcode(segroot,CPUI_SEGMENTOP);
data.opSetInput(segroot,data.newVarnodeSpace(spc),0); data.opSetInput(segroot,data.newVarnodeSpace(spc),0);
data.opSetInput(segroot,bindlist[1],1); data.opSetInput(segroot,bindlist[0],1);
data.opSetInput(segroot,bindlist[0],2); data.opSetInput(segroot,bindlist[1],2);
for(int4 j=segroot->numInput()-1;j>2;--j) // Remove anything else for(int4 j=segroot->numInput()-1;j>2;--j) // Remove anything else
data.opRemoveInput(segroot,j); data.opRemoveInput(segroot,j);
count += 1; count += 1;

View file

@ -127,8 +127,8 @@ void EmulatePcodeOp::executeSegmentOp(void)
uintb in1 = getVarnodeValue(currentOp->getIn(1)); uintb in1 = getVarnodeValue(currentOp->getIn(1));
uintb in2 = getVarnodeValue(currentOp->getIn(2)); uintb in2 = getVarnodeValue(currentOp->getIn(2));
vector<uintb> bindlist; vector<uintb> bindlist;
bindlist.push_back(in2);
bindlist.push_back(in1); bindlist.push_back(in1);
bindlist.push_back(in2);
uintb res = segdef->execute(bindlist); uintb res = segdef->execute(bindlist);
setVarnodeValue(currentOp->getOut(), res); setVarnodeValue(currentOp->getOut(), res);
} }

View file

@ -36,7 +36,7 @@ void connect_to_console(Funcdata *fd)
if (remote == (RemoteSocket *)0) { if (remote == (RemoteSocket *)0) {
remote = new RemoteSocket(); remote = new RemoteSocket();
if (remote->open("/tmp/ghidrasocket")) { if (remote->open("/tmp/ghidrasocket")) {
ghidra_dcp = new IfaceStatus("[ghidradbg]> ",*remote->getInputStream(),*remote->getOutputStream()); ghidra_dcp = new IfaceTerm("[ghidradbg]> ",*remote->getInputStream(),*remote->getOutputStream());
IfaceCapability::registerAllCommands(ghidra_dcp); IfaceCapability::registerAllCommands(ghidra_dcp);
} }
} }

View file

@ -7459,8 +7459,8 @@ int4 RuleSegment::applyOp(PcodeOp *op,Funcdata &data)
if (vn1->isConstant() && vn2->isConstant()) { if (vn1->isConstant() && vn2->isConstant()) {
vector<uintb> bindlist; vector<uintb> bindlist;
bindlist.push_back(vn2->getOffset());
bindlist.push_back(vn1->getOffset()); bindlist.push_back(vn1->getOffset());
bindlist.push_back(vn2->getOffset());
uintb val = segdef->execute(bindlist); uintb val = segdef->execute(bindlist);
data.opRemoveInput(op,2); data.opRemoveInput(op,2);
data.opRemoveInput(op,1); data.opRemoveInput(op,1);

View file

@ -143,13 +143,13 @@ bool SegmentOp::unify(Funcdata &data,PcodeOp *op,
innervn = op->getIn(2); innervn = op->getIn(2);
if (basevn->isConstant()) if (basevn->isConstant())
basevn = data.newConstant(baseinsize,basevn->getOffset()); basevn = data.newConstant(baseinsize,basevn->getOffset());
bindlist[1] = basevn; bindlist[0] = basevn;
} }
else else
bindlist[1] = (Varnode *)0; bindlist[0] = (Varnode *)0;
if (innervn->isConstant()) if (innervn->isConstant())
innervn = data.newConstant(innerinsize,innervn->getOffset()); innervn = data.newConstant(innerinsize,innervn->getOffset());
bindlist[0] = innervn; bindlist[1] = innervn;
return true; return true;
} }

View file

@ -8,8 +8,8 @@
<segmentop space="RAM" userop="segment" farpointer="no"> <segmentop space="RAM" userop="segment" farpointer="no">
<pcode> <pcode>
<input name="inner" size="2"/>
<input name="base" size="3"/> <input name="base" size="3"/>
<input name="inner" size="2"/>
<output name="res" size="3"/> <output name="res" size="3"/>
<body><![CDATA[ <body><![CDATA[
res = base ^ zext(inner); res = base ^ zext(inner);

View file

@ -11,8 +11,8 @@
<stackpointer register="SP" space="ram"/> <stackpointer register="SP" space="ram"/>
<segmentop space="ram" userop="segment" farpointer="yes"> <segmentop space="ram" userop="segment" farpointer="yes">
<pcode> <pcode>
<input name="inner" size="2"/>
<input name="base" size="2"/> <input name="base" size="2"/>
<input name="inner" size="2"/>
<output name="res" size="2"/> <output name="res" size="2"/>
<body><![CDATA[ <body><![CDATA[
res = (base << 12) + inner; res = (base << 12) + inner;

View file

@ -9,8 +9,8 @@
<segmented_address space="ram" type="real" /> <segmented_address space="ram" type="real" />
<segmentop space="ram" userop="segment" farpointer="yes"> <segmentop space="ram" userop="segment" farpointer="yes">
<pcode> <pcode>
<input name="inner" size="2"/>
<input name="base" size="2"/> <input name="base" size="2"/>
<input name="inner" size="2"/>
<output name="res" size="4"/> <output name="res" size="4"/>
<body><![CDATA[ <body><![CDATA[
res = (zext(base) << 4) + zext(inner); res = (zext(base) << 4) + zext(inner);

View file

@ -10,8 +10,8 @@
<segmented_address space="ram" type="protected"/> <segmented_address space="ram" type="protected"/>
<segmentop space="ram" userop="segment" farpointer="yes"> <segmentop space="ram" userop="segment" farpointer="yes">
<pcode> <pcode>
<input name="inner" size="2"/>
<input name="base" size="2"/> <input name="base" size="2"/>
<input name="inner" size="2"/>
<output name="res" size="4"/> <output name="res" size="4"/>
<body><![CDATA[ <body><![CDATA[
res = (zext(base) << 16) + zext(inner); res = (zext(base) << 16) + zext(inner);