WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
Xen

xen-devel

[Top] [All Lists]

[Xen-devel] dom0cut script patches

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] dom0cut script patches
From: "Kazuo Moriwaka" <moriwaka@xxxxxxxxxxxxx>
Date: 2006年5月22日 22:05:37 +0900
Delivery-date: 2006年5月22日 06:06:02 -0700
Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:sender:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition:x-google-sender-auth; b=MftKTtfB4GVNpSHGJjv9Dm0q0TZpXd3jHivVyNhDVD4cjAiyaMp9tidOHPLmMb9DOCjugtrCLYI9GwV5FplUOIUBf6YDzc7oXa5V2EasGj3u4EdG4mK23Pgyr2GbFTf9B38N/igFTlJKAVM+l+wOhSppgel1BhQYNNCScsKKoc4=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Hi,
I fix some bugs about dom0cut script's ELF Core output.
- It was assumed that phys_to_machine mapping and pagetables have same state,
 and it is wrong. Now the script uses pagetable information only
 to create ELF core image.
- ElfCoreReader._get_pages() returned wrong pages.
- some measures against slowness.
- some cleanups.
Index: ElfCore.py
===================================================================
RCS file: /cvsroot/xen_ia64/people/moriwaka/dom0cut/ElfCore.py,v
retrieving revision 1.9
retrieving revision 1.11
diff -u -r1.9 -r1.11
--- ElfCore.py 19 May 2006 08:49:44 -0000 1.9
+++ ElfCore.py 22 May 2006 12:49:54 -0000 1.11
@@ -4,6 +4,7 @@
and their abstruct class ElfCore
'''
+import sys
import os
import re
import CoreDump
@@ -23,9 +24,12 @@
 currentrange = [start, start + 1]
 oldoffset = start - m2v[start]
+ count = 0
 for mfn in mfns:
 if not mfn in m2v:
+ count += 1
+ print 'mfn %d cannot found in m2v mapping' % mfn, count
 continue # this page is not mapped
 offset = mfn - m2v[mfn]
 if oldoffset == offset and currentrange[1] == mfn:
@@ -56,7 +60,7 @@
 Elf Section header class.
 '''
- def __init__(self, typename, offset, vaddr, maddr, filesize,
memsize, flag, align):
+ def __init__(self, typename, offset, vaddr, maddr, filesize,
memsize, flag, align, arch):
 self.typename = typename
 self.offset = offset
 self.vaddr = vaddr
@@ -65,13 +69,27 @@
 self.memsize = memsize
 self.flag = flag
 self.align = align
+ self.arch = arch
+ firstmfn = self.maddr / self.arch.page_size
+
+ self.pages = range(firstmfn, firstmfn + (self.memsize) /
self.arch.page_size)
+ self.pageoffset = dict([(mfn, (mfn - firstmfn) *
self.arch.page_size + self.offset) for mfn in self.pages])
+
 def has_maddr(self, maddr):
 return self.maddr <= maddr < self.maddr + self.memsize
 def maddr_to_offset(self, maddr):
- return maddr - self.maddr + self.offset
+ if self.has_maddr(maddr):
+ return maddr - self.maddr + self.offset
+ else:
+ return None
+ def mfn_to_offset(self, mfn):
+ if mfn in self.pageoffset:
+ return self.pageoffset[mfn]
+ else:
+ return None
class ElfCore(CoreDump.CoreDump):
 '''
@@ -83,19 +101,18 @@
 self.pages = []
 self.file = None
 self.m2v = None
- self.p2m = None
+ self.p2m = None # not used
 self.note = ''
 def mfn2offset(self, mfn):
 offset = None
- for sec in self.sections:
- if sec.has_maddr(self.arch.mfn_to_maddr(mfn)):
- offset = sec.maddr_to_offset(self.arch.mfn_to_maddr(mfn))
- break
- if offset == None:
- raise KeyError, '%s not found' % mfn
- return offset
+ for sec in self.sections:
+ offset = sec.mfn_to_offset(mfn)
+ if offset != None:
+ return offset
+ raise KeyError('%s doesn\'t have mfn 0x%x' % (self.corefilename, mfn))
+
 def read_page(self, mfn):
 '''return a page data'''
 offset = self.mfn2offset(mfn)
@@ -103,9 +120,18 @@
 data = self.file.read(self.arch.page_size)
 return data
+ def write_page(self, mfn, data):
+ '''put a page into index and write data into file. header is
not updated by this.'''
+ offset = self.mfn2offset(mfn)
+ self.file.seek(offset)
+ self.file.write(data)
+
 def has_page(self, mfn):
 '''return a page is there or not'''
- return mfn in self.pages
+ if self.m2v:
+ return mfn in self.m2v
+ else:
+ return mfn in self.pages
 def get_pagelist(self):
 '''return a list of all available mfn'''
@@ -138,20 +164,19 @@
 def set_m2v(self, m2v):
 '''set machine to virtual mapping'''
 self.m2v = m2v
- if self.p2m:
- self._update_sections()
-
+ self._update_sections()
+
 def set_p2m(self, p2m):
 '''set pfn2mfn for this dump image'''
- self.p2m = p2m
- if self.m2v:
- self._update_sections()
-
-
+ # not used in elf
+
 def _update_sections(self):
- '''update section info from p2m & m2v'''
+ '''update section info from m2v'''
+
+ self.pages = self.m2v.keys()
+ self.pages.sort()
- pagemap = m2v_to_sections(self.m2v, self.p2m.values())
+ pagemap = m2v_to_sections(self.m2v, self.pages)
 dataoffset = self.arch.round_pgup(
 # ELF heaer
 libelf.sizeof_elf32_ehdr +
@@ -168,10 +193,10 @@
 self.arch.page_size *
s['nr_pages'], # memsize
 'RWE',
 self.arch.page_size, # page align
+ self.arch,
 )
 for s in pagemap]
-
class ElfCoreReader(ElfCore):
 '''
 ELF core image file reader class.
@@ -199,7 +224,7 @@
 if sec.typename == 'LOAD':
 start_mfn = self.arch.maddr_to_mfn(sec.maddr)
 end_mfn = self.arch.maddr_to_mfn(sec.maddr + sec.memsize)
- pages = pages + range(start_mfn, end_mfn+1)
+ pages = pages + range(start_mfn, end_mfn)
 return pages
 def _read_sections(self):
@@ -225,7 +250,7 @@
 memsize = int(memsize, 16)
 align = int(align, 16)
- sections.append( ElfSection(typename, offset, vaddr,
paddr, filesize, memsize, flag, align) )
+ sections.append( ElfSection(typename, offset, vaddr,
paddr, filesize, memsize, flag, align, self.arch) )
 return sections
@@ -237,12 +262,17 @@
 def __init__(self, corefilename, arch):
 ElfCore.__init__(self, corefilename, arch)
 self.file = file(corefilename, 'r+')
-
+ self.elf = None
+ self.phdr = []
+ self._header_size = 0
+ self.note = ''
 def set_note(self, note):
+ '''set note header\'s contents by string'''
 self.note = note
 def _elf_init(self):
+ '''make elf struct, elf header, and phdr'''
 libelf.format(self.arch.elf_format)
 libelf.version(libelf.EV_CURRENT)
 self.elf = libelf.begin(self.file, libelf.ELF_C_WRITE, None)
@@ -258,6 +288,7 @@
 def _fill_note_hdr(self):
 '''make PT_NOTE header'''
+
 self.note_offset = (libelf.sizeof_elf32_ehdr +
 (1 + len(self.sections)) *
libelf.sizeof_elf32_phdr)
 phdr = self.phdrs[0]
@@ -273,6 +304,7 @@
 def _fill_load_hdr(self):
 '''make PT_LOAD header'''
+
 for i, sec in enumerate(self.sections):
 phdr = self.phdrs[1 + i]
 phdr.p_type = libelf.PT_LOAD
@@ -286,10 +318,13 @@
 def _elf_write_notes(self):
 '''make ELF notes'''
+
 self.file.seek(self.note_offset)
 self.file.write(self.note)
 def _elf_end(self):
+ '''write elf headers.'''
+
 self.elf.update(libelf.ELF_C_WRITE)
 self._header_size = self.elf.end()
@@ -299,34 +334,30 @@
 self._elf_init()
 # make program headers
- note = self._fill_note_hdr()
- loads = self._fill_load_hdr()
+ self._fill_note_hdr()
+ self._fill_load_hdr()
 self._elf_write_notes()
 # write headers, set self.page_offset
- offset = self._elf_end()
+ self._elf_end()
 def fetch_pages(self, other):
 '''copy pages from other dump'''
 count = 0
 pagebuf = {}
+ nullpage = '0円' * self.arch.page_size
+
+ for mfn in self.pages:
+ try:
+ pagebuf[mfn] = other.read_page(mfn)
+ except:
+ pagebuf[mfn] = nullpage
+ sys.stderr.write("%s doesn't have mfn 0x%x, the page
is filled with '\0円'\n" % (other.corefilename, mfn))
- pages = self.p2m.values()
- pages.sort()
-
- for mfn in pages:
- pagebuf[mfn] = other.read_page(mfn)
 count += 1
- if count % 1024 == 0 or count == len(pages):
+ if count % 1024 == 0 or count == len(self.pages):
 for mfn in pagebuf:
 self.write_page(mfn, pagebuf[mfn]) # write mfn
 pagebuf = {}
-
- def write_page(self, mfn, data):
- '''put a page into index and write data into file. header is
not updated by this.'''
- # data on disk
- self.file.seek(self.mfn2offset(mfn))
- self.file.write(data)
-
-
+
Index: PageTable.py
===================================================================
RCS file: /cvsroot/xen_ia64/people/moriwaka/dom0cut/PageTable.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PageTable.py 18 May 2006 13:05:36 -0000 1.3
+++ PageTable.py 22 May 2006 11:44:05 -0000 1.4
@@ -47,14 +47,14 @@
 pte = self.l1[page]
 if pte & FLAGPRESENT:
 if pte & FLAG4MB:
- ranges.append((page, 1024))
+ ranges.append((page, pte & BASE_L1, 1024))
 else:
 mfn = self.arch.maddr_to_mfn(pte)
 l2 = self.read_l2(mfn)
 for subpage in l2:
 pte = l2[subpage]
 if pte & FLAGPRESENT:
- ranges.append((page|subpage, 1))
+ ranges.append((page|subpage, pte & BASE_L2, 1))
 return ranges
 def get_machine_to_virt(self):
@@ -62,10 +62,11 @@
 pages = self.get_present_virt()
 mach2virt = {}
 shift = 12
- for base, nr in pages:
+ for base, mbase, nr in pages:
 for i in range(nr):
- page = base + i * self.arch.page_size
- mach2virt[self.v2m(page) >> shift] = page >> shift
+ page = (base >> shift) + i
+ mpage = (mbase >> shift) + i
+ mach2virt[mpage] = page
 return mach2virt
 def read_l1(self, mfn):
--
Kazuo Moriwaka
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] dom0cut script patches, Kazuo Moriwaka <=
Previous by Date: Re: [Xen-devel] [PATCH] Mini-OS Makefile TARGET_ARCH becomesMINIOS_TARGET_ARCH , John D. Ramsdell
Next by Date: RE: [Xen-devel] [PATCH] Make "xm mem-set" be lower bound ondomX-min-mem , Ky Srinivasan
Previous by Thread: RE: [Xen-devel] [PATCH] Mini-OS Makefile TARGET_ARCH becomesMINIOS_TARGET_ARCH , Puthiyaparambil, Aravindh
Next by Thread: [Xen-devel] RE: [PATCH] Disable auto-balloon on ia64 , Tian, Kevin
Indexes: [Date] [Thread] [Top] [All Lists]

Copyright ©, Citrix Systems Inc. All rights reserved. Legal and Privacy
Citrix This site is hosted by Citrix

AltStyle によって変換されたページ (->オリジナル) /