ELF Loader: Use physical addresses instead of virtual ones.
authorGabe Black <gblack@eecs.umich.edu>
Tue, 9 Oct 2007 20:12:04 +0000 (13:12 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Tue, 9 Oct 2007 20:12:04 +0000 (13:12 -0700)
This works in SE mode because the virtual and physical addresses specified for
segments are the same. In Alpha, the LoadAddrMask is still necessary because
the virtual and physical addresses are the same and apparently rely on the
super page mechanism. All of the regressions pass.

--HG--
extra : convert_revision : 45e49dec5002d64e541bc466c61a0f304af29ea5

src/base/loader/elf_object.cc

index 553723e74286e5ec55caf262207de8f2aa875655..653088c449526a4c6e45fab8e8a1adec73c57406 100644 (file)
@@ -176,7 +176,7 @@ ElfObject::tryFile(const string &fname, int fd, size_t len, uint8_t *data)
                 if(phdr.p_offset <= e_phoff &&
                         phdr.p_offset + phdr.p_filesz > e_phoff)
                 {
-                    result->_programHeaderTable = phdr.p_vaddr + e_phoff;
+                    result->_programHeaderTable = phdr.p_paddr + e_phoff;
                     break;
                 }
             }
@@ -261,28 +261,28 @@ ElfObject::ElfObject(const string &_filename, int _fd,
             continue;
 
         // Check to see if this segment contains the bss section.
-        if (phdr.p_vaddr <= bssSecStart &&
-                phdr.p_vaddr + phdr.p_memsz > bssSecStart &&
+        if (phdr.p_paddr <= bssSecStart &&
+                phdr.p_paddr + phdr.p_memsz > bssSecStart &&
                 phdr.p_memsz - phdr.p_filesz > 0) {
-            bss.baseAddr = phdr.p_vaddr + phdr.p_filesz;
+            bss.baseAddr = phdr.p_paddr + phdr.p_filesz;
             bss.size = phdr.p_memsz - phdr.p_filesz;
             bss.fileImage = NULL;
         }
 
         // Check to see if this is the text or data segment
-        if (phdr.p_vaddr <= textSecStart &&
-                phdr.p_vaddr + phdr.p_filesz > textSecStart) {
-            text.baseAddr = phdr.p_vaddr;
+        if (phdr.p_paddr <= textSecStart &&
+                phdr.p_paddr + phdr.p_filesz > textSecStart) {
+            text.baseAddr = phdr.p_paddr;
             text.size = phdr.p_filesz;
             text.fileImage = fileData + phdr.p_offset;
-        } else if (phdr.p_vaddr <= dataSecStart &&
-                phdr.p_vaddr + phdr.p_filesz > dataSecStart) {
-            data.baseAddr = phdr.p_vaddr;
+        } else if (phdr.p_paddr <= dataSecStart &&
+                phdr.p_paddr + phdr.p_filesz > dataSecStart) {
+            data.baseAddr = phdr.p_paddr;
             data.size = phdr.p_filesz;
             data.fileImage = fileData + phdr.p_offset;
         } else {
             Segment extra;
-            extra.baseAddr = phdr.p_vaddr;
+            extra.baseAddr = phdr.p_paddr;
             extra.size = phdr.p_filesz;
             extra.fileImage = fileData + phdr.p_offset;
             extraSegments.push_back(extra);