Merge remote-tracking branch 'origin/GP-1163_RealModeReferences' into patch

This commit is contained in:
ghidra1 2021-08-04 11:05:35 -04:00
commit 0e81327c46
11 changed files with 31 additions and 24 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

@ -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);

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

@ -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;

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);