1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 22:22:11 +02:00

2005-03-24 Alain Magloire

* cdi/org/eclipse/cdt/debug/mi/core/cdi/MemoryManager.java
	* cdi/org/eclipse/cdt/debug/mi/core/cdi/Memoryblock.java
	* cdi/org/eclipse/cdt/debug/mi/core/cdi/Target.java
	* mi/org/eclipse/cdt/debug/mi/core/command/MIShowEndian.java
	* mi/org/eclipse/cdt/debug/mi/core/output/MIShowEndianInfo.java
This commit is contained in:
Alain Magloire 2005-03-25 05:00:10 +00:00
parent fcfbda5c0e
commit 28ea038670
6 changed files with 205 additions and 10 deletions

View file

@ -1,3 +1,10 @@
2005-03-24 Alain Magloire
* cdi/org/eclipse/cdt/debug/mi/core/cdi/MemoryManager.java
* cdi/org/eclipse/cdt/debug/mi/core/cdi/Memoryblock.java
* cdi/org/eclipse/cdt/debug/mi/core/cdi/Target.java
* mi/org/eclipse/cdt/debug/mi/core/command/MIShowEndian.java
* mi/org/eclipse/cdt/debug/mi/core/output/MIShowEndianInfo.java
2005-03-23 Alain Magloire
Changes in the CDI ICDIMemoryBlock && ICDIMemoryBlockManagement API.
* cdi/org/eclipse/cdt/debug/mi/core/cdi/MemoryManager.java

View file

@ -135,8 +135,9 @@ public class MemoryManager extends Manager {
Target target = (Target)block.getTarget();
String exp = block.getExpression();
int wordSize = block.getWordSize();
boolean little = target.isLittleEndian();
MIDataReadMemoryInfo info = createMIDataReadMemoryInfo(target.getMISession(), exp, (int)block.getLength(), wordSize);
return new MemoryBlock(target, exp, wordSize, info);
return new MemoryBlock(target, exp, wordSize, little, info);
}
/**
@ -158,8 +159,9 @@ public class MemoryManager extends Manager {
}
public ICDIMemoryBlock createMemoryBlock(Target target, String address, int units, int wordSize) throws CDIException {
boolean little = target.isLittleEndian();
MIDataReadMemoryInfo info = createMIDataReadMemoryInfo(target.getMISession(), address, units, wordSize);
ICDIMemoryBlock block = new MemoryBlock(target, address, wordSize, info);
ICDIMemoryBlock block = new MemoryBlock(target, address, wordSize, little, info);
List blockList = getMemoryBlockList(target);
blockList.add(block);
MISession miSession = target.getMISession();

View file

@ -41,12 +41,14 @@ public class MemoryBlock extends CObject implements ICDIMemoryBlock {
private BigInteger cStartAddress; //cached start address
private byte[] cBytes; //cached bytes
private int[] badOffsets;
private boolean fIsLittleEndian;
public MemoryBlock(Target target, String exp, int wordSize, MIDataReadMemoryInfo info) {
public MemoryBlock(Target target, String exp, int wordSize, boolean isLittle, MIDataReadMemoryInfo info) {
super(target);
expression = exp;
fWordSize = wordSize;
frozen = true;
fIsLittleEndian = isLittle;
setMIDataReadMemoryInfo(info);
}
@ -136,14 +138,23 @@ public class MemoryBlock extends CObject implements ICDIMemoryBlock {
MIMemory[] miMem = m.getMemories();
for (int i = 0; i < miMem.length; ++i) {
long[] data = miMem[i].getData();
if (data.length > 0) {
int blen = bytes.length;
byte[] newBytes = new byte[blen + data.length];
System.arraycopy(bytes, 0, newBytes, 0, blen);
for (int j = 0; j < data.length; ++j, ++blen) {
newBytes[blen] = (byte)data[j];
if (data != null && data.length > 0) {
// int blen = bytes.length;
// byte[] newBytes = new byte[blen + data.length];
// System.arraycopy(bytes, 0, newBytes, 0, blen);
// for (int j = 0; j < data.length; ++j, ++blen) {
// newBytes[blen] = (byte)data[j];
// }
// bytes = newBytes;
for (int j = 0; j < data.length; ++j) {
byte[] bs = longToBytes(data[j]);
// grow the array
int blen = bytes.length;
byte[] newBytes = new byte[blen + bs.length];
System.arraycopy(bytes, 0, newBytes, 0, blen);
System.arraycopy(bs, 0, newBytes, blen, bs.length);
bytes = newBytes;
}
bytes = newBytes;
}
}
return bytes;
@ -201,6 +212,14 @@ public class MemoryBlock extends CObject implements ICDIMemoryBlock {
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlock#getLength()
*/
public long getLength() {
try {
// use this instead. If the wordSize
// given does not match the hardware,
// counting the bytes will be correct.
return getBytes().length;
} catch (CDIException e) {
// ignore.
}
return mem.getTotalBytes();
}
@ -273,4 +292,54 @@ public class MemoryBlock extends CObject implements ICDIMemoryBlock {
return VALID;
}
/**
* We should use the wordSize ... but ...
* The problem: the user may not have the right wordsize
* For example on some DSP the user set the wordSize to be 1 byte
* but in fact GDB is reading 2 bytes.
* So let do some guessing since the data(long) may have a bigger value then one byte.
*/
private byte[] longToBytes(long v) {
// Calculate the number of bytes needed
int count = 1;
long value = v;
for (count = 1; (value /= 0x100) > 0; ++count)
;
// Reset the wordSize if incorrect.
if (fWordSize != count) {
fWordSize = count;
}
byte[] bytes = new byte[count];
if (fIsLittleEndian) {
for (int i = count - 1; i >= 0; --i) {
int shift = i * count;
bytes[i] = (byte)((v >>> shift) & 0xFF);
}
// bytes[7] = (byte)((v >>> 56) & 0xFF);
// bytes[6] = (byte)((v >>> 48) & 0xFF);
// bytes[5] = (byte)((v >>> 40) & 0xFF);
// bytes[4] = (byte)((v >>> 32) & 0xFF);
// bytes[3] = (byte)((v >>> 24) & 0xFF);
// bytes[2] = (byte)((v >>> 16) & 0xFF);
// bytes[1] = (byte)((v >>> 8) & 0xFF);
// bytes[0] = (byte)((v >>> 0) & 0xFF);
} else {
for (int i = 0; i < count; ++i) {
int shift = (count - i - 1) * count;
bytes[i] = (byte)((v >>> shift) & 0xFF);
}
// bytes[0] = (byte)((v >>> 56) & 0xFF);
// bytes[1] = (byte)((v >>> 48) & 0xFF);
// bytes[2] = (byte)((v >>> 40) & 0xFF);
// bytes[3] = (byte)((v >>> 32) & 0xFF);
// bytes[4] = (byte)((v >>> 24) & 0xFF);
// bytes[5] = (byte)((v >>> 16) & 0xFF);
// bytes[6] = (byte)((v >>> 8) & 0xFF);
// bytes[7] = (byte)((v >>> 0) & 0xFF);
}
return bytes;
}
}

View file

@ -60,6 +60,7 @@ import org.eclipse.cdt.debug.mi.core.command.MIExecStepInstruction;
import org.eclipse.cdt.debug.mi.core.command.MIExecUntil;
import org.eclipse.cdt.debug.mi.core.command.MIInfoThreads;
import org.eclipse.cdt.debug.mi.core.command.MIJump;
import org.eclipse.cdt.debug.mi.core.command.MIShowEndian;
import org.eclipse.cdt.debug.mi.core.command.MISignal;
import org.eclipse.cdt.debug.mi.core.command.MITargetDetach;
import org.eclipse.cdt.debug.mi.core.command.MIThreadSelect;
@ -70,6 +71,7 @@ import org.eclipse.cdt.debug.mi.core.output.MIDataEvaluateExpressionInfo;
import org.eclipse.cdt.debug.mi.core.output.MIFrame;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
import org.eclipse.cdt.debug.mi.core.output.MIInfoThreadsInfo;
import org.eclipse.cdt.debug.mi.core.output.MIShowEndianInfo;
import org.eclipse.cdt.debug.mi.core.output.MIThreadSelectInfo;
/**
@ -81,6 +83,7 @@ public class Target extends SessionObject implements ICDITarget {
Thread[] noThreads = new Thread[0];
Thread[] currentThreads;
int currentThreadId;
String fEndian = null;
public Target(Session s, MISession mi) {
super(s);
@ -335,6 +338,24 @@ public class Target extends SessionObject implements ICDITarget {
return th;
}
public boolean isLittleEndian() throws CDIException {
if (fEndian == null) {
CommandFactory factory = miSession.getCommandFactory();
MIShowEndian endian = new MIShowEndian();
try {
miSession.postCommand(endian);
MIShowEndianInfo info = endian.getMIShowEndianInfo();
if (info == null) {
throw new CDIException(CdiResources.getString("cdi.model.Target.Target_not_responding")); //$NON-NLS-1$
}
fEndian = info.isLittleEndian() ? "le" : "be"; //$NON-NLS-1$ //$NON-NLS-2$
} catch (MIException e) {
throw new MI2CDIException(e);
}
}
return fEndian.equals("le"); //$NON-NLS-1$
}
/**
* @see org.eclipse.cdt.debug.core.cdi.model.ICDITarget#restart()
*/

View file

@ -0,0 +1,41 @@
/*******************************************************************************
* Copyright (c) 2000, 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.command;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.output.MIInfo;
import org.eclipse.cdt.debug.mi.core.output.MIOutput;
import org.eclipse.cdt.debug.mi.core.output.MIShowEndianInfo;
public class MIShowEndian extends CLICommand {
public MIShowEndian() {
super("show endian"); //$NON-NLS-1$
}
public MIShowEndianInfo getMIShowEndianInfo() throws MIException {
return (MIShowEndianInfo)getMIInfo();
}
public MIInfo getMIInfo() throws MIException {
MIInfo info = null;
MIOutput out = getMIOutput();
if (out != null) {
info = new MIShowEndianInfo(out);
if (info.isError()) {
throwMIException(info, out);
}
}
return info;
}
}

View file

@ -0,0 +1,55 @@
/*******************************************************************************
* Copyright (c) 2000, 2004 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.output;
/**
* show endian
&"show endian\n"
~"The target endianness is set automatically (currently little endian)\n"
^done
*
*/
public class MIShowEndianInfo extends MIInfo {
boolean littleEndian;
public MIShowEndianInfo(MIOutput out) {
super(out);
parse();
}
public boolean isLittleEndian() {
return littleEndian;
}
void parse() {
if (isDone()) {
MIOutput out = getMIOutput();
MIOOBRecord[] oobs = out.getMIOOBRecords();
for (int i = 0; i < oobs.length; i++) {
if (oobs[i] instanceof MIConsoleStreamOutput) {
MIStreamRecord cons = (MIStreamRecord) oobs[i];
String str = cons.getString();
// We are interested in the signal info
parseLine(str);
}
}
}
}
void parseLine(String str) {
if (str != null && str.length() > 0) {
littleEndian = (str.indexOf("little") != -1);
}
}
}