Skip to content

Commit

Permalink
- Added support for Big and Little Endian Applications on ARM
Browse files Browse the repository at this point in the history
- Added memory implementations for big endian


git-svn-id: http://pearcolator.svn.sourceforge.net/svnroot/pearcolator@174 f9fe5334-281c-0410-a981-a1a969458ad4
  • Loading branch information
Michael Baer committed Aug 27, 2007
1 parent c29a5b4 commit fb037a1
Show file tree
Hide file tree
Showing 10 changed files with 1,319 additions and 44 deletions.
4 changes: 3 additions & 1 deletion rvmroot.patch
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ Index: build/primordials/RVM_OPT.txt
[Lorg/jikesrvm/compilers/opt/OPT_Simplifier$DefUseEffect;
[Lorg/jikesrvm/compilers/opt/ir/OPT_Operator;
+[Lorg/binarytranslator/generic/os/loader/elf/ELF_File$ELF_Identity$AddressSize;
+[Lorg/binarytranslator/generic/os/loader/elf/ELF_File$ELF_Identity$ByteOrder;
+[Lorg/binarytranslator/generic/os/loader/elf/ELF_File$ByteOrder;
+[Lorg/binarytranslator/generic/os/loader/elf/ELF_File$Header$ObjectFileType;
+[Lorg/binarytranslator/generic/os/loader/elf/ELF_File$SegmentRange;
+[Lorg/binarytranslator/vmInterface/DummyDynamicCodeRunner;
Expand All @@ -157,4 +157,6 @@ Index: build/primordials/RVM_OPT.txt
+[Lorg/binarytranslator/arch/arm/decoder/ARM_Instructions$Instruction$Condition;
+[Lorg/binarytranslator/arch/arm/decoder/ARM_Instructions$DataProcessing$Opcode;
+[Lorg/binarytranslator/arch/arm/decoder/ARM_Instructions$OperandWrapper$ShiftType;
+[Lorg/binarytranslator/arch/arm/decoder/ARM_Laziness$Operation;
+[Lorg/binarytranslator/arch/arm/decoder/ARM_Laziness$Flag;

9 changes: 8 additions & 1 deletion src/org/binarytranslator/arch/arm/decoder/ARM_Options.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.binarytranslator.arch.arm.decoder;

import org.binarytranslator.generic.os.loader.elf.ELF_File.ByteOrder;

public class ARM_Options {

public enum FlagBehaviour {
Expand Down Expand Up @@ -39,6 +41,9 @@ public enum MemoryModel {
/** Sets the memory model that ARM shall use. */
public static MemoryModel memoryModel = MemoryModel.IntAddressed;

/** Override the byte order read from the ELF file. */
public static ByteOrder enforcedByteOrder = null;

public static void parseOption(String key, String value) {
if (key.equalsIgnoreCase("optimizeByProfiling")) {
optimizeTranslationByProfiling = Boolean.parseBoolean(value);
Expand All @@ -50,7 +55,9 @@ public static void parseOption(String key, String value) {
memoryModel = ARM_Options.MemoryModel.valueOf(value);
} else if (key.equalsIgnoreCase("optimizedFlags")) {
useOptimizedFlags = Boolean.parseBoolean(value);
}
} else if (key.equalsIgnoreCase("byteOrder")) {
enforcedByteOrder = ByteOrder.valueOf(value);
}
else {
throw new Error("Unknown ARM option: " + key);
}
Expand Down
62 changes: 55 additions & 7 deletions src/org/binarytranslator/arch/arm/os/process/ARM_ProcessSpace.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,23 @@
import org.binarytranslator.arch.arm.os.process.linux.ARM_LinuxProcessSpace;
import org.binarytranslator.generic.decoder.CodeTranslator;
import org.binarytranslator.generic.decoder.Interpreter;
import org.binarytranslator.generic.memory.ByteAddressedBigEndianMemory;
import org.binarytranslator.generic.memory.ByteAddressedLittleEndianMemory;
import org.binarytranslator.generic.memory.IntAddressedBigEndianMemory;
import org.binarytranslator.generic.memory.IntAddressedLittleEndianMemory;
import org.binarytranslator.generic.os.loader.Loader;
import org.binarytranslator.generic.os.loader.elf.ELF_Loader;
import org.binarytranslator.generic.os.loader.elf.ELF_File.ByteOrder;
import org.binarytranslator.generic.os.process.ProcessSpace;
import org.binarytranslator.vmInterface.DBT_Trace;
import org.jikesrvm.compilers.opt.ir.OPT_GenerationContext;
import org.vmmagic.pragma.Uninterruptible;

public abstract class ARM_ProcessSpace extends ProcessSpace {


/** Registers used by this process */
public ARM_Registers registers;


/**
* Debug information
*
Expand All @@ -38,16 +40,44 @@ private static void report(String s) {
}
}

protected ARM_ProcessSpace() {
protected ARM_ProcessSpace(ByteOrder byteOrder) {
registers = new ARM_Registers();

switch (ARM_Options.memoryModel) {
case ByteAddressed:
memory = new ByteAddressedLittleEndianMemory();

switch (byteOrder)
{
case LittleEndian:
memory = new ByteAddressedLittleEndianMemory();
break;

case BigEndian:
memory = new ByteAddressedBigEndianMemory();
break;

default:
throw new RuntimeException("Unexpected byte order: " + byteOrder);
}

break;

case IntAddressed:
memory = new IntAddressedLittleEndianMemory();

switch (byteOrder)
{
case LittleEndian:
memory = new IntAddressedLittleEndianMemory();
break;

case BigEndian:
memory = new IntAddressedBigEndianMemory();
break;

default:
throw new RuntimeException("Unexpected byte order: " + byteOrder);
}

break;

default:
Expand Down Expand Up @@ -79,12 +109,30 @@ public CodeTranslator createTranslator(OPT_GenerationContext context, DBT_Trace
public static ProcessSpace createProcessSpaceFromBinary(Loader loader)
throws IOException {
Loader.ABI abi = loader.getABI();

//determine the byte order for the memory implementation
ByteOrder byteOrder = ARM_Options.enforcedByteOrder;

if (byteOrder == null) {
if (loader instanceof ELF_Loader) {
//read the byte order from the elf file
byteOrder = ((ELF_Loader)loader).getFile().getByteOrder();
}
else {
byteOrder = ByteOrder.LittleEndian;
System.err.println("WARNING: Unable to deduce byte order from binary file. Defaulting to " + byteOrder);
}
}
else {
System.err.println("WARNING: Overriding byte order set by ELF file to " + byteOrder);
}

if (abi == Loader.ABI.ARM) {
report("Creating ARM Linux ABI Process space");
return new ARM_LinuxProcessSpace();
return new ARM_LinuxProcessSpace(byteOrder);
} else {
report("Creating ARM image process space.");
return new ARM_ImageProcessSpace();
return new ARM_ImageProcessSpace(byteOrder);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,16 @@
import org.binarytranslator.generic.execution.GdbController.GdbTarget;
import org.binarytranslator.generic.fault.InsufficientMemoryException;
import org.binarytranslator.generic.os.loader.Loader;
import org.binarytranslator.generic.os.loader.elf.ELF_File.ByteOrder;

public class ARM_ImageProcessSpace extends ARM_ProcessSpace {

private AngelSystemCalls sysCalls;
private final int STACK_SIZE = 4096 * 1000;
private final int HEAP_SIZE = 4096 * 1000;

public ARM_ImageProcessSpace() {
super();

//make sure that pages of memory are automatically mapped in as they are requested.
//memory = new AutoMappingMemory(memory);
public ARM_ImageProcessSpace(ByteOrder byteOrder) {
super(byteOrder);
}

private int allocateFreeMemoryArea(int stackSize) throws InsufficientMemoryException
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.binarytranslator.generic.os.abi.linux.LinuxSystemCalls;
import org.binarytranslator.generic.os.loader.Loader;
import org.binarytranslator.generic.os.loader.elf.ELF_Loader;
import org.binarytranslator.generic.os.loader.elf.ELF_File.ByteOrder;

public class ARM_LinuxProcessSpace extends ARM_ProcessSpace {

Expand All @@ -31,7 +32,9 @@ public class ARM_LinuxProcessSpace extends ARM_ProcessSpace {
*/
private int[] auxVector;

public ARM_LinuxProcessSpace() {
public ARM_LinuxProcessSpace(ByteOrder byteOrder) {
super(byteOrder);

sysCallGenerator = new Legacy(this);
sysCalls = new ARM_LinuxSystemCalls(this, sysCallGenerator);
}
Expand Down
Loading

0 comments on commit fb037a1

Please sign in to comment.