towards adding support for 64-bit architectures: registering relative memory addresses with contiki instead of fetching absolute addresses to java

This commit is contained in:
fros4943 2008-11-20 16:22:28 +00:00
parent a59cbaf19f
commit 11fa5a9a6b
4 changed files with 103 additions and 57 deletions

View file

@ -26,14 +26,14 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: Level5.java,v 1.4 2007/09/18 11:35:11 fros4943 Exp $
* $Id: Level5.java,v 1.5 2008/11/20 16:22:28 fros4943 Exp $
*/
import java.io.*;
import java.util.Properties;
import java.util.Vector;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.log4j.BasicConfigurator;
import se.sics.cooja.GUI;
import se.sics.cooja.SectionMoteMemory;
import se.sics.cooja.contikimote.ContikiMoteType;
@ -46,9 +46,10 @@ public class Level5 {
}
private native void doCount();
private native int getRefAddress();
public native void getMemory(int start, int length, byte[] mem);
public native void setMemory(int start, int length, byte[] mem);
public native void setReferenceAddress(int addr);
public native void getMemory(int addr, int length, byte[] mem);
public native void setMemory(int addr, int length, byte[] mem);
private int javaDataCounter = 1;
private int javaBssCounter = 0;
@ -56,7 +57,7 @@ public class Level5 {
public Level5() {
// Configure logger
DOMConfigurator.configure(GUI.class.getResource("/" + GUI.LOG_CONFIG_FILE));
BasicConfigurator.configure();
// Load configuration
System.out.println("Loading COOJA configuration");
@ -126,16 +127,15 @@ public class Level5 {
bssSectionSize = ContikiMoteType.loadBssSectionSize(mapData);
}
int absRefAddress = getRefAddress();
int relRefAddress = (Integer) addresses.get("ref_var");
int offsetRelToAbs = absRefAddress - relRefAddress;
setReferenceAddress(relRefAddress);
System.out.println("Creating section memory");
byte[] initialDataSection = new byte[dataSectionSize];
byte[] initialBssSection = new byte[bssSectionSize];
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
SectionMoteMemory memory = new SectionMoteMemory(addresses);
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
@ -145,8 +145,14 @@ public class Level5 {
System.out.print("Checking initial values: ");
dataCounter = memory.getIntValueOf("initialized_counter");
bssCounter = memory.getIntValueOf("uninitialized_counter");
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
if (dataCounter != javaDataCounter) {
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else if (bssCounter != javaBssCounter) {
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else {
System.out.println("OK!");
}
@ -159,13 +165,18 @@ public class Level5 {
doCount(); javaDataCounter++; javaBssCounter++;
System.out.print("Checking increased values: ");
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
dataCounter = memory.getIntValueOf("initialized_counter");
bssCounter = memory.getIntValueOf("uninitialized_counter");
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
if (dataCounter != javaDataCounter) {
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else if (bssCounter != javaBssCounter) {
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else {
@ -177,8 +188,8 @@ public class Level5 {
byte[] savedBssSection = new byte[bssSectionSize];
int savedDataCounter = dataCounter;
int savedBssCounter = bssCounter;
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, savedDataSection);
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, savedBssSection);
getMemory(relDataSectionAddr, dataSectionSize, savedDataSection);
getMemory(relBssSectionAddr, bssSectionSize, savedBssSection);
System.out.println("Increasing counters 3 times");
doCount(); javaDataCounter++; javaBssCounter++;
@ -186,13 +197,18 @@ public class Level5 {
doCount(); javaDataCounter++; javaBssCounter++;
System.out.print("Checking increased values: ");
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
dataCounter = memory.getIntValueOf("initialized_counter");
bssCounter = memory.getIntValueOf("uninitialized_counter");
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
if (dataCounter != javaDataCounter) {
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else if (bssCounter != javaBssCounter) {
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else {
@ -200,7 +216,7 @@ public class Level5 {
}
System.out.println("Restoring data segment");
setMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, savedDataSection);
setMemory(relDataSectionAddr, dataSectionSize, savedDataSection);
javaDataCounter = savedDataCounter;
System.out.println("Increasing counters 3 times");
@ -209,13 +225,18 @@ public class Level5 {
doCount(); javaDataCounter++; javaBssCounter++;
System.out.print("Checking reset data counter: ");
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
dataCounter = memory.getIntValueOf("initialized_counter");
bssCounter = memory.getIntValueOf("uninitialized_counter");
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
if (dataCounter != javaDataCounter) {
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else if (bssCounter != javaBssCounter) {
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else {
@ -223,17 +244,22 @@ public class Level5 {
}
System.out.println("Restoring bss segment");
setMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, savedBssSection);
setMemory(relBssSectionAddr, bssSectionSize, savedBssSection);
javaBssCounter = savedBssCounter;
System.out.print("Checking reset bss counter: ");
getMemory(relDataSectionAddr + offsetRelToAbs, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr + offsetRelToAbs, bssSectionSize, initialBssSection);
getMemory(relDataSectionAddr, dataSectionSize, initialDataSection);
getMemory(relBssSectionAddr, bssSectionSize, initialBssSection);
memory.setMemorySegment(relDataSectionAddr, initialDataSection);
memory.setMemorySegment(relBssSectionAddr, initialBssSection);
dataCounter = memory.getIntValueOf("initialized_counter");
bssCounter = memory.getIntValueOf("uninitialized_counter");
if (dataCounter != javaDataCounter || bssCounter != javaBssCounter) {
if (dataCounter != javaDataCounter) {
System.out.println("DATA mismatch (" + dataCounter + " != " + javaDataCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else if (bssCounter != javaBssCounter) {
System.out.println("BSS mismatch (" + bssCounter + " != " + javaBssCounter + ")");
System.out.println("FAILED!");
System.exit(1);
} else {