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,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: Level4.java,v 1.3 2007/09/18 11:35:11 fros4943 Exp $
* $Id: Level4.java,v 1.4 2008/11/20 16:22:28 fros4943 Exp $
*/
import java.io.*;
@ -45,7 +45,8 @@ public class Level4 {
}
private native void doCount();
private native int getRefAddress();
public native void setReferenceAddress(int addr);
public Level4() {
// Configure logger
@ -152,12 +153,9 @@ public class Level4 {
System.exit(1);
}
int absRefAddress = getRefAddress();
System.out.println("Absolute reference address: 0x" + Integer.toHexString(absRefAddress));
int relRefAddress = (Integer) addresses.get("ref_var");
System.out.println("Relative reference address: 0x" + Integer.toHexString(relRefAddress));
int offsetRelToAbs = absRefAddress - relRefAddress;
System.out.println("Offset relative-absolute: 0x" + Integer.toHexString(offsetRelToAbs));
setReferenceAddress(relRefAddress);
doCount();
doCount();

View file

@ -26,16 +26,27 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: level4.c,v 1.2 2007/09/10 14:07:12 fros4943 Exp $
* $Id: level4.c,v 1.3 2008/11/20 16:22:28 fros4943 Exp $
*/
#include <jni.h>
#include <stdio.h>
int ref_var;
long ref_var; /* Placed somewhere in the BSS section */
int initialized_counter=1;
int uninitialized_counter;
int initialized_counter=1; /* Variable in data section */
int uninitialized_counter; /* Variable in BSS section */
JNIEXPORT void JNICALL
Java_Level4_setReferenceAddress(JNIEnv *env, jobject obj, jint addr)
{
/*printf("relative reference address is %p\n", addr);*/
/*printf("absolute reference address is %p\n", &ref_var);*/
ref_var = (((long)&ref_var) - ((long)addr));
printf("Offset is 0x%p\n", ref_var);
fflush(stdout);
}
JNIEXPORT void JNICALL
Java_Level4_doCount(JNIEnv *env, jobject obj)
@ -43,8 +54,3 @@ Java_Level4_doCount(JNIEnv *env, jobject obj)
printf(">> DATA_counter=\t%i\tBSS_counter=\t%i\n", initialized_counter++, uninitialized_counter++);
fflush(stdout);
}
JNIEXPORT jint JNICALL
Java_Level4_getRefAddress(JNIEnv *env, jobject obj)
{
return (jint) &ref_var;
}

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 {

View file

@ -26,17 +26,29 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: level5.c,v 1.3 2007/09/10 14:07:12 fros4943 Exp $
* $Id: level5.c,v 1.4 2008/11/20 16:22:28 fros4943 Exp $
*/
#include <jni.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int ref_var;
long ref_var; /* Placed somewhere in the BSS section */
int initialized_counter=1;
int uninitialized_counter;
int initialized_counter=1; /* Variable in data section */
int uninitialized_counter; /* Variable in BSS section */
JNIEXPORT void JNICALL
Java_Level5_setReferenceAddress(JNIEnv *env, jobject obj, jint addr)
{
/*printf("relative reference address is %p\n", addr);*/
/*printf("absolute reference address is %p\n", &ref_var);*/
ref_var = (((long)&ref_var) - ((long)addr));
printf("Offset is 0x%p\n", ref_var);
fflush(stdout);
}
JNIEXPORT void JNICALL
Java_Level5_doCount(JNIEnv *env, jobject obj)
@ -44,22 +56,26 @@ Java_Level5_doCount(JNIEnv *env, jobject obj)
printf(">> DATA_counter=\t%i\tBSS_counter=\t%i\n", ++initialized_counter, ++uninitialized_counter);
fflush(stdout);
}
JNIEXPORT jint JNICALL
Java_Level5_getRefAddress(JNIEnv *env, jobject obj)
JNIEXPORT void JNICALL
Java_Level5_getMemory(JNIEnv *env, jobject obj, jint rel_addr, jint length, jbyteArray mem_arr)
{
return (jint) &ref_var;
(*env)->SetByteArrayRegion(
env,
mem_arr,
0,
(size_t) length,
(jbyte *) (((long)rel_addr) + ref_var)
);
}
JNIEXPORT void JNICALL
Java_Level5_getMemory(JNIEnv *env, jobject obj, jint start, jint length, jbyteArray mem_arr)
{
(*env)->SetByteArrayRegion(env, mem_arr, 0, (size_t) length, (jbyte *) start);
}
JNIEXPORT void JNICALL
Java_Level5_setMemory(JNIEnv *env, jobject obj, jint start, jint length, jbyteArray mem_arr)
Java_Level5_setMemory(JNIEnv *env, jobject obj, jint rel_addr, jint length, jbyteArray mem_arr)
{
jbyte *mem = (*env)->GetByteArrayElements(env, mem_arr, 0);
memcpy((void *) start, mem, length);
memcpy(
(char*) (((long)rel_addr) + ref_var),
mem,
length);
(*env)->ReleaseByteArrayElements(env, mem_arr, mem, 0);
}