Hi.

This patch adds vaddr_to_fileoffset() for x86_64.

Thanks
Ken'ichi Ohmichi

diff -puN makedumpfile.org/makedumpfile.c makedumpfile/makedumpfile.c
--- makedumpfile.org/makedumpfile.c     2006-10-04 16:36:57.000000000 +0900
+++ makedumpfile/makedumpfile.c 2006-10-04 16:37:26.000000000 +0900
@@ -36,7 +36,7 @@ struct vm_table *vt = 0;
  *  It is not in the memory image.
  */
 off_t
-paddr_to_fileoffset(struct DumpInfo *info,  unsigned long paddr)
+paddr_to_offset(struct DumpInfo *info, unsigned long paddr)
 {
        int i;
        off_t offset;
@@ -61,7 +61,7 @@ paddr_to_fileoffset(struct DumpInfo *inf
  *  It is not in the memory image.
  */
 off_t
-vaddr_to_fileoffset(struct DumpInfo *info,  unsigned long vaddr)
+vaddr_to_offset_general(struct DumpInfo *info, unsigned long vaddr)
 {
        int i;
        off_t offset;
@@ -106,7 +106,7 @@ readmem(struct DumpInfo *info, unsigned 
        /*
         * Convert Virtual Address to File Offset.
         */
-       if (!(offset = vaddr_to_fileoffset(info, vaddr))) {
+       if (!(offset = vaddr_to_offset(info, vaddr))) {
                ERRMSG("Can't convert a virtual address(%lx) to offset.\n",
                    vaddr);
                return FALSE;
@@ -1453,7 +1453,7 @@ is_memory_hole(struct dump_bitmap *bitma
 static inline int
 is_in_segs(struct DumpInfo *info, unsigned long long paddr)
 {
-       if (paddr_to_fileoffset(info, paddr))
+       if (paddr_to_offset(info, paddr))
                return TRUE;
        else
                return FALSE;
@@ -2799,7 +2799,7 @@ write_pages(struct DumpInfo *info)
                if (!is_dumpable(&bitmap2, pfn))
                        continue;
 
-               offset_memory = paddr_to_fileoffset(info, info->page_size*pfn);
+               offset_memory = paddr_to_offset(info, info->page_size*pfn);
                if (lseek(info->fd_memory, offset_memory, SEEK_SET)
                    == failed) {
                        ERRMSG("Can't seek the dump memory(%s). %s\n",
diff -puN makedumpfile.org/makedumpfile.h makedumpfile/makedumpfile.h
--- makedumpfile.org/makedumpfile.h     2006-10-04 16:36:57.000000000 +0900
+++ makedumpfile/makedumpfile.h 2006-10-04 16:37:26.000000000 +0900
@@ -342,13 +342,16 @@ do { \
 int get_machdep_info_x86();
 #define get_phys_base(X)       TRUE
 #define get_machdep_info(X)    get_machdep_info_x86(X)
+#define vaddr_to_offset(X, Y)  vaddr_to_offset_general(X,Y)
 #endif /* x86 */
 
 #ifdef __x86_64__
 int get_phys_base_x86_64();
 int get_machdep_info_x86_64();
+off_t vaddr_to_offset_x86_64();
 #define get_phys_base(X)       get_phys_base_x86_64(X)
 #define get_machdep_info(X)    get_machdep_info_x86_64(X)
+#define vaddr_to_offset(X, Y)  vaddr_to_offset_x86_64(X, Y)
 #endif /* x86_64 */
 
 #ifdef __ia64__ /* ia64 */
@@ -356,6 +359,7 @@ int get_phys_base_ia64();
 int get_machdep_info_ia64();
 #define get_machdep_info(X)    get_machdep_info_ia64(X)
 #define get_phys_base(X)       get_phys_base_ia64(X)
+#define vaddr_to_offset(X, Y)  vaddr_to_offset_general(X, Y)
 #define VADDR_REGION(X)                ((X) >> REGION_SHIFT)
 #endif          /* ia64 */
 
diff -puN makedumpfile.org/x86_64.c makedumpfile/x86_64.c
--- makedumpfile.org/x86_64.c   2006-10-04 16:36:57.000000000 +0900
+++ makedumpfile/x86_64.c       2006-10-04 16:37:26.000000000 +0900
@@ -65,5 +65,37 @@ get_machdep_info_x86_64(struct DumpInfo 
        return TRUE;
 }
 
+off_t
+vaddr_to_offset_x86_64(struct DumpInfo *info,  unsigned long vaddr)
+{
+       int i;
+       off_t offset;
+       unsigned long paddr;
+       struct pt_load_segment *pls;
+
+       for (i = offset = 0; i < info->num_load_memory; i++) {
+               pls = &info->pt_load_segments[i];
+               if ((vaddr >= pls->virt_start)
+                   && (vaddr < pls->virt_end)) {
+                       offset = (off_t)(vaddr - pls->virt_start) +
+                               pls->file_offset;
+                               break;
+               }
+       }
+       if (!offset && (vaddr < __START_KERNEL_map)) {
+               paddr = vaddr - PAGE_OFFSET;
+               for (i = offset = 0; i < info->num_load_memory; i++) {
+                       pls = &info->pt_load_segments[i];
+                       if ((paddr >= pls->phys_start)
+                           && (paddr < pls->phys_end)) {
+                               offset = (off_t)(paddr - pls->phys_start) +
+                                       pls->file_offset;
+                                       break;
+                       }
+               }
+       }
+       return offset;
+}
+
 #endif /* x86_64 */
 
_
_______________________________________________
fastboot mailing list
[email protected]
https://lists.osdl.org/mailman/listinfo/fastboot

Reply via email to