mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
Merge remote-tracking branch 'origin/GP-1163_RealModeReferences' into patch
This commit is contained in:
commit
0e81327c46
11 changed files with 31 additions and 24 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7489,8 +7489,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -254,8 +254,8 @@ public class HighFunctionDBUtil {
|
||||||
|
|
||||||
Register reg = var.getRegister();
|
Register reg = var.getRegister();
|
||||||
if (reg != null) {
|
if (reg != null) {
|
||||||
program.getReferenceManager().addRegisterReference(pcAddr, -1, reg, RefType.WRITE,
|
program.getReferenceManager()
|
||||||
source);
|
.addRegisterReference(pcAddr, -1, reg, RefType.WRITE, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
return var;
|
return var;
|
||||||
|
@ -496,8 +496,7 @@ public class HighFunctionDBUtil {
|
||||||
VariableStorage storage = highSymbol.getStorage();
|
VariableStorage storage = highSymbol.getStorage();
|
||||||
Address pcAddr = highSymbol.getPCAddress();
|
Address pcAddr = highSymbol.getPCAddress();
|
||||||
HighVariable tmpHigh = highSymbol.getHighVariable();
|
HighVariable tmpHigh = highSymbol.getHighVariable();
|
||||||
if (!storage.isHashStorage() && tmpHigh != null &&
|
if (!storage.isHashStorage() && tmpHigh != null && tmpHigh.requiresDynamicStorage()) {
|
||||||
tmpHigh.requiresDynamicStorage()) {
|
|
||||||
DynamicEntry entry = DynamicEntry.build(tmpHigh.getRepresentative());
|
DynamicEntry entry = DynamicEntry.build(tmpHigh.getRepresentative());
|
||||||
storage = entry.getStorage();
|
storage = entry.getStorage();
|
||||||
pcAddr = entry.getPCAdress(); // The address may change from original Varnode
|
pcAddr = entry.getPCAdress(); // The address may change from original Varnode
|
||||||
|
@ -728,17 +727,25 @@ public class HighFunctionDBUtil {
|
||||||
}
|
}
|
||||||
if (op.getOpcode() == PcodeOp.PTRSUB) {
|
if (op.getOpcode() == PcodeOp.PTRSUB) {
|
||||||
Varnode vnode = op.getInput(0);
|
Varnode vnode = op.getInput(0);
|
||||||
|
Varnode cnode = op.getInput(1);
|
||||||
if (vnode.isRegister()) {
|
if (vnode.isRegister()) {
|
||||||
AddressSpace stackspace = program.getAddressFactory().getStackSpace();
|
AddressSpace stackspace = program.getAddressFactory().getStackSpace();
|
||||||
if (stackspace != null) {
|
if (stackspace != null) {
|
||||||
Address caddr = op.getInput(1).getAddress();
|
storageAddress = stackspace.getAddress(cnode.getOffset());
|
||||||
storageAddress = stackspace.getAddress(caddr.getOffset());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Address caddr = op.getInput(1).getAddress();
|
AddressSpace space = program.getAddressFactory().getDefaultAddressSpace();
|
||||||
storageAddress = program.getAddressFactory().getDefaultAddressSpace().getAddress(
|
if (space instanceof SegmentedAddressSpace) {
|
||||||
caddr.getOffset());
|
// Assume this is a "full" encoding of the offset
|
||||||
|
int innersize = space.getPointerSize();
|
||||||
|
int base = (int) (cnode.getOffset() >>> 8 * innersize);
|
||||||
|
int off = (int) cnode.getOffset() & ((1 << 8 * innersize) - 1);
|
||||||
|
storageAddress = ((SegmentedAddressSpace) space).getAddress(base, off);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
storageAddress = space.getAddress(cnode.getOffset());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return storageAddress;
|
return storageAddress;
|
||||||
|
|
|
@ -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