From: <mic...@us...> - 2007-04-14 09:35:22
|
Revision: 49 http://svn.sourceforge.net/pearcolator/?rev=49&view=rev Author: michael_baer Date: 2007-04-14 02:35:23 -0700 (Sat, 14 Apr 2007) Log Message: ----------- Moved createSegment() from ProcessSpace to ELF_Loader. Modified Paths: -------------- src/org/binarytranslator/generic/os/loader/elf/ELF_Loader.java src/org/binarytranslator/generic/os/loader/image/ImageLoader.java src/org/binarytranslator/generic/os/process/ProcessSpace.java Modified: src/org/binarytranslator/generic/os/loader/elf/ELF_Loader.java =================================================================== --- src/org/binarytranslator/generic/os/loader/elf/ELF_Loader.java 2007-04-13 18:40:22 UTC (rev 48) +++ src/org/binarytranslator/generic/os/loader/elf/ELF_Loader.java 2007-04-14 09:35:23 UTC (rev 49) @@ -10,6 +10,7 @@ import org.binarytranslator.generic.os.loader.Loader; import org.binarytranslator.generic.os.process.ProcessSpace; +import org.binarytranslator.generic.memory.Memory; import org.binarytranslator.generic.memory.MemoryMapException; import org.binarytranslator.DBT_Options; @@ -935,11 +936,11 @@ break; case PT_LOAD: // A loadable segment try { - ps.createSegment(reader.rFile, - p_offset, p_vaddr, - p_filesz, p_memsz, - (p_flags & PF_R) != 0, (p_flags & PF_W) != 0, (p_flags & PF_X) != 0 - ); + createSegment(ps.memory, + reader.rFile, + p_offset, p_vaddr, + p_filesz, p_memsz, + (p_flags & PF_R) != 0, (p_flags & PF_W) != 0, (p_flags & PF_X) != 0); } catch(MemoryMapException e) { throw new Error("Error in creating: " + this, e); @@ -959,6 +960,68 @@ throw new Error("Segment type " + toString() + " not yet supported"); } } + + /** + * Create a segment + * + * @param memory + * The memory into which the segment is to be mapped. + * @param file + * file to read segment data from if file size != 0 + * @param offset + * file offset + * @param address + * location of segment + * @param filesize + * size of segment in file + * @param memsize + * size of segment in memory + * @param read + * is segment readable + * @param write + * is segment writable + * @param exec + * is segment executable + */ + public void createSegment(Memory memory, RandomAccessFile file, long offset, int address, + int filesize, int memsize, boolean read, boolean write, boolean exec) + throws MemoryMapException { + // Sanity check + if (memsize < filesize) { + throw new Error("Segment memory size (" + memsize + + ")less than file size (" + filesize + ")"); + } + // Are we mapping anything from a file? + if (filesize == 0) { + // No: map anonymously + memory.map(address, memsize, read, write, exec); + } else { + // align offset and address + int alignedAddress; + long alignedOffset; + int alignedFilesize; + if (memory.isPageAligned(address)) { + // memory and therefore offset should be aligned + alignedAddress = address; + alignedOffset = offset; + alignedFilesize = filesize; + } else { + // Address not aligned + alignedAddress = memory.truncateToPage(address); + int delta = address - alignedAddress; + // adjust offset and length too + alignedOffset = offset - delta; + alignedFilesize = filesize + delta; + } + memory.map(file, alignedOffset, alignedAddress, alignedFilesize, read, + write, exec); + // Do we need to map in some blank pages at the end of the segment? + if (filesize < memsize) { + alignedAddress = memory.truncateToNextPage(address + filesize); + memory.map(alignedAddress, memsize - filesize, read, write, exec); + } + } + } /** * Round the give value up so that it is at the beginning of the Modified: src/org/binarytranslator/generic/os/loader/image/ImageLoader.java =================================================================== --- src/org/binarytranslator/generic/os/loader/image/ImageLoader.java 2007-04-13 18:40:22 UTC (rev 48) +++ src/org/binarytranslator/generic/os/loader/image/ImageLoader.java 2007-04-14 09:35:23 UTC (rev 49) @@ -113,7 +113,7 @@ int fileAndMemSize = (int)file.length() - 16; try { - ps.createSegment(file, 16, 0, fileAndMemSize, fileAndMemSize, true, true, true); + ps.memory.map(file, 16, 0, fileAndMemSize, true, true, true); } catch (MemoryMapException e) { e.printStackTrace(); Modified: src/org/binarytranslator/generic/os/process/ProcessSpace.java =================================================================== --- src/org/binarytranslator/generic/os/process/ProcessSpace.java 2007-04-13 18:40:22 UTC (rev 48) +++ src/org/binarytranslator/generic/os/process/ProcessSpace.java 2007-04-14 09:35:23 UTC (rev 49) @@ -9,7 +9,6 @@ package org.binarytranslator.generic.os.process; import java.io.IOException; -import java.io.RandomAccessFile; import org.binarytranslator.DBT_Options; import org.binarytranslator.arch.arm.os.process.ARM_ProcessSpace; @@ -18,7 +17,6 @@ import org.binarytranslator.generic.branch.BranchLogic; import org.binarytranslator.generic.execution.GdbController.GdbTarget; import org.binarytranslator.generic.memory.Memory; -import org.binarytranslator.generic.memory.MemoryMapException; import org.binarytranslator.generic.os.loader.Loader; import org.jikesrvm.compilers.opt.ir.OPT_GenerationContext; import org.jikesrvm.compilers.opt.ir.OPT_HIRGenerator; @@ -98,66 +96,6 @@ } /** - * Create a segment - * - * @param RandomAccessFile - * file to read segment data from if file size != 0 - * @param offset - * file offset - * @param address - * location of segment - * @param filesize - * size of segment in file - * @param memsize - * size of segment in memory - * @param read - * is segment readable - * @param write - * is segment writable - * @param exec - * is segment executable - */ - public void createSegment(RandomAccessFile file, long offset, int address, - int filesize, int memsize, boolean read, boolean write, boolean exec) - throws MemoryMapException { - // Sanity check - if (memsize < filesize) { - throw new Error("Segment memory size (" + memsize - + ")less than file size (" + filesize + ")"); - } - // Are we mapping anything from a file? - if (filesize == 0) { - // No: map anonymously - memory.map(address, memsize, read, write, exec); - } else { - // align offset and address - int alignedAddress; - long alignedOffset; - int alignedFilesize; - if (memory.isPageAligned(address)) { - // memory and therefore offset should be aligned - alignedAddress = address; - alignedOffset = offset; - alignedFilesize = filesize; - } else { - // Address not aligned - alignedAddress = memory.truncateToPage(address); - int delta = address - alignedAddress; - // adjust offset and length too - alignedOffset = offset - delta; - alignedFilesize = filesize + delta; - } - memory.map(file, alignedOffset, alignedAddress, alignedFilesize, read, - write, exec); - // Do we need to map in some blank pages at the end of the segment? - if (filesize < memsize) { - alignedAddress = memory.truncateToNextPage(address + filesize); - memory.map(alignedAddress, memsize - filesize, read, write, exec); - } - } - } - - /** * Initialise the process space * * @param loader This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |