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