mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
Let segmentop scripts follow natural parameter order
This commit is contained in:
parent
8253b21bab
commit
05f292a5e7
10 changed files with 15 additions and 15 deletions
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue