Merge
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 7 Aug 2008 10:59:01 +0000 (11:59 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Thu, 7 Aug 2008 10:59:01 +0000 (11:59 +0100)
302 files changed:
.hgignore
HACKING [new file with mode: 0644]
MANIFEST
Make.rules.in
Makefile.in
README
configure.ac
dmesg/.depend
dmesg/Makefile.in
dmesg/virt_dmesg.ml
extract/README [new file with mode: 0644]
extract/codegen/.depend [new file with mode: 0644]
extract/codegen/Makefile.in [new file with mode: 0644]
extract/codegen/kerneldb_to_parser.ml [new file with mode: 0644]
extract/fedora-koji/.depend [new file with mode: 0644]
extract/fedora-koji/Makefile.in [new file with mode: 0644]
extract/fedora-koji/fedora_koji_download_kernels.ml [new file with mode: 0644]
kernels/kernel-PAE-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3128.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3128.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3132.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3132.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3144.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3144.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3209.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3209.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3218.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3218.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3234.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3234.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3236.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.21-1.3236.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.24-7.fc9.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.24-7.fc9.i686.rpm.info [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.24-9.fc9.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-PAE-debuginfo-2.6.24-9.fc9.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3209.fc8.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3218.fc8.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3234.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3234.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3234.fc8.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3234.fc8.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3236.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3236.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3236.fc8.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3236.fc8.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3238.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.21-1.3238.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-7.fc9.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.i586.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.i586.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.24-9.fc9.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.25.11-97.fc9.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.25.11-97.fc9.i686.rpm.info [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.25.11-97.fc9.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-debuginfo-2.6.25.11-97.fc9.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.24-7.fc9.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.24-7.fc9.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.24-9.fc9.ppc64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-kdump-debuginfo-2.6.24-9.fc9.ppc64.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.24-7.fc9.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.24-7.fc9.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.24-9.fc9.ppc.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-smp-debuginfo-2.6.24-9.fc9.ppc.rpm.info [new file with mode: 0644]
kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info [new file with mode: 0644]
kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info [new file with mode: 0644]
kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 [new file with mode: 0644]
kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info [new file with mode: 0644]
lib/.depend
lib/Makefile.in
lib/kernel_net_device.ml [new file with mode: 0644]
lib/kernel_net_device.mli [new file with mode: 0644]
lib/kernel_task_struct.ml [new file with mode: 0644]
lib/kernel_task_struct.mli [new file with mode: 0644]
lib/test_mmap.ml [new file with mode: 0644]
lib/virt_mem.ml
lib/virt_mem.mli
lib/virt_mem_capture.ml [new file with mode: 0644]
lib/virt_mem_kallsyms.ml [new file with mode: 0644]
lib/virt_mem_kallsyms.mli [new file with mode: 0644]
lib/virt_mem_ksyms.ml [new file with mode: 0644]
lib/virt_mem_ksyms.mli [new file with mode: 0644]
lib/virt_mem_mmap.ml
lib/virt_mem_mmap.mli
lib/virt_mem_mmap_c.c [new file with mode: 0644]
lib/virt_mem_types.ml [new file with mode: 0644]
lib/virt_mem_types.mli [new file with mode: 0644]
lib/virt_mem_utils.ml
lib/virt_mem_utsname.ml [new file with mode: 0644]
lib/virt_mem_utsname.mli [new file with mode: 0644]
mem/.depend [new file with mode: 0644]
mem/Makefile.in [new file with mode: 0644]
mem/virt_mem_main.ml [new file with mode: 0644]
po/Makefile.in
po/ja.po
po/pl.po
po/pt_BR.po
po/virt-mem.pot
ps/.depend
ps/Makefile.in
ps/virt_ps.ml
uname/.depend
uname/Makefile.in
uname/virt_uname.ml
virt-mem.1
virt-mem.pod
virt-mem.txt

index 771c749..06a3ff6 100644 (file)
--- a/.hgignore
+++ b/.hgignore
@@ -19,12 +19,16 @@ config.status
 configure
 gmon.out
 virt-mem-*.tar.gz
+html
 lib/virt_mem_gettext.ml
 lib/virt_mem_version.ml
+lib/test_mmap
 po/*.mo
 po/*.po.bak
 po/*.po.orig
 uname/virt-uname
 dmesg/virt-dmesg
 ps/virt-ps
-samples
\ No newline at end of file
+mem/virt-mem
+samples
+lib/*.so
diff --git a/HACKING b/HACKING
new file mode 100644 (file)
index 0000000..a9b1b71
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,151 @@
+Source files
+------------
+
+We build all the tools into a single virt-mem executable, in order to
+share the most runtime.  Almost all the code between individual tools
+is shared anyway.
+
+lib/
+
+ - The common core of all the tools.  Library, kernel symbols, command
+   line handling, memory images, etc.
+
+   lib/virt_mem.ml contains most of the important 'glue' code.
+
+uname/
+dmesg/
+  etc.
+
+ - The code specific to each tool.  This is usually rather small because
+   the code in lib/ does the hard work.
+
+mem/
+
+ - This brings everything together and links it into a single executable.
+   Other than that purpose, there is almost nothing in this directory.
+
+kernels/
+
+ - The database of known kernels and the layout of their structures.
+
+extract/
+
+ - Tools to extract the structure layout data from kernels.  Various
+   subdirectories here correspond to the different Linux distributions
+   and methods of getting at their kernels.
+
+extract/codegen/
+
+ - Tools to turn the kernel database into generated code which parses
+   the kernel structures.
+
+General structure of lib/virt_mem.ml
+------------------------------------
+
+We start with a bare kernel memory image ('Virt_mem_types.image0')
+which gets successively enhanced with extra data along the way:
+
+       Parse command line arguments,
+       work out what virtual machines to
+       process, load kernel images
+
+               |
+               |       (passes a 'Virt_mem_types.image0')
+               V
+
+       Find kernel symbols
+
+               |
+               |       (enhanced into a 'Virt_mem_types.image1')
+               V
+
+       Find kernel version (uname)
+
+               |
+               |       (enhanced into a 'Virt_mem_types.image2')
+               V
+
+       Call tool's "run" function.
+
+Tools can register other callbacks which get called at earlier stages.
+
+How it works
+------------
+
+(1) Getting the kernel image
+
+This is pretty easy (on QEMU/KVM anyway): There is a QEMU monitor
+command which reads out memory from the guest, and this is made
+available through the virDomainMemoryPeek call in libvirt.
+
+Kernel images are generally located at small number of known addresses
+(eg. 0xC010_0000 on x86).
+
+(2) Getting the kernel symbols.
+
+The Linux kernel contains two tables of kernel symbols - the usual
+kernel symbols used for exporting symbols to loadable modules, and
+'kallsyms' which is used for error reporting.  (Of course, specific
+Linux kernels may be compiled without one or other of these tables).
+
+The functions in modules lib/virt_mem_ksyms.ml and
+lib/virt_mem_kallsyms.ml deal with searching kernel memory for these
+two tables.
+
+(3) Getting the kernel version.
+
+The kernel has the kernel version information compiled in at a known
+symbol address, so once we have the kernel symbols it is relatively
+straightforward to get the kernel version.
+
+See lib/virt_mem_utsname.ml.
+
+(4) Process table / memory / network info etc.
+
+Note that we have the kernel symbols and the kernel version (and that
+information is pretty reliable).
+
+If we take the process table as an example, then it consists of a
+linked list of 'struct task_struct', starting at the symbol
+'init_task' (which corresponds to the "hidden" PID 0 / swapper task),
+and linked through a double-linked list in the 'tasks' member of this
+structure.
+
+We have the location of 'init_task', but struct task_struct varies
+greatly depending on: word size, kernel version, CONFIG_* settings,
+and vendor/additional patches.
+
+The problem is to work out the "shape" of task_struct, and we do this
+in two different ways:
+
+(Method 1) Precompiled task_struct.  We can easily and reliably
+determine the Linux kernel version (see virt-uname).  In theory we
+could compile a list of known kernel versions, check out their sources
+beforehand, and find the absolute layout of the task_struct (eg. using
+CIL).  This method would only work for known kernel versions, but has
+the advantage that all fields in the task_struct would be known.
+
+(Method 2) Fuzzy matched task_struct.  The task_struct has a certain
+internal structure which is stable even over many kernel revisions.
+For example, groups of pointers always occur together.  We search
+through init_task looking for these characteristic features and where
+a pointer is found to another task_struct we search that (recursively)
+on the assumption that those contain the same features at the same
+location.  This works well for pointers, but not so well for finding
+other fields (eg. uids, process name, etc).  We can defray the cost of
+searches by caching the results between runs.
+
+Currently we use Method 1, deriving the database of known kernels from
+gdb debugging information generated by Linux distributions when they
+build their kernels, and processing that with 'pahole' (from dwarves
+library).
+
+We have experimented with Method 2.  Currently work on it is postponed
+to a research project for a keen student at some point in the near
+future.  There are some early implementations of method 2 if you look
+back over the version control history.
+
+The database of known kernels is stored in kernels/ subdirectory.
+
+The functions to build the database by extracting debug information
+from Linux distributions is stored in extract/ subdirectory.
\ No newline at end of file
index 1f8fcfe..0f8a6db 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -4,19 +4,45 @@ COPYING
 dmesg/.depend
 dmesg/Makefile.in
 dmesg/virt_dmesg.ml
+extract/codegen/.depend
+extract/codegen/kerneldb_to_parser.ml
+extract/codegen/Makefile.in
+extract/fedora-koji/.depend
+extract/fedora-koji/fedora_koji_download_kernels.ml
+extract/fedora-koji/Makefile.in
+extract/README
 .hgignore
+HACKING
 install-sh
 lib/.depend
+lib/kernel_net_device.ml
+lib/kernel_net_device.mli
+lib/kernel_task_struct.ml
+lib/kernel_task_struct.mli
 lib/Makefile.in
+lib/test_mmap.ml
+lib/virt_mem_capture.ml
+lib/virt_mem_kallsyms.ml
+lib/virt_mem_kallsyms.mli
+lib/virt_mem_ksyms.ml
+lib/virt_mem_ksyms.mli
 lib/virt_mem.ml
 lib/virt_mem.mli
 lib/virt_mem_mmap.ml
 lib/virt_mem_mmap.mli
+lib/virt_mem_mmap_c.c
+lib/virt_mem_types.ml
+lib/virt_mem_types.mli
 lib/virt_mem_utils.ml
+lib/virt_mem_utsname.ml
+lib/virt_mem_utsname.mli
 lib/virt_mem_version.ml.in
 Makefile.in
 Make.rules.in
 MANIFEST
+mem/.depend
+mem/Makefile.in
+mem/virt_mem_main.ml
 po/.cvsignore
 po/LINGUAS
 po/Makefile.in
index 0ce95e2..b22f337 100644 (file)
@@ -23,9 +23,6 @@ OCAMLDEP      = @OCAMLDEP@
 OCAMLC         = @OCAMLC@
 OCAMLOPT       = @OCAMLOPT@
 
-OCAMLDOC        = @OCAMLDOC@
-OCAMLDOCFLAGS  += -html -sort
-
 # Common rules for building OCaml objects.
 
 .mli.cmi:
@@ -52,17 +49,6 @@ ifeq ($(wildcard .depend),.depend)
 include .depend
 endif
 
-# Developer documentation (in html/ subdirectory).
-
-ifneq ($(OCAMLDOC),)
-ifneq ($(OCAMLDOCFILES),)
-doc:
-       rm -rf html
-       mkdir html
-       -$(OCAMLDOC) $(OCAMLDOCFLAGS) -d html $(OCAMLDOCFILES)
-endif
-endif
-
 .PHONY: depend dist check-manifest dpkg doc
 
 .SUFFIXES:      .cmo .cmi .cmx .ml .mli .mll .mly
index 8ccb0ef..799da69 100644 (file)
@@ -24,9 +24,23 @@ MKDIR_P              = @MKDIR_P@
 datarootdir    = @datarootdir@
 mandir         = @mandir@
 
+OCAMLDOCFLAGS  = -html -sort -package bitstring,extlib,libvirt -I lib
+OCAMLDOC       = @OCAMLDOC@
+OCAMLDOCFILES  = lib/virt_mem_utils.ml \
+                 lib/virt_mem_mmap.mli \
+                 lib/virt_mem_types.mli \
+                 lib/virt_mem_ksyms.mli \
+                 lib/virt_mem_kallsyms.mli \
+                 lib/virt_mem_utsname.mli \
+                 lib/virt_mem.mli
+
 HAVE_PERLDOC    = @HAVE_PERLDOC@
 
 TOOLS          = uname dmesg ps
+export TOOLS
+
+SUBDIRS_NOT_PO = lib $(TOOLS) mem extract/fedora-koji extract/codegen
+SUBDIRS                = $(SUBDIRS_NOT_PO) po
 
 ifeq ($(HAVE_PERLDOC),perldoc)
 MANPAGES        = virt-mem.1 $(TOOLS:%=virt-%.1)
@@ -36,40 +50,49 @@ endif
 TARGETS                = $(MANPAGES) $(TEXTMANPAGES)
 
 all: $(TARGETS)
-       for d in lib $(TOOLS) po; do \
+       for d in $(SUBDIRS); do \
          $(MAKE) -C $$d $@; \
          if [ $$? -ne 0 ]; then exit 1; fi; \
        done
 
 install: install-man
-       for d in lib $(TOOLS) po; do \
+       for d in $(SUBDIRS); do \
          $(MAKE) -C $$d $@; \
          if [ $$? -ne 0 ]; then exit 1; fi; \
        done
 
-depend doc:
-       for d in lib $(TOOLS); do \
+depend:
+       for d in $(SUBDIRS_NOT_PO); do \
          $(MAKE) -C $$d $@; \
          if [ $$? -ne 0 ]; then exit 1; fi; \
        done
 
 clean:
-       for d in . lib $(TOOLS); do \
+       for d in . $(SUBDIRS); do \
          (cd $$d; rm -f *.cmi *.cmo *.cmx *.cma *.cmxa *.o *.a \
            *.so *.opt *~ *.dll *.exe *.annot core); \
        done
-       for d in po; do \
-         (cd $$d; rm -f *~); \
-       done
        rm -f uname/virt-uname
        rm -f dmesg/virt-dmesg
        rm -f ps/virt-ps
+       rm -f mem/virt-mem
 
 distclean: clean
        rm -f config.h config.log config.status configure
        rm -rf autom4te.cache
        rm -f Makefile
-       rm -f virt-df/Makefile
+       rm -f */Makefile
+
+# Developer documentation (in html/ subdirectory).
+
+ifneq ($(OCAMLDOC),)
+ifneq ($(OCAMLDOCFILES),)
+doc:
+       rm -rf html
+       mkdir html
+       -ocamlfind ocamldoc $(OCAMLDOCFLAGS) -d html $(OCAMLDOCFILES)
+endif
+endif
 
 # Manual page.
 
@@ -106,10 +129,19 @@ dist:
        $(INSTALL) -m 0644 config.h.in $(PACKAGE)-$(VERSION)/
        tar zcf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION)
        rm -rf $(PACKAGE)-$(VERSION)
+       mkdir $(PACKAGE)-$(VERSION)
+       mkdir $(PACKAGE)-$(VERSION)/kernels
+       $(INSTALL) -m 0644 kernels/*.data* kernels/*.info \
+         $(PACKAGE)-$(VERSION)/kernels/
+       tar zcf $(PACKAGE)-kerneldb-$(VERSION).tar.gz $(PACKAGE)-$(VERSION)
+       rm -rf $(PACKAGE)-$(VERSION)
        ls -l $(PACKAGE)-$(VERSION).tar.gz
+       ls -l $(PACKAGE)-kerneldb-$(VERSION).tar.gz
 
 check-manifest:
-       hg manifest | sort > .check-manifest; \
+       hg manifest | \
+         grep -Ev 'kernels/.*\.(data|info).*' | \
+         sort > .check-manifest; \
        sort MANIFEST > .orig-manifest; \
        diff -u .orig-manifest .check-manifest; rv=$$?; \
        rm -f .orig-manifest .check-manifest; \
diff --git a/README b/README
index 170a8b6..6fbe3c1 100644 (file)
--- a/README
+++ b/README
@@ -17,11 +17,6 @@ software inside the virtual machine.  At the moment we only support
 virtual machines running Linux kernel >= 2.6, but we expect to support
 other operating systems in the future.
 
-Most of the commands also offer a CSV (comma-separated values) output
-format ('virt-xx --csv'), allowing usage from scripts to update
-spreadsheets, databases or integrate with existing monitoring systems
-like Nagios.
-
 The commands use libvirt to access the underlying virtualization
 system, so we support a variety of different systems such as Xen, QEMU
 and KVM, and more can be added just by adding support to libvirt.
@@ -44,14 +39,12 @@ Then:
 
   make
 
-The binaries are called things like 'virt-dmesg.opt' and located in
-the respective directories, so you could run them by doing:
+Then run the virt-mem meta-tool, for example:
 
-  ./dmesg/virt-dmesg.opt
+  ./mem/virt-mem.opt dmesg
 
-All the binaries understand the --help option to provide a summary of
-options.  All require virtual machines to run against, but most also
-offer a test mode (-t option).
+(If this binary is linked with the name 'virt-dmesg' then it behaves
+in the same way).
 
 To install the binaries, man pages and message catalogs, do this as
 root:
index 53287c4..e5af7a9 100644 (file)
 
 dnl Process this file with autoconf to produce a configure script.
 
-AC_INIT(virt-mem,0.2.4)
+AC_INIT(virt-mem,0.2.8)
 
 AC_PROG_INSTALL
 AC_PROG_MKDIR_P
 
+dnl Check for an ANSI C compiler.
+AC_GNU_SOURCE
+AC_PROG_CC
+AC_C_PROTOTYPES
+test "x$U" != "x" && AC_MSG_ERROR(Compiler not ANSI compliant)
+AC_PROG_CC_C_O
+
+AC_CHECK_FUNCS([memmem])
+
+dnl Do we have pahole (from acme's "dwarves" library)?
+AC_PATH_PROG(PAHOLE,pahole)
+
 dnl Check for basic OCaml environment & findlib.
 AC_PROG_OCAML
 AC_PROG_FINDLIB
@@ -53,22 +65,24 @@ if test "x$pkg_xml_light" != "xyes"; then
     AC_MSG_ERROR([Cannot find required OCaml package 'xml-light'])
 fi
 
-AC_CHECK_OCAML_PKG(bitmatch)
-if test "x$pkg_bitmatch" != "xyes"; then
-    AC_MSG_ERROR([Cannot find required OCaml package 'bitmatch'])
+AC_CHECK_OCAML_PKG(bitstring)
+if test "x$pkg_bitstring" != "xyes"; then
+    AC_MSG_ERROR([Cannot find required OCaml package 'bitstring'])
 fi
 
 dnl Check for optional OCaml packages.
 AC_CHECK_OCAML_PKG(gettext)
 AC_CHECK_OCAML_PKG(csv)
+AC_CHECK_OCAML_PKG(xmlrpc-light)
 
 AC_SUBST(pkg_unix)
 AC_SUBST(pkg_extlib)
 AC_SUBST(pkg_libvirt)
 AC_SUBST(pkg_xml_light)
-AC_SUBST(pkg_bitmatch)
+AC_SUBST(pkg_bitstring)
 AC_SUBST(pkg_gettext)
 AC_SUBST(pkg_csv)
+AC_SUBST(pkg_xmlrpc_light)
 
 dnl Check for optional perldoc (for building manual pages).
 AC_CHECK_PROG(HAVE_PERLDOC,perldoc,perldoc)
@@ -140,6 +154,9 @@ AC_CONFIG_FILES([Makefile
        uname/Makefile
        dmesg/Makefile
        ps/Makefile
+       mem/Makefile
        po/Makefile
+       extract/fedora-koji/Makefile
+       extract/codegen/Makefile
        ])
 AC_OUTPUT
index 6c94cb9..8cbdd64 100644 (file)
@@ -1,4 +1,4 @@
-virt_dmesg.cmo: ../lib/virt_mem_utils.cmo ../lib/virt_mem_mmap.cmi \
-    ../lib/virt_mem_gettext.cmo ../lib/virt_mem.cmi 
-virt_dmesg.cmx: ../lib/virt_mem_utils.cmx ../lib/virt_mem_mmap.cmx \
-    ../lib/virt_mem_gettext.cmx ../lib/virt_mem.cmx 
+virt_dmesg.cmo: ../lib/virt_mem_utils.cmo ../lib/virt_mem_types.cmi \
+    ../lib/virt_mem_mmap.cmi ../lib/virt_mem_gettext.cmo ../lib/virt_mem.cmi 
+virt_dmesg.cmx: ../lib/virt_mem_utils.cmx ../lib/virt_mem_types.cmx \
+    ../lib/virt_mem_mmap.cmx ../lib/virt_mem_gettext.cmx ../lib/virt_mem.cmx 
index bb23f07..38fca98 100644 (file)
@@ -21,47 +21,33 @@ VERSION             = @PACKAGE_VERSION@
 
 INSTALL                = @INSTALL@
 MKDIR_P                = @MKDIR_P@
-bindir         = @bindir@
 
-SYNTAX         = -pp "camlp4o -I$$(ocamlc -where)/bitmatch bitmatch.cma pa_bitmatch.cmo"
+SYNTAX         = -syntax bitstring.syntax
 
-#OCAMLCPACKAGES        = -package unix,bigarray,extlib,libvirt,xml-light,bitmatch
-OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light -I +bitmatch -I ../lib
+OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light,bitstring.syntax -I ../lib
 
 ifneq ($(pkg_gettext),no)
 OCAMLCPACKAGES += -package gettext-stub
 endif
 
 OCAMLCFLAGS    = @OCAMLCFLAGS@ $(SYNTAX)
-OCAMLCLIBS     = -linkpkg bitmatch.cma ../lib/virt_mem.cma
+OCAMLCLIBS     = -linkpkg ../lib/virt_mem.cma
 
 OCAMLOPTFLAGS  = @OCAMLOPTFLAGS@ $(SYNTAX)
 OCAMLOPTPACKAGES = $(OCAMLCPACKAGES)
-OCAMLOPTLIBS   = -linkpkg bitmatch.cmxa ../lib/virt_mem.cmxa
+OCAMLOPTLIBS   = -linkpkg ../lib/virt_mem.cmxa
 
 OCAMLDOCFLAGS  = -html -sort $(OCAMLCPACKAGES) $(SYNTAX)
 
 OCAMLDEPFLAGS  = $(SYNTAX)
 
-TARGETS                = virt-dmesg virt-dmesg.opt
-
 OBJS           = virt_dmesg.cmo
 XOBJS          = virt_dmesg.cmx
 
-all:   $(TARGETS)
-
-virt-dmesg: $(OBJS) ../lib/virt_mem.cma
-       ocamlfind ocamlc \
-         $(OCAMLCFLAGS) $(OCAMLCPACKAGES) $(OCAMLCLIBS) $(OBJS) -o $@
+TARGETS                = $(OBJS) $(XOBJS)
 
-virt-dmesg.opt: $(XOBJS) ../lib/virt_mem.cmxa
-       ocamlfind ocamlopt \
-         $(OCAMLOPTFLAGS) $(OCAMLOPTPACKAGES) $(OCAMLOPTLIBS) $(XOBJS) -o $@
+all:   $(TARGETS)
 
 install:
-       if [ -x virt-dmesg.opt ]; then \
-         $(MKDIR_P) $(DESTDIR)$(bindir); \
-         $(INSTALL) -m 0755 virt-dmesg.opt $(DESTDIR)$(bindir)/virt-dmesg; \
-       fi
 
 include ../Make.rules
\ No newline at end of file
index 60d7b60..73a671b 100644 (file)
@@ -21,68 +21,61 @@ open Printf
 
 open Virt_mem_gettext.Gettext
 open Virt_mem_utils
+open Virt_mem_types
 open Virt_mem_mmap
 
-let usage = s_"NAME
-  virt-dmesg - dmesg command for virtual machines
-
-SUMMARY
-  virt-dmesg [-options] [domains]
-
-DESCRIPTION
-  virt-dmesg prints the kernel messages for virtual machines running
-  under libvirt.  The output is similar to the ordinary dmesg command
-  run inside the virtual machine."
-
-let _, images = Virt_mem.start usage
-
-let () =
-  List.iter (
-    fun (name, arch, mem, lookup_ksym) ->
-      try
-       (* I don't know why but this symbol doesn't exist in 2.6.9
-        * even in kallsyms.  Hence this won't work with that kernel.
-        * It's possible we can fall back to memory scanning. XXX
-        *)
-       let log_buf = lookup_ksym "log_buf" in
-       let log_buf = follow_pointer mem log_buf in
-       let log_buf_len = lookup_ksym "log_buf_len" in
-       let log_buf_len = Int64.of_int32 (get_C_int mem log_buf_len) in
-(*     let log_start = lookup_ksym "log_start" in
+let run debug ({ domname = domname; mem = mem }, ksymmap, _) =
+  try
+    (* I don't know why but this symbol doesn't exist in 2.6.9
+     * even in kallsyms.  Hence this won't work with that kernel.
+     * It's possible we can fall back to memory scanning. XXX
+     *)
+    let log_buf = Ksymmap.find "log_buf" ksymmap in
+    let log_buf = follow_pointer mem log_buf in
+    let log_buf_len = Ksymmap.find "log_buf_len" ksymmap in
+    let log_buf_len = Int64.of_int32 (get_C_int mem log_buf_len) in
+    (* let log_start = Ksymmap.find "log_start" ksymmap in
        let log_start = get_C_long mem log_start in *)
-       let log_end = lookup_ksym "log_end" in
-       let log_end = get_C_long mem log_end in
-(*     let con_start = lookup_ksym "con_start" in
+    let log_end = Ksymmap.find "log_end" ksymmap in
+    let log_end = get_C_long mem log_end in
+    (* let con_start = Ksymmap.find "con_start" ksymmap in
        let con_start = get_C_long mem con_start in *)
-       let logged_chars = lookup_ksym "logged_chars" in
-       let logged_chars = get_C_long mem logged_chars in
+    let logged_chars = Ksymmap.find "logged_chars" ksymmap in
+    let logged_chars = get_C_long mem logged_chars in
+
+    (* This is basically the same algorithm from printk.c:do_syslog
+     * type=3, translated into OCaml.  Unlike the kernel version
+     * however we don't copy the buffer backwards.
+     *)
+    let get_log_buf idx =
+      let addr = log_buf +^ (idx &^ (log_buf_len -^ 1L)) in
+      Char.chr (get_byte mem addr)
+    in
+
+    let count = log_buf_len in
+    let count = if count > logged_chars then logged_chars else count in
+    let limit = log_end in
 
-       (* This is basically the same algorithm from printk.c:do_syslog
-        * type=3, translated into OCaml.  Unlike the kernel version
-        * however we don't copy the buffer backwards.
-        *)
-       let get_log_buf idx =
-         let addr = log_buf +^ (idx &^ (log_buf_len -^ 1L)) in
-         Char.chr (get_byte mem addr)
-       in
+    let rec loop i =
+      if i >= 0L then (
+       let j = limit-^1L-^i in
+       if j +^ log_buf_len >= log_end then (
+         let c = get_log_buf j in
+         printf "%c" c;
+         loop (i-^1L)
+       )
+      )
+    in
+    loop (count-^1L)
+  with
+    Not_found ->
+      eprintf (f_"%s: could not find kernel log buffer in kernel image\n")
+       domname
 
-       let count = log_buf_len in
-       let count = if count > logged_chars then logged_chars else count in
-       let limit = log_end in
+let summary = s_"display kernel messages"
+let description = s_"\
+virt-dmesg prints the kernel messages for virtual machines running
+under libvirt.  The output is similar to the ordinary dmesg command
+run inside the virtual machine."
 
-       let rec loop i =
-         if i >= 0L then (
-           let j = limit-^1L-^i in
-           if j +^ log_buf_len >= log_end then (
-             let c = get_log_buf j in
-             printf "%c" c;
-             loop (i-^1L)
-           )
-         )
-       in
-       loop (count-^1L)
-      with
-       Not_found ->
-         eprintf (f_"%s: could not find kernel log buffer in kernel image\n")
-           name
-  ) images
+let () = Virt_mem.register "dmesg" summary description ~run
diff --git a/extract/README b/extract/README
new file mode 100644 (file)
index 0000000..06d6636
--- /dev/null
@@ -0,0 +1,13 @@
+
+This directory contains distro-specific tools for downloading kernels
+and extracting the information we need from them.
+
+fedora-koji/
+
+ - For recent Fedora kernels built at http://koji.fedoraproject.org/
+
+
+codegen/
+
+ - This contains tools which turn the kernels database (in ../kernels/)
+   into parsing code.
diff --git a/extract/codegen/.depend b/extract/codegen/.depend
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/extract/codegen/Makefile.in b/extract/codegen/Makefile.in
new file mode 100644 (file)
index 0000000..eeb8774
--- /dev/null
@@ -0,0 +1,49 @@
+# virt-mem
+# @configure_input@
+# Copyright (C) 2008 Red Hat Inc., Richard W.M. Jones
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+
+PACKAGE                = @PACKAGE_NAME@
+VERSION                = @PACKAGE_VERSION@
+
+INSTALL                = @INSTALL@
+MKDIR_P                = @MKDIR_P@
+bindir         = @bindir@
+
+#OCAMLCPACKAGES        = -package extlib,pcre,unix,camlp4,bitstring.syntax -syntax bitstring.syntax
+OCAMLCPACKAGES = -package extlib,pcre,unix,camlp4,bitstring -pp camlp4of
+
+OCAMLCFLAGS    = @OCAMLCFLAGS@
+OCAMLCLIBS     = -linkpkg camlp4lib.cma
+
+OCAMLOPTFLAGS  = @OCAMLOPTFLAGS@
+OCAMLOPTPACKAGES = $(OCAMLCPACKAGES)
+OCAMLOPTLIBS   = -linkpkg camlp4lib.cmxa
+
+TARGETS                = kerneldb-to-parser.opt
+
+OBJS           = kerneldb_to_parser.cmo
+XOBJS          = $(OBJS:.cmo=.cmx)
+
+all:   $(TARGETS)
+
+kerneldb-to-parser.opt: $(XOBJS)
+       ocamlfind ocamlopt \
+         $(OCAMLOPTFLAGS) $(OCAMLOPTPACKAGES) $(OCAMLOPTLIBS) $(XOBJS) -o $@
+
+install:
+
+include ../../Make.rules
\ No newline at end of file
diff --git a/extract/codegen/kerneldb_to_parser.ml b/extract/codegen/kerneldb_to_parser.ml
new file mode 100644 (file)
index 0000000..1d56126
--- /dev/null
@@ -0,0 +1,717 @@
+(* Memory info for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*)
+
+(* This program takes the kernel database (in kernels/ in toplevel
+   directory) and generates parsing code for the various structures
+   in the kernel that we are interested in.
+
+   The output programs -- *.ml, *.mli files of generated code -- go
+   into lib/ at the toplevel, eg. lib/kernel_task_struct.ml
+
+   The stuff at the top of this file determine what structures
+   and fields we try to parse.
+*)
+
+let what = [
+  "task_struct", (
+    "struct task_struct {", "};", true,
+    [ "state"; "prio"; "normal_prio"; "static_prio";
+      "tasks'prev"; "tasks'next"; "mm"; "active_mm"; "comm"; "pid" ]
+  );
+(*
+  "mm_struct", (
+    "struct mm_struct {", "};", true,
+    [ ]
+  );
+*)
+  "net_device", (
+    "struct net_device {", "};", true,
+    [ "name"; "dev_addr" ]
+  );
+]
+
+let debug = false
+
+open Camlp4.PreCast
+open Syntax
+(*open Ast*)
+
+open ExtList
+open ExtString
+open Printf
+
+let (//) = Filename.concat
+
+let () =
+  let args = Array.to_list Sys.argv in
+
+  let kernelsdir, outputdir =
+    match args with
+    | [_;kd;od] -> kd,od
+    | _ ->
+       let arg0 = Filename.basename Sys.executable_name in
+       eprintf "%s - Turn kernels database into code modules.
+
+Usage:
+  %s <kernelsdir> <outputdir>
+
+Example (from toplevel of virt-mem source tree):
+  %s kernels/ lib/
+" arg0 arg0 arg0;
+       exit 2 in
+
+  (* Get the *.info files from the kernels database. *)
+  let infos = Sys.readdir kernelsdir in
+  let infos = Array.to_list infos in
+  let infos = List.filter (fun name -> String.ends_with name ".info") infos in
+  let infos = List.map ( (//) kernelsdir) infos in
+
+  (* Regular expressions.  We really really should use ocaml-mikmatch ... *)
+  let re_oldformat = Pcre.regexp "^RPM: \\d+: \\(build \\d+\\) ([-\\w]+) ([\\w.]+) ([\\w.]+) \\(.*?\\) (\\w+)" in
+  let re_keyvalue = Pcre.regexp "^(\\w+): (.*)" in
+
+  (* Parse in the *.info files.  These have historically had a few different
+   * formats that we need to support.
+   *)
+  let infos = List.map (
+    fun filename ->
+      (* Get the basename (for getting the .data file later on). *)
+      let basename = Filename.chop_suffix filename ".info" in
+
+      let chan = open_in filename in
+      let line = input_line chan in
+
+      (* Kernel version string. *)
+      let version, arch =
+       if Pcre.pmatch ~rex:re_oldformat line then (
+         (* If the file starts with "RPM: \d+: ..." then it's the
+          * original Fedora format.  Everything in one line.
+          *)
+         let subs = Pcre.exec ~rex:re_oldformat line in
+         (* let name = Pcre.get_substring subs 1 in *)
+         let version = Pcre.get_substring subs 2 in
+         let release = Pcre.get_substring subs 3 in
+         let arch = Pcre.get_substring subs 4 in
+         close_in chan;
+         (* XXX Map name -> PAE, hugemem etc. *)
+         (* name, *) sprintf "%s-%s.%s" version release arch, arch
+       ) else (
+         (* New-style "key: value" entries, up to end of file or the first
+          * blank line.
+          *)
+         let (*name,*) version, release, arch =
+           (*ref "",*) ref "", ref "", ref "" in
+         let rec loop line =
+           try
+             let subs = Pcre.exec ~rex:re_keyvalue line in
+             let key = Pcre.get_substring subs 1 in
+             let value = Pcre.get_substring subs 2 in
+             (*if key = "Name" then name := value
+             else*) if key = "Version" then version := value
+             else if key = "Release" then release := value
+             else if key = "Architecture" then arch := value;
+             let line = input_line chan in
+             loop line
+           with
+             Not_found | End_of_file ->
+               close_in chan
+         in
+         loop line;
+         let (*name,*) version, release, arch =
+           (*!name,*) !version, !release, !arch in
+         if (*name = "" ||*) version = "" || release = "" || arch = "" then
+           failwith (sprintf "%s: missing Name, Version, Release or Architecture key" filename);
+         (* XXX Map name -> PAE, hugemem etc. *)
+         (* name, *) sprintf "%s-%s.%s" version release arch, arch
+       ) in
+
+      (*printf "%s -> %s %s\n%!" basename version arch;*)
+
+      (basename, version, arch)
+  ) infos in
+
+  (* For quick access to the opener strings, build a hash. *)
+  let openers = Hashtbl.create 13 in
+  List.iter (
+    fun (name, (opener, closer, _, _)) ->
+      Hashtbl.add openers opener (closer, name)
+  ) what;
+
+  (* Now read the data files and parse out the structures of interest. *)
+  let datas = List.map (
+    fun (basename, version, arch) ->
+      let file_exists name =
+       try Unix.access name [Unix.F_OK]; true
+       with Unix.Unix_error _ -> false
+      in
+      let close_process_in cmd chan =
+       match Unix.close_process_in chan with
+       | Unix.WEXITED 0 -> ()
+       | Unix.WEXITED i ->
+           eprintf "%s: command exited with code %d\n" cmd i; exit i
+       | Unix.WSIGNALED i ->
+           eprintf "%s: command exited with signal %d\n" cmd i; exit 1
+       | Unix.WSTOPPED i ->
+           eprintf "%s: command stopped by signal %d\n" cmd i; exit 1
+      in
+
+      (* Open the data file, uncompressing it on the fly if necessary. *)
+      let chan, close =
+       if file_exists (basename ^ ".data") then
+         open_in (basename ^ ".data"), close_in
+       else if file_exists (basename ^ ".data.gz") then (
+         let cmd =
+           sprintf "gzip -cd %s" (Filename.quote (basename ^ ".data.gz")) in
+         Unix.open_process_in cmd, close_process_in cmd
+       )
+       else if file_exists (basename ^ ".data.bz2") then (
+         let cmd =
+           sprintf "bzip2 -cd %s" (Filename.quote (basename ^ ".data.bz2")) in
+         Unix.open_process_in cmd, close_process_in cmd
+       ) else
+         failwith
+           (sprintf "%s: cannot find corresponding data file" basename) in
+
+      (* Read the data file in, looking for structures of interest to us. *)
+      let bodies = Hashtbl.create 13 in
+      let rec loop () =
+       let line = input_line chan in
+
+       (* If the line is an opener for one of the structures we
+        * are looking for, then for now just save all the text until
+        * we get to the closer line.
+        *)
+       (try
+          let closer, name = Hashtbl.find openers line in
+          let rec loop2 lines =
+            let line = input_line chan in
+            let lines = line :: lines in
+            if String.starts_with line closer then List.rev lines
+            else loop2 lines
+          in
+
+          let body =
+            try loop2 [line]
+            with End_of_file ->
+              failwith (sprintf "%s: %s: %S not matched by closing %S" basename name line closer) in
+
+          Hashtbl.replace bodies name body
+        with Not_found -> ());
+
+       loop ()
+      in
+      (try loop () with End_of_file -> ());
+
+      close chan;
+
+      (* Make sure we got all the mandatory structures. *)
+      List.iter (
+        fun (name, (_, _, mandatory, _)) ->
+          if mandatory && not (Hashtbl.mem bodies name) then
+            failwith (sprintf "%s: structure %s not found in this kernel" basename name)
+      ) what;
+
+      (basename, version, arch, bodies)
+  ) infos in
+
+  (* Now parse each structure body.
+   * XXX This would be better as a proper lex/yacc parser.
+   * XXX Even better would be to have a proper interface to libdwarves.
+   *)
+  let re_offsetsize = Pcre.regexp "/\\*\\s+(\\d+)\\s+(\\d+)\\s+\\*/" in
+  let re_intfield = Pcre.regexp "int\\s+(\\w+);" in
+  let re_ptrfield = Pcre.regexp "struct\\s+(\\w+)\\s*\\*\\s*(\\w+);" in
+  let re_strfield = Pcre.regexp "char\\s+(\\w+)\\[(\\d+)\\];" in
+  let re_structopener = Pcre.regexp "(struct|union)\\s+.*{$" in
+  let re_structcloser = Pcre.regexp "}\\s*(\\w+)?(\\[\\d+\\])?;" in
+
+  (* 'basename' is the source file, and second parameter ('body') is
+   * the list of text lines which covers this structure (minus the
+   * opener line).  Result is the list of parsed fields from this
+   * structure.
+   *)
+  let rec parse basename = function
+    | [] -> assert false
+    | [_] -> []                         (* Just the closer line, finished. *)
+    | line :: lines when Pcre.pmatch ~rex:re_structopener line ->
+      (* Recursively parse a sub-structure.  First search for the
+       * corresponding closer line.
+       *)
+      let rec loop depth acc = function
+       | [] ->
+           eprintf "%s: %S has no matching close structure line\n%!"
+             basename line;
+           assert false
+       | line :: lines when Pcre.pmatch ~rex:re_structopener line ->
+         loop (depth+1) (line :: acc) lines
+       | line :: lines
+           when depth = 0 && Pcre.pmatch ~rex:re_structcloser line ->
+         (line :: acc), lines
+       | line :: lines
+           when depth > 0 && Pcre.pmatch ~rex:re_structcloser line ->
+         loop (depth-1) (line :: acc) lines
+       | line :: lines -> loop depth (line :: acc) lines
+      in
+      let nested_body, rest = loop 0 [] lines in
+
+      (* Then parse the sub-structure. *)
+      let struct_name, nested_body =
+       match nested_body with
+       | [] -> assert false
+       | closer :: _ ->
+           let subs = Pcre.exec ~rex:re_structcloser closer in
+           let struct_name =
+             try Some (Pcre.get_substring subs 1) with Not_found -> None in
+           struct_name, List.rev nested_body in
+      let nested_fields = parse basename nested_body in
+
+      (* Prefix the sub-fields with the name of the structure. *)
+      let nested_fields =
+       match struct_name with
+       | None -> nested_fields
+       | Some prefix ->
+            List.map (
+              fun (name, details) -> (prefix ^ "'" ^ name, details)
+            ) nested_fields in
+
+      (* Parse the rest. *)
+      nested_fields @ parse basename rest
+
+    | line :: lines when Pcre.pmatch ~rex:re_intfield line ->
+      (* An int field. *)
+      let subs = Pcre.exec ~rex:re_intfield line in
+      let name = Pcre.get_substring subs 1 in
+      (try
+        let subs = Pcre.exec ~rex:re_offsetsize line in
+        let offset = int_of_string (Pcre.get_substring subs 1) in
+        let size = int_of_string (Pcre.get_substring subs 2) in
+        (name, (`Int, offset, size)) :: parse basename lines
+       with
+        Not_found -> parse basename lines
+      );
+
+    | line :: lines when Pcre.pmatch ~rex:re_ptrfield line ->
+      (* A pointer-to-struct field. *)
+      let subs = Pcre.exec ~rex:re_ptrfield line in
+      let struct_name = Pcre.get_substring subs 1 in
+      let name = Pcre.get_substring subs 2 in
+      (try
+        let subs = Pcre.exec ~rex:re_offsetsize line in
+        let offset = int_of_string (Pcre.get_substring subs 1) in
+        let size = int_of_string (Pcre.get_substring subs 2) in
+        (name, (`Ptr struct_name, offset, size))
+          :: parse basename lines
+       with
+        Not_found -> parse basename lines
+      );
+
+    | line :: lines when Pcre.pmatch ~rex:re_strfield line ->
+      (* A string (char array) field. *)
+      let subs = Pcre.exec ~rex:re_strfield line in
+      let name = Pcre.get_substring subs 1 in
+      let width = int_of_string (Pcre.get_substring subs 2) in
+      (try
+        let subs = Pcre.exec ~rex:re_offsetsize line in
+        let offset = int_of_string (Pcre.get_substring subs 1) in
+        let size = int_of_string (Pcre.get_substring subs 2) in
+        (name, (`Str width, offset, size))
+          :: parse basename lines
+       with
+        Not_found -> parse basename lines
+      );
+
+    | _ :: lines ->
+       (* Just ignore any other field we can't parse. *)
+       parse basename lines
+
+  in
+
+  let datas = List.map (
+    fun (basename, version, arch, bodies) ->
+      let structures = List.filter_map (
+       fun (struct_name, (_, _, _, wanted_fields)) ->
+         let body =
+           try Some (Hashtbl.find bodies struct_name)
+           with Not_found -> None in
+         match body with
+         | None -> None
+         | Some body ->
+             let body = List.tl body in (* Don't care about opener line. *)
+             let fields = parse basename body in
+
+             (* Compute total size of the structure. *)
+             let total_size =
+               let fields = List.map (
+                 fun (_, (_, offset, size)) -> offset + size
+               ) fields in
+               List.fold_left max 0 fields in
+
+             (* That got us all the fields, but we only care about
+              * the wanted_fields.
+              *)
+             let fields = List.filter (
+               fun (name, _) -> List.mem name wanted_fields
+             ) fields in
+
+             (* Also check we have all the wanted fields. *)
+             List.iter (
+               fun wanted_field ->
+                 if not (List.mem_assoc wanted_field fields) then
+                   failwith (sprintf "%s: structure %s is missing required field %s" basename struct_name wanted_field)
+             ) wanted_fields;
+
+             (* Prefix all the field names with the structure name. *)
+             let fields =
+               List.map (fun (name, details) ->
+                           struct_name ^ "_" ^ name, details) fields in
+
+             Some (struct_name, (fields, total_size))
+      ) what in
+
+      (basename, version, arch, structures)
+  ) datas in
+
+  if debug then
+    List.iter (
+      fun (basename, version, arch, structures) ->
+       printf "%s (version: %s, arch: %s):\n" basename version arch;
+       List.iter (
+         fun (struct_name, (fields, total_size)) ->
+           printf "  struct %s {\n" struct_name;
+           List.iter (
+             fun (field_name, (typ, offset, size)) ->
+               (match typ with
+                | `Int ->
+                     printf "    int %s; " field_name
+                | `Ptr struct_name ->
+                    printf "    struct %s *%s; " struct_name field_name
+                | `Str width ->
+                    printf "    char %s[%d]; " field_name width
+               );
+               printf " /* offset = %d, size = %d */\n" offset size
+           ) fields;
+           printf "  } /* %d bytes */\n\n" total_size;
+       ) structures;
+    ) datas;
+
+  (* We'll generate a code file for each structure type (eg. task_struct
+   * across all kernel versions), so rearrange 'datas' for that purpose.
+   *
+   * XXX This loop is O(n^3), luckily n is small!
+   *)
+  let files =
+    List.map (
+      fun (name, _) ->
+       name,
+       List.filter_map (
+         fun (basename, version, arch, structures) ->
+           try Some (basename, version, arch, List.assoc name structures)
+           with Not_found -> None
+       ) datas
+    ) what in
+
+  let datas = () in ignore datas; (* garbage collect *)
+
+  (* Get just the field types.  It's plausible that a field with the
+   * same name has a different type between kernel versions, so we must
+   * check that didn't happen.
+   *)
+  let files = List.map (
+    fun (struct_name, kernels) ->
+      let field_types =
+       match kernels with
+       | [] -> []
+       | (_, _, _, (fields, _)) :: kernels ->
+           let field_types_of_fields fields =
+             List.sort (
+               List.map (
+                 fun (field_name, (typ, _, _)) -> field_name, typ
+               ) fields
+             )
+           in
+           let field_types = field_types_of_fields fields in
+           List.iter (
+             fun (_, _, _, (fields, _)) ->
+               if field_types <> field_types_of_fields fields then
+                 failwith (sprintf "%s: one of the structure fields changed type between kernel versions" struct_name)
+           ) kernels;
+           field_types in
+      (struct_name, kernels, field_types)
+  ) files in
+
+  (* To minimize generated code size, we want to fold together all
+   * structures where the particulars (eg. offsets, sizes, endianness)
+   * of the fields we care about are the same -- eg. between kernel
+   * versions which are very similar.
+   *)
+  let endian_of_architecture arch =
+    if String.starts_with arch "i386" ||
+      String.starts_with arch "i486" ||
+      String.starts_with arch "i586" ||
+      String.starts_with arch "i686" ||
+      String.starts_with arch "x86_64" ||
+      String.starts_with arch "x86-64" then
+       Bitstring.LittleEndian
+    else if String.starts_with arch "ia64" then
+      Bitstring.LittleEndian (* XXX usually? *)
+    else if String.starts_with arch "ppc" then
+      Bitstring.BigEndian
+    else if String.starts_with arch "sparc" then
+      Bitstring.BigEndian
+    else
+      failwith (sprintf "endian_of_architecture: cannot parse %S" arch)
+  in
+
+  let files =
+    List.map (
+      fun (struct_name, kernels, field_types) ->
+       let hash = Hashtbl.create 13 in
+       let i = ref 0 in
+       let xs = ref [] in
+       let kernels =
+         List.map (
+           fun (basename, version, arch, (fields, total_size)) ->
+             let key = endian_of_architecture arch, fields in
+             let j =
+               try Hashtbl.find hash key
+               with Not_found ->
+                 incr i;
+                 xs := (!i, key) :: !xs; Hashtbl.add hash key !i;
+                 !i in
+             (basename, version, arch, total_size, j)
+         ) kernels in
+       struct_name, kernels, field_types, List.rev !xs
+    ) files in
+
+  (* How much did we save by sharing? *)
+  if debug then
+    List.iter (
+      fun (struct_name, kernels, _, parsers) ->
+       printf "struct %s:\n" struct_name;
+       printf "  number of kernel versions: %d\n" (List.length kernels);
+       printf "  number of parser functions needed after sharing: %d\n"
+         (List.length parsers)
+    ) files;
+
+  (* Let's generate some code! *)
+  let files =
+    List.map (
+      fun (struct_name, kernels, field_types, parsers) ->
+       (* Dummy location required - there are no real locations for
+        * output files.
+        *)
+       let _loc = Loc.ghost in
+
+       (* The structure type. *)
+       let struct_type, struct_sig =
+         let fields = List.map (
+           function
+           | (name, `Int) ->
+               <:ctyp< $lid:name$ : int64 >>
+           | (name, `Ptr _) ->
+               <:ctyp< $lid:name$ : Virt_mem_mmap.addr >>
+           | (name, `Str _) ->
+               <:ctyp< $lid:name$ : string >>
+         ) field_types in
+         let f, fs = match fields with
+           | [] -> failwith (sprintf "%s: structure has no fields" struct_name)
+           | f :: fs -> f, fs in
+         let fields = List.fold_left (
+           fun fs f -> <:ctyp< $fs$ ; $f$ >>
+         ) f fs in
+
+         let struct_type = <:str_item< type t = { $fields$ } >> in
+         let struct_sig = <:sig_item< type t = { $fields$ } >> in
+         struct_type, struct_sig in
+
+       (* The shared parser functions.
+        * 
+        * We could include bitmatch statements directly in here, but
+        * what happens is that the macros get expanded here, resulting
+        * in (even more) unreadable generated code.  So instead just
+        * do a textual substitution later by post-processing the
+        * generated files.  Not type-safe, but we can't have
+        * everything.
+        *)
+       let parser_stmts, parser_subs =
+         let parser_stmts = List.map (
+           fun (i, _) ->
+             let fnname = sprintf "parser_%d" i in
+             <:str_item<
+               let $lid:fnname$ bits = $str:fnname$
+                 >>
+         ) parsers in
+
+         let parser_stmts =
+           match parser_stmts with
+           | [] -> <:str_item< >>
+           | p :: ps ->
+               List.fold_left (fun ps p -> <:str_item< $ps$ $p$ >>) p ps in
+
+         (* What gets substituted for "parser_NN" ... *)
+         let parser_subs = List.map (
+           fun (i, (endian, fields)) ->
+             let fnname = sprintf "parser_%d" i in
+             let endian =
+               match endian with
+               | Bitstring.LittleEndian -> "littleendian"
+               | Bitstring.BigEndian -> "bigendian"
+               | _ -> assert false in
+             let patterns =
+               (* Fields must be sorted by offset, otherwise bitmatch
+                * will complain.
+                *)
+               let cmp (_, (_, o1, _)) (_, (_, o2, _)) = compare o1 o2 in
+               let fields = List.sort ~cmp fields in
+               String.concat ";\n    " (
+                 List.map (
+                   function
+                   | (field_name, (`Int, offset, size))
+                   | (field_name, (`Ptr _, offset, size)) ->
+                       (* 'zero+' is a hack to force the type to int64. *)
+                       sprintf "%s : zero+%d : offset(%d), %s"
+                         field_name (size*8) (offset*8) endian
+                   | (field_name, (`Str width, offset, size)) ->
+                       sprintf "%s : %d : offset(%d), string"
+                         field_name (width*8) (offset*8)
+                 ) fields
+               ) in
+             let assignments =
+               String.concat ";\n    " (
+                 List.map (
+                   function
+                   | (field_name, (`Ptr "list_head", offset, size)) ->
+                       sprintf "%s = Int64.sub %s %dL" field_name field_name offset
+                   | (field_name, _) ->
+                       sprintf "%s = %s" field_name field_name
+                 ) fields
+               ) in
+
+             let sub =
+               sprintf "\
+  bitmatch bits with
+  | { %s } -> { %s }
+  | { _ } -> raise (ParseError (%S, %S, \"failed to match kernel structure\"))"
+                 patterns assignments struct_name fnname in
+
+             fnname, sub
+         ) parsers in
+
+         parser_stmts, parser_subs in
+
+       (* Define a map from kernel versions to parsing functions. *)
+       let version_map =
+         let stmts = List.fold_left (
+           fun stmts (_, version, arch, total_size, i) ->
+             let parserfn = sprintf "parser_%d" i in
+             <:str_item<
+               $stmts$
+               let v = ($lid:parserfn$, $`int:total_size$)
+               let map = StringMap.add $str:version$ v map
+             >>
+         ) <:str_item< let map = StringMap.empty >> kernels in
+
+         <:str_item<
+            module StringMap = Map.Make (String) ;;
+           $stmts$
+         >> in
+
+       (* Code (.ml file). *)
+       let code = <:str_item<
+         let warning = "This code is automatically generated from the kernel database by kerneldb-to-parser program.  Any edits you make will be lost."
+          let zero = 0
+          exception ParseError of string * string * string;;
+         $struct_type$
+         $parser_stmts$
+         $version_map$
+
+         type kernel_version = string
+         let $lid:struct_name^"_known"$ version = StringMap.mem version map
+         let $lid:struct_name^"_size"$ version =
+           let _, size = StringMap.find version map in
+           size
+         let $lid:struct_name^"_of_bits"$ version bits =
+           let parsefn, _ = StringMap.find version map in
+           parsefn bits
+         let $lid:"get_"^struct_name$ version mem addr =
+           let parsefn, size = StringMap.find version map in
+           let bytes = Virt_mem_mmap.get_bytes mem addr size in
+           let bits = Bitstring.bitstring_of_string bytes in
+           parsefn bits
+       >> in
+
+       (* Interface (.mli file). *)
+       let interface = <:sig_item<
+          exception ParseError of string * string * string;;
+         $struct_sig$
+
+         type kernel_version = string
+         val $lid:struct_name^"_known"$ : kernel_version -> bool
+         val $lid:struct_name^"_size"$ : kernel_version -> int
+         val $lid:struct_name^"_of_bits"$ :
+           kernel_version -> Bitstring.bitstring -> t
+         val $lid:"get_"^struct_name$ : kernel_version ->
+           ('a, 'b, [`HasMapping]) Virt_mem_mmap.t -> Virt_mem_mmap.addr -> t
+       >> in
+
+       (struct_name, code, interface, parser_subs)
+    ) files in
+
+  (* Finally generate the output files. *)
+  let re_subst = Pcre.regexp "^(.*)\"(parser_\\d+)\"(.*)$" in
+
+  List.iter (
+    fun (struct_name, code, interface, parser_subs) ->
+      (* Interface (.mli file). *)
+      let output_file = outputdir // "kernel_" ^ struct_name ^ ".mli" in
+      printf "Writing %s interface to %s ...\n%!" struct_name output_file;
+      Printers.OCaml.print_interf ~output_file interface;
+
+      (* Implementation (.ml file). *)
+      let output_file = outputdir // "kernel_" ^ struct_name ^ ".ml" in
+      printf "Writing %s implementation to %s ...\n%!" struct_name output_file;
+
+      let new_output_file = output_file ^ ".new" in
+      Printers.OCaml.print_implem ~output_file:new_output_file code;
+
+      (* Substitute the parser bodies in the output file. *)
+      let ichan = open_in new_output_file in
+      let ochan = open_out output_file in
+
+      let rec loop () =
+       let line = input_line ichan in
+       let line =
+         if Pcre.pmatch ~rex:re_subst line then (
+           let subs = Pcre.exec ~rex:re_subst line in
+           let start = Pcre.get_substring subs 1 in
+           let template = Pcre.get_substring subs 2 in
+           let rest = Pcre.get_substring subs 3 in
+           let sub = List.assoc template parser_subs in
+           start ^ sub ^ rest
+         ) else line in
+       output_string ochan line; output_char ochan '\n';
+       loop ()
+      in
+      (try loop () with End_of_file -> ());
+
+      close_out ochan;
+      close_in ichan;
+
+      Unix.unlink new_output_file
+  ) files
diff --git a/extract/fedora-koji/.depend b/extract/fedora-koji/.depend
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/extract/fedora-koji/Makefile.in b/extract/fedora-koji/Makefile.in
new file mode 100644 (file)
index 0000000..9af56f3
--- /dev/null
@@ -0,0 +1,54 @@
+# virt-mem
+# @configure_input@
+# Copyright (C) 2008 Red Hat Inc., Richard W.M. Jones
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+
+PACKAGE                = @PACKAGE_NAME@
+VERSION                = @PACKAGE_VERSION@
+
+INSTALL                = @INSTALL@
+MKDIR_P                = @MKDIR_P@
+bindir         = @bindir@
+
+pkg_xmlrpc_light = @pkg_xmlrpc_light@
+
+OCAMLCPACKAGES = -package extlib,xmlrpc-light
+
+OCAMLCFLAGS    = @OCAMLCFLAGS@
+OCAMLCLIBS     = -linkpkg
+
+OCAMLOPTFLAGS  = @OCAMLOPTFLAGS@
+OCAMLOPTPACKAGES = $(OCAMLCPACKAGES)
+OCAMLOPTLIBS   = -linkpkg
+
+ifneq ($(pkg_xmlrpc_light),no)
+TARGETS                = fedora-koji-download-kernels.opt
+else
+TARGETS                =
+endif
+
+OBJS           = fedora_koji_download_kernels.cmo
+XOBJS          = $(OBJS:.cmo=.cmx)
+
+all:   $(TARGETS)
+
+fedora-koji-download-kernels.opt: $(XOBJS)
+       ocamlfind ocamlopt \
+         $(OCAMLOPTFLAGS) $(OCAMLOPTPACKAGES) $(OCAMLOPTLIBS) $(XOBJS) -o $@
+
+install:
+
+include ../../Make.rules
\ No newline at end of file
diff --git a/extract/fedora-koji/fedora_koji_download_kernels.ml b/extract/fedora-koji/fedora_koji_download_kernels.ml
new file mode 100644 (file)
index 0000000..89879e4
--- /dev/null
@@ -0,0 +1,315 @@
+(* Memory info for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*)
+
+(* This is a script which downloads kernels from Fedora and extracts
+   the kernel layout information.
+
+   The basic plan is as follows:
+
+   (1) Use koji to list out all kernel builds, compare this to
+   what we have already got (in the kernels/ database at the top level
+   of the virt-mem source), and download any kernels we haven't
+   seen already.
+
+   (2) For each kernel, get the kernel-*debuginfo* RPMs (there will
+   be several, one for each architecture, and one for each variant
+   such as PAE).
+
+   (3) For each debuginfo RPM, extract the 'vmlinux' (kernel image)
+   from the RPM.  This contains debugging symbols.
+
+   (4) Run 'pahole -E' (from acme's dwarves library) to extract all
+   the kernel structures.
+
+   (5) Save the kernel name/version/architecture + the output of pahole
+   in the kernels/ directory (the kernels database).
+ *)
+
+open ExtList
+open ExtString
+open Printf
+
+let (//) = Filename.concat
+
+(* Wrappers around the XMLRPC calls. *)
+type build = {
+  package_name : string;               (* eg. "kernel" *)
+  version : string;                    (* eg. "2.6.25" *)
+  release : string;                    (* eg. "1.fc8" *)
+  build_id : int;
+}
+
+let string_of_build { package_name = package_name;
+                     version = version; release = release;
+                     build_id = build_id } =
+  sprintf "%d: %s %s %s" build_id package_name version release
+
+type rpm = {
+  rpm_id : int;                                (* RPM ID (for downloading, etc.) *)
+  rpm_build : build;
+  rpm_name : string;                   (* eg. "kernel" *)
+  rpm_version : string;                        (* eg. "2.6.25" *)
+  rpm_release : string;                        (* eg. "1.fc8" *)
+  rpm_size : int;                      (* size in bytes of the RPM. *)
+  rpm_arch : string;                   (* architecture *)
+}
+
+let string_of_rpm { rpm_id = id; rpm_build = { build_id = build_id };
+                   rpm_name = name;
+                   rpm_version = version; rpm_release = release;
+                   rpm_size = size; rpm_arch = arch } =
+  sprintf "%d: (build %d) %s %s %s (%d bytes) %s"
+    id build_id name version release size arch
+
+let get_string_from_struct name items =
+  match List.assoc name items with
+  | `String str -> str
+  | _ -> invalid_arg (name ^ ": expected string type")
+
+let get_int_from_struct name items =
+  match List.assoc name items with
+  | `Int i -> i
+  | _ -> invalid_arg (name ^ ": expected int type")
+
+let koji_list_builds rpc ~prefix =
+  let builds = rpc#call "listBuilds" [
+    `Struct [
+      (* __starstar is some wierd Python thing which is needed for
+       * Python optional arguments to work.
+       *)
+      "__starstar", `Int 1;
+      "prefix", `String prefix;
+    ]
+  ] in
+
+  match builds with
+  | `Array builds ->
+      List.map (
+       function
+       | `Struct items ->
+           (try
+              let package_name = get_string_from_struct "package_name" items in
+              let version = get_string_from_struct "version" items in
+              let release = get_string_from_struct "release" items in
+              let build_id = get_int_from_struct "build_id" items in
+              { package_name = package_name;
+                version = version; release = release;
+                build_id = build_id }
+            with
+            | Not_found ->
+                prerr_endline "missing element in build structure from koji listBuilds() calls";
+                exit 1
+            | Invalid_argument err ->
+                prerr_endline err;
+                exit 1
+           )
+       | t ->
+           prerr_endline "unexpected type from koji listBuilds() call";
+           prerr_endline (XmlRpc.dump t);
+           exit 1
+      ) builds
+  | t ->
+      prerr_endline "unexpected type from koji listBuilds() call:";
+      prerr_endline (XmlRpc.dump t);
+      exit 1
+
+let koji_list_build_rpms rpc ({ build_id = build_id } as build) =
+  let rpms = rpc#call "listBuildRPMs" [ `Int build_id ] in
+
+  match rpms with
+  | `Array rpms ->
+      List.map (
+       function
+       | `Struct items ->
+           (try
+              let name = get_string_from_struct "name" items in
+              let version = get_string_from_struct "version" items in
+              let release = get_string_from_struct "release" items in
+              let build_id' = get_int_from_struct "build_id" items in
+              let id = get_int_from_struct "id" items in
+              let size = get_int_from_struct "size" items in
+              let arch = get_string_from_struct "arch" items in
+              assert (build_id = build_id');
+              { rpm_name = name; rpm_version = version; rpm_release = release;
+                rpm_build = build; rpm_id = id; rpm_size = size;
+                rpm_arch = arch }
+            with
+            | Not_found ->
+                prerr_endline "missing element in build structure from koji listBuildRPMs() calls";
+                exit 1
+            | Invalid_argument err ->
+                prerr_endline err;
+                exit 1
+           )
+       | t ->
+           prerr_endline "unexpected type from koji listBuildRPMs() call";
+           prerr_endline (XmlRpc.dump t);
+           exit 1
+      ) rpms
+  | t ->
+      prerr_endline "unexpected type from koji listBuildRPMs() call:";
+      prerr_endline (XmlRpc.dump t);
+      exit 1
+
+(* This gets the RPM download URL for an RPM.  I can't see a way to
+ * get this using the Koji API, but the URLs are fairly predictable
+ * anyway.
+ *)
+let koji_rpm_download_url { rpm_build = { package_name = build_name };
+                           rpm_name = rpm_name;
+                           rpm_version = version; rpm_release = release;
+                           rpm_arch = arch } =
+  let filename = sprintf "%s-%s-%s.%s.rpm" rpm_name version release arch in
+  let uri = sprintf "http://koji.fedoraproject.org/packages/%s/%s/%s/%s/%s"
+    build_name version release arch filename in
+  uri, filename
+
+(* Main program. *)
+let main outputdir =
+  let rpc = new XmlRpc.client "http://koji.fedoraproject.org/kojihub" in
+
+  (* Grab the list of kernel builds from Koji. *)
+  printf "Downloading list of kernel builds from Koji ...\n%!";
+  let builds = koji_list_builds rpc ~prefix:"kernel" in
+
+  (* Only care about "kernel" and "kernel-xen" builds. *)
+  let builds = List.filter (
+    fun { package_name = name } ->
+      name = "kernel" || name = "kernel-xen"
+  ) builds in
+
+  let nr_builds = List.length builds in
+  printf "%d kernel builds found on Koji.\n%!" nr_builds;
+
+  List.iteri (
+    fun i build ->
+      printf "Build %d/%d: %s\n" (i+1) nr_builds (string_of_build build);
+
+      (* List the RPMs in the build. *)
+      let rpms = koji_list_build_rpms rpc build in
+
+      (* Only care about debuginfo builds, and not debuginfo-common. *)
+      let contains_string substr name =
+       try ignore (String.find name substr); true
+       with Invalid_string -> false
+      in
+      let contains_debuginfo = contains_string "debuginfo" in
+      let contains_common = contains_string "common" in
+      let rpms = List.filter (
+       fun { rpm_name = name } ->
+         contains_debuginfo name && not (contains_common name)
+      ) rpms in
+
+      List.iter (
+       fun rpm ->
+         let uri, filename = koji_rpm_download_url rpm in
+         let infofile = outputdir // filename ^ ".info" in
+
+         let infoexists =
+           try ignore (Unix.access infofile [Unix.F_OK]); true
+           with Unix.Unix_error _ -> false in
+
+         if infoexists then
+           printf "Skipping %s\n%!" (string_of_rpm rpm)
+         else (
+           printf "%s\n%!" (string_of_rpm rpm);
+
+           let run cmd =
+             let r = Sys.command cmd in
+             if r <> 0 then
+               failwith (sprintf "%s: command exited with code %d" cmd r)
+           in
+
+           (* Function to clean up the RPM & the temporary subdirectory
+            * (usr/, used for unpacking the RPM).
+            *)
+           let cleanup () =
+             (try Unix.unlink filename with _ -> ());
+             ignore (Sys.command "rm -rf usr/")
+           in
+
+           cleanup ();
+
+           try
+             Std.finally cleanup (
+               fun () ->
+                 (* Download the RPM.
+                  * 
+                  * Could use ocurl here (the OCaml CURL library) but
+                  * using CURL as a library is generally more trouble
+                  * than it's worth.  So shell out to 'wget' instead.
+                  *)
+                 printf "Downloading RPM ...\n%!";
+                 run (sprintf "wget --quiet %s" (Filename.quote uri));
+
+                 printf "Finished downloading RPM.\n%!";
+
+                 (* Unpack vmlinux binary from the RPM. *)
+                 run (sprintf "rpm2cpio %s | cpio -id --quiet '*/vmlinux'"
+                        (Filename.quote filename));
+
+                 run (sprintf "find usr/ -name vmlinux -print0 |
+                                xargs -0 pahole -E > %s.data"
+                        (Filename.quote outputdir // Filename.quote filename));
+
+                 let chan = open_out infofile in
+                 fprintf chan "Source: fedora-koji\n";
+                 fprintf chan "Distribution: Fedora\n";
+                 fprintf chan "RPM_id: %d\n" rpm.rpm_id;
+                 fprintf chan "RPM_build_id: %d\n" rpm.rpm_build.build_id;
+                 fprintf chan "Name: %s\n" rpm.rpm_name;
+                 fprintf chan "Version: %s\n" rpm.rpm_version;
+                 fprintf chan "Release: %s\n" rpm.rpm_release;
+                 fprintf chan "Architecture: %s\n" rpm.rpm_arch;
+                 fprintf chan "RPM_size: %d\n" rpm.rpm_size;
+                 fprintf chan "\n";
+                 close_out chan;
+
+                 run (sprintf "rpm -qip %s >> %s"
+                        (Filename.quote filename) (Filename.quote infofile));
+             ) ()
+           with
+             Failure msg ->
+               eprintf "%s\n%!" msg (* but continue to next RPM ... *)
+         )
+      ) rpms
+  ) builds
+
+let () =
+  Random.self_init ();
+
+  (* Create a temporary work directory, chdir into there to run the
+   * main program, then ensure that the temporary directory is cleaned
+   * up when we exit.
+   *)
+  let olddir = Unix.getcwd () in
+  let tmpdir =
+    sprintf "%s/tmp%d%Ld"
+      Filename.temp_dir_name
+      (Unix.getpid ()) (Random.int64 Int64.max_int) in
+
+  Unix.mkdir tmpdir 0o700;
+  Sys.chdir tmpdir;
+
+  let cleanup () =
+    Sys.chdir olddir;
+    ignore (Sys.command (sprintf "rm -rf %s" (Filename.quote tmpdir)))
+  in
+
+  Std.finally cleanup (fun () -> main olddir) ()
diff --git a/kernels/kernel-PAE-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 b/kernels/kernel-PAE-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..e31c723
Binary files /dev/null and b/kernels/kernel-PAE-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info b/kernels/kernel-PAE-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..08860ab
--- /dev/null
@@ -0,0 +1,21 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16556
+RPM_build_id: 1422
+Name: kernel-PAE-debug-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: i686
+RPM_size: 184072398
+
+Name        : kernel-PAE-debug-debuginfo   Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:58:24 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 455560785                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:00:58 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-PAE-debug
+Description :
+This package provides debug information for package kernel-PAE-debug
diff --git a/kernels/kernel-PAE-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 b/kernels/kernel-PAE-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..fc7d90a
Binary files /dev/null and b/kernels/kernel-PAE-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info b/kernels/kernel-PAE-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..e18eeab
--- /dev/null
@@ -0,0 +1,21 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94422
+RPM_build_id: 8692
+Name: kernel-PAE-debug-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: i686
+RPM_size: 196006933
+
+Name        : kernel-PAE-debug-debuginfo   Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 09:30:14 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 484910068                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-PAE-debug
+Description :
+This package provides debug information for package kernel-PAE-debug
diff --git a/kernels/kernel-PAE-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..bad8731
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..50cf478
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16566
+RPM_build_id: 1422
+Name: kernel-PAE-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: i686
+RPM_size: 179094536
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:58:24 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 443598595                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:01:11 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3128.fc7.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.21-1.3128.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c84605b
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.21-1.3128.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3128.fc7.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.21-1.3128.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..827adba
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55003
+RPM_build_id: 6138
+Name: kernel-PAE-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: i686
+RPM_size: 196781773
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Fri 04 May 2007 12:43:20 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 487218673                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3132.fc7.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.21-1.3132.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c84605b
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.21-1.3132.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3132.fc7.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.21-1.3132.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..e7d19f6
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55088
+RPM_build_id: 6151
+Name: kernel-PAE-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: i686
+RPM_size: 196849773
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 04:47:23 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 487356633                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3144.fc7.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.21-1.3144.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..bebb2d2
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.21-1.3144.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3144.fc7.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.21-1.3144.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..b029a45
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61372
+RPM_build_id: 6385
+Name: kernel-PAE-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: i686
+RPM_size: 196436631
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 09:00:08 PM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 486258481                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3209.fc8.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.21-1.3209.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..4dfa8e1
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.21-1.3209.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3209.fc8.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.21-1.3209.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..e1a1195
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 89094
+RPM_build_id: 8229
+Name: kernel-PAE-debuginfo
+Version: 2.6.21
+Release: 1.3209.fc8
+Architecture: i686
+RPM_size: 181851345
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3209.fc8                    Build Date: Wed 06 Jun 2007 09:42:36 AM BST
+Install Date: (not installed)               Build Host: xenbuilder3.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3209.fc8.src.rpm
+Size        : 447750043                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.21-1.3209.fc8.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3218.fc8.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.21-1.3218.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..16b3651
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.21-1.3218.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3218.fc8.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.21-1.3218.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..0c9f37b
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 91943
+RPM_build_id: 8473
+Name: kernel-PAE-debuginfo
+Version: 2.6.21
+Release: 1.3218.fc8
+Architecture: i686
+RPM_size: 184577122
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3218.fc8                    Build Date: Sat 09 Jun 2007 10:08:26 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3218.fc8.src.rpm
+Size        : 454535402                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.21-1.3218.fc8.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..b9030eb
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..f885b37
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94418
+RPM_build_id: 8692
+Name: kernel-PAE-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: i686
+RPM_size: 190658986
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 09:30:14 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 471917670                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3234.fc8.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.21-1.3234.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..213ffee
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.21-1.3234.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3234.fc8.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.21-1.3234.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..ba3e29a
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 104551
+RPM_build_id: 9562
+Name: kernel-PAE-debuginfo
+Version: 2.6.21
+Release: 1.3234.fc8
+Architecture: i686
+RPM_size: 184005713
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3234.fc8                    Build Date: Fri 22 Jun 2007 08:04:29 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3234.fc8.src.rpm
+Size        : 452123673                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.21-1.3234.fc8.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3236.fc8.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.21-1.3236.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..8441314
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.21-1.3236.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.21-1.3236.fc8.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.21-1.3236.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..41e954c
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 105365
+RPM_build_id: 9641
+Name: kernel-PAE-debuginfo
+Version: 2.6.21
+Release: 1.3236.fc8
+Architecture: i686
+RPM_size: 184093980
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3236.fc8                    Build Date: Mon 25 Jun 2007 05:39:27 AM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3236.fc8.src.rpm
+Size        : 452273558                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.21-1.3236.fc8.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..4a084ca
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..e401c1c
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 115436
+RPM_build_id: 10582
+Name: kernel-PAE-debuginfo
+Version: 2.6.22
+Release: 0.23.rc7.git6.fc8
+Architecture: i686
+RPM_size: 189208816
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.22                            Vendor: Fedora Project
+Release     : 0.23.rc7.git6.fc8             Build Date: Sat 07 Jul 2007 02:00:45 AM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.22-0.23.rc7.git6.fc8.src.rpm
+Size        : 462737408                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE
+This is required to use SystemTap with kernel-PAE-2.6.22-0.23.rc7.git6.fc8.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.24-7.fc9.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.24-7.fc9.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..107820e
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.24-7.fc9.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.24-7.fc9.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.24-7.fc9.i686.rpm.info
new file mode 100644 (file)
index 0000000..548fa14
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 383791
+RPM_build_id: 33301
+Name: kernel-PAE-debuginfo
+Version: 2.6.24
+Release: 7.fc9
+Architecture: i686
+RPM_size: 229506771
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 7.fc9                         Build Date: Tue 29 Jan 2008 01:40:30 AM GMT
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-7.fc9.src.rpm
+Size        : 556125165                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE.
+This is required to use SystemTap with kernel-PAE-2.6.24-7.fc9.
diff --git a/kernels/kernel-PAE-debuginfo-2.6.24-9.fc9.i686.rpm.data.bz2 b/kernels/kernel-PAE-debuginfo-2.6.24-9.fc9.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..107820e
Binary files /dev/null and b/kernels/kernel-PAE-debuginfo-2.6.24-9.fc9.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-PAE-debuginfo-2.6.24-9.fc9.i686.rpm.info b/kernels/kernel-PAE-debuginfo-2.6.24-9.fc9.i686.rpm.info
new file mode 100644 (file)
index 0000000..a53ed8e
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 385984
+RPM_build_id: 33481
+Name: kernel-PAE-debuginfo
+Version: 2.6.24
+Release: 9.fc9
+Architecture: i686
+RPM_size: 31888575
+
+Name        : kernel-PAE-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 9.fc9                         Build Date: Tue 29 Jan 2008 11:19:58 PM GMT
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-9.fc9.src.rpm
+Size        : 77082285                         License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel-PAE
+Description :
+This package provides debug information for package kernel-PAE.
+This is required to use SystemTap with kernel-PAE-2.6.24-9.fc9.
diff --git a/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 b/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..41683b1
Binary files /dev/null and b/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info b/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..484ad61
--- /dev/null
@@ -0,0 +1,21 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16563
+RPM_build_id: 1422
+Name: kernel-debug-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: i686
+RPM_size: 184220419
+
+Name        : kernel-debug-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:58:24 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 455891667                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:00:03 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-debug
+Description :
+This package provides debug information for package kernel-debug
diff --git a/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 b/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..a25d1b1
Binary files /dev/null and b/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info b/kernels/kernel-debug-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..d778156
--- /dev/null
@@ -0,0 +1,21 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16540
+RPM_build_id: 1422
+Name: kernel-debug-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: x86_64
+RPM_size: 160402945
+
+Name        : kernel-debug-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:07:03 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc1-5.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 538652667                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:03:27 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-debug
+Description :
+This package provides debug information for package kernel-debug
diff --git a/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 b/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..123d8a6
Binary files /dev/null and b/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info b/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..63fc15b
--- /dev/null
@@ -0,0 +1,21 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94417
+RPM_build_id: 8692
+Name: kernel-debug-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: i686
+RPM_size: 196118009
+
+Name        : kernel-debug-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 09:30:14 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 485060369                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-debug
+Description :
+This package provides debug information for package kernel-debug
diff --git a/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..65fe9d7
Binary files /dev/null and b/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info b/kernels/kernel-debug-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..cf0615e
--- /dev/null
@@ -0,0 +1,21 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94389
+RPM_build_id: 8692
+Name: kernel-debug-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: x86_64
+RPM_size: 170204356
+
+Name        : kernel-debug-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 09:16:29 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 573732873                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-debug
+Description :
+This package provides debug information for package kernel-debug
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..a73f0a0
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i586.rpm.info b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i586.rpm.info
new file mode 100644 (file)
index 0000000..efc7584
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 88: (build 8) kernel-debuginfo 2.6.18 1.2798.fc6 (157656732 bytes) i586
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 09:20:38 PM BST
+Install Date: (not installed)               Build Host: hs20-bc2-3.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 383934365                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..b3a57ca
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..a0b2f1e
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 119: (build 8) kernel-debuginfo 2.6.18 1.2798.fc6 (163684416 bytes) i686
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 08:57:26 PM BST
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 398653376                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..94a321c
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.info
new file mode 100644 (file)
index 0000000..b29724e
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 75: (build 8) kernel-debuginfo 2.6.18 1.2798.fc6 (191628974 bytes) ppc
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 09:31:44 PM BST
+Install Date: (not installed)               Build Host: js20-bc2-12.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 418810093                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c534b41
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..f43fdf1
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 104: (build 8) kernel-debuginfo 2.6.18 1.2798.fc6 (214712733 bytes) ppc64
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 10:08:45 PM BST
+Install Date: (not installed)               Build Host: js20-bc2-10.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 597165618                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c59d40b
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.info b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.info
new file mode 100644 (file)
index 0000000..f4ceaf9
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 82: (build 8) kernel-debuginfo 2.6.18 1.2798.fc6 (110980937 bytes) ppc64iseries
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 09:08:36 PM BST
+Install Date: (not installed)               Build Host: js20-bc2-12.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 300176462                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..6b25855
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..3b54631
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 101: (build 8) kernel-debuginfo 2.6.18 1.2798.fc6 (158757133 bytes) x86_64
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 09:12:02 PM BST
+Install Date: (not installed)               Build Host: hs20-bc1-6.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 538764023                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..59c4c81
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i586.rpm.info b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i586.rpm.info
new file mode 100644 (file)
index 0000000..ba38314
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16524
+RPM_build_id: 1422
+Name: kernel-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: i586
+RPM_size: 174835058
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 03:01:53 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc1-7.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 432555389                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 03:59:45 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..e20b888
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..fd88eb9
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16549
+RPM_build_id: 1422
+Name: kernel-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: i686
+RPM_size: 179191798
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:58:24 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 443901662                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:00:16 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..18b7044
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.info
new file mode 100644 (file)
index 0000000..c19dfd8
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16520
+RPM_build_id: 1422
+Name: kernel-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: ppc
+RPM_size: 208158720
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:02:19 PM GMT
+Install Date: (not installed)               Build Host: js20-bc1-12.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 454043603                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:02:33 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..26987f2
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..8c87b0f
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16542
+RPM_build_id: 1422
+Name: kernel-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: ppc64
+RPM_size: 241443903
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:46:07 PM GMT
+Install Date: (not installed)               Build Host: js20-bc1-9.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 675588890                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:01:46 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..22f98fd
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..69f3a47
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16534
+RPM_build_id: 1422
+Name: kernel-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: x86_64
+RPM_size: 156484589
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:07:03 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc1-5.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 526889426                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:03:38 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..daff64b
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i586.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i586.rpm.info
new file mode 100644 (file)
index 0000000..1200cd8
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 54992
+RPM_build_id: 6138
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: i586
+RPM_size: 191791017
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Fri 04 May 2007 12:07:33 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 474565438                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..d8f5958
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i686.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..cbb6ed6
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55007
+RPM_build_id: 6138
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: i686
+RPM_size: 196888430
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Fri 04 May 2007 12:43:20 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 487377259                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..19955a3
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.info
new file mode 100644 (file)
index 0000000..c4fe1b7
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 54975
+RPM_build_id: 6138
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: ppc
+RPM_size: 223851722
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Thu 03 May 2007 11:15:53 PM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 487971990                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c0e9d9e
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..1df50f6
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 54993
+RPM_build_id: 6138
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: ppc64
+RPM_size: 261803468
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Thu 03 May 2007 11:44:14 PM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 732275203                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c3135ca
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..9b5b258
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 54981
+RPM_build_id: 6138
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: x86_64
+RPM_size: 170968019
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Fri 04 May 2007 12:40:37 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 576834010                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..daff64b
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i586.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i586.rpm.info
new file mode 100644 (file)
index 0000000..7fec323
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55074
+RPM_build_id: 6151
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: i586
+RPM_size: 191862459
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 04:17:00 AM BST
+Install Date: (not installed)               Build Host: xenbuilder3.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 474704486                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..d8f5958
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i686.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..94bed6f
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55092
+RPM_build_id: 6151
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: i686
+RPM_size: 196949305
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 04:47:23 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 487515335                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..19955a3
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.info
new file mode 100644 (file)
index 0000000..db17c7d
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55065
+RPM_build_id: 6151
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: ppc
+RPM_size: 223924079
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 04:47:04 AM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 488121634                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c0e9d9e
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..ecf5063
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55084
+RPM_build_id: 6151
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: ppc64
+RPM_size: 261881390
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 05:15:40 AM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 732478307                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c3135ca
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..dce8c74
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55069
+RPM_build_id: 6151
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: x86_64
+RPM_size: 171032282
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 06:17:52 AM BST
+Install Date: (not installed)               Build Host: xenbuilder1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 577011442                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..0376fc0
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i586.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i586.rpm.info
new file mode 100644 (file)
index 0000000..a674b58
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61356
+RPM_build_id: 6385
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: i586
+RPM_size: 191444172
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 08:30:55 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 473595795                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..233509c
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i686.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..7aa77d3
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61369
+RPM_build_id: 6385
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: i686
+RPM_size: 196557073
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 09:00:08 PM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 486421140                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..19955a3
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.info
new file mode 100644 (file)
index 0000000..f5ed614
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61340
+RPM_build_id: 6385
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: ppc
+RPM_size: 223440636
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 10:02:36 PM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 487033255                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..27f9640
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..9421ad8
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61365
+RPM_build_id: 6385
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: ppc64
+RPM_size: 261481361
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 09:53:24 PM BST
+Install Date: (not installed)               Build Host: ppc2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 731266986                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c3135ca
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..188cd9f
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61347
+RPM_build_id: 6385
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: x86_64
+RPM_size: 170638216
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 09:26:56 PM BST
+Install Date: (not installed)               Build Host: xenbuilder3.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 575544946                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..7c7626e
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i586.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i586.rpm.info
new file mode 100644 (file)
index 0000000..69d33c0
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 89077
+RPM_build_id: 8229
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3209.fc8
+Architecture: i586
+RPM_size: 174969775
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3209.fc8                    Build Date: Wed 06 Jun 2007 08:59:14 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3209.fc8.src.rpm
+Size        : 430150469                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3209.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..f429eea
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i686.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..48c56aa
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 89090
+RPM_build_id: 8229
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3209.fc8
+Architecture: i686
+RPM_size: 181852310
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3209.fc8                    Build Date: Wed 06 Jun 2007 09:42:36 AM BST
+Install Date: (not installed)               Build Host: xenbuilder3.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3209.fc8.src.rpm
+Size        : 447761542                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3209.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..225b8a0
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..351023b
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 89066
+RPM_build_id: 8229
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3209.fc8
+Architecture: ppc
+RPM_size: 230251972
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3209.fc8                    Build Date: Wed 06 Jun 2007 09:40:08 AM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3209.fc8.src.rpm
+Size        : 500485622                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3209.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..e7ec87b
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..a504c9e
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 89085
+RPM_build_id: 8229
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3209.fc8
+Architecture: ppc64
+RPM_size: 270540205
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3209.fc8                    Build Date: Wed 06 Jun 2007 09:54:58 AM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3209.fc8.src.rpm
+Size        : 752711542                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3209.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..f0113a8
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3209.fc8.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..5703538
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 89074
+RPM_build_id: 8229
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3209.fc8
+Architecture: x86_64
+RPM_size: 172853261
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3209.fc8                    Build Date: Wed 06 Jun 2007 10:00:25 AM BST
+Install Date: (not installed)               Build Host: xenbuilder1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3209.fc8.src.rpm
+Size        : 580272612                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3209.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..a9b87a1
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i586.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i586.rpm.info
new file mode 100644 (file)
index 0000000..3f6b297
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 91930
+RPM_build_id: 8473
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3218.fc8
+Architecture: i586
+RPM_size: 177693614
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3218.fc8                    Build Date: Sat 09 Jun 2007 09:16:23 AM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3218.fc8.src.rpm
+Size        : 437012872                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3218.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..b6e2cce
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i686.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..c041e51
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 91946
+RPM_build_id: 8473
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3218.fc8
+Architecture: i686
+RPM_size: 184560750
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3218.fc8                    Build Date: Sat 09 Jun 2007 10:08:26 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3218.fc8.src.rpm
+Size        : 454541173                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3218.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..2618c01
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..85d5d73
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 91920
+RPM_build_id: 8473
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3218.fc8
+Architecture: ppc
+RPM_size: 233906910
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3218.fc8                    Build Date: Sat 09 Jun 2007 09:59:13 AM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3218.fc8.src.rpm
+Size        : 508762433                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3218.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..9bdf606
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..1599f08
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 91941
+RPM_build_id: 8473
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3218.fc8
+Architecture: ppc64
+RPM_size: 274807563
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3218.fc8                    Build Date: Sat 09 Jun 2007 09:53:05 AM BST
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3218.fc8.src.rpm
+Size        : 765973740                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3218.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..3ccf3ff
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3218.fc8.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..1e0b581
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 91926
+RPM_build_id: 8473
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3218.fc8
+Architecture: x86_64
+RPM_size: 175700682
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3218.fc8                    Build Date: Sat 09 Jun 2007 09:08:28 AM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3218.fc8.src.rpm
+Size        : 590854502                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3218.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..1c8d7d9
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i586.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i586.rpm.info
new file mode 100644 (file)
index 0000000..aab2c03
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94399
+RPM_build_id: 8692
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: i586
+RPM_size: 185848443
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 08:09:21 PM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 459589077                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..9c4e58f
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.i686.rpm.info
new file mode 100644 (file)
index 0000000..c9160b0
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94410
+RPM_build_id: 8692
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: i686
+RPM_size: 190701714
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 09:30:14 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 472056214                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..d308ab1
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.info
new file mode 100644 (file)
index 0000000..b888d3b
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94380
+RPM_build_id: 8692
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: ppc
+RPM_size: 221884228
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 08:48:58 PM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 483805569                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..09a159c
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..c9aa09b
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94407
+RPM_build_id: 8692
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: ppc64
+RPM_size: 260611148
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 08:40:46 PM BST
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 728638150                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..28dd8fc
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..20405b0
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94397
+RPM_build_id: 8692
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: x86_64
+RPM_size: 165733690
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 09:16:29 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 559721867                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..6416993
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.i686.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..60d2eb7
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 104554
+RPM_build_id: 9562
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3234.fc8
+Architecture: i686
+RPM_size: 184013664
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3234.fc8                    Build Date: Fri 22 Jun 2007 08:04:29 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3234.fc8.src.rpm
+Size        : 452133181                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3234.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..6db82fd
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..54da1db
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 104530
+RPM_build_id: 9562
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3234.fc8
+Architecture: ppc
+RPM_size: 235442522
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3234.fc8                    Build Date: Fri 22 Jun 2007 08:17:57 PM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3234.fc8.src.rpm
+Size        : 510422369                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3234.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..f97b780
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..7dad6d2
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 104542
+RPM_build_id: 9562
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3234.fc8
+Architecture: ppc64
+RPM_size: 275850761
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3234.fc8                    Build Date: Fri 22 Jun 2007 08:15:11 PM BST
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3234.fc8.src.rpm
+Size        : 765011806                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3234.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..e7d7945
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3234.fc8.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..5a7fdda
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 104538
+RPM_build_id: 9562
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3234.fc8
+Architecture: x86_64
+RPM_size: 174832970
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3234.fc8                    Build Date: Fri 22 Jun 2007 07:57:58 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3234.fc8.src.rpm
+Size        : 585413844                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3234.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..1414e44
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.i686.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..1bd8470
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 105361
+RPM_build_id: 9641
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3236.fc8
+Architecture: i686
+RPM_size: 184078580
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3236.fc8                    Build Date: Mon 25 Jun 2007 05:39:27 AM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3236.fc8.src.rpm
+Size        : 452287147                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3236.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..746fe9c
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..4c2d60a
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 105344
+RPM_build_id: 9641
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3236.fc8
+Architecture: ppc
+RPM_size: 235589634
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3236.fc8                    Build Date: Mon 25 Jun 2007 05:19:43 AM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3236.fc8.src.rpm
+Size        : 510623870                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3236.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..5db37b8
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..e8a904f
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 105354
+RPM_build_id: 9641
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3236.fc8
+Architecture: ppc64
+RPM_size: 276004069
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3236.fc8                    Build Date: Mon 25 Jun 2007 05:25:09 AM BST
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3236.fc8.src.rpm
+Size        : 765391471                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3236.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..8e28541
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3236.fc8.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..73c5e9f
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 105347
+RPM_build_id: 9641
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3236.fc8
+Architecture: x86_64
+RPM_size: 174919315
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3236.fc8                    Build Date: Mon 25 Jun 2007 05:26:38 AM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3236.fc8.src.rpm
+Size        : 585677958                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3236.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3238.fc8.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.21-1.3238.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..5aba4a1
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.21-1.3238.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.21-1.3238.fc8.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.21-1.3238.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..b14fbd7
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 105436
+RPM_build_id: 9647
+Name: kernel-debuginfo
+Version: 2.6.21
+Release: 1.3238.fc8
+Architecture: ppc
+RPM_size: 232481589
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3238.fc8                    Build Date: Mon 25 Jun 2007 10:55:06 AM BST
+Install Date: (not installed)               Build Host: ppc2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3238.fc8.src.rpm
+Size        : 504417116                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.21-1.3238.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..ec48345
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.info b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.i686.rpm.info
new file mode 100644 (file)
index 0000000..9b1dcaa
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 115409
+RPM_build_id: 10582
+Name: kernel-debuginfo
+Version: 2.6.22
+Release: 0.23.rc7.git6.fc8
+Architecture: i686
+RPM_size: 189223848
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.22                            Vendor: Fedora Project
+Release     : 0.23.rc7.git6.fc8             Build Date: Sat 07 Jul 2007 02:00:45 AM BST
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.22-0.23.rc7.git6.fc8.src.rpm
+Size        : 462749425                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.22-0.23.rc7.git6.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..f9093db
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..05a6773
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 115393
+RPM_build_id: 10582
+Name: kernel-debuginfo
+Version: 2.6.22
+Release: 0.23.rc7.git6.fc8
+Architecture: ppc
+RPM_size: 236641823
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.22                            Vendor: Fedora Project
+Release     : 0.23.rc7.git6.fc8             Build Date: Sat 07 Jul 2007 02:21:47 AM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.22-0.23.rc7.git6.fc8.src.rpm
+Size        : 512539678                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.22-0.23.rc7.git6.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..2956e3f
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..de43ec4
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 115404
+RPM_build_id: 10582
+Name: kernel-debuginfo
+Version: 2.6.22
+Release: 0.23.rc7.git6.fc8
+Architecture: ppc64
+RPM_size: 283677707
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.22                            Vendor: Fedora Project
+Release     : 0.23.rc7.git6.fc8             Build Date: Sat 07 Jul 2007 02:51:27 AM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.22-0.23.rc7.git6.fc8.src.rpm
+Size        : 782298039                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.22-0.23.rc7.git6.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..6f26c2a
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.22-0.23.rc7.git6.fc8.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..8f0e8b9
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 115398
+RPM_build_id: 10582
+Name: kernel-debuginfo
+Version: 2.6.22
+Release: 0.23.rc7.git6.fc8
+Architecture: x86_64
+RPM_size: 180328180
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.22                            Vendor: Fedora Project
+Release     : 0.23.rc7.git6.fc8             Build Date: Sat 07 Jul 2007 01:32:28 AM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.22-0.23.rc7.git6.fc8.src.rpm
+Size        : 603097364                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel
+This is required to use SystemTap with kernel-2.6.22-0.23.rc7.git6.fc8.
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-7.fc9.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..01d0818
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-7.fc9.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.i586.rpm.info b/kernels/kernel-debuginfo-2.6.24-7.fc9.i586.rpm.info
new file mode 100644 (file)
index 0000000..1aabfcd
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 383776
+RPM_build_id: 33301
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 7.fc9
+Architecture: i586
+RPM_size: 229226443
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 7.fc9                         Build Date: Tue 29 Jan 2008 01:09:44 AM GMT
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-7.fc9.src.rpm
+Size        : 555451244                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-7.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-7.fc9.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..e84d956
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-7.fc9.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.i686.rpm.info b/kernels/kernel-debuginfo-2.6.24-7.fc9.i686.rpm.info
new file mode 100644 (file)
index 0000000..ad692ed
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 383788
+RPM_build_id: 33301
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 7.fc9
+Architecture: i686
+RPM_size: 229251157
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 7.fc9                         Build Date: Tue 29 Jan 2008 01:40:30 AM GMT
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-7.fc9.src.rpm
+Size        : 555604507                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-7.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..5c7c12e
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc.rpm.info
new file mode 100644 (file)
index 0000000..35573d2
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 383764
+RPM_build_id: 33301
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 7.fc9
+Architecture: ppc
+RPM_size: 237436663
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 7.fc9                         Build Date: Tue 29 Jan 2008 02:11:11 AM GMT
+Install Date: (not installed)               Build Host: ppc2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-7.fc9.src.rpm
+Size        : 517733064                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-7.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..0e64f58
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.24-7.fc9.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..8637497
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 383782
+RPM_build_id: 33301
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 7.fc9
+Architecture: ppc64
+RPM_size: 287147329
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 7.fc9                         Build Date: Tue 29 Jan 2008 01:47:14 AM GMT
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-7.fc9.src.rpm
+Size        : 806851793                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-7.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-7.fc9.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..aea4e05
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-7.fc9.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-7.fc9.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.24-7.fc9.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..b18a6be
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 383768
+RPM_build_id: 33301
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 7.fc9
+Architecture: x86_64
+RPM_size: 201205622
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 7.fc9                         Build Date: Tue 29 Jan 2008 01:32:06 AM GMT
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-7.fc9.src.rpm
+Size        : 672341320                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-7.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.i586.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-9.fc9.i586.rpm.data.bz2
new file mode 100644 (file)
index 0000000..01d0818
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-9.fc9.i586.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.i586.rpm.info b/kernels/kernel-debuginfo-2.6.24-9.fc9.i586.rpm.info
new file mode 100644 (file)
index 0000000..b836cfc
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 385968
+RPM_build_id: 33481
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 9.fc9
+Architecture: i586
+RPM_size: 31933216
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 9.fc9                         Build Date: Tue 29 Jan 2008 11:06:35 PM GMT
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-9.fc9.src.rpm
+Size        : 77219460                         License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-9.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-9.fc9.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..e84d956
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-9.fc9.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.i686.rpm.info b/kernels/kernel-debuginfo-2.6.24-9.fc9.i686.rpm.info
new file mode 100644 (file)
index 0000000..a0706e6
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 385980
+RPM_build_id: 33481
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 9.fc9
+Architecture: i686
+RPM_size: 31935777
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 9.fc9                         Build Date: Tue 29 Jan 2008 11:19:58 PM GMT
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-9.fc9.src.rpm
+Size        : 77203527                         License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-9.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..5c7c12e
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc.rpm.info b/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc.rpm.info
new file mode 100644 (file)
index 0000000..fb6ca7f
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 385956
+RPM_build_id: 33481
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 9.fc9
+Architecture: ppc
+RPM_size: 23544847
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 9.fc9                         Build Date: Tue 29 Jan 2008 11:36:55 PM GMT
+Install Date: (not installed)               Build Host: ppc2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-9.fc9.src.rpm
+Size        : 46961856                         License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-9.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..0e64f58
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc64.rpm.info b/kernels/kernel-debuginfo-2.6.24-9.fc9.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..17e9704
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 385974
+RPM_build_id: 33481
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 9.fc9
+Architecture: ppc64
+RPM_size: 287185692
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 9.fc9                         Build Date: Tue 29 Jan 2008 11:27:22 PM GMT
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-9.fc9.src.rpm
+Size        : 807021505                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-9.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.24-9.fc9.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..aea4e05
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.24-9.fc9.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.24-9.fc9.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.24-9.fc9.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..ff6a0fe
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 385964
+RPM_build_id: 33481
+Name: kernel-debuginfo
+Version: 2.6.24
+Release: 9.fc9
+Architecture: x86_64
+RPM_size: 201236961
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 9.fc9                         Build Date: Tue 29 Jan 2008 10:57:35 PM GMT
+Install Date: (not installed)               Build Host: xenbuilder4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-9.fc9.src.rpm
+Size        : 672503920                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.24-9.fc9.
diff --git a/kernels/kernel-debuginfo-2.6.25.11-97.fc9.i686.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.25.11-97.fc9.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..87c9479
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.25.11-97.fc9.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.25.11-97.fc9.i686.rpm.info b/kernels/kernel-debuginfo-2.6.25.11-97.fc9.i686.rpm.info
new file mode 100644 (file)
index 0000000..fb6e970
--- /dev/null
@@ -0,0 +1,20 @@
+Source: fedora-koji
+Distribution: Fedora
+Name: kernel-debuginfo
+Version: 2.6.25.11
+Release: 97.fc9
+Architecture: i686
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.25.11                         Vendor: Fedora Project
+Release     : 97.fc9                        Build Date: Mon 21 Jul 2008 06:53:47 AM BST
+Install Date: (not installed)               Build Host: x86-5
+Group       : Development/Debug             Source RPM: kernel-2.6.25.11-97.fc9.src.rpm
+Size        : 568828378                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.25.11-97.fc9.i686.
diff --git a/kernels/kernel-debuginfo-2.6.25.11-97.fc9.x86_64.rpm.data.bz2 b/kernels/kernel-debuginfo-2.6.25.11-97.fc9.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..2ae3ce9
Binary files /dev/null and b/kernels/kernel-debuginfo-2.6.25.11-97.fc9.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-debuginfo-2.6.25.11-97.fc9.x86_64.rpm.info b/kernels/kernel-debuginfo-2.6.25.11-97.fc9.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..01cb9dc
--- /dev/null
@@ -0,0 +1,20 @@
+Source: fedora-koji
+Distribution: Fedora
+Name: kernel-debuginfo
+Version: 2.6.25.11
+Release: 97.fc9
+Architecture: x86_64
+
+Name        : kernel-debuginfo             Relocations: (not relocatable)
+Version     : 2.6.25.11                         Vendor: Fedora Project
+Release     : 97.fc9                        Build Date: Mon 21 Jul 2008 06:23:41 AM BST
+Install Date: (not installed)               Build Host: x86-3
+Group       : Development/Debug             Source RPM: kernel-2.6.25.11-97.fc9.src.rpm
+Size        : 686868623                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel
+Description :
+This package provides debug information for package kernel.
+This is required to use SystemTap with kernel-2.6.25.11-97.fc9.x86_64.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..06675be
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..2a64737
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 112: (build 8) kernel-kdump-debuginfo 2.6.18 1.2798.fc6 (172356745 bytes) i686
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 08:57:26 PM BST
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 413278169                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..1a42822
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..4e60d8b
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 105: (build 8) kernel-kdump-debuginfo 2.6.18 1.2798.fc6 (214777196 bytes) ppc64
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 10:08:45 PM BST
+Install Date: (not installed)               Build Host: js20-bc2-10.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 597303033                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c59d40b
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.ppc64iseries.rpm.info
new file mode 100644 (file)
index 0000000..f1244cf
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 87: (build 8) kernel-kdump-debuginfo 2.6.18 1.2798.fc6 (110989820 bytes) ppc64iseries
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 09:08:36 PM BST
+Install Date: (not installed)               Build Host: js20-bc2-12.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 300183806                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..512cc6f
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..c7ad366
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 100: (build 8) kernel-kdump-debuginfo 2.6.18 1.2798.fc6 (172242859 bytes) x86_64
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 09:12:02 PM BST
+Install Date: (not installed)               Build Host: hs20-bc1-6.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 563451280                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..ccf54bb
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..97707ed
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16551
+RPM_build_id: 1422
+Name: kernel-kdump-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: i686
+RPM_size: 194667784
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:58:24 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 482513628                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:00:39 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..ba4137c
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..68839e5
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16544
+RPM_build_id: 1422
+Name: kernel-kdump-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: ppc64
+RPM_size: 241517633
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:46:07 PM GMT
+Install Date: (not installed)               Build Host: js20-bc1-9.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 675738986                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:02:12 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..d80111a
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..72cf4cc
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16530
+RPM_build_id: 1422
+Name: kernel-kdump-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: x86_64
+RPM_size: 172004880
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:07:03 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc1-5.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 559132560                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:03:53 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..61b0e86
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..828e052
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 54999
+RPM_build_id: 6138
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: ppc64
+RPM_size: 261883614
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Thu 03 May 2007 11:44:14 PM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 732405427                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..461e115
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3128.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..93e6b5d
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 54985
+RPM_build_id: 6138
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: x86_64
+RPM_size: 186528662
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Fri 04 May 2007 12:40:37 AM BST
+Install Date: (not installed)               Build Host: hammer2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 607940242                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..61b0e86
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..1d3a008
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55081
+RPM_build_id: 6151
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: ppc64
+RPM_size: 261962912
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 05:15:40 AM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 732609099                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..461e115
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3132.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..cfa1dbc
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55066
+RPM_build_id: 6151
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: x86_64
+RPM_size: 186589988
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 06:17:52 AM BST
+Install Date: (not installed)               Build Host: xenbuilder1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 608115746                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..711d46c
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..2acc52a
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61363
+RPM_build_id: 6385
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: ppc64
+RPM_size: 261561637
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 09:53:24 PM BST
+Install Date: (not installed)               Build Host: ppc2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 731399441                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..461e115
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3144.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..e3d9859
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61351
+RPM_build_id: 6385
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: x86_64
+RPM_size: 186206478
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 09:26:56 PM BST
+Install Date: (not installed)               Build Host: xenbuilder3.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 606680999                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..f4de128
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3209.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..012ecd7
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 89086
+RPM_build_id: 8229
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3209.fc8
+Architecture: ppc64
+RPM_size: 270638630
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3209.fc8                    Build Date: Wed 06 Jun 2007 09:54:58 AM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3209.fc8.src.rpm
+Size        : 752842148                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3209.fc8.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c476b85
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3218.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..ee16495
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 91936
+RPM_build_id: 8473
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3218.fc8
+Architecture: ppc64
+RPM_size: 274914328
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3218.fc8                    Build Date: Sat 09 Jun 2007 09:53:05 AM BST
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3218.fc8.src.rpm
+Size        : 766120394                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3218.fc8.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..bac515e
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..1f249bb
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94402
+RPM_build_id: 8692
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: ppc64
+RPM_size: 260700298
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 08:40:46 PM BST
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 728765388                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c87c0ff
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3228.fc7.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..76e024e
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94391
+RPM_build_id: 8692
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: x86_64
+RPM_size: 180190194
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 09:16:29 PM BST
+Install Date: (not installed)               Build Host: xenbuilder2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 590063701                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..924087b
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3234.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..4899484
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 104548
+RPM_build_id: 9562
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3234.fc8
+Architecture: ppc64
+RPM_size: 275978264
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3234.fc8                    Build Date: Fri 22 Jun 2007 08:15:11 PM BST
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3234.fc8.src.rpm
+Size        : 765163124                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3234.fc8.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..6a33c21
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.21-1.3236.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..b180591
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 105355
+RPM_build_id: 9641
+Name: kernel-kdump-debuginfo
+Version: 2.6.21
+Release: 1.3236.fc8
+Architecture: ppc64
+RPM_size: 276112717
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3236.fc8                    Build Date: Mon 25 Jun 2007 05:25:09 AM BST
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3236.fc8.src.rpm
+Size        : 765544485                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.21-1.3236.fc8.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..e5290ea
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..1ff1b37
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 115407
+RPM_build_id: 10582
+Name: kernel-kdump-debuginfo
+Version: 2.6.22
+Release: 0.23.rc7.git6.fc8
+Architecture: ppc64
+RPM_size: 283761874
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.22                            Vendor: Fedora Project
+Release     : 0.23.rc7.git6.fc8             Build Date: Sat 07 Jul 2007 02:51:27 AM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.22-0.23.rc7.git6.fc8.src.rpm
+Size        : 782448805                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump
+This is required to use SystemTap with kernel-kdump-2.6.22-0.23.rc7.git6.fc8.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.24-7.fc9.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.24-7.fc9.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..3d310ff
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.24-7.fc9.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.24-7.fc9.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.24-7.fc9.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..3a175ab
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 383785
+RPM_build_id: 33301
+Name: kernel-kdump-debuginfo
+Version: 2.6.24
+Release: 7.fc9
+Architecture: ppc64
+RPM_size: 287177883
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 7.fc9                         Build Date: Tue 29 Jan 2008 01:47:14 AM GMT
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-7.fc9.src.rpm
+Size        : 806919630                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump.
+This is required to use SystemTap with kernel-kdump-2.6.24-7.fc9.
diff --git a/kernels/kernel-kdump-debuginfo-2.6.24-9.fc9.ppc64.rpm.data.bz2 b/kernels/kernel-kdump-debuginfo-2.6.24-9.fc9.ppc64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..3d310ff
Binary files /dev/null and b/kernels/kernel-kdump-debuginfo-2.6.24-9.fc9.ppc64.rpm.data.bz2 differ
diff --git a/kernels/kernel-kdump-debuginfo-2.6.24-9.fc9.ppc64.rpm.info b/kernels/kernel-kdump-debuginfo-2.6.24-9.fc9.ppc64.rpm.info
new file mode 100644 (file)
index 0000000..e2b8bc8
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 385977
+RPM_build_id: 33481
+Name: kernel-kdump-debuginfo
+Version: 2.6.24
+Release: 9.fc9
+Architecture: ppc64
+RPM_size: 287239947
+
+Name        : kernel-kdump-debuginfo       Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 9.fc9                         Build Date: Tue 29 Jan 2008 11:27:22 PM GMT
+Install Date: (not installed)               Build Host: ppc4.fedora.phx.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-9.fc9.src.rpm
+Size        : 807089190                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel-kdump
+Description :
+This package provides debug information for package kernel-kdump.
+This is required to use SystemTap with kernel-kdump-2.6.24-9.fc9.
diff --git a/kernels/kernel-smp-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..0fccebe
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.18-1.2798.fc6.ppc.rpm.info
new file mode 100644 (file)
index 0000000..6a90298
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 79: (build 8) kernel-smp-debuginfo 2.6.18 1.2798.fc6 (193355819 bytes) ppc
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 09:31:44 PM BST
+Install Date: (not installed)               Build Host: js20-bc2-12.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 422632173                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-smp-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..f2c3a60
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.20-1.2933.fc6.ppc.rpm.info
new file mode 100644 (file)
index 0000000..67fc792
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16521
+RPM_build_id: 1422
+Name: kernel-smp-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: ppc
+RPM_size: 210050204
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:02:19 PM GMT
+Install Date: (not installed)               Build Host: js20-bc1-12.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 458016187                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:03:04 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..70224b4
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.21-1.3128.fc7.ppc.rpm.info
new file mode 100644 (file)
index 0000000..6f2757e
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 54978
+RPM_build_id: 6138
+Name: kernel-smp-debuginfo
+Version: 2.6.21
+Release: 1.3128.fc7
+Architecture: ppc
+RPM_size: 225849401
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3128.fc7                    Build Date: Thu 03 May 2007 11:15:53 PM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3128.fc7.src.rpm
+Size        : 492114795                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.21-1.3128.fc7.
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..70224b4
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.21-1.3132.fc7.ppc.rpm.info
new file mode 100644 (file)
index 0000000..f2ab34d
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 55059
+RPM_build_id: 6151
+Name: kernel-smp-debuginfo
+Version: 2.6.21
+Release: 1.3132.fc7
+Architecture: ppc
+RPM_size: 225924350
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3132.fc7                    Build Date: Fri 04 May 2007 04:47:04 AM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3132.fc7.src.rpm
+Size        : 492265495                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.21-1.3132.fc7.
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..70224b4
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.21-1.3144.fc7.ppc.rpm.info
new file mode 100644 (file)
index 0000000..33fb8c6
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 61345
+RPM_build_id: 6385
+Name: kernel-smp-debuginfo
+Version: 2.6.21
+Release: 1.3144.fc7
+Architecture: ppc
+RPM_size: 225470469
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Koji
+Release     : 1.3144.fc7                    Build Date: Tue 08 May 2007 10:02:36 PM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3144.fc7.src.rpm
+Size        : 491161016                        License: GPLv2
+Signature   : (none)
+Packager    : Koji
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.21-1.3144.fc7.
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..3fe3c1f
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.21-1.3209.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..b213240
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 89067
+RPM_build_id: 8229
+Name: kernel-smp-debuginfo
+Version: 2.6.21
+Release: 1.3209.fc8
+Architecture: ppc
+RPM_size: 232274564
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3209.fc8                    Build Date: Wed 06 Jun 2007 09:40:08 AM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3209.fc8.src.rpm
+Size        : 504644921                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.21-1.3209.fc8.
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..e389aab
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.21-1.3218.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..99de475
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 91919
+RPM_build_id: 8473
+Name: kernel-smp-debuginfo
+Version: 2.6.21
+Release: 1.3218.fc8
+Architecture: ppc
+RPM_size: 235947789
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3218.fc8                    Build Date: Sat 09 Jun 2007 09:59:13 AM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3218.fc8.src.rpm
+Size        : 512968228                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.21-1.3218.fc8.
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..c3c0e91
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.21-1.3228.fc7.ppc.rpm.info
new file mode 100644 (file)
index 0000000..1580af8
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 94379
+RPM_build_id: 8692
+Name: kernel-smp-debuginfo
+Version: 2.6.21
+Release: 1.3228.fc7
+Architecture: ppc
+RPM_size: 224336447
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3228.fc7                    Build Date: Tue 12 Jun 2007 08:48:58 PM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3228.fc7.src.rpm
+Size        : 488357691                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.21-1.3228.fc7.
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..cb324a3
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.21-1.3234.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..6dd88ee
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 104528
+RPM_build_id: 9562
+Name: kernel-smp-debuginfo
+Version: 2.6.21
+Release: 1.3234.fc8
+Architecture: ppc
+RPM_size: 237317445
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3234.fc8                    Build Date: Fri 22 Jun 2007 08:17:57 PM BST
+Install Date: (not installed)               Build Host: ppc3.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3234.fc8.src.rpm
+Size        : 514523203                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.21-1.3234.fc8.
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..ad50039
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.21-1.3236.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..a34f4cd
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 105343
+RPM_build_id: 9641
+Name: kernel-smp-debuginfo
+Version: 2.6.21
+Release: 1.3236.fc8
+Architecture: ppc
+RPM_size: 237492561
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.21                            Vendor: Fedora Project
+Release     : 1.3236.fc8                    Build Date: Mon 25 Jun 2007 05:19:43 AM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.21-1.3236.fc8.src.rpm
+Size        : 514731524                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.21-1.3236.fc8.
diff --git a/kernels/kernel-smp-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..72d3ea6
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.22-0.23.rc7.git6.fc8.ppc.rpm.info
new file mode 100644 (file)
index 0000000..a648505
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 115394
+RPM_build_id: 10582
+Name: kernel-smp-debuginfo
+Version: 2.6.22
+Release: 0.23.rc7.git6.fc8
+Architecture: ppc
+RPM_size: 242795746
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.22                            Vendor: Fedora Project
+Release     : 0.23.rc7.git6.fc8             Build Date: Sat 07 Jul 2007 02:21:47 AM BST
+Install Date: (not installed)               Build Host: ppc1.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.22-0.23.rc7.git6.fc8.src.rpm
+Size        : 525330629                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp
+This is required to use SystemTap with kernel-smp-2.6.22-0.23.rc7.git6.fc8.
diff --git a/kernels/kernel-smp-debuginfo-2.6.24-7.fc9.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.24-7.fc9.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..5f029ec
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.24-7.fc9.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.24-7.fc9.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.24-7.fc9.ppc.rpm.info
new file mode 100644 (file)
index 0000000..c51af96
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 383767
+RPM_build_id: 33301
+Name: kernel-smp-debuginfo
+Version: 2.6.24
+Release: 7.fc9
+Architecture: ppc
+RPM_size: 244072955
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 7.fc9                         Build Date: Tue 29 Jan 2008 02:11:11 AM GMT
+Install Date: (not installed)               Build Host: ppc2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-7.fc9.src.rpm
+Size        : 531457291                        License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp.
+This is required to use SystemTap with kernel-smp-2.6.24-7.fc9.
diff --git a/kernels/kernel-smp-debuginfo-2.6.24-9.fc9.ppc.rpm.data.bz2 b/kernels/kernel-smp-debuginfo-2.6.24-9.fc9.ppc.rpm.data.bz2
new file mode 100644 (file)
index 0000000..5f029ec
Binary files /dev/null and b/kernels/kernel-smp-debuginfo-2.6.24-9.fc9.ppc.rpm.data.bz2 differ
diff --git a/kernels/kernel-smp-debuginfo-2.6.24-9.fc9.ppc.rpm.info b/kernels/kernel-smp-debuginfo-2.6.24-9.fc9.ppc.rpm.info
new file mode 100644 (file)
index 0000000..045303a
--- /dev/null
@@ -0,0 +1,23 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 385959
+RPM_build_id: 33481
+Name: kernel-smp-debuginfo
+Version: 2.6.24
+Release: 9.fc9
+Architecture: ppc
+RPM_size: 24387257
+
+Name        : kernel-smp-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.24                            Vendor: Fedora Project
+Release     : 9.fc9                         Build Date: Tue 29 Jan 2008 11:36:55 PM GMT
+Install Date: (not installed)               Build Host: ppc2.fedora.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.24-9.fc9.src.rpm
+Size        : 48497143                         License: GPLv2
+Signature   : (none)
+Packager    : Fedora Project
+URL         : http://www.kernel.org/
+Summary     : Debug information for package kernel-smp
+Description :
+This package provides debug information for package kernel-smp.
+This is required to use SystemTap with kernel-smp-2.6.24-9.fc9.
diff --git a/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 b/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..f31e3c4
Binary files /dev/null and b/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info b/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..f716723
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 115: (build 8) kernel-xen-debuginfo 2.6.18 1.2798.fc6 (158840978 bytes) i686
+Name        : kernel-xen-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 08:57:26 PM BST
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 387143416                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-xen
+Description :
+This package provides debug information for package kernel-xen
+This is required to use SystemTap with kernel-xen-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 b/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..ef1728e
Binary files /dev/null and b/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info b/kernels/kernel-xen-debuginfo-2.6.18-1.2798.fc6.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..df8c4b8
--- /dev/null
@@ -0,0 +1,13 @@
+RPM: 102: (build 8) kernel-xen-debuginfo 2.6.18 1.2798.fc6 (159516665 bytes) x86_64
+Name        : kernel-xen-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.18                            Vendor: Red Hat, Inc.
+Release     : 1.2798.fc6                    Build Date: Mon 16 Oct 2006 09:12:02 PM BST
+Install Date: (not installed)               Build Host: hs20-bc1-6.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.18-1.2798.fc6.src.rpm
+Size        : 541598403                        License: GPLv2
+Signature   : (none)
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-xen
+Description :
+This package provides debug information for package kernel-xen
+This is required to use SystemTap with kernel-xen-2.6.18-1.2798.fc6.
diff --git a/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 b/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2
new file mode 100644 (file)
index 0000000..f1d117e
Binary files /dev/null and b/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.i686.rpm.data.bz2 differ
diff --git a/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info b/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.i686.rpm.info
new file mode 100644 (file)
index 0000000..74e64a4
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16555
+RPM_build_id: 1422
+Name: kernel-xen-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: i686
+RPM_size: 173649163
+
+Name        : kernel-xen-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:58:24 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc2-4.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 430531453                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:01:25 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-xen
+Description :
+This package provides debug information for package kernel-xen
+This is required to use SystemTap with kernel-xen-2.6.20-1.2933.fc6.
diff --git a/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 b/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2
new file mode 100644 (file)
index 0000000..9e52abd
Binary files /dev/null and b/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.data.bz2 differ
diff --git a/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info b/kernels/kernel-xen-debuginfo-2.6.20-1.2933.fc6.x86_64.rpm.info
new file mode 100644 (file)
index 0000000..72eb7f3
--- /dev/null
@@ -0,0 +1,22 @@
+Source: fedora-koji
+Distribution: Fedora
+RPM_id: 16535
+RPM_build_id: 1422
+Name: kernel-xen-debuginfo
+Version: 2.6.20
+Release: 1.2933.fc6
+Architecture: x86_64
+RPM_size: 154251753
+
+Name        : kernel-xen-debuginfo         Relocations: (not relocatable)
+Version     : 2.6.20                            Vendor: Red Hat, Inc.
+Release     : 1.2933.fc6                    Build Date: Mon 19 Mar 2007 04:07:03 PM GMT
+Install Date: (not installed)               Build Host: hs20-bc1-5.build.redhat.com
+Group       : Development/Debug             Source RPM: kernel-2.6.20-1.2933.fc6.src.rpm
+Size        : 520318522                        License: GPLv2
+Signature   : DSA/SHA1, Fri 23 Mar 2007 04:04:04 PM GMT, Key ID b44269d04f2a6fd2
+Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
+Summary     : Debug information for package kernel-xen
+Description :
+This package provides debug information for package kernel-xen
+This is required to use SystemTap with kernel-xen-2.6.20-1.2933.fc6.
index 3e083d2..51d8e06 100644 (file)
@@ -1,12 +1,40 @@
-virt_mem.cmi: virt_mem_utils.cmo virt_mem_mmap.cmi 
-virt_mem_mmap.cmi: virt_mem_utils.cmo /usr/lib64/ocaml/bitmatch/bitmatch.cmi 
-virt_mem.cmo: virt_mem_version.cmo virt_mem_utils.cmo virt_mem_mmap.cmi \
-    virt_mem_gettext.cmo /usr/lib64/ocaml/bitmatch/bitmatch.cmi virt_mem.cmi 
-virt_mem.cmx: virt_mem_version.cmx virt_mem_utils.cmx virt_mem_mmap.cmx \
-    virt_mem_gettext.cmx /usr/lib64/ocaml/bitmatch/bitmatch.cmi virt_mem.cmi 
-virt_mem_mmap.cmo: virt_mem_utils.cmo /usr/lib64/ocaml/bitmatch/bitmatch.cmi \
-    virt_mem_mmap.cmi 
-virt_mem_mmap.cmx: virt_mem_utils.cmx /usr/lib64/ocaml/bitmatch/bitmatch.cmi \
-    virt_mem_mmap.cmi 
-virt_mem_utils.cmo: /usr/lib64/ocaml/bitmatch/bitmatch.cmi 
-virt_mem_utils.cmx: /usr/lib64/ocaml/bitmatch/bitmatch.cmi 
+kernel_net_device.cmi: virt_mem_mmap.cmi 
+kernel_task_struct.cmi: virt_mem_mmap.cmi 
+virt_mem_kallsyms.cmi: virt_mem_types.cmi 
+virt_mem_ksyms.cmi: virt_mem_types.cmi 
+virt_mem.cmi: virt_mem_types.cmi 
+virt_mem_mmap.cmi: virt_mem_utils.cmo 
+virt_mem_types.cmi: virt_mem_utils.cmo virt_mem_mmap.cmi 
+virt_mem_utsname.cmi: virt_mem_types.cmi 
+kernel_net_device.cmo: virt_mem_mmap.cmi kernel_net_device.cmi 
+kernel_net_device.cmx: virt_mem_mmap.cmx kernel_net_device.cmi 
+kernel_task_struct.cmo: virt_mem_mmap.cmi kernel_task_struct.cmi 
+kernel_task_struct.cmx: virt_mem_mmap.cmx kernel_task_struct.cmi 
+test_mmap.cmo: virt_mem_mmap.cmi 
+test_mmap.cmx: virt_mem_mmap.cmx 
+virt_mem_capture.cmo: virt_mem_types.cmi virt_mem_gettext.cmo virt_mem.cmi 
+virt_mem_capture.cmx: virt_mem_types.cmx virt_mem_gettext.cmx virt_mem.cmx 
+virt_mem_kallsyms.cmo: virt_mem_utils.cmo virt_mem_types.cmi \
+    virt_mem_mmap.cmi virt_mem_ksyms.cmi virt_mem_gettext.cmo \
+    virt_mem_kallsyms.cmi 
+virt_mem_kallsyms.cmx: virt_mem_utils.cmx virt_mem_types.cmx \
+    virt_mem_mmap.cmx virt_mem_ksyms.cmx virt_mem_gettext.cmx \
+    virt_mem_kallsyms.cmi 
+virt_mem_ksyms.cmo: virt_mem_utils.cmo virt_mem_types.cmi virt_mem_mmap.cmi \
+    virt_mem_gettext.cmo virt_mem_ksyms.cmi 
+virt_mem_ksyms.cmx: virt_mem_utils.cmx virt_mem_types.cmx virt_mem_mmap.cmx \
+    virt_mem_gettext.cmx virt_mem_ksyms.cmi 
+virt_mem.cmo: virt_mem_version.cmo virt_mem_utsname.cmi virt_mem_utils.cmo \
+    virt_mem_types.cmi virt_mem_mmap.cmi virt_mem_ksyms.cmi \
+    virt_mem_kallsyms.cmi virt_mem_gettext.cmo virt_mem.cmi 
+virt_mem.cmx: virt_mem_version.cmx virt_mem_utsname.cmx virt_mem_utils.cmx \
+    virt_mem_types.cmx virt_mem_mmap.cmx virt_mem_ksyms.cmx \
+    virt_mem_kallsyms.cmx virt_mem_gettext.cmx virt_mem.cmi 
+virt_mem_mmap.cmo: virt_mem_utils.cmo virt_mem_mmap.cmi 
+virt_mem_mmap.cmx: virt_mem_utils.cmx virt_mem_mmap.cmi 
+virt_mem_types.cmo: virt_mem_utils.cmo virt_mem_mmap.cmi virt_mem_types.cmi 
+virt_mem_types.cmx: virt_mem_utils.cmx virt_mem_mmap.cmx virt_mem_types.cmi 
+virt_mem_utsname.cmo: virt_mem_utils.cmo virt_mem_types.cmi virt_mem_mmap.cmi \
+    virt_mem_gettext.cmo virt_mem_utsname.cmi 
+virt_mem_utsname.cmx: virt_mem_utils.cmx virt_mem_types.cmx virt_mem_mmap.cmx \
+    virt_mem_gettext.cmx virt_mem_utsname.cmi 
index c520552..a92a984 100644 (file)
@@ -21,23 +21,27 @@ VERSION             = @PACKAGE_VERSION@
 
 INSTALL                = @INSTALL@
 
-SYNTAX         = -pp "camlp4o -I$$(ocamlc -where)/bitmatch bitmatch.cma pa_bitmatch.cmo"
+OCAMLLIB       = @OCAMLLIB@
 
-#OCAMLCPACKAGES        = -package unix,bigarray,extlib,libvirt,xml-light,bitmatch
-OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light -I +bitmatch
+pkg_gettext    = @pkg_gettext@
+
+CC             = @CC@
+CFLAGS         = @CFLAGS@ -fPIC -Wall -Werror -I$(OCAMLLIB) -I@top_srcdir@
+
+SYNTAX         = -syntax bitstring.syntax
+
+OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light,bitstring.syntax
 
 ifneq ($(pkg_gettext),no)
 OCAMLCPACKAGES += -package gettext-stub
 endif
 
 OCAMLCFLAGS    = @OCAMLCFLAGS@ $(SYNTAX)
-OCAMLCLIBS     = -linkpkg bitmatch.cma
+OCAMLCLIBS     = -linkpkg
 
 OCAMLOPTFLAGS  = @OCAMLOPTFLAGS@ $(SYNTAX)
 OCAMLOPTPACKAGES = $(OCAMLCPACKAGES)
-OCAMLOPTLIBS   = -linkpkg bitmatch.cmxa
-
-OCAMLDOCFLAGS  = -html -sort $(OCAMLCPACKAGES) $(SYNTAX)
+OCAMLOPTLIBS   = -linkpkg
 
 OCAMLDEPFLAGS  = $(SYNTAX)
 
@@ -46,17 +50,31 @@ TARGETS             = virt_mem.cma virt_mem.cmxa
 OBJS           = virt_mem_gettext.cmo \
                  virt_mem_version.cmo \
                  virt_mem_utils.cmo \
+                 virt_mem_mmap_c.o \
                  virt_mem_mmap.cmo \
-                 virt_mem.cmo
+                 kernel_task_struct.cmo \
+                 kernel_net_device.cmo \
+                 virt_mem_types.cmo \
+                 virt_mem_ksyms.cmo \
+                 virt_mem_kallsyms.cmo \
+                 virt_mem_utsname.cmo \
+                 virt_mem.cmo \
+                 virt_mem_capture.cmo
 XOBJS          = $(OBJS:%.cmo=%.cmx)
 
 all:   $(TARGETS)
 
 virt_mem.cma: $(OBJS)
-       ocamlfind ocamlc $(OCAMLCFLAGS) $(OCAMLCPACKAGES) -a -o $@ $^
+       ocamlmklib -o virt_mem $^
 
 virt_mem.cmxa: $(XOBJS)
-       ocamlfind ocamlopt $(OCAMLOPTFLAGS) $(OCAMLOPTPACKAGES) -a -o $@ $^
+       ocamlmklib -o virt_mem $^
+
+# Just for testing Virt_mem_mmap module:
+test_mmap: virt_mem_utils.cmx virt_mem_mmap_c.o virt_mem_mmap.cmx test_mmap.cmx
+       ocamlfind ocamlopt \
+         $(OCAMLOPTFLAGS) $(OCAMLOPTPACKAGES) $(OCAMLOPTLIBS) \
+         bitstring.cmxa -o $@ $^
 
 install:
 
diff --git a/lib/kernel_net_device.ml b/lib/kernel_net_device.ml
new file mode 100644 (file)
index 0000000..636df4b
--- /dev/null
@@ -0,0 +1,348 @@
+let warning =
+  "This code is automatically generated from the kernel database by kerneldb-to-parser program.  Any edits you make will be lost.";;
+let zero = 0;;
+exception ParseError of string * string * string;;
+type t = { net_device_dev_addr : string; net_device_name : string };;
+let parser_1 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(2240), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_1", "failed to match kernel structure"));;
+let parser_2 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(2496), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_2", "failed to match kernel structure"));;
+let parser_3 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(2688), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_3", "failed to match kernel structure"));;
+let parser_4 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(4416), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_4", "failed to match kernel structure"));;
+let parser_5 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(4416), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_5", "failed to match kernel structure"));;
+let parser_6 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(3392), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_6", "failed to match kernel structure"));;
+let parser_7 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(3264), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_7", "failed to match kernel structure"));;
+let parser_8 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(4288), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_8", "failed to match kernel structure"));;
+let parser_9 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(1728), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_9", "failed to match kernel structure"));;
+let parser_10 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(1728), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_10", "failed to match kernel structure"));;
+let parser_11 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(2528), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_11", "failed to match kernel structure"));;
+let parser_12 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(4288), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_12", "failed to match kernel structure"));;
+let parser_13 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(3392), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_13", "failed to match kernel structure"));;
+let parser_14 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(2528), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_14", "failed to match kernel structure"));;
+let parser_15 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(1696), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_15", "failed to match kernel structure"));;
+let parser_16 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(2624), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_16", "failed to match kernel structure"));;
+let parser_17 bits = bitmatch bits with
+  | { net_device_name : 128 : offset(0), string;
+    net_device_dev_addr : 256 : offset(1696), string } -> { net_device_name = net_device_name;
+    net_device_dev_addr = net_device_dev_addr }
+  | { _ } -> raise (ParseError ("net_device", "parser_17", "failed to match kernel structure"));;
+module StringMap = Map.Make(String);;
+let map = StringMap.empty;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3128.fc7.i586" v map;;
+let v = (parser_2, 1092);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.ppc" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3128.fc7.i686" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3132.fc7.i686" v map;;
+let v = (parser_2, 1092);;
+let map = StringMap.add "2.6.21-1.3236.fc8.ppc" v map;;
+let v = (parser_1, 1116);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i586" v map;;
+let v = (parser_3, 1108);;
+let map = StringMap.add "2.6.18-1.2798.fc6.x86_64" v map;;
+let v = (parser_4, 2316);;
+let map = StringMap.add "2.6.21-1.3236.fc8.x86_64" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.21-1.3218.fc8.ppc64" v map;;
+let v = (parser_6, 1684);;
+let map = StringMap.add "2.6.21-1.3228.fc7.ppc64" v map;;
+let v = (parser_3, 1404);;
+let map = StringMap.add "2.6.21-1.3228.fc7.x86_64" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3218.fc8.i586" v map;;
+let v = (parser_4, 2316);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.x86_64" v map;;
+let v = (parser_6, 1924);;
+let map = StringMap.add "2.6.21-1.3144.fc7.ppc64" v map;;
+let v = (parser_2, 1092);;
+let map = StringMap.add "2.6.21-1.3218.fc8.ppc" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.ppc64" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3236.fc8.i686" v map;;
+let v = (parser_6, 1924);;
+let map = StringMap.add "2.6.21-1.3132.fc7.ppc64" v map;;
+let v = (parser_1, 1116);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i686" v map;;
+let v = (parser_8, 2288);;
+let map = StringMap.add "2.6.24-9.fc9.x86_64" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.ppc64" v map;;
+let v = (parser_6, 1924);;
+let map = StringMap.add "2.6.21-1.3132.fc7.ppc64" v map;;
+let v = (parser_8, 2288);;
+let map = StringMap.add "2.6.24-7.fc9.x86_64" v map;;
+let v = (parser_1, 912);;
+let map = StringMap.add "2.6.18-1.2798.fc6.i586" v map;;
+let v = (parser_9, 1020);;
+let map = StringMap.add "2.6.21-1.3132.fc7.ppc" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.21-1.3234.fc8.ppc64" v map;;
+let v = (parser_1, 912);;
+let map = StringMap.add "2.6.18-1.2798.fc6.i686" v map;;
+let v = (parser_8, 1752);;
+let map = StringMap.add "2.6.25.11-97.fc9.x86_64" v map;;
+let v = (parser_10, 672);;
+let map = StringMap.add "2.6.18-1.2798.fc6.i686" v map;;
+let v = (parser_11, 1244);;
+let map = StringMap.add "2.6.24-9.fc9.i686" v map;;
+let v = (parser_12, 1984);;
+let map = StringMap.add "2.6.24-7.fc9.ppc64" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.i686" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.21-1.3236.fc8.ppc64" v map;;
+let v = (parser_2, 1116);;
+let map = StringMap.add "2.6.21-1.3209.fc8.ppc" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.21-1.3236.fc8.ppc64" v map;;
+let v = (parser_6, 1684);;
+let map = StringMap.add "2.6.21-1.3228.fc7.ppc64" v map;;
+let v = (parser_6, 1924);;
+let map = StringMap.add "2.6.21-1.3128.fc7.ppc64" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3209.fc8.i686" v map;;
+let v = (parser_13, 2196);;
+let map = StringMap.add "2.6.21-1.3132.fc7.x86_64" v map;;
+let v = (parser_12, 1984);;
+let map = StringMap.add "2.6.24-7.fc9.ppc64" v map;;
+let v = (parser_13, 2196);;
+let map = StringMap.add "2.6.21-1.3228.fc7.x86_64" v map;;
+let v = (parser_14, 1072);;
+let map = StringMap.add "2.6.24-9.fc9.ppc" v map;;
+let v = (parser_9, 672);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc" v map;;
+let v = (parser_9, 1020);;
+let map = StringMap.add "2.6.21-1.3128.fc7.ppc" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3209.fc8.i686" v map;;
+let v = (parser_13, 1540);;
+let map = StringMap.add "2.6.20-1.2933.fc6.x86_64" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3234.fc8.i686" v map;;
+let v = (parser_9, 1020);;
+let map = StringMap.add "2.6.21-1.3144.fc7.ppc" v map;;
+let v = (parser_6, 1924);;
+let map = StringMap.add "2.6.21-1.3144.fc7.ppc64" v map;;
+let v = (parser_12, 1984);;
+let map = StringMap.add "2.6.24-9.fc9.ppc64" v map;;
+let v = (parser_2, 1116);;
+let map = StringMap.add "2.6.21-1.3218.fc8.ppc" v map;;
+let v = (parser_9, 996);;
+let map = StringMap.add "2.6.21-1.3128.fc7.ppc" v map;;
+let v = (parser_13, 1260);;
+let map = StringMap.add "2.6.18-1.2798.fc6.x86_64" v map;;
+let v = (parser_9, 996);;
+let map = StringMap.add "2.6.21-1.3132.fc7.ppc" v map;;
+let v = (parser_9, 936);;
+let map = StringMap.add "2.6.21-1.3228.fc7.ppc" v map;;
+let v = (parser_12, 1984);;
+let map = StringMap.add "2.6.24-9.fc9.ppc64" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.21-1.3218.fc8.ppc64" v map;;
+let v = (parser_6, 1260);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc64" v map;;
+let v = (parser_3, 2124);;
+let map = StringMap.add "2.6.21-1.3128.fc7.x86_64" v map;;
+let v = (parser_1, 912);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_13, 2196);;
+let map = StringMap.add "2.6.21-1.3144.fc7.x86_64" v map;;
+let v = (parser_6, 1260);;
+let map = StringMap.add "2.6.20-1.2933.fc6.ppc64" v map;;
+let v = (parser_2, 1116);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.ppc" v map;;
+let v = (parser_14, 1048);;
+let map = StringMap.add "2.6.24-7.fc9.ppc" v map;;
+let v = (parser_2, 1092);;
+let map = StringMap.add "2.6.21-1.3209.fc8.ppc" v map;;
+let v = (parser_13, 1260);;
+let map = StringMap.add "2.6.20-1.2933.fc6.x86_64" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3132.fc7.i586" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3144.fc7.i586" v map;;
+let v = (parser_13, 1660);;
+let map = StringMap.add "2.6.21-1.3228.fc7.x86_64" v map;;
+let v = (parser_6, 1260);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc64iseries" v map;;
+let v = (parser_11, 1244);;
+let map = StringMap.add "2.6.24-7.fc9.i586" v map;;
+let v = (parser_15, 668);;
+let map = StringMap.add "2.6.20-1.2933.fc6.ppc" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3218.fc8.i686" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3144.fc7.i686" v map;;
+let v = (parser_1, 1116);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i686" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3209.fc8.i586" v map;;
+let v = (parser_4, 2316);;
+let map = StringMap.add "2.6.21-1.3218.fc8.x86_64" v map;;
+let v = (parser_6, 1260);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc64iseries" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3144.fc7.i686" v map;;
+let v = (parser_16, 1100);;
+let map = StringMap.add "2.6.20-1.2933.fc6.x86_64" v map;;
+let v = (parser_2, 1116);;
+let map = StringMap.add "2.6.21-1.3234.fc8.ppc" v map;;
+let v = (parser_13, 1260);;
+let map = StringMap.add "2.6.20-1.2933.fc6.x86_64" v map;;
+let v = (parser_13, 1260);;
+let map = StringMap.add "2.6.18-1.2798.fc6.x86_64" v map;;
+let v = (parser_11, 1244);;
+let map = StringMap.add "2.6.24-7.fc9.i686" v map;;
+let v = (parser_3, 2124);;
+let map = StringMap.add "2.6.21-1.3144.fc7.x86_64" v map;;
+let v = (parser_9, 688);;
+let map = StringMap.add "2.6.20-1.2933.fc6.ppc" v map;;
+let v = (parser_11, 1244);;
+let map = StringMap.add "2.6.24-7.fc9.i686" v map;;
+let v = (parser_11, 1244);;
+let map = StringMap.add "2.6.24-9.fc9.i686" v map;;
+let v = (parser_1, 924);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_11, 1212);;
+let map = StringMap.add "2.6.25.11-97.fc9.i686" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i686" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i686" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3128.fc7.i686" v map;;
+let v = (parser_9, 996);;
+let map = StringMap.add "2.6.21-1.3144.fc7.ppc" v map;;
+let v = (parser_1, 912);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_4, 2316);;
+let map = StringMap.add "2.6.21-1.3209.fc8.x86_64" v map;;
+let v = (parser_2, 1092);;
+let map = StringMap.add "2.6.21-1.3238.fc8.ppc" v map;;
+let v = (parser_4, 2316);;
+let map = StringMap.add "2.6.21-1.3234.fc8.x86_64" v map;;
+let v = (parser_2, 1092);;
+let map = StringMap.add "2.6.21-1.3234.fc8.ppc" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.21-1.3234.fc8.ppc64" v map;;
+let v = (parser_1, 912);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i586" v map;;
+let v = (parser_3, 2124);;
+let map = StringMap.add "2.6.21-1.3132.fc7.x86_64" v map;;
+let v = (parser_1, 912);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_6, 1260);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc64" v map;;
+let v = (parser_1, 912);;
+let map = StringMap.add "2.6.18-1.2798.fc6.i686" v map;;
+let v = (parser_9, 836);;
+let map = StringMap.add "2.6.21-1.3228.fc7.ppc" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3236.fc8.i686" v map;;
+let v = (parser_2, 1116);;
+let map = StringMap.add "2.6.21-1.3236.fc8.ppc" v map;;
+let v = (parser_17, 668);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3218.fc8.i686" v map;;
+let v = (parser_11, 1244);;
+let map = StringMap.add "2.6.24-9.fc9.i586" v map;;
+let v = (parser_13, 2196);;
+let map = StringMap.add "2.6.21-1.3128.fc7.x86_64" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.21-1.3234.fc8.i686" v map;;
+let v = (parser_6, 1260);;
+let map = StringMap.add "2.6.20-1.2933.fc6.ppc64" v map;;
+let v = (parser_14, 1048);;
+let map = StringMap.add "2.6.24-9.fc9.ppc" v map;;
+let v = (parser_6, 1924);;
+let map = StringMap.add "2.6.21-1.3128.fc7.ppc64" v map;;
+let v = (parser_14, 1072);;
+let map = StringMap.add "2.6.24-7.fc9.ppc" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.21-1.3209.fc8.ppc64" v map;;
+let v = (parser_9, 688);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc" v map;;
+let v = (parser_7, 1408);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.i686" v map;;
+let v = (parser_1, 924);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_5, 2044);;
+let map = StringMap.add "2.6.21-1.3209.fc8.ppc64" v map;;
+let v = (parser_1, 1284);;
+let map = StringMap.add "2.6.21-1.3132.fc7.i686" v map;;
+type kernel_version = string;;
+let net_device_known version = StringMap.mem version map;;
+let net_device_size version =
+  let (_, size) = StringMap.find version map in size;;
+let net_device_of_bits version bits =
+  let (parsefn, _) = StringMap.find version map in parsefn bits;;
+let get_net_device version mem addr =
+  let (parsefn, size) = StringMap.find version map in
+  let bytes = Virt_mem_mmap.get_bytes mem addr size in
+  let bits = Bitstring.bitstring_of_string bytes in parsefn bits;;
diff --git a/lib/kernel_net_device.mli b/lib/kernel_net_device.mli
new file mode 100644 (file)
index 0000000..a9600d5
--- /dev/null
@@ -0,0 +1,9 @@
+exception ParseError of string * string * string;;
+type t = { net_device_dev_addr : string; net_device_name : string };;
+type kernel_version = string;;
+val net_device_known : kernel_version -> bool;;
+val net_device_size : kernel_version -> int;;
+val net_device_of_bits : kernel_version -> Bitstring.bitstring -> t;;
+val get_net_device :
+  kernel_version ->
+    ('a, 'b, [ | `HasMapping ]) Virt_mem_mmap.t -> Virt_mem_mmap.addr -> t;;
diff --git a/lib/kernel_task_struct.ml b/lib/kernel_task_struct.ml
new file mode 100644 (file)
index 0000000..dfcbeb3
--- /dev/null
@@ -0,0 +1,837 @@
+let warning =
+  "This code is automatically generated from the kernel database by kerneldb-to-parser program.  Any edits you make will be lost.";;
+let zero = 0;;
+exception ParseError of string * string * string;;
+type t =
+  { task_struct_active_mm : Virt_mem_mmap.addr; task_struct_comm : string;
+    task_struct_mm : Virt_mem_mmap.addr; task_struct_normal_prio : int64;
+    task_struct_pid : int64; task_struct_prio : int64;
+    task_struct_state : int64; task_struct_static_prio : int64;
+    task_struct_tasks'next : Virt_mem_mmap.addr;
+    task_struct_tasks'prev : Virt_mem_mmap.addr
+  };;
+let parser_1 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(192), littleendian;
+    task_struct_static_prio : zero+32 : offset(224), littleendian;
+    task_struct_normal_prio : zero+32 : offset(256), littleendian;
+    task_struct_tasks'next : zero+32 : offset(992), littleendian;
+    task_struct_tasks'prev : zero+32 : offset(1024), littleendian;
+    task_struct_mm : zero+32 : offset(1056), littleendian;
+    task_struct_active_mm : zero+32 : offset(1088), littleendian;
+    task_struct_pid : zero+32 : offset(1344), littleendian;
+    task_struct_comm : 128 : offset(3232), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 124L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 128L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_1", "failed to match kernel structure"));;
+let parser_2 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(160), bigendian;
+    task_struct_static_prio : zero+32 : offset(192), bigendian;
+    task_struct_normal_prio : zero+32 : offset(224), bigendian;
+    task_struct_tasks'next : zero+32 : offset(2176), bigendian;
+    task_struct_tasks'prev : zero+32 : offset(2208), bigendian;
+    task_struct_mm : zero+32 : offset(2240), bigendian;
+    task_struct_active_mm : zero+32 : offset(2272), bigendian;
+    task_struct_pid : zero+32 : offset(2528), bigendian;
+    task_struct_comm : 128 : offset(4416), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 272L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 276L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_2", "failed to match kernel structure"));;
+let parser_3 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(192), bigendian;
+    task_struct_static_prio : zero+32 : offset(224), bigendian;
+    task_struct_normal_prio : zero+32 : offset(256), bigendian;
+    task_struct_tasks'next : zero+32 : offset(2304), bigendian;
+    task_struct_tasks'prev : zero+32 : offset(2336), bigendian;
+    task_struct_mm : zero+32 : offset(2496), bigendian;
+    task_struct_active_mm : zero+32 : offset(2528), bigendian;
+    task_struct_pid : zero+32 : offset(2784), bigendian;
+    task_struct_comm : 128 : offset(4736), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 288L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 292L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_3", "failed to match kernel structure"));;
+let parser_4 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(320), littleendian;
+    task_struct_static_prio : zero+32 : offset(352), littleendian;
+    task_struct_normal_prio : zero+32 : offset(384), littleendian;
+    task_struct_tasks'next : zero+64 : offset(1536), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(1600), littleendian;
+    task_struct_mm : zero+64 : offset(1664), littleendian;
+    task_struct_active_mm : zero+64 : offset(1728), littleendian;
+    task_struct_pid : zero+32 : offset(2144), littleendian;
+    task_struct_comm : 128 : offset(5376), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 192L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 200L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_4", "failed to match kernel structure"));;
+let parser_5 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(256), littleendian;
+    task_struct_static_prio : zero+32 : offset(288), littleendian;
+    task_struct_normal_prio : zero+32 : offset(320), littleendian;
+    task_struct_tasks'next : zero+64 : offset(2816), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(2880), littleendian;
+    task_struct_mm : zero+64 : offset(3200), littleendian;
+    task_struct_active_mm : zero+64 : offset(3264), littleendian;
+    task_struct_pid : zero+32 : offset(3584), littleendian;
+    task_struct_comm : 128 : offset(6912), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 352L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 360L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_5", "failed to match kernel structure"));;
+let parser_6 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(256), bigendian;
+    task_struct_static_prio : zero+32 : offset(288), bigendian;
+    task_struct_normal_prio : zero+32 : offset(320), bigendian;
+    task_struct_tasks'next : zero+64 : offset(1472), bigendian;
+    task_struct_tasks'prev : zero+64 : offset(1536), bigendian;
+    task_struct_mm : zero+64 : offset(1600), bigendian;
+    task_struct_active_mm : zero+64 : offset(1664), bigendian;
+    task_struct_pid : zero+32 : offset(1984), bigendian;
+    task_struct_comm : 128 : offset(5184), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 184L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 192L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_6", "failed to match kernel structure"));;
+let parser_7 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(320), bigendian;
+    task_struct_static_prio : zero+32 : offset(352), bigendian;
+    task_struct_normal_prio : zero+32 : offset(384), bigendian;
+    task_struct_tasks'next : zero+64 : offset(1600), bigendian;
+    task_struct_tasks'prev : zero+64 : offset(1664), bigendian;
+    task_struct_mm : zero+64 : offset(1728), bigendian;
+    task_struct_active_mm : zero+64 : offset(1792), bigendian;
+    task_struct_pid : zero+32 : offset(2208), bigendian;
+    task_struct_comm : 128 : offset(5440), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 200L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 208L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_7", "failed to match kernel structure"));;
+let parser_8 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(320), littleendian;
+    task_struct_static_prio : zero+32 : offset(352), littleendian;
+    task_struct_normal_prio : zero+32 : offset(384), littleendian;
+    task_struct_tasks'next : zero+64 : offset(1536), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(1600), littleendian;
+    task_struct_mm : zero+64 : offset(1664), littleendian;
+    task_struct_active_mm : zero+64 : offset(1728), littleendian;
+    task_struct_pid : zero+32 : offset(2144), littleendian;
+    task_struct_comm : 128 : offset(5440), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 192L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 200L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_8", "failed to match kernel structure"));;
+let parser_9 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(224), littleendian;
+    task_struct_static_prio : zero+32 : offset(256), littleendian;
+    task_struct_normal_prio : zero+32 : offset(288), littleendian;
+    task_struct_tasks'next : zero+64 : offset(2816), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(2880), littleendian;
+    task_struct_mm : zero+64 : offset(2944), littleendian;
+    task_struct_active_mm : zero+64 : offset(3008), littleendian;
+    task_struct_pid : zero+32 : offset(3328), littleendian;
+    task_struct_comm : 128 : offset(6592), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 352L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 360L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_9", "failed to match kernel structure"));;
+let parser_10 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(192), bigendian;
+    task_struct_static_prio : zero+32 : offset(224), bigendian;
+    task_struct_normal_prio : zero+32 : offset(256), bigendian;
+    task_struct_tasks'next : zero+32 : offset(1024), bigendian;
+    task_struct_tasks'prev : zero+32 : offset(1056), bigendian;
+    task_struct_mm : zero+32 : offset(1088), bigendian;
+    task_struct_active_mm : zero+32 : offset(1120), bigendian;
+    task_struct_pid : zero+32 : offset(1376), bigendian;
+    task_struct_comm : 128 : offset(3264), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 128L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 132L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_10", "failed to match kernel structure"));;
+let parser_11 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(224), bigendian;
+    task_struct_static_prio : zero+32 : offset(256), bigendian;
+    task_struct_normal_prio : zero+32 : offset(288), bigendian;
+    task_struct_tasks'next : zero+64 : offset(2880), bigendian;
+    task_struct_tasks'prev : zero+64 : offset(2944), bigendian;
+    task_struct_mm : zero+64 : offset(3008), bigendian;
+    task_struct_active_mm : zero+64 : offset(3072), bigendian;
+    task_struct_pid : zero+32 : offset(3392), bigendian;
+    task_struct_comm : 128 : offset(6592), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 360L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 368L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_11", "failed to match kernel structure"));;
+let parser_12 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(192), littleendian;
+    task_struct_static_prio : zero+32 : offset(224), littleendian;
+    task_struct_normal_prio : zero+32 : offset(256), littleendian;
+    task_struct_tasks'next : zero+32 : offset(2208), littleendian;
+    task_struct_tasks'prev : zero+32 : offset(2240), littleendian;
+    task_struct_mm : zero+32 : offset(2400), littleendian;
+    task_struct_active_mm : zero+32 : offset(2432), littleendian;
+    task_struct_pid : zero+32 : offset(2688), littleendian;
+    task_struct_comm : 128 : offset(4608), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 276L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 280L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_12", "failed to match kernel structure"));;
+let parser_13 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(224), littleendian;
+    task_struct_static_prio : zero+32 : offset(256), littleendian;
+    task_struct_normal_prio : zero+32 : offset(288), littleendian;
+    task_struct_tasks'next : zero+64 : offset(3648), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(3712), littleendian;
+    task_struct_mm : zero+64 : offset(3776), littleendian;
+    task_struct_active_mm : zero+64 : offset(3840), littleendian;
+    task_struct_pid : zero+32 : offset(4160), littleendian;
+    task_struct_comm : 128 : offset(7816), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 456L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 464L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_13", "failed to match kernel structure"));;
+let parser_14 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(256), bigendian;
+    task_struct_static_prio : zero+32 : offset(288), bigendian;
+    task_struct_normal_prio : zero+32 : offset(320), bigendian;
+    task_struct_tasks'next : zero+64 : offset(2688), bigendian;
+    task_struct_tasks'prev : zero+64 : offset(2752), bigendian;
+    task_struct_mm : zero+64 : offset(3072), bigendian;
+    task_struct_active_mm : zero+64 : offset(3136), bigendian;
+    task_struct_pid : zero+32 : offset(3456), bigendian;
+    task_struct_comm : 128 : offset(6720), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 336L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 344L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_14", "failed to match kernel structure"));;
+let parser_15 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(224), littleendian;
+    task_struct_static_prio : zero+32 : offset(256), littleendian;
+    task_struct_normal_prio : zero+32 : offset(288), littleendian;
+    task_struct_tasks'next : zero+64 : offset(3840), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(3904), littleendian;
+    task_struct_mm : zero+64 : offset(3968), littleendian;
+    task_struct_active_mm : zero+64 : offset(4032), littleendian;
+    task_struct_pid : zero+32 : offset(4352), littleendian;
+    task_struct_comm : 128 : offset(8392), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 480L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 488L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_15", "failed to match kernel structure"));;
+let parser_16 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(160), littleendian;
+    task_struct_static_prio : zero+32 : offset(192), littleendian;
+    task_struct_normal_prio : zero+32 : offset(224), littleendian;
+    task_struct_tasks'next : zero+32 : offset(3008), littleendian;
+    task_struct_tasks'prev : zero+32 : offset(3040), littleendian;
+    task_struct_mm : zero+32 : offset(3072), littleendian;
+    task_struct_active_mm : zero+32 : offset(3104), littleendian;
+    task_struct_pid : zero+32 : offset(3360), littleendian;
+    task_struct_comm : 128 : offset(5416), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 376L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 380L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_16", "failed to match kernel structure"));;
+let parser_17 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(224), bigendian;
+    task_struct_static_prio : zero+32 : offset(256), bigendian;
+    task_struct_normal_prio : zero+32 : offset(288), bigendian;
+    task_struct_tasks'next : zero+64 : offset(3648), bigendian;
+    task_struct_tasks'prev : zero+64 : offset(3712), bigendian;
+    task_struct_mm : zero+64 : offset(3776), bigendian;
+    task_struct_active_mm : zero+64 : offset(3840), bigendian;
+    task_struct_pid : zero+32 : offset(4160), bigendian;
+    task_struct_comm : 128 : offset(7752), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 456L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 464L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_17", "failed to match kernel structure"));;
+let parser_18 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(160), littleendian;
+    task_struct_static_prio : zero+32 : offset(192), littleendian;
+    task_struct_normal_prio : zero+32 : offset(224), littleendian;
+    task_struct_tasks'next : zero+32 : offset(2144), littleendian;
+    task_struct_tasks'prev : zero+32 : offset(2176), littleendian;
+    task_struct_mm : zero+32 : offset(2208), littleendian;
+    task_struct_active_mm : zero+32 : offset(2240), littleendian;
+    task_struct_pid : zero+32 : offset(2496), littleendian;
+    task_struct_comm : 128 : offset(4384), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 268L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 272L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_18", "failed to match kernel structure"));;
+let parser_19 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(256), bigendian;
+    task_struct_static_prio : zero+32 : offset(288), bigendian;
+    task_struct_normal_prio : zero+32 : offset(320), bigendian;
+    task_struct_tasks'next : zero+64 : offset(2880), bigendian;
+    task_struct_tasks'prev : zero+64 : offset(2944), bigendian;
+    task_struct_mm : zero+64 : offset(3264), bigendian;
+    task_struct_active_mm : zero+64 : offset(3328), bigendian;
+    task_struct_pid : zero+32 : offset(3648), bigendian;
+    task_struct_comm : 128 : offset(6912), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 360L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 368L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_19", "failed to match kernel structure"));;
+let parser_20 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(160), bigendian;
+    task_struct_static_prio : zero+32 : offset(192), bigendian;
+    task_struct_normal_prio : zero+32 : offset(224), bigendian;
+    task_struct_tasks'next : zero+32 : offset(3136), bigendian;
+    task_struct_tasks'prev : zero+32 : offset(3168), bigendian;
+    task_struct_mm : zero+32 : offset(3200), bigendian;
+    task_struct_active_mm : zero+32 : offset(3232), bigendian;
+    task_struct_pid : zero+32 : offset(3488), bigendian;
+    task_struct_comm : 128 : offset(5576), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 392L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 396L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_20", "failed to match kernel structure"));;
+let parser_21 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(192), littleendian;
+    task_struct_static_prio : zero+32 : offset(224), littleendian;
+    task_struct_normal_prio : zero+32 : offset(256), littleendian;
+    task_struct_tasks'next : zero+32 : offset(2144), littleendian;
+    task_struct_tasks'prev : zero+32 : offset(2176), littleendian;
+    task_struct_mm : zero+32 : offset(2336), littleendian;
+    task_struct_active_mm : zero+32 : offset(2368), littleendian;
+    task_struct_pid : zero+32 : offset(2624), littleendian;
+    task_struct_comm : 128 : offset(4544), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 268L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 272L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_21", "failed to match kernel structure"));;
+let parser_22 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(320), littleendian;
+    task_struct_static_prio : zero+32 : offset(352), littleendian;
+    task_struct_normal_prio : zero+32 : offset(384), littleendian;
+    task_struct_tasks'next : zero+64 : offset(1728), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(1792), littleendian;
+    task_struct_mm : zero+64 : offset(1856), littleendian;
+    task_struct_active_mm : zero+64 : offset(1920), littleendian;
+    task_struct_pid : zero+32 : offset(2336), littleendian;
+    task_struct_comm : 128 : offset(5568), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 216L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 224L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_22", "failed to match kernel structure"));;
+let parser_23 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(256), littleendian;
+    task_struct_static_prio : zero+32 : offset(288), littleendian;
+    task_struct_normal_prio : zero+32 : offset(320), littleendian;
+    task_struct_tasks'next : zero+64 : offset(1408), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(1472), littleendian;
+    task_struct_mm : zero+64 : offset(1536), littleendian;
+    task_struct_active_mm : zero+64 : offset(1600), littleendian;
+    task_struct_pid : zero+32 : offset(1920), littleendian;
+    task_struct_comm : 128 : offset(5184), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 176L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 184L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_23", "failed to match kernel structure"));;
+let parser_24 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(192), bigendian;
+    task_struct_static_prio : zero+32 : offset(224), bigendian;
+    task_struct_normal_prio : zero+32 : offset(256), bigendian;
+    task_struct_tasks'next : zero+32 : offset(2240), bigendian;
+    task_struct_tasks'prev : zero+32 : offset(2272), bigendian;
+    task_struct_mm : zero+32 : offset(2432), bigendian;
+    task_struct_active_mm : zero+32 : offset(2464), bigendian;
+    task_struct_pid : zero+32 : offset(2720), bigendian;
+    task_struct_comm : 128 : offset(4672), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 280L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 284L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_24", "failed to match kernel structure"));;
+let parser_25 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(160), littleendian;
+    task_struct_static_prio : zero+32 : offset(192), littleendian;
+    task_struct_normal_prio : zero+32 : offset(224), littleendian;
+    task_struct_tasks'next : zero+32 : offset(3232), littleendian;
+    task_struct_tasks'prev : zero+32 : offset(3264), littleendian;
+    task_struct_mm : zero+32 : offset(3296), littleendian;
+    task_struct_active_mm : zero+32 : offset(3328), littleendian;
+    task_struct_pid : zero+32 : offset(3584), littleendian;
+    task_struct_comm : 128 : offset(5928), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 404L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 408L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_25", "failed to match kernel structure"));;
+let parser_26 bits = bitmatch bits with
+  | { task_struct_state : zero+32 : offset(0), bigendian;
+    task_struct_prio : zero+32 : offset(160), bigendian;
+    task_struct_static_prio : zero+32 : offset(192), bigendian;
+    task_struct_normal_prio : zero+32 : offset(224), bigendian;
+    task_struct_tasks'next : zero+32 : offset(2240), bigendian;
+    task_struct_tasks'prev : zero+32 : offset(2272), bigendian;
+    task_struct_mm : zero+32 : offset(2304), bigendian;
+    task_struct_active_mm : zero+32 : offset(2336), bigendian;
+    task_struct_pid : zero+32 : offset(2592), bigendian;
+    task_struct_comm : 128 : offset(4480), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 280L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 284L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_26", "failed to match kernel structure"));;
+let parser_27 bits = bitmatch bits with
+  | { task_struct_state : zero+64 : offset(0), littleendian;
+    task_struct_prio : zero+32 : offset(256), littleendian;
+    task_struct_static_prio : zero+32 : offset(288), littleendian;
+    task_struct_normal_prio : zero+32 : offset(320), littleendian;
+    task_struct_tasks'next : zero+64 : offset(2624), littleendian;
+    task_struct_tasks'prev : zero+64 : offset(2688), littleendian;
+    task_struct_mm : zero+64 : offset(3008), littleendian;
+    task_struct_active_mm : zero+64 : offset(3072), littleendian;
+    task_struct_pid : zero+32 : offset(3392), littleendian;
+    task_struct_comm : 128 : offset(6720), string } -> { task_struct_state = task_struct_state;
+    task_struct_prio = task_struct_prio;
+    task_struct_static_prio = task_struct_static_prio;
+    task_struct_normal_prio = task_struct_normal_prio;
+    task_struct_tasks'next = Int64.sub task_struct_tasks'next 328L;
+    task_struct_tasks'prev = Int64.sub task_struct_tasks'prev 336L;
+    task_struct_mm = task_struct_mm;
+    task_struct_active_mm = task_struct_active_mm;
+    task_struct_pid = task_struct_pid;
+    task_struct_comm = task_struct_comm }
+  | { _ } -> raise (ParseError ("task_struct", "parser_27", "failed to match kernel structure"));;
+module StringMap = Map.Make(String);;
+let map = StringMap.empty;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3128.fc7.i586" v map;;
+let v = (parser_2, 1756);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.ppc" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3128.fc7.i686" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3132.fc7.i686" v map;;
+let v = (parser_3, 1780);;
+let map = StringMap.add "2.6.21-1.3236.fc8.ppc" v map;;
+let v = (parser_1, 1376);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i586" v map;;
+let v = (parser_4, 1856);;
+let map = StringMap.add "2.6.18-1.2798.fc6.x86_64" v map;;
+let v = (parser_5, 3948);;
+let map = StringMap.add "2.6.21-1.3236.fc8.x86_64" v map;;
+let v = (parser_6, 2116);;
+let map = StringMap.add "2.6.21-1.3218.fc8.ppc64" v map;;
+let v = (parser_7, 2072);;
+let map = StringMap.add "2.6.21-1.3228.fc7.ppc64" v map;;
+let v = (parser_8, 1832);;
+let map = StringMap.add "2.6.21-1.3228.fc7.x86_64" v map;;
+let v = (parser_1, 2712);;
+let map = StringMap.add "2.6.21-1.3218.fc8.i586" v map;;
+let v = (parser_9, 3932);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.x86_64" v map;;
+let v = (parser_7, 2132);;
+let map = StringMap.add "2.6.21-1.3144.fc7.ppc64" v map;;
+let v = (parser_10, 1612);;
+let map = StringMap.add "2.6.21-1.3218.fc8.ppc" v map;;
+let v = (parser_11, 2292);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.ppc64" v map;;
+let v = (parser_12, 2880);;
+let map = StringMap.add "2.6.21-1.3236.fc8.i686" v map;;
+let v = (parser_7, 2132);;
+let map = StringMap.add "2.6.21-1.3132.fc7.ppc64" v map;;
+let v = (parser_1, 1376);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i686" v map;;
+let v = (parser_13, 4684);;
+let map = StringMap.add "2.6.24-9.fc9.x86_64" v map;;
+let v = (parser_11, 2292);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.ppc64" v map;;
+let v = (parser_7, 2132);;
+let map = StringMap.add "2.6.21-1.3132.fc7.ppc64" v map;;
+let v = (parser_13, 4684);;
+let map = StringMap.add "2.6.24-7.fc9.x86_64" v map;;
+let v = (parser_1, 1384);;
+let map = StringMap.add "2.6.18-1.2798.fc6.i586" v map;;
+let v = (parser_10, 1620);;
+let map = StringMap.add "2.6.21-1.3132.fc7.ppc" v map;;
+let v = (parser_14, 2292);;
+let map = StringMap.add "2.6.21-1.3234.fc8.ppc64" v map;;
+let v = (parser_1, 1384);;
+let map = StringMap.add "2.6.18-1.2798.fc6.i686" v map;;
+let v = (parser_15, 2496);;
+let map = StringMap.add "2.6.25.11-97.fc9.x86_64" v map;;
+let v = (parser_1, 1368);;
+let map = StringMap.add "2.6.18-1.2798.fc6.i686" v map;;
+let v = (parser_16, 3540);;
+let map = StringMap.add "2.6.24-9.fc9.i686" v map;;
+let v = (parser_17, 2492);;
+let map = StringMap.add "2.6.24-7.fc9.ppc64" v map;;
+let v = (parser_18, 2856);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.i686" v map;;
+let v = (parser_19, 2308);;
+let map = StringMap.add "2.6.21-1.3236.fc8.ppc64" v map;;
+let v = (parser_10, 1628);;
+let map = StringMap.add "2.6.21-1.3209.fc8.ppc" v map;;
+let v = (parser_19, 2308);;
+let map = StringMap.add "2.6.21-1.3236.fc8.ppc64" v map;;
+let v = (parser_7, 2072);;
+let map = StringMap.add "2.6.21-1.3228.fc7.ppc64" v map;;
+let v = (parser_7, 2132);;
+let map = StringMap.add "2.6.21-1.3128.fc7.ppc64" v map;;
+let v = (parser_1, 2712);;
+let map = StringMap.add "2.6.21-1.3209.fc8.i686" v map;;
+let v = (parser_8, 3772);;
+let map = StringMap.add "2.6.21-1.3132.fc7.x86_64" v map;;
+let v = (parser_17, 2492);;
+let map = StringMap.add "2.6.24-7.fc9.ppc64" v map;;
+let v = (parser_8, 3772);;
+let map = StringMap.add "2.6.21-1.3228.fc7.x86_64" v map;;
+let v = (parser_20, 1948);;
+let map = StringMap.add "2.6.24-9.fc9.ppc" v map;;
+let v = (parser_10, 1576);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc" v map;;
+let v = (parser_10, 1620);;
+let map = StringMap.add "2.6.21-1.3128.fc7.ppc" v map;;
+let v = (parser_1, 2712);;
+let map = StringMap.add "2.6.21-1.3209.fc8.i686" v map;;
+let v = (parser_8, 3772);;
+let map = StringMap.add "2.6.20-1.2933.fc6.x86_64" v map;;
+let v = (parser_21, 2880);;
+let map = StringMap.add "2.6.21-1.3234.fc8.i686" v map;;
+let v = (parser_10, 1620);;
+let map = StringMap.add "2.6.21-1.3144.fc7.ppc" v map;;
+let v = (parser_7, 2132);;
+let map = StringMap.add "2.6.21-1.3144.fc7.ppc64" v map;;
+let v = (parser_17, 2492);;
+let map = StringMap.add "2.6.24-9.fc9.ppc64" v map;;
+let v = (parser_10, 1628);;
+let map = StringMap.add "2.6.21-1.3218.fc8.ppc" v map;;
+let v = (parser_10, 1604);;
+let map = StringMap.add "2.6.21-1.3128.fc7.ppc" v map;;
+let v = (parser_22, 1928);;
+let map = StringMap.add "2.6.18-1.2798.fc6.x86_64" v map;;
+let v = (parser_10, 1604);;
+let map = StringMap.add "2.6.21-1.3132.fc7.ppc" v map;;
+let v = (parser_10, 1584);;
+let map = StringMap.add "2.6.21-1.3228.fc7.ppc" v map;;
+let v = (parser_17, 2492);;
+let map = StringMap.add "2.6.24-9.fc9.ppc64" v map;;
+let v = (parser_6, 2116);;
+let map = StringMap.add "2.6.21-1.3218.fc8.ppc64" v map;;
+let v = (parser_7, 2104);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc64" v map;;
+let v = (parser_8, 3780);;
+let map = StringMap.add "2.6.21-1.3128.fc7.x86_64" v map;;
+let v = (parser_1, 1400);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_8, 3772);;
+let map = StringMap.add "2.6.21-1.3144.fc7.x86_64" v map;;
+let v = (parser_7, 2112);;
+let map = StringMap.add "2.6.20-1.2933.fc6.ppc64" v map;;
+let v = (parser_2, 1772);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.ppc" v map;;
+let v = (parser_20, 1936);;
+let map = StringMap.add "2.6.24-7.fc9.ppc" v map;;
+let v = (parser_10, 1612);;
+let map = StringMap.add "2.6.21-1.3209.fc8.ppc" v map;;
+let v = (parser_8, 1920);;
+let map = StringMap.add "2.6.20-1.2933.fc6.x86_64" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3132.fc7.i586" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3144.fc7.i586" v map;;
+let v = (parser_8, 1880);;
+let map = StringMap.add "2.6.21-1.3228.fc7.x86_64" v map;;
+let v = (parser_7, 2088);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc64iseries" v map;;
+let v = (parser_16, 3540);;
+let map = StringMap.add "2.6.24-7.fc9.i586" v map;;
+let v = (parser_10, 1592);;
+let map = StringMap.add "2.6.20-1.2933.fc6.ppc" v map;;
+let v = (parser_1, 2712);;
+let map = StringMap.add "2.6.21-1.3218.fc8.i686" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3144.fc7.i686" v map;;
+let v = (parser_1, 1376);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i686" v map;;
+let v = (parser_1, 2712);;
+let map = StringMap.add "2.6.21-1.3209.fc8.i586" v map;;
+let v = (parser_23, 3756);;
+let map = StringMap.add "2.6.21-1.3218.fc8.x86_64" v map;;
+let v = (parser_7, 2088);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc64iseries" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3144.fc7.i686" v map;;
+let v = (parser_8, 1880);;
+let map = StringMap.add "2.6.20-1.2933.fc6.x86_64" v map;;
+let v = (parser_24, 1796);;
+let map = StringMap.add "2.6.21-1.3234.fc8.ppc" v map;;
+let v = (parser_8, 1920);;
+let map = StringMap.add "2.6.20-1.2933.fc6.x86_64" v map;;
+let v = (parser_22, 1928);;
+let map = StringMap.add "2.6.18-1.2798.fc6.x86_64" v map;;
+let v = (parser_16, 3540);;
+let map = StringMap.add "2.6.24-7.fc9.i686" v map;;
+let v = (parser_8, 3780);;
+let map = StringMap.add "2.6.21-1.3144.fc7.x86_64" v map;;
+let v = (parser_10, 1608);;
+let map = StringMap.add "2.6.20-1.2933.fc6.ppc" v map;;
+let v = (parser_16, 3540);;
+let map = StringMap.add "2.6.24-7.fc9.i686" v map;;
+let v = (parser_16, 3540);;
+let map = StringMap.add "2.6.24-9.fc9.i686" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_25, 1832);;
+let map = StringMap.add "2.6.25.11-97.fc9.i686" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i686" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3228.fc7.i686" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3128.fc7.i686" v map;;
+let v = (parser_10, 1604);;
+let map = StringMap.add "2.6.21-1.3144.fc7.ppc" v map;;
+let v = (parser_1, 1400);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_23, 3756);;
+let map = StringMap.add "2.6.21-1.3209.fc8.x86_64" v map;;
+let v = (parser_26, 1756);;
+let map = StringMap.add "2.6.21-1.3238.fc8.ppc" v map;;
+let v = (parser_27, 3932);;
+let map = StringMap.add "2.6.21-1.3234.fc8.x86_64" v map;;
+let v = (parser_24, 1780);;
+let map = StringMap.add "2.6.21-1.3234.fc8.ppc" v map;;
+let v = (parser_14, 2292);;
+let map = StringMap.add "2.6.21-1.3234.fc8.ppc64" v map;;
+let v = (parser_1, 1400);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i586" v map;;
+let v = (parser_8, 3780);;
+let map = StringMap.add "2.6.21-1.3132.fc7.x86_64" v map;;
+let v = (parser_1, 1400);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_7, 2104);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc64" v map;;
+let v = (parser_1, 1384);;
+let map = StringMap.add "2.6.18-1.2798.fc6.i686" v map;;
+let v = (parser_10, 1560);;
+let map = StringMap.add "2.6.21-1.3228.fc7.ppc" v map;;
+let v = (parser_12, 2880);;
+let map = StringMap.add "2.6.21-1.3236.fc8.i686" v map;;
+let v = (parser_3, 1796);;
+let map = StringMap.add "2.6.21-1.3236.fc8.ppc" v map;;
+let v = (parser_1, 1384);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_1, 2712);;
+let map = StringMap.add "2.6.21-1.3218.fc8.i686" v map;;
+let v = (parser_16, 3540);;
+let map = StringMap.add "2.6.24-9.fc9.i586" v map;;
+let v = (parser_8, 3772);;
+let map = StringMap.add "2.6.21-1.3128.fc7.x86_64" v map;;
+let v = (parser_21, 2880);;
+let map = StringMap.add "2.6.21-1.3234.fc8.i686" v map;;
+let v = (parser_7, 2112);;
+let map = StringMap.add "2.6.20-1.2933.fc6.ppc64" v map;;
+let v = (parser_20, 1936);;
+let map = StringMap.add "2.6.24-9.fc9.ppc" v map;;
+let v = (parser_7, 2132);;
+let map = StringMap.add "2.6.21-1.3128.fc7.ppc64" v map;;
+let v = (parser_20, 1948);;
+let map = StringMap.add "2.6.24-7.fc9.ppc" v map;;
+let v = (parser_6, 2116);;
+let map = StringMap.add "2.6.21-1.3209.fc8.ppc64" v map;;
+let v = (parser_10, 1592);;
+let map = StringMap.add "2.6.18-1.2798.fc6.ppc" v map;;
+let v = (parser_18, 2856);;
+let map = StringMap.add "2.6.22-0.23.rc7.git6.fc8.i686" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.20-1.2933.fc6.i686" v map;;
+let v = (parser_6, 2116);;
+let map = StringMap.add "2.6.21-1.3209.fc8.ppc64" v map;;
+let v = (parser_1, 2704);;
+let map = StringMap.add "2.6.21-1.3132.fc7.i686" v map;;
+type kernel_version = string;;
+let task_struct_known version = StringMap.mem version map;;
+let task_struct_size version =
+  let (_, size) = StringMap.find version map in size;;
+let task_struct_of_bits version bits =
+  let (parsefn, _) = StringMap.find version map in parsefn bits;;
+let get_task_struct version mem addr =
+  let (parsefn, size) = StringMap.find version map in
+  let bytes = Virt_mem_mmap.get_bytes mem addr size in
+  let bits = Bitstring.bitstring_of_string bytes in parsefn bits;;
diff --git a/lib/kernel_task_struct.mli b/lib/kernel_task_struct.mli
new file mode 100644 (file)
index 0000000..8cbdae4
--- /dev/null
@@ -0,0 +1,16 @@
+exception ParseError of string * string * string;;
+type t =
+  { task_struct_active_mm : Virt_mem_mmap.addr; task_struct_comm : string;
+    task_struct_mm : Virt_mem_mmap.addr; task_struct_normal_prio : int64;
+    task_struct_pid : int64; task_struct_prio : int64;
+    task_struct_state : int64; task_struct_static_prio : int64;
+    task_struct_tasks'next : Virt_mem_mmap.addr;
+    task_struct_tasks'prev : Virt_mem_mmap.addr
+  };;
+type kernel_version = string;;
+val task_struct_known : kernel_version -> bool;;
+val task_struct_size : kernel_version -> int;;
+val task_struct_of_bits : kernel_version -> Bitstring.bitstring -> t;;
+val get_task_struct :
+  kernel_version ->
+    ('a, 'b, [ | `HasMapping ]) Virt_mem_mmap.t -> Virt_mem_mmap.addr -> t;;
diff --git a/lib/test_mmap.ml b/lib/test_mmap.ml
new file mode 100644 (file)
index 0000000..731be09
--- /dev/null
@@ -0,0 +1,47 @@
+(* Test program for Virt_mem_mmap module.  Not for general consumption. *)
+
+open Printf
+open Virt_mem_mmap
+
+let () =
+  let mem = create () in
+  let data = String.make 0x1000 '\001' in
+  let mem = add_string mem data 0x800L in
+  let data = String.make 0x1000 '\002' in
+  let mem = add_string mem data 0x1000L in
+  let data = String.make 0x1800 '\003' in
+  let mem = add_string mem data 0L in
+  let data = String.make 0x800 '\004' in
+  let mem = add_string mem data 0x1000L in
+  let data = String.make 0x800 '\005' in
+  let mem = add_string mem data 0x2800L in
+  let data = String.make 1 '\006' in
+  let mem = add_string mem data 0L in
+  let data = "hello, world!\000" in
+  let mem = add_string mem data 0x20L in
+
+  List.iter (
+    fun addr ->
+      try
+       printf "byte @ %Lx = %d\n" addr (get_byte mem addr)
+      with Invalid_argument "get_byte" ->
+       printf "byte @ %Lx = HOLE\n" addr
+  ) [ 0L; 0x1L;
+      0x7ffL; 0x800L; 0x801L;
+      0xfffL; 0x1000L; 0x1001L;
+      0x17ffL; 0x1800L; 0x1801L;
+      0x1fffL; 0x2000L; 0x2001L;
+      0x27ffL; 0x2800L; 0x2801L;
+      0x2fffL; 0x3000L; 0x3001L ];
+
+  List.iter (
+    fun addr ->
+      try
+       printf "three bytes @ %Lx = %S\n" addr (get_bytes mem addr 3)
+      with
+       Invalid_argument "get_bytes" ->
+         printf "three bytes @ %Lx found a HOLE\n" addr
+  ) [ 0L; 0x1L; 0x7ffL; 0xfffL; 0x17ffL; 0x1fffL; 0x27ffL; 0x2800L;
+      0x2ffdL; 0x2fffL ];
+
+  printf "string @ 0x20 = %S\n" (get_string mem 0x20L)
index 9a00ead..69a0821 100644 (file)
@@ -27,31 +27,131 @@ module D = Libvirt.Domain
 
 open Virt_mem_gettext.Gettext
 open Virt_mem_utils
-module MMap = Virt_mem_mmap
+open Virt_mem_types
 
-let min_kallsyms_tabsize = 1_000L
-let max_kallsyms_tabsize = 250_000L
-
-let kernel_size = 0x100_0000
-let max_memory_peek = 0x1_000
-
-type ksym = string
-
-type image =
-    string
-    * Virt_mem_utils.architecture
-    * ([`Wordsize], [`Endian]) Virt_mem_mmap.t
-    * (ksym -> MMap.addr)
-
-type kallsyms_compr =
-  | Compressed of (string * MMap.addr) list * MMap.addr
-  | Uncompressed of (string * MMap.addr) list
+(* Make the kernel size around 16 MB, but just a bit smaller than
+ * maximum string length so we can still run this on a 32 bit platform.
+ *)
+let kernel_size =
+  if Sys.word_size = 32 then Sys.max_string_length
+  else 0x100_0000
 
-let start usage_msg =
-  (* Debug messages. *)
+(* When tools register themselves, they are added to this list.
+ * Later, we will alphabetize the list.
+ *)
+let tools = ref []
+
+(* Registration function used by the tools. *)
+let register ?(external_cmd = true) ?(extra_args = [])
+    ?argcheck ?beforeksyms ?beforeutsname ?run
+    name summary description =
+  tools :=
+    (name, (name, summary, description, external_cmd, extra_args,
+           argcheck, beforeksyms, beforeutsname, run))
+  :: !tools
+
+(* Main program, called from mem/virt_mem_main.ml when all the
+ * tools have had a chance to register themselves.
+ *)
+let main () =
+  (* Get the registered tools, alphabetically. *)
+  let tools = !tools in
+  let tools = List.sort ~cmp:(fun (a,_) (b,_) -> compare a b) tools in
+
+  (* Which tool did the user want to run?  Look at the executable
+   * name (eg. 'virt-dmesg' => tool == dmesg).  If we don't recognise
+   * the executable name then we must look for the first parameter
+   * which doesn't begin with a '-' character.
+   *
+   * Note that we must do all of this before using the OCaml Arg
+   * module to properly parse the command line (below), so that
+   * we can have a usage message ready.
+   *)
+  let tool, ignore_first_anon_arg =
+    let prog = Sys.executable_name in  (* eg. "/usr/bin/virt-dmesg.opt" *)
+    let prog = Filename.basename prog in(* eg. "virt-dmesg.opt" *)
+    let prog =                         (* eg. "virt-dmesg" *)
+      try Filename.chop_extension prog with Invalid_argument _ -> prog in
+    let prog =                         (* eg. "dmesg" *)
+      if String.starts_with prog "virt-" then
+       String.sub prog 5 (String.length prog - 5)
+      else prog in
+    try Some (List.assoc prog tools), false
+    with Not_found ->
+      let arg1 =                       (* First non-option argument. *)
+       match Array.to_list Sys.argv with
+       | [] -> None
+       | _::args ->
+           let rec loop = function
+             | [] -> None
+             | a::args when String.length a > 0 && a.[0] = '-' -> loop args
+             | a::_ -> Some a
+           in
+           loop args in
+      match arg1 with
+      | None -> None, false
+      | Some prog ->                   (* Recognisable first argument? *)
+         let prog =
+           try Filename.chop_extension prog with Invalid_argument _ -> prog in
+         let prog =
+           if String.starts_with prog "virt-" then
+             String.sub prog 5 (String.length prog - 5)
+           else prog in
+         (try Some (List.assoc prog tools), true
+          with Not_found -> None, false) in
+
+  (* Make a usage message. *)
+  let usage_msg =
+    match tool with
+    | None ->                          (* Generic usage message. *)
+       let tools = List.map (
+         fun (name, (_, summary, _, external_cmd, _, _, _, _, _)) ->
+           if external_cmd then "virt-"^name, summary
+           else                 "virt-mem "^name, summary
+       ) tools in
+       (* Maximum width of field in the left hand column. *)
+       let max_width =
+         List.fold_left max 0 (List.map String.length (List.map fst tools)) in
+       let tools = List.map (fun (l,r) -> pad max_width l, r) tools in
+       let tools = List.map (fun (l,r) -> "  " ^ l ^ " - " ^ r) tools in
+       let tools = String.concat "\n" tools in
+
+       sprintf (f_"\
+
+virt-mem: Tools for providing information about virtual machines
+
+Currently available tools include:
+%s
+
+General usage is:
+  <tool> [-options] [domains...]
+
+To display extra help for a single tool, do:
+  virt-mem help <tool>
+
+Options:") tools
+
+                                        (* Tool-specific usage message. *)
+    | Some (name, summary, description, external_cmd, _, _, _, _, _) ->
+       let cmd =
+         if external_cmd then "virt-" ^ name else "virt-mem " ^ name in
+
+       sprintf (f_"\
+
+%s: %s
+
+Description:
+%s
+
+Options:") cmd summary description in
+
+  (* Now begin proper parsing of the command line arguments. *)
   let debug = ref false in
+  let testimages = ref [] in
+  let uri = ref "" in
+  let anon_args = ref [] in
 
-  (* Default wordsize. *)
+  (* Default wordsize (-W). *)
   let def_wordsize = ref None in
   let set_wordsize = function
     | "32" -> def_wordsize := Some W32
@@ -60,18 +160,18 @@ let start usage_msg =
     | str -> failwith (sprintf (f_"set_wordsize: %s: unknown wordsize") str)
   in
 
-  (* Default endianness. *)
+  (* Default endianness (-E). *)
   let def_endian = ref None in
   let set_endian = function
     | "auto" -> def_endian := None
     | "le" | "little" | "littleendian" | "intel" ->
-       def_endian := Some Bitmatch.LittleEndian
+       def_endian := Some Bitstring.LittleEndian
     | "be" | "big" | "bigendian" | "motorola" ->
-       def_endian := Some Bitmatch.BigEndian
+       def_endian := Some Bitstring.BigEndian
     | str -> failwith (sprintf (f_"set_endian: %s: unknown endianness") str)
   in
 
-  (* Default architecture. *)
+  (* Default architecture (-A). *)
   let def_architecture = ref None in
   let set_architecture = function
     | "auto" -> def_architecture := None
@@ -82,25 +182,47 @@ let start usage_msg =
        def_wordsize := Some (wordsize_of_architecture arch)
   in
 
-  (* Default text address. *)
+  (* Default text address (-T). *)
   let def_text_addr = ref 0L (* 0 = auto-detect *) in
+  let def_kernel_min = ref 0L in
+  let def_kernel_max = ref 0L in
   let set_text_addr = function
     | "auto" -> def_text_addr := 0L
-    | "i386" -> def_text_addr := 0xc010_0000_L (* common for x86 *)
-    | "x86-64"|"x86_64" -> def_text_addr := 0xffffffff_81000000_L (* x86-64? *)
-    | str -> def_text_addr := Int64.of_string str
+    | "i386" ->
+       (* common for x86, but we should be able to try a selection *)
+       def_text_addr :=  0xc010_0000_L;
+       def_kernel_min := 0xc010_0000_L;
+       def_kernel_max := 0xffff_ffff_L
+    | "x86-64"|"x86_64" ->
+       def_text_addr  := 0xffffffff_81000000_L;
+       def_kernel_min := 0xffffffff_81000000_L;
+       def_kernel_max := 0xffffffff_ffffffff_L;
+    | str ->
+       let strs = String.nsplit str "," in
+       match strs with
+       | [str] ->
+           def_text_addr := Int64.of_string str;
+           def_kernel_min := !def_text_addr;
+           def_kernel_max :=
+             if !def_text_addr < 0x1_0000_0000_L
+             then 0xffff_ffff_L
+             else 0xffffffff_ffffffff_L
+       | [str1;str2;str3] ->
+           def_text_addr := Int64.of_string str1;
+           def_kernel_min := Int64.of_string str2;
+           def_kernel_max := Int64.of_string str3
+       | _ -> failwith (sprintf (f_"set_text_addr: %s: incorrect number of parameters to -T option") str)
   in
 
-  (* List of kernel images. *)
-  let images = ref [] in
-  let uri = ref "" in
-
+  (* Handle -t option. *)
   let memory_image filename =
-    images :=
-      (!def_wordsize, !def_endian, !def_architecture, !def_text_addr, filename)
-    :: !images
+    testimages :=
+      (!def_wordsize, !def_endian, !def_architecture,
+       !def_text_addr, !def_kernel_min, !def_kernel_max, filename)
+    :: !testimages
   in
 
+  (* Handle --version option. *)
   let version () =
     printf "virt-mem %s\n" Virt_mem_version.version;
 
@@ -111,39 +233,86 @@ let start usage_msg =
     exit 0
   in
 
-  let argspec = Arg.align [
-    "-A", Arg.String set_architecture,
-      "arch " ^ s_"Set kernel architecture, endianness and word size";
-    "-E", Arg.String set_endian,
-      "endian " ^ s_"Set kernel endianness";
-    "-T", Arg.String set_text_addr,
-      "addr " ^ s_"Set kernel text address";
-    "-W", Arg.String set_wordsize,
-      "addr " ^ s_"Set kernel word size";
-    "-c", Arg.Set_string uri,
-      "uri " ^ s_ "Connect to URI";
-    "--connect", Arg.Set_string uri,
-      "uri " ^ s_ "Connect to URI";
-    "--debug", Arg.Set debug,
-      " " ^ s_"Debug mode (default: false)";
-    "-t", Arg.String memory_image,
-      "image " ^ s_"Use saved kernel memory image";
-    "--version", Arg.Unit version,
-      " " ^ s_"Display version and exit";
-  ] in
-
-  let anon_fun str =
-    raise (Arg.Bad (sprintf (f_"%s: unknown parameter") str)) in
-  let usage_msg = usage_msg ^ s_"\n\nOPTIONS" in
-  Arg.parse argspec anon_fun usage_msg;
-
-  let images = !images in
+  (* Function to collect up any anonymous args (domain names/IDs). *)
+  let anon_arg str = anon_args := str :: !anon_args in
+
+  (* Construct the argspec.
+   * May include extra arguments specified by the tool.
+   *)
+  let argspec =
+    let extra_args = match tool with
+      | None -> []
+      | Some (_, _, _, _, extra_args, _, _, _, _) -> extra_args in
+    let argspec = [
+      "-A", Arg.String set_architecture,
+        "arch " ^ s_"Set kernel architecture, endianness and word size";
+      "-E", Arg.String set_endian,
+        "endian " ^ s_"Set kernel endianness";
+      "-T", Arg.String set_text_addr,
+        "addr " ^ s_"Set kernel text address";
+      "-W", Arg.String set_wordsize,
+        "addr " ^ s_"Set kernel word size";
+      "-c", Arg.Set_string uri,
+        "uri " ^ s_ "Connect to URI";
+      "--connect", Arg.Set_string uri,
+        "uri " ^ s_ "Connect to URI";
+      "--debug", Arg.Set debug,
+        " " ^ s_"Debug mode (default: false)";
+      "-t", Arg.String memory_image,
+        "image " ^ s_"Use saved kernel memory image";
+      "--version", Arg.Unit version,
+        " " ^ s_"Display version and exit";
+    ] @ extra_args in
+
+    (* Sort options alphabetically on first alpha character. *)
+    let cmp (a,_,_) (b,_,_) =
+      let chars = "-" in
+      let a = String.strip ~chars a and b = String.strip ~chars b in
+      compare a b
+    in
+    let argspec = List.sort ~cmp argspec in
+    (* Make the options line up nicely. *)
+    Arg.align argspec in
+
+  (* Parse the command line.  This will exit if --version or --help found. *)
+  Arg.parse argspec anon_arg usage_msg;
+
+  let testimages = !testimages in
   let debug = !debug in
   let uri = if !uri = "" then None else Some !uri in
 
+  (* Discard the first anonymous argument if, above, we previously
+   * found it contained the tool name.
+   *)
+  let anon_args = List.rev !anon_args in
+  let anon_args =
+    if ignore_first_anon_arg then List.tl anon_args else anon_args in
+
+  (* At this point, either --help was specified on the command line
+   * (and so the program has exited) or we must have determined tool,
+   * or the user didn't give us a valid tool (eg. "virt-mem foobar").
+   * Detect that final case now and give an error.
+   *)
+  let name, _, _, _, _, argcheck, beforeksyms,  beforeutsname, run =
+    match tool with
+    | Some t -> t
+    | None ->
+       prerr_endline (s_"\
+virt-mem: I could not work out which tool you are trying to run.
+Use 'virt-mem --help' for more help or read the manual page virt-mem(1)");
+       exit 1
+  in
+  if debug then eprintf "tool = %s\n%!" name;
+
+  (* Optional argument checking in the tool. *)
+  (match argcheck with
+   | None -> ()
+   | Some argcheck -> argcheck debug
+  );
+
   (* Get the kernel images. *)
   let images =
-    if images = [] then (
+    if testimages = [] then (
       let conn =
        let name = uri in
        try C.connect_readonly ?name ()
@@ -155,14 +324,36 @@ let start usage_msg =
          );
          exit 1 in
 
-      (* List of active domains. *)
+      (* If we have a list of parameters, then it is the domain names / UUIDs /
+       * IDs ONLY that we wish to display.  Otherwise, display all active.
+       *)
       let doms =
-       let nr_active_doms = C.num_of_domains conn in
-       let active_doms =
-         Array.to_list (C.list_domains conn nr_active_doms) in
-       let active_doms =
-         List.map (D.lookup_by_id conn) active_doms in
-       active_doms in
+       if anon_args = [] then (
+         (* List of active domains. *)
+         let nr_active_doms = C.num_of_domains conn in
+         let active_doms =
+           Array.to_list (C.list_domains conn nr_active_doms) in
+         List.map (D.lookup_by_id conn) active_doms
+       ) else (
+         List.map (
+           fun arg ->
+             let dom =
+               try D.lookup_by_uuid_string conn arg
+               with _ ->
+                 try D.lookup_by_name conn arg
+                 with _ ->
+                   try D.lookup_by_id conn (int_of_string arg)
+                   with _ ->
+                     failwith (sprintf (f_"%s: unknown domain (not a UUID, name or ID of any active domain)") arg) in
+
+             (* XXX Primitive test to see if the domain is active. *)
+             let is_active = try D.get_id dom >= 0 with _ -> false in
+             if not is_active then
+               failwith (sprintf (f_"%s: domain is not running") arg);
+
+             dom
+         ) anon_args
+       ) in
 
       (* Get their XML. *)
       let xmls = List.map (fun dom -> dom, D.get_xml_desc dom) doms in
@@ -182,21 +373,21 @@ let start usage_msg =
 
       List.map (
        fun (dom, _) ->
-         let name = D.get_name dom in
+         let domname = D.get_name dom in
 
          let wordsize =
            match !def_wordsize with
            | None ->
                failwith
                  (sprintf (f_"%s: use -W to define word size for this image")
-                    name);
+                    domname);
            | Some ws -> ws in
          let endian =
            match !def_endian with
            | None ->
                failwith
                  (sprintf (f_"%s: use -E to define endianness for this image")
-                    name);
+                    domname);
            | Some e -> e in
 
          let arch =
@@ -204,40 +395,47 @@ let start usage_msg =
            | Some I386 -> I386 | Some X86_64 -> X86_64
            | _ ->
                failwith
-                 (sprintf (f_"%s: use -A to define architecture (i386/x86-64 only) for this image") name) in
-
-         if !def_text_addr = 0L then
-           failwith
-             (sprintf (f_"%s: use -T to define kernel load address for this image")
-                name);
-
-         (* Read the kernel memory.
-          * Maximum 64K can be read over remote connections.
-          *)
-         let str = String.create kernel_size in
-         let rec loop i =
-           let remaining = kernel_size - i in
-           if remaining > 0 then (
-             let size = min remaining max_memory_peek in
-             D.memory_peek dom [D.Virtual]
-               (!def_text_addr +^ Int64.of_int i) size str i;
-             loop (i + size)
-           )
-         in
-         loop 0;
-
-         (* Map the virtual memory. *)
-         let mem = MMap.of_string str !def_text_addr in
+                 (sprintf (f_"%s: use -A to define architecture (i386/x86-64 only) for this image") domname) in
+
+         if !def_text_addr = 0L ||
+           !def_kernel_min = 0L ||
+           !def_kernel_max = 0L then
+             failwith
+               (sprintf (f_"%s: use -T to define kernel load address for this image") domname);
+
+         (* Download the static part of the kernel. *)
+         let start_t = gettimeofday () in
+
+         let image =
+           try
+             load_static_memory ~dom ~domname ~arch
+               ~wordsize ~endian
+               ~kernel_min:!def_kernel_min ~kernel_max:!def_kernel_max
+               !def_text_addr kernel_size
+           with
+           | LoadMemoryError (AddressOutOfRange, _) ->
+               prerr_endline (s_"virt-mem: error loading kernel memory: address out of range
+Possibly the '-T' command line parameter was used inconsistently.");
+               exit 1
+           (* Allow any other exceptions to escape & kill the program. *) in
+
+         if debug then (
+           let end_t = gettimeofday () in
+           eprintf "timing: downloading kernel took %f seconds\n%!"
+             (end_t -. start_t)
+         );
 
-         (* Force the wordsize and endianness. *)
-         let mem = MMap.set_wordsize mem wordsize in
-         let mem = MMap.set_endian mem endian in
+         image
 
-         (name, arch, mem)
       ) xmls
-    ) else
+    ) else (
+      (* One or more -t options passed. *)
+      if anon_args <> [] then
+       failwith (s_"virt-mem: if -t given on command line, then no domain arguments should be listed");
+
       List.map (
-       fun (wordsize, endian, arch, text_addr, filename) ->
+       fun (wordsize, endian, arch,
+            text_addr, kernel_min, kernel_max, filename) ->
          (* Quite a lot of limitations on the kernel images we can
           * handle at the moment ...
           *)
@@ -271,399 +469,79 @@ let start usage_msg =
 
          (* Map the virtual memory. *)
          let fd = openfile filename [O_RDONLY] 0 in
-         let mem = MMap.of_file fd text_addr in
+         let mem = Virt_mem_mmap.of_file fd text_addr in
 
          (* Force the wordsize and endianness. *)
-         let mem = MMap.set_wordsize mem wordsize in
-         let mem = MMap.set_endian mem endian in
-
-         (filename, arch, mem)
-      ) images in
-
+         let mem = Virt_mem_mmap.set_wordsize mem wordsize in
+         let mem = Virt_mem_mmap.set_endian mem endian in
+
+         { dom = None; domname = filename; mem = mem; arch = arch;
+           kernel_min = kernel_min; kernel_max = kernel_max }
+      ) testimages
+    ) in
+
+  (* Optional callback into the tool before we start looking for
+   * kernel symbols.
+   *)
+  (match beforeksyms with
+   | None -> ()
+   | Some beforeksyms -> beforeksyms debug images
+  );
+
+  (* If there are no more callback functions, then there is no point
+   * continuing with the rest of the program (kernel symbol analysis) ...
+   *)
+  if beforeutsname = None && run = None then exit 0;
+
+  (* Do the kernel symbol analysis. *)
   let images =
     List.map (
-      fun (name, arch, mem) ->
-       (* Look for some common entries in the exported symbol table and
-        * from that find the symbol table itself.  These are just
-        * supposed to be symbols which are very likely to be present
-        * in any Linux kernel, although we only need one of them to be
-        * present to find the symbol table.
-        *
-        * NB. Must not be __initdata, must be in EXPORT_SYMBOL.
-        *)
-       let common_ksyms = [
-         "init_task";                  (* first task_struct *)
-         "root_mountflags";            (* flags for mounting root fs *)
-         "init_uts_ns";                (* uname strings *)
-         "sys_open";                   (* open(2) entry point *)
-         "sys_chdir";                  (* chdir(2) entry point *)
-         "sys_chroot";                 (* chroot(2) entry point *)
-         "sys_umask";                  (* umask(2) entry point *)
-         "schedule";                   (* scheduler entry point *)
-       ] in
-       (* Searching for <NUL>string<NUL> *)
-       let common_ksyms_nul = List.map (sprintf "\000%s\000") common_ksyms in
-
-       (* Search for these strings in the memory image. *)
-       let ksym_strings = List.map (MMap.find_all mem) common_ksyms_nul in
-       let ksym_strings = List.concat ksym_strings in
-       (* Adjust found addresses to start of the string (skip <NUL>). *)
-       let ksym_strings = List.map Int64.succ ksym_strings in
-
-       (* For any we found, try to look up the symbol table
-        * base addr and size.
-        *)
-       let ksymtabs = List.map (
-         fun addr ->
-           (* Search for 'addr' appearing in the image. *)
-           let addrs = MMap.find_pointer_all mem addr in
-
-           (* Now consider each of these addresses and search back
-            * until we reach the beginning of the (possible) symbol
-            * table.
-            *
-            * Kernel symbol table struct is:
-            * struct kernel_symbol {
-             *   unsigned long value;
-             *   const char *name;    <-- initial pointer
-            * } symbols[];
-            *)
-           let pred_long2 addr =
-             MMap.pred_long mem (MMap.pred_long mem addr)
-           in
-           let base_addrs = List.map (
-             fun addr ->
-               let rec loop addr =
-                 (* '*addr' should point to a C identifier.  If it does,
-                  * step backwards to the previous symbol table entry.
-                  *)
-                 let addrp = MMap.follow_pointer mem addr in
-                 if MMap.is_C_identifier mem addrp then
-                   loop (pred_long2 addr)
-                 else
-                   MMap.succ_long mem addr
-               in
-               loop addr
-           ) addrs in
-
-           (* Also look for the end of the symbol table and
-            * calculate its size.
-            *)
-           let base_addrs_sizes = List.map (
-             fun base_addr ->
-               let rec loop addr =
-                 let addr2 = MMap.succ_long mem addr in
-                 let addr2p = MMap.follow_pointer mem addr2 in
-                 if MMap.is_C_identifier mem addr2p then
-                   loop (MMap.succ_long mem addr2)
-                 else
-                   addr
-               in
-               let end_addr = loop base_addr in
-               base_addr, end_addr -^ base_addr
-           ) base_addrs in
-
-           base_addrs_sizes
-       ) ksym_strings in
-       let ksymtabs = List.concat ksymtabs in
-
-       (* Simply ignore any symbol table candidates which are too small. *)
-       let ksymtabs = List.filter (fun (_, size) -> size > 64L) ksymtabs in
-
-       if debug then (
-         printf "%s: candidate symbol tables at:\n" name;
-         List.iter (
-           fun (addr, size) ->
-             printf "\t%Lx\t%Lx\t%!" addr size;
-             printf "first symbol: %s\n%!"
-               (MMap.get_string mem
-                  (MMap.follow_pointer mem
-                     (MMap.succ_long mem addr)))
-         ) ksymtabs
-       );
-
-       (* Vote for the most popular symbol table candidate and from this
-        * generate a function to look up ksyms.
-        *)
-       let lookup_ksym =
-         let freqs = frequency ksymtabs in
-         match freqs with
-         | [] ->
-             eprintf (f_"%s: cannot find start of kernel symbol table\n") name;
-             (fun _ -> raise Not_found)
-
-         | (_, (ksymtab_addr, ksymtab_size)) :: _ ->
-             if debug then
-               printf
-                 "%s: Kernel symbol table found at %Lx, size %Lx bytes\n%!"
-                 name ksymtab_addr ksymtab_size;
-
-             (* Load the whole symbol table as a bitstring. *)
-             let ksymtab =
-               Bitmatch.bitstring_of_string
-                 (MMap.get_bytes mem ksymtab_addr
-                    (Int64.to_int ksymtab_size)) in
-
-             (* Function to look up an address in the symbol table. *)
-             let lookup_ksym sym =
-               let bits = bits_of_wordsize (MMap.get_wordsize mem) in
-               let e = MMap.get_endian mem in
-               let rec loop bs =
-                 bitmatch bs with
-                 | { value : bits : endian(e);
-                     name_ptr : bits : endian(e) }
-                     when MMap.get_string mem name_ptr = sym ->
-                     value
-                 | { _ : bits : endian(e);
-                     _ : bits : endian(e);
-                     bs : -1 : bitstring } ->
-                     loop bs
-                 | { _ } -> raise Not_found
-               in
-               loop ksymtab
-             in
-
-             lookup_ksym
-       in
-
-       (* Now try to find the /proc/kallsyms table.  This is in an odd
-        * compressed format (but not a very successful compression
-        * format).  However if it exists we know that it will contain
-        * addresses of the common ksyms above, and it has some
-        * characteristics which make it easy to detect in the
-        * memory.
-        *
-        * kallsyms contains a complete list of symbols so is much
-        * more useful than the basic list of exports.
-        *)
-       let ksym_addrs = List.filter_map (
-         fun ksym -> try Some (lookup_ksym ksym) with Not_found -> None
-       ) common_ksyms in
-
-       (* Search for those kernel addresses in the image.  We're looking
-        * for the table kallsyms_addresses followed by kallsyms_num_syms
-        * (number of symbols in the table).
-        *)
-       let ksym_addrs = List.map (MMap.find_pointer_all mem) ksym_addrs in
-       let ksym_addrs = List.concat ksym_addrs in
-
-       (* Test each one to see if it's a candidate list of kernel
-        * addresses followed by length of list.
-        *)
-       let kallsymtabs = List.filter_map (
-         fun addr ->
-           (* Search upwards from address until we find the length field.
-            * If found, jump backwards by length and check all addresses.
-            *)
-           if debug then
-             printf "%s: testing candidate kallsyms at %Lx\n" name addr;
-           let rec loop addr =
-             let addrp = MMap.follow_pointer mem addr in
-             if MMap.is_mapped mem addrp then
-               loop (MMap.succ_long mem addr) (* continue up the table *)
-             else
-               if addrp >= min_kallsyms_tabsize &&
-                 addrp <= max_kallsyms_tabsize then (
-                 (* addrp might be the symbol count.  Count backwards and
-                  * check the full table.
-                  *)
-                 let num_entries = Int64.to_int addrp in
-                 let entry_size = bytes_of_wordsize (MMap.get_wordsize mem) in
-                 let start_addr =
-                   addr -^ Int64.of_int (entry_size * num_entries) in
-                 let end_addr = addr in
-                 let rec loop2 addr =
-                   if addr < end_addr then (
-                     let addrp = MMap.follow_pointer mem addr in
-                     if MMap.is_mapped mem addrp then
-                       loop2 (MMap.succ_long mem addr)
-                     else
-                       None (* can't verify the full address table *)
-                   ) else
-                     (* ok! *)
-                     let names_addr = MMap.succ_long mem end_addr in
-                     if debug then
-                       printf "%s: candidate kallsyms found at %Lx (names_addr at %Lx, num_entries %d)\n"
-                         name start_addr names_addr num_entries;
-                     Some (start_addr, num_entries, names_addr)
-                 in
-                 loop2 start_addr
-               )
-               else
-                 None (* forget it *)
-           in
-           match loop addr with
-           | None -> None
-           | Some (start_addr, num_entries, names_addr) ->
-               (* As an additional verification, check the list of
-                * kallsyms_names.
-                *)
-               try
-                 (* If the first byte is '\000' and is followed by a
-                  * C identifier, then this is old-school list of
-                  * symbols with prefix compression as in 2.6.9.
-                  * Otherwise Huffman-compressed kallsyms as in
-                  * 2.6.25.
-                  *)
-                 if MMap.get_byte mem names_addr = 0 &&
-                   MMap.is_C_identifier mem (names_addr+^1L) then (
-                   let names = ref [] in
-                   let prev = ref "" in
-                   let rec loop names_addr start_addr num =
-                     if num > 0 then (
-                       let prefix = MMap.get_byte mem names_addr in
-                       let prefix = String.sub !prev 0 prefix in
-                       let name = MMap.get_string mem (names_addr+^1L) in
-                       let len = String.length name in
-                       let name = prefix ^ name in
-                       prev := name;
-                       let names_addr = names_addr +^ Int64.of_int len +^ 2L in
-                       let sym_value = MMap.follow_pointer mem start_addr in
-                       let start_addr = MMap.succ_long mem start_addr in
-                       (*printf "%S -> %Lx\n" name sym_value;*)
-                       names := (name, sym_value) :: !names;
-                       loop names_addr start_addr (num-1)
-                     )
-                   in
-                   loop names_addr start_addr num_entries;
-                   let names = List.rev !names in
-
-                   Some (start_addr, num_entries, names_addr,
-                         Uncompressed names)
-                   )
-                 else ( (* new-style "compressed" names. *)
-                   let compressed_names = ref [] in
-                   let rec loop names_addr start_addr num =
-                     if num > 0 then (
-                       let len = MMap.get_byte mem names_addr in
-                       let name = MMap.get_bytes mem (names_addr+^1L) len in
-                       let names_addr = names_addr +^ Int64.of_int len +^ 1L in
-                       let sym_value = MMap.follow_pointer mem start_addr in
-                       let start_addr = MMap.succ_long mem start_addr in
-                       compressed_names :=
-                         (name, sym_value) :: !compressed_names;
-                       loop names_addr start_addr (num-1)
-                     ) else
-                       names_addr
-                   in
-                   let markers_addr = loop names_addr start_addr num_entries in
-                   let markers_addr = MMap.align mem markers_addr in
-                   let compressed_names = List.rev !compressed_names in
-
-                   Some (start_addr, num_entries, names_addr,
-                         Compressed (compressed_names, markers_addr))
-                 )
-               with
-                 Invalid_argument _ -> None (* bad names list *)
-       ) ksym_addrs in
-
-       if debug then (
-         printf "%s: candidate kallsyms at:\n" name;
-         List.iter (
-           function
-           | (start_addr, num_entries, names_addr, Uncompressed _) ->
-               printf "\t%Lx %d entries names_addr=%Lx old-style\n%!"
-                 start_addr num_entries names_addr
-           | (start_addr, num_entries, names_addr,
-              Compressed (_, markers_addr)) ->
-               printf "\t%Lx %d entries names_addr=%Lx markers_addr=%Lx\n%!"
-                 start_addr num_entries names_addr markers_addr
-         ) kallsymtabs
-       );
-
-       (* Vote for the most popular symbol table candidate and
-        * enhance the function for looking up ksyms.
-        *)
-       let lookup_ksym =
-         let freqs = frequency kallsymtabs in
-         match freqs with
-         | [] ->
-             (* Can't find any kallsymtabs, just return the lookup_ksym
-              * function generated previously from the exported symbols.
-              *)
-             lookup_ksym
-
-         | (_, (_, _, _, Uncompressed names)) :: _ ->
-             let lookup_ksym name =
-               try (* first look it up in kallsyms table. *)
-                 List.assoc name names
-               with Not_found -> (* try the old exports table instead *)
-                 lookup_ksym name
-             in
-             lookup_ksym
-
-         | (_, (start_addr, num_entries, names_addr,
-                Compressed (compressed_names, markers_addr))) :: _ ->
-             (* Skip the markers and look for the token table. *)
-             let num_markers = Int64.of_int ((num_entries + 255) / 256) in
-             let marker_size =
-               Int64.of_int (bytes_of_wordsize (MMap.get_wordsize mem)) in
-             let tokens_addr = markers_addr +^ marker_size *^ num_markers in
-
-             (* Now read out the compression tokens, which are just
-              * 256 ASCIIZ strings that map bytes in the compression
-              * names to substrings.
-              *)
-             let tokens = Array.make 256 "" in
-             let rec loop i addr =
-               if i < 256 then (
-                 let str = MMap.get_string mem addr in
-                 let len = String.length str in
-                 let addr = addr +^ Int64.of_int (len+1) in
-                 tokens.(i) <- str;
-                 loop (i+1) addr
-               )
-             in
-             loop 0 tokens_addr;
-
-             (* Expand the compressed names using the tokens. *)
-             let names = List.filter_map (
-               fun (name, sym_value) ->
-                 let f c = tokens.(Char.code c) in
-                 let name = String.replace_chars f name in
-                 (* First character in uncompressed output is the symbol
-                  * type, eg. 'T'/'t' for text etc.
-                  *)
-                 (* NOTE: Symbol names are NOT unique
-                  * (eg. 'con_start' is both a function and data in
-                  * some kernels).  XXX We need to handle this situation
-                  * better.
-                  *)
-                 (*let typ = name.[0] in*)
-                 let name = String.sub name 1 (String.length name - 1) in
-                 (*printf "%S -> %Lx\n" name sym_value;*)
-                 Some (name, sym_value)
-             ) compressed_names in
-
-             let lookup_ksym name =
-               try (* first look it up in kallsyms table. *)
-                 List.assoc name names
-               with Not_found -> (* try the old exports table instead *)
-                 lookup_ksym name
-             in
-
-             lookup_ksym in
-
-       (* Just wrap the lookup_ksym call in something which prints
-        * the query when debug is set.
+      fun image ->
+       (* Look for ordinary kernel symbols: *)
+       let image = Virt_mem_ksyms.find_kernel_symbols debug image in
+       (* Look for kallsyms: *)
+       let image = Virt_mem_kallsyms.find_kallsyms debug image in
+
+(*
+       (* Finally, just wrap the lookup_ksym call in something
+        * which prints the query when debug is set.
         *)
-       let lookup_ksym =
+       let image =
          if debug then
+           let (domid, name, arch, mem, lookup_ksym) = image in
            let lookup_ksym sym =
              try
                let value = lookup_ksym sym in
-               printf "lookup_ksym %S = %Lx\n%!" sym value;
+               eprintf "lookup_ksym %S = %Lx\n%!" sym value;
                value
              with Not_found ->
-               printf "lookup_ksym %S failed\n%!" sym;
+               eprintf "lookup_ksym %S failed\n%!" sym;
                raise Not_found
            in
-           lookup_ksym
+           (domid, name, arch, mem, lookup_ksym)
          else
-           lookup_ksym
-       in
+           image in
+*)
 
-       ((name, arch, mem, lookup_ksym) : image)
+       image
     ) images in
 
-  debug, images
+  (* Before utsname analysis. *)
+  (match beforeutsname with
+   | None -> ()
+   | Some beforeutsname -> List.iter (beforeutsname debug) images
+  );
+
+  (* If there are no more callback functions, then there is no point
+   * continuing with the rest of the program (kernel version analysis) ...
+   *)
+  if run = None then exit 0;
+
+  (* Get the kernel version (utsname analysis). *)
+  let images = List.map (Virt_mem_utsname.find_utsname debug) images in
+
+  (* Run the tool's main function. *)
+  (match run with
+   | None -> ()
+   | Some run -> List.iter (run debug) images
+  )
index 443bff6..c807365 100644 (file)
@@ -1,3 +1,4 @@
+(** Memory info for virtual domains. *)
 (* Memory info for virtual domains.
    (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
    http://libvirt.org/
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *)
 
-type ksym = string
-  (** A kernel symbol name. *)
-
-type image =
-    string
-    * Virt_mem_utils.architecture
-    * ([`Wordsize], [`Endian]) Virt_mem_mmap.t
-    * (ksym -> Virt_mem_mmap.addr)
-  (** An image after it has been processed by the code common to
-      all commands.
-
-      The tuple fields are:
-      - name
-      - architecture (eg. I386)
-      - kernel memory map (wordsize & endianness already determined)
-      - a function to look up kernel symbols.  It raises [Not_found]
-        if a kernel symbol could not be found or if the kernel symbol
-        table could not be found at all.
+val register :
+  ?external_cmd:bool ->
+  ?extra_args:(Arg.key * Arg.spec * Arg.doc) list ->
+  ?argcheck:(bool -> unit) ->
+  ?beforeksyms:(bool -> Virt_mem_types.image0 list -> unit) ->
+  ?beforeutsname:(bool -> Virt_mem_types.image1 -> unit) ->
+  ?run:(bool -> Virt_mem_types.image2 -> unit) ->
+  string -> string -> Arg.usage_msg ->
+  unit
+  (** Tools register themselves with this call.
+
+      The anonymous parameters are:
+      - tool name (eg. "uname")
+      - short summary
+      - full usage message
+
+      The optional callback functions are:
+      - [?argcheck] called after arguments have been fully parsed
+      so that the program can do any additional checks needed (eg.
+      on [extra_args]),
+      - [?beforeksyms] called after images are loaded and before
+      kernel symbols are analyzed,
+      - [?beforeutsname] called after kernel symbols are analyzed
+      and before the kernel version is detected
+      - [?run] called after everything
+      (almost all tools supply this callback function).
+
+      Pass [~external_cmd:false] if this tool doesn't have an
+      external 'virt-tool' link.
+
+      Pass [~extra_args:...] if this tool needs extra command
+      line options.
   *)
 
-val start : Arg.usage_msg -> bool * image list
-  (** Programs call this to parse the standard command-line arguments
-      and do all the standard processing of domains into images.
-
-      The returned tuple is:
-      - debug mode
-      - list of images
-  *)
+val main : unit -> unit
+  (** Entry point for the combined virt-mem executable. *)
diff --git a/lib/virt_mem_capture.ml b/lib/virt_mem_capture.ml
new file mode 100644 (file)
index 0000000..0c1ff57
--- /dev/null
@@ -0,0 +1,97 @@
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   Implements 'virt-mem capture' command.
+ *)
+
+open Printf
+open ExtString
+
+module D = Libvirt.Domain
+
+open Virt_mem_types
+open Virt_mem_gettext.Gettext
+
+(* This will contain what is passed by the user as '-o' option. *)
+let output_filename = ref ""
+
+(* Early argument check. *)
+let argcheck debug =
+  (* -o flag must have been specified. *)
+  let output_filename = !output_filename in
+  if output_filename = "" then (
+    prerr_endline (s_"virt-mem capture: '-o memoryimage' option is required");
+    exit 1
+  )
+
+(* Capture the images before kernel symbol analysis is attempted.
+ * Just save them to the output file(s).
+ *)
+let rec beforeksyms debug = function
+  | [] ->
+      prerr_endline
+       (s_"virt-mem capture: warning: no kernel images were captured")
+  | [image] ->
+      (* Single image is saved to output_filename. *)
+      save_image image !output_filename
+  | images ->
+      (* Multiple images are saved to output_filename.ID where ID
+       * is the domain ID (if known) or a mangled domain name.
+       *)
+      List.iter (
+       fun ({ dom = dom; domname = domname } as image) ->
+         let filename =
+           !output_filename ^ "." ^
+           match dom with
+           | Some dom -> string_of_int (D.get_id dom)
+           | None ->
+               let f = function
+                 | ('a'..'z'|'A'..'Z'|'0'..'9'|'_' as c) -> String.make 1 c
+                 | _ -> ""
+               in
+               String.replace_chars f domname in
+         save_image image filename
+      ) images
+
+and save_image { domname = domname } filename =
+  assert false;
+
+  let chan = open_out filename in
+
+  close_out chan;
+
+  printf (f_"virt-mem capture: wrote kernel image from %s to filename %s\n")
+    domname filename
+
+let summary = s_"capture memory image for post-mortem analysis"
+let description = s_"Capture a memory image to a file for later post-mortem
+analysis.  Use the '-o memoryimage' option to specify the
+output file.
+
+Other tools can load the memory image using the '-t' option."
+
+let extra_args = [
+  "-o", Arg.Set_string output_filename,
+    "memoryimage " ^s_"Set output filename"
+]
+
+let () =
+  Virt_mem.register
+    ~external_cmd:false ~extra_args
+    ~argcheck ~beforeksyms
+    "capture" summary description
diff --git a/lib/virt_mem_kallsyms.ml b/lib/virt_mem_kallsyms.ml
new file mode 100644 (file)
index 0000000..2394248
--- /dev/null
@@ -0,0 +1,273 @@
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   Find kallsyms in a kernel image.
+ *)
+
+open Unix
+open Printf
+
+open ExtList
+open ExtString
+
+open Virt_mem_gettext.Gettext
+open Virt_mem_utils
+open Virt_mem_types
+
+let min_kallsyms_tabsize = 1_000L
+let max_kallsyms_tabsize = 250_000L
+
+type kallsyms_compr =
+  | Compressed of (string * Virt_mem_mmap.addr) list * Virt_mem_mmap.addr
+  | Uncompressed of (string * Virt_mem_mmap.addr) list
+
+let find_kallsyms debug (({ domname = domname; mem = mem } as image), ksymmap) =
+  let start_t = gettimeofday () in
+
+  (* Now try to find the /proc/kallsyms table.  This is in an odd
+   * compressed format (but not a very successful compression
+   * format).  However if it exists we know that it will contain
+   * addresses of the ordinary ksyms, and it has some
+   * characteristics which make it easy to detect in the
+   * memory.
+   *
+   * kallsyms contains a complete list of symbols so is much
+   * more useful than the basic list of exports.
+   *)
+  let ksym_addrs = List.filter_map (
+    fun ksym -> try Some (Ksymmap.find ksym ksymmap) with Not_found -> None
+  ) Virt_mem_ksyms.common_ksyms in
+
+  (* Search for those kernel addresses in the image.  We're looking
+   * for the table kallsyms_addresses followed by kallsyms_num_syms
+   * (number of symbols in the table).
+   *)
+  let ksym_addrs =
+    List.map (Virt_mem_mmap.find_pointer_all mem) ksym_addrs in
+  let ksym_addrs = List.concat ksym_addrs in
+
+  (* Test each one to see if it's a candidate list of kernel
+   * addresses followed by length of list.
+   *)
+  let kallsymtabs = List.filter_map (
+    fun addr ->
+      (* Search upwards from address until we find the length field.
+       * If found, jump backwards by length and check all addresses.
+       *)
+      if debug then
+       eprintf "%s: testing candidate kallsyms at %Lx\n" domname addr;
+      let rec loop addr =
+       let addrp = Virt_mem_mmap.follow_pointer mem addr in
+       if Virt_mem_mmap.is_mapped mem addrp then
+         (* continue up the table *)
+         loop (Virt_mem_mmap.succ_long mem addr)
+       else
+         if addrp >= min_kallsyms_tabsize &&
+           addrp <= max_kallsyms_tabsize then (
+             (* addrp might be the symbol count.  Count backwards and
+              * check the full table.
+              *)
+             let num_entries = Int64.to_int addrp in
+             let entry_size =
+               bytes_of_wordsize (Virt_mem_mmap.get_wordsize mem) in
+             let start_addr =
+               addr -^ Int64.of_int (entry_size * num_entries) in
+             let end_addr = addr in
+             let rec loop2 addr =
+               if addr < end_addr then (
+                 let addrp = Virt_mem_mmap.follow_pointer mem addr in
+                 if Virt_mem_mmap.is_mapped mem addrp then
+                   loop2 (Virt_mem_mmap.succ_long mem addr)
+                 else
+                   None (* can't verify the full address table *)
+               ) else
+                 (* ok! *)
+                 let names_addr = Virt_mem_mmap.succ_long mem end_addr in
+                 if debug then
+                   eprintf "%s: candidate kallsyms found at %Lx (names_addr at %Lx, num_entries %d)\n"
+                     domname start_addr names_addr num_entries;
+                 Some (start_addr, num_entries, names_addr)
+             in
+             loop2 start_addr
+           )
+         else
+           None (* forget it *)
+      in
+      match loop addr with
+      | None -> None
+      | Some (start_addr, num_entries, names_addr) ->
+         (* As an additional verification, check the list of
+          * kallsyms_names.
+          *)
+         try
+           (* If the first byte is '\000' and is followed by a
+            * C identifier, then this is old-school list of
+            * symbols with prefix compression as in 2.6.9.
+            * Otherwise Huffman-compressed kallsyms as in
+            * 2.6.25.
+            *)
+           if Virt_mem_mmap.get_byte mem names_addr = 0 &&
+             Virt_mem_mmap.is_C_identifier mem (names_addr+^1L) then (
+               let names = ref [] in
+               let prev = ref "" in
+               let rec loop names_addr start_addr num =
+                 if num > 0 then (
+                   let prefix = Virt_mem_mmap.get_byte mem names_addr in
+                   let prefix = String.sub !prev 0 prefix in
+                   let name =
+                     Virt_mem_mmap.get_string mem (names_addr+^1L) in
+                   let len = String.length name in
+                   let name = prefix ^ name in
+                   prev := name;
+                   let names_addr = names_addr +^ Int64.of_int len +^ 2L in
+                   let sym_value =
+                     Virt_mem_mmap.follow_pointer mem start_addr in
+                   let start_addr =
+                     Virt_mem_mmap.succ_long mem start_addr in
+                   (*eprintf "%S -> %Lx\n" name sym_value;*)
+                   names := (name, sym_value) :: !names;
+                   loop names_addr start_addr (num-1)
+                 )
+               in
+               loop names_addr start_addr num_entries;
+               let names = List.rev !names in
+
+               Some (start_addr, num_entries, names_addr,
+                     Uncompressed names)
+             )
+           else ( (* new-style "compressed" names. *)
+             let compressed_names = ref [] in
+             let rec loop names_addr start_addr num =
+               if num > 0 then (
+                 let len = Virt_mem_mmap.get_byte mem names_addr in
+                 let name =
+                   Virt_mem_mmap.get_bytes mem (names_addr+^1L) len in
+                 let names_addr = names_addr +^ Int64.of_int len +^ 1L in
+                 let sym_value =
+                   Virt_mem_mmap.follow_pointer mem start_addr in
+                 let start_addr =
+                   Virt_mem_mmap.succ_long mem start_addr in
+                 compressed_names :=
+                   (name, sym_value) :: !compressed_names;
+                 loop names_addr start_addr (num-1)
+               ) else
+                 names_addr
+             in
+             let markers_addr = loop names_addr start_addr num_entries in
+             let markers_addr = Virt_mem_mmap.align mem markers_addr in
+             let compressed_names = List.rev !compressed_names in
+
+             Some (start_addr, num_entries, names_addr,
+                   Compressed (compressed_names, markers_addr))
+           )
+         with
+           Invalid_argument _ -> None (* bad names list *)
+  ) ksym_addrs in
+
+  if debug then (
+    eprintf "%s: candidate kallsyms at:\n" domname;
+    List.iter (
+      function
+      | (start_addr, num_entries, names_addr, Uncompressed _) ->
+         eprintf "\t%Lx %d entries names_addr=%Lx old-style\n%!"
+           start_addr num_entries names_addr
+      | (start_addr, num_entries, names_addr,
+        Compressed (_, markers_addr)) ->
+         eprintf "\t%Lx %d entries names_addr=%Lx markers_addr=%Lx\n%!"
+           start_addr num_entries names_addr markers_addr
+    ) kallsymtabs
+  );
+
+  (* Vote for the most popular symbol table candidate and
+   * enhance the function for looking up ksyms.
+   *)
+  let ksymmap =
+    let freqs = frequency kallsymtabs in
+    match freqs with
+    | [] ->
+       (* Can't find any kallsymtabs, just return the ksymmap
+        * map generated previously from the exported symbols.
+        *)
+       ksymmap
+
+    | (_, (_, _, _, Uncompressed names)) :: _ ->
+       let rec loop ksymmap = function
+         | (name, value) :: names ->
+             loop (Ksymmap.add name value ksymmap) names
+         | [] -> ksymmap
+       in
+       loop ksymmap names
+
+    | (_, (start_addr, num_entries, names_addr,
+          Compressed (compressed_names, markers_addr))) :: _ ->
+       (* Skip the markers and look for the token table. *)
+       let num_markers = Int64.of_int ((num_entries + 255) / 256) in
+       let marker_size =
+         Int64.of_int (bytes_of_wordsize
+                         (Virt_mem_mmap.get_wordsize mem)) in
+       let tokens_addr = markers_addr +^ marker_size *^ num_markers in
+
+       (* Now read out the compression tokens, which are just
+        * 256 ASCIIZ strings that map bytes in the compression
+        * names to substrings.
+        *)
+       let tokens = Array.make 256 "" in
+       let rec loop i addr =
+         if i < 256 then (
+           let str = Virt_mem_mmap.get_string mem addr in
+           let len = String.length str in
+           let addr = addr +^ Int64.of_int (len+1) in
+           tokens.(i) <- str;
+           loop (i+1) addr
+         )
+       in
+       loop 0 tokens_addr;
+
+       (* Expand the compressed names using the tokens. *)
+       let names = List.filter_map (
+         fun (name, sym_value) ->
+           let f c = tokens.(Char.code c) in
+           let name = String.replace_chars f name in
+           (* First character in uncompressed output is the symbol
+            * type, eg. 'T'/'t' for text etc.
+            *)
+           (* NOTE: Symbol names are NOT unique
+            * (eg. 'con_start' is both a function and data in
+            * some kernels).  XXX We need to handle this situation
+            * better.
+            *)
+           (*let typ = name.[0] in*)
+           let name = String.sub name 1 (String.length name - 1) in
+           (*eprintf "%S -> %Lx\n" name sym_value;*)
+           Some (name, sym_value)
+       ) compressed_names in
+
+       let rec loop ksymmap = function
+         | (name, value) :: names ->
+             loop (Ksymmap.add name value ksymmap) names
+         | [] -> ksymmap
+       in
+       loop ksymmap names in
+
+  if debug then (
+    let end_t = gettimeofday () in
+    eprintf "timing: searching for kallsyms took %f seconds\n%!"
+      (end_t -. start_t)
+  );
+
+  ((image, ksymmap) : image1)
diff --git a/lib/virt_mem_kallsyms.mli b/lib/virt_mem_kallsyms.mli
new file mode 100644 (file)
index 0000000..7f51831
--- /dev/null
@@ -0,0 +1,24 @@
+(** Find kallsyms in a kernel image. *)
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   Find kallsyms in a kernel image.
+ *)
+
+val find_kallsyms : bool -> Virt_mem_types.image1 -> Virt_mem_types.image1
+(** Find kallsyms in a kernel image. *)
diff --git a/lib/virt_mem_ksyms.ml b/lib/virt_mem_ksyms.ml
new file mode 100644 (file)
index 0000000..32031fb
--- /dev/null
@@ -0,0 +1,189 @@
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   Ordinary kernel symbol lookups.
+ *)
+
+open Unix
+open Printf
+
+open Virt_mem_gettext.Gettext
+open Virt_mem_utils
+open Virt_mem_types
+
+(* Look for some common entries in the exported symbol table and
+ * from that find the symbol table itself.  These are just
+ * supposed to be symbols which are very likely to be present
+ * in any Linux kernel, although we only need one of them to be
+ * present to find the symbol table.
+ *
+ * NB. Must not be __initdata, must be in EXPORT_SYMBOL.
+ *)
+let common_ksyms = [
+  "init_task";                         (* first task_struct *)
+  "root_mountflags";                   (* flags for mounting root fs *)
+  "init_uts_ns";                       (* uname strings *)
+  "sys_open";                          (* open(2) entry point *)
+  "sys_chdir";                         (* chdir(2) entry point *)
+  "sys_chroot";                                (* chroot(2) entry point *)
+  "sys_umask";                         (* umask(2) entry point *)
+  "schedule";                          (* scheduler entry point *)
+]
+
+let find_kernel_symbols debug ({ mem = mem; domname = domname } as image) =
+  (* Searching for <NUL>string<NUL> *)
+  let common_ksyms_nul = List.map (sprintf "\000%s\000") common_ksyms in
+
+  let start_t = gettimeofday () in
+
+  (* Search for these strings in the memory image. *)
+  let ksym_strings =
+    List.map (Virt_mem_mmap.find_all mem) common_ksyms_nul in
+  let ksym_strings = List.concat ksym_strings in
+  (* Adjust found addresses to start of the string (skip <NUL>). *)
+  let ksym_strings = List.map Int64.succ ksym_strings in
+
+  if debug then (
+    let end_t = gettimeofday () in
+    eprintf "timing: searching for common_ksyms took %f seconds\n%!"
+      (end_t -. start_t)
+  );
+
+  let start_t = gettimeofday () in
+
+  (* For any we found, try to look up the symbol table
+   * base addr and size.
+   *)
+  let ksymtabs = List.map (
+    fun addr ->
+      (* Search for 'addr' appearing in the image. *)
+      let addrs = Virt_mem_mmap.find_pointer_all mem addr in
+
+      (* Now consider each of these addresses and search back
+       * until we reach the beginning of the (possible) symbol
+       * table.
+       *
+       * Kernel symbol table struct is:
+       * struct kernel_symbol {
+       *   unsigned long value;
+       *   const char *name;    <-- initial pointer
+       * } symbols[];
+       *)
+      let pred_long2 addr =
+       Virt_mem_mmap.pred_long mem (Virt_mem_mmap.pred_long mem addr)
+      in
+      let base_addrs = List.map (
+       fun addr ->
+         let rec loop addr =
+           (* '*addr' should point to a C identifier.  If it does,
+            * step backwards to the previous symbol table entry.
+            *)
+           let addrp = Virt_mem_mmap.follow_pointer mem addr in
+           if Virt_mem_mmap.is_C_identifier mem addrp then
+             loop (pred_long2 addr)
+           else
+             Virt_mem_mmap.succ_long mem addr
+         in
+         loop addr
+      ) addrs in
+
+      (* Also look for the end of the symbol table and
+       * calculate its size.
+       *)
+      let base_addrs_sizes = List.map (
+       fun base_addr ->
+         let rec loop addr =
+           let addr2 = Virt_mem_mmap.succ_long mem addr in
+           let addr2p = Virt_mem_mmap.follow_pointer mem addr2 in
+           if Virt_mem_mmap.is_C_identifier mem addr2p then
+             loop (Virt_mem_mmap.succ_long mem addr2)
+           else
+             addr
+         in
+         let end_addr = loop base_addr in
+         base_addr, end_addr -^ base_addr
+      ) base_addrs in
+
+      base_addrs_sizes
+  ) ksym_strings in
+  let ksymtabs = List.concat ksymtabs in
+
+  (* Simply ignore any symbol table candidates which are too small. *)
+  let ksymtabs = List.filter (fun (_, size) -> size > 64L) ksymtabs in
+
+  if debug then (
+    eprintf "%s: candidate symbol tables at:\n" domname;
+    List.iter (
+      fun (addr, size) ->
+       eprintf "\t%Lx\t%Lx\t%!" addr size;
+       eprintf "first symbol: %s\n%!"
+         (Virt_mem_mmap.get_string mem
+            (Virt_mem_mmap.follow_pointer mem
+               (Virt_mem_mmap.succ_long mem addr)))
+    ) ksymtabs
+  );
+
+  (* Vote for the most popular symbol table candidate and from this
+   * generate a function to look up ksyms.
+   *)
+  let ksymmap =
+    let freqs = frequency ksymtabs in
+    match freqs with
+    | [] ->
+       eprintf (f_"%s: cannot find start of kernel symbol table\n") domname;
+       Ksymmap.empty
+
+    | (_, (ksymtab_addr, ksymtab_size)) :: _ ->
+       if debug then
+         eprintf
+           "%s: Kernel symbol table found at %Lx, size %Lx bytes\n%!"
+           domname ksymtab_addr ksymtab_size;
+
+       (* Load the whole symbol table as a bitstring. *)
+       let ksymtab =
+         Bitstring.bitstring_of_string
+           (Virt_mem_mmap.get_bytes mem ksymtab_addr
+              (Int64.to_int ksymtab_size)) in
+
+       (* Construct kernel symbol map. *)
+       let ksymmap =
+         let bits = bits_of_wordsize (Virt_mem_mmap.get_wordsize mem) in
+         let e = Virt_mem_mmap.get_endian mem in
+         let rec loop ksymmap bs =
+           bitmatch bs with
+           | { value : bits : endian(e);
+               name_ptr : bits : endian(e);
+               bs : -1 : bitstring } ->
+               let name = Virt_mem_mmap.get_string mem name_ptr in
+               let ksymmap = Ksymmap.add name value ksymmap in
+               loop ksymmap bs
+           | { _ } ->
+               ksymmap
+         in
+         loop Ksymmap.empty ksymtab in
+
+       ksymmap
+  in
+
+  if debug then (
+    let end_t = gettimeofday () in
+    eprintf "timing: searching for ordinary ksyms took %f seconds\n%!"
+      (end_t -. start_t)
+  );
+
+  ((image, ksymmap) : image1)
diff --git a/lib/virt_mem_ksyms.mli b/lib/virt_mem_ksyms.mli
new file mode 100644 (file)
index 0000000..fb00bb3
--- /dev/null
@@ -0,0 +1,28 @@
+(** Ordinary kernel symbol lookups. *)
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   Ordinary kernel symbol lookups.
+ *)
+
+val common_ksyms : Virt_mem_types.ksym list
+(** The list of "common" kernel symbols which we expect to be present
+    in almost any Linux kernel. *)
+
+val find_kernel_symbols : bool -> Virt_mem_types.image0 -> Virt_mem_types.image1
+(** Find ordinary kernel symbols in a kernel image. *)
index 98dc84a..c323c1a 100644 (file)
  *)
 
 open Unix
+open Printf
 open Bigarray
 
 open Virt_mem_utils
 
-(* Simple implementation at the moment: Store a list of mappings,
- * sorted by start address.  We assume that mappings do not overlap.
- * We can change the implementation later if we need to.  In most cases
- * there will only be a small number of mappings (probably 1).
- *)
-type ('a,'b) t = {
-  mappings : mapping list;
-  wordsize : wordsize option;
-  endian : Bitmatch.endian option;
-}
-and mapping = {
+let debug = false
+
+(* An address. *)
+type addr = int64
+
+(* A range of addresses (start and start+size). *)
+type interval = addr * addr
+
+(* A mapping. *)
+type mapping = {
   start : addr;
   size : addr;
   (* Bigarray mmap(2)'d region with byte addressing: *)
   arr : (char,int8_unsigned_elt,c_layout) Array1.t;
+  (* The order that the mappings were added, 0 for the first mapping,
+   * 1 for the second mapping, etc.
+   *)
+  order : int;
 }
 
-and addr = int64
+(* A memory map. *)
+type ('ws,'e,'hm) t = {
+  (* List of mappings, kept in reverse order they were added (new
+   * mappings are added at the head of this list).
+   *)
+  mappings : mapping list;
+
+  (* Segment tree for fast access to a mapping at a particular address.
+   * This is rebuilt each time a new mapping is added.
+   * NB! If mappings = [], ignore contents of this field.  (This is
+   * enforced by the 'hm phantom type).
+   *)
+  tree : (interval * mapping option, interval * mapping option) binary_tree;
+
+  (* Word size, endianness.
+   * Phantom types enforce that these are set before being used.
+   *)
+  wordsize : wordsize;
+  endian : Bitstring.endian;
+}
 
 let create () = {
   mappings = [];
-  wordsize = None;
-  endian = None
+  tree = Leaf ((0L,0L),None);
+  wordsize = W32;
+  endian = Bitstring.LittleEndian;
 }
 
-let set_wordsize t ws = { t with wordsize = Some ws }
+let set_wordsize t ws = { t with wordsize = ws }
+
+let set_endian t e = { t with endian = e }
+
+let get_wordsize t = t.wordsize
+
+let get_endian t = t.endian
+
+(* Build the segment tree from the list of mappings.  This code
+ * is taken from virt-df.  For an explanation of the process see:
+ * http://en.wikipedia.org/wiki/Segment_tree
+ *
+ * See also the 'get_mapping' function below which uses this tree
+ * to do fast lookups.
+ *)
+let tree_of_mappings mappings =
+  (* Construct the list of distinct endpoints. *)
+  let eps =
+    List.map
+      (fun { start = start; size = size } -> [start; start +^ size])
+      mappings in
+  let eps = sort_uniq (List.concat eps) in
+
+  (* Construct the elementary intervals. *)
+  let elints =
+    let elints, lastpoint =
+      List.fold_left (
+       fun (elints, prevpoint) point ->
+         ((point, point) :: (prevpoint, point) :: elints), point
+      ) ([], 0L) eps in
+    let elints = (lastpoint, Int64.max_int(*XXX*)) :: elints in
+    List.rev elints in
+
+  if debug then (
+    eprintf "elementary intervals (%d in total):\n" (List.length elints);
+    List.iter (
+      fun (startpoint, endpoint) ->
+       eprintf "  %Lx %Lx\n" startpoint endpoint
+    ) elints
+  );
+
+  (* Construct the binary tree of elementary intervals. *)
+  let tree =
+    (* Each elementary interval becomes a leaf. *)
+    let elints = List.map (fun elint -> Leaf elint) elints in
+    (* Recursively build this into a binary tree. *)
+    let rec make_layer = function
+      | [] -> []
+      | ([_] as x) -> x
+      (* Turn pairs of leaves at the bottom level into nodes. *)
+      | (Leaf _ as a) :: (Leaf _ as b) :: xs ->
+         let xs = make_layer xs in
+         Node (a, (), b) :: xs
+      (* Turn pairs of nodes at higher levels into nodes. *)
+      | (Node _ as left) :: ((Node _|Leaf _) as right) :: xs ->
+         let xs = make_layer xs in
+         Node (left, (), right) :: xs
+      | Leaf _ :: _ -> assert false (* never happens??? (I think) *)
+    in
+    let rec loop = function
+      | [] -> assert false
+      | [x] -> x
+      | xs -> loop (make_layer xs)
+    in
+    loop elints in
 
-let set_endian t e = { t with endian = Some e }
+  if debug then (
+    let leaf_printer (startpoint, endpoint) =
+      sprintf "%Lx-%Lx" startpoint endpoint
+    in
+    let node_printer () = "" in
+    print_binary_tree leaf_printer node_printer tree
+  );
+
+  (* Insert the mappings into the tree one by one. *)
+  let tree =
+    (* For each node/leaf in the tree, add its interval and an
+     * empty list which will be used to store the mappings.
+     *)
+    let rec interval_tree = function
+      | Leaf elint -> Leaf (elint, None)
+      | Node (left, (), right) ->
+         let left = interval_tree left in
+         let right = interval_tree right in
+         let (leftstart, _) = interval_of_node left in
+         let (_, rightend) = interval_of_node right in
+         let interval = leftstart, rightend in
+         Node (left, (interval, None), right)
+    and interval_of_node = function
+      | Leaf (elint, _) -> elint
+      | Node (_, (interval, _), _) -> interval
+    in
 
-let get_wordsize t = Option.get t.wordsize
+    let tree = interval_tree tree in
+    (* This should always be true: *)
+    assert (interval_of_node tree = (0L, Int64.max_int(*XXX*)));
+
+    (* "Contained in" operator.
+     * 'a <-< b' iff 'a' is a subinterval of 'b'.
+     *      |<---- a ---->|
+     * |<----------- b ----------->|
+     *)
+    let (<-<) (a1, a2) (b1, b2) = b1 <= a1 && a2 <= b2 in
+
+    (* "Intersects" operator.
+     * 'a /\ b' iff intervals 'a' and 'b' overlap, eg:
+     *      |<---- a ---->|
+     *                |<----------- b ----------->|
+     *)
+    let ( /\ ) (a1, a2) (b1, b2) = a2 > b1 || b2 > a1 in
+
+    let rec insert_mapping tree mapping =
+      let { start = start; size = size } = mapping in
+      let seginterval = start, start +^ size in
+
+      match tree with
+      (* Test if we should insert into this leaf or node: *)
+      | Leaf (interval, None) when interval <-< seginterval ->
+         Leaf (interval, Some mapping)
+      | Leaf (interval, Some oldmapping) when interval <-< seginterval ->
+         let mapping =
+           if oldmapping.order > mapping.order then oldmapping else mapping in
+         Leaf (interval, Some mapping)
+
+      | Node (left, (interval, None), right) when interval <-< seginterval ->
+         Node (left, (interval, Some mapping), right)
+
+      | Node (left, (interval, Some oldmapping), right)
+         when interval <-< seginterval ->
+         let mapping =
+           if oldmapping.order > mapping.order then oldmapping else mapping in
+         Node (left, (interval, Some mapping), right)
+
+      | (Leaf _) as leaf -> leaf
+
+      (* Else, should we insert into left or right subtrees? *)
+      | Node (left, i, right) ->
+         let left =
+           if seginterval /\ interval_of_node left then
+             insert_mapping left mapping
+           else
+             left in
+         let right =
+           if seginterval /\ interval_of_node right then
+             insert_mapping right mapping
+           else
+             right in
+         Node (left, i, right)
+    in
+    let tree = List.fold_left insert_mapping tree mappings in
+    tree in
+
+  if debug then (
+    let printer ((sp, ep), mapping) =
+      sprintf "[%Lx-%Lx] " sp ep ^
+       match mapping with
+       | None -> "(none)"
+       | Some { start = start; size = size; order = order } ->
+           sprintf "%Lx..%Lx(%d)" start (start+^size-^1L) order
+    in
+    print_binary_tree printer printer tree
+  );
 
-let get_endian t = Option.get t.endian
+  tree
 
-let sort_mappings mappings =
-  let cmp { start = s1 } { start = s2 } = compare s1 s2 in
-  List.sort cmp mappings
+let add_mapping ({ mappings = mappings } as t) start size arr =
+  let order = List.length mappings in
+  let mapping = { start = start; size = size; arr = arr; order = order } in
+  let mappings = mapping :: mappings in
+  let tree = tree_of_mappings mappings in
+  { t with mappings = mappings; tree = tree }
 
-let add_file ({ mappings = mappings } as t) fd addr =
-  if addr &^ 7L <> 0L then
-    invalid_arg "add_file: mapping address must be aligned to 8 bytes";
+let add_file t fd addr =
   let size = (fstat fd).st_size in
   (* mmap(2) the file using Bigarray module. *)
   let arr = Array1.map_file fd char c_layout false size in
-  (* Create the mapping entry and keep the mappings sorted by start addr. *)
-  let mappings =
-    { start = addr; size = Int64.of_int size; arr = arr } :: mappings in
-  let mappings = sort_mappings mappings in
-  { t with mappings = mappings }
-
-let of_file fd addr =
-  let t = create () in
-  add_file t fd addr
+  (* Create the mapping entry. *)
+  add_mapping t addr (Int64.of_int size) arr
 
 let add_string ({ mappings = mappings } as t) str addr =
-  if addr &^ 7L <> 0L then
-    invalid_arg "add_file: mapping address must be aligned to 8 bytes";
   let size = String.length str in
-  (* Use Bigarray.Array1. XXX We should just use the string. *)
+  (* Copy the string data to a Bigarray. *)
   let arr = Array1.create char c_layout size in
   for i = 0 to size-1 do
     Array1.set arr i (String.unsafe_get str i)
   done;
-  (* Create the mapping entry and keep the mappings sorted by start addr. *)
-  let mappings =
-    { start = addr; size = Int64.of_int size; arr = arr } :: mappings in
-  let mappings = sort_mappings mappings in
-  { t with mappings = mappings }
+  (* Create the mapping entry. *)
+  add_mapping t addr (Int64.of_int size) arr
+
+let of_file fd addr =
+  let t = create () in
+  add_file t fd addr
 
 let of_string str addr =
   let t = create () in
   add_string t str addr
 
-(* Find in mappings and return first predicate match. *)
-let _find_map { mappings = mappings } pred =
-  let rec loop = function
-    | [] -> None
-    | m :: ms ->
-       match pred m with
-       | Some n -> Some n
-       | None -> loop ms
+(* 'get_mapping' is the crucial, fast lookup function for address -> mapping.
+ * It searches the tree (hence fast) to work out the topmost mapping which
+ * applies to an address.
+ *
+ * Returns (rightend * mapping option)
+ * where 'mapping option' is the mapping (or None if it's a hole)
+ *   and 'rightend' is the next address at which there is a different
+ *       mapping/hole.  In other words, this mapping result is good for
+ *       addresses [addr .. rightend-1].
+ *)
+let rec get_mapping addr = function
+  | Leaf ((_, rightend), mapping) -> rightend, mapping
+
+  | Node ((Leaf ((_, leftend), _) | Node (_, ((_, leftend), _), _) as left),
+         (_, None),
+         right) ->
+      let subrightend, submapping =
+       if addr < leftend then get_mapping addr left
+       else get_mapping addr right in
+      subrightend, submapping
+
+  | Node ((Leaf ((_, leftend), _) | Node (_, ((_, leftend), _), _) as left),
+         (_, Some mapping),
+         right) ->
+      let subrightend, submapping =
+       if addr < leftend then get_mapping addr left
+       else get_mapping addr right in
+      (match submapping with
+       | None -> subrightend, Some mapping
+       | Some submapping ->
+          subrightend,
+          Some (if mapping.order > submapping.order then mapping
+                else submapping)
+      )
+
+(* Use the tree to quickly check if an address is mapped (returns false
+ * if it's a hole).
+ *)
+let is_mapped { mappings = mappings; tree = tree } addr =
+  (* NB: No [`HasMapping] in the type so we have to check mappings <> []. *)
+  match mappings with
+  | [] -> false
+  | _ ->
+      let _, mapping = get_mapping addr tree in
+      mapping <> None
+
+(* Get a single byte. *)
+let get_byte { tree = tree } addr =
+  (* Get the mapping which applies to this address: *)
+  let _, mapping = get_mapping addr tree in
+  match mapping with
+  | Some { start = start; size = size; arr = arr } ->
+      let offset = Int64.to_int (addr -^ start) in
+      Char.code (Array1.get arr offset)
+  | None ->
+      invalid_arg "get_byte"
+
+(* Get a range of bytes, possibly across several intervals. *)
+let get_bytes { tree = tree } addr len =
+  let str = String.create len in
+
+  let rec loop addr pos len =
+    if len > 0 then (
+      let rightend, mapping = get_mapping addr tree in
+      match mapping with
+      | Some { start = start; size = size; arr = arr } ->
+         (* Offset within this mapping. *)
+         let offset = Int64.to_int (addr -^ start) in
+         (* Number of bytes to read before we either get to the end
+          * of our 'len' or we fall off the end of this interval.
+          *)
+         let n = min len (Int64.to_int (rightend -^ addr)) in
+         for i = 0 to n-1 do
+           String.unsafe_set str (pos + i) (Array1.get arr (offset + i))
+         done;
+         let len = len - n in
+         loop (addr +^ Int64.of_int n) (pos + n) len
+
+      | None ->
+         invalid_arg "get_bytes"
+    )
   in
-  loop mappings
+  loop addr 0 len;
+
+  str
+
+let get_int32 t addr =
+  let e = get_endian t in
+  let str = get_bytes t addr 4 in
+  let bs = Bitstring.bitstring_of_string str in
+  bitmatch bs with
+  | { addr : 32 : endian (e) } -> addr
+  | { _ } -> invalid_arg "get_int32"
+
+let get_int64 t addr =
+  let e = get_endian t in
+  let str = get_bytes t addr 8 in
+  let bs = Bitstring.bitstring_of_string str in
+  bitmatch bs with
+  | { addr : 64 : endian (e) } -> addr
+  | { _ } -> invalid_arg "get_int64"
+
+let get_C_int = get_int32
+
+let get_C_long t addr =
+  let ws = get_wordsize t in
+  match ws with
+  | W32 -> Int64.of_int32 (get_int32 t addr)
+  | W64 -> get_int64 t addr
 
+(* Take bytes until a condition is not met.  This is efficient
+ * in that we stay within the same mapping as long as we can.
+ *
+ * If we hit a hole, raises Invalid_argument "dowhile".
+ *)
+let dowhile { tree = tree } addr cond =
+  let rec loop addr =
+    let rightend, mapping = get_mapping addr tree in
+    match mapping with
+    | Some { start = start; size = size; arr = arr } ->
+       (* Offset within this mapping. *)
+       let offset = Int64.to_int (addr -^ start) in
+       (* Number of bytes before we fall off the end of this interval. *)
+       let n = Int64.to_int (rightend -^ addr) in
+
+       let rec loop2 addr offset n =
+         if n > 0 then (
+           let c = Array1.get arr offset in
+           if cond addr c then
+             loop2 (addr +^ 1L) (offset + 1) (n - 1)
+           else
+             false (* stop now, finish outer loop too *)
+         )
+         else true (* fell off the end, so continue outer loop *)
+       in
+       if loop2 addr offset n then
+         loop (addr +^ Int64.of_int n)
+
+    | None ->
+       invalid_arg "dowhile"
+  in
+  loop addr
+
+let is_mapped_range ({ mappings = mappings } as t) addr size =
+  match mappings with
+  (* NB: No [`HasMapping] in the type so we have to check mappings <> []. *)
+  | [] -> false
+  | _ ->
+      (* Quick and dirty.  It's possible to make a much faster
+       * implementation of this which doesn't call the closure for every
+       * byte.
+       *)
+      let size = ref size in
+      try dowhile t addr (fun _ _ -> decr size; !size > 0); true
+      with Invalid_argument "dowhile" -> false
+
+(* Get a string, ending at ASCII NUL character. *)
+let get_string t addr =
+  let chars = ref [] in
+  try
+    dowhile t addr (
+      fun _ c ->
+       if c <> '\000' then (
+         chars := c :: !chars;
+         true
+       ) else false
+    );
+    let chars = List.rev !chars in
+    let len = List.length chars in
+    let str = String.create len in
+    let i = ref 0 in
+    List.iter (fun c -> String.unsafe_set str !i c; incr i) chars;
+    str
+  with
+    Invalid_argument _ -> invalid_arg "get_string"
+
+let is_string t addr =
+  try dowhile t addr (fun _ c -> c <> '\000'); true
+  with Invalid_argument _ -> false
+
+let is_C_identifier t addr =
+  let i = ref 0 in
+  let r = ref true in
+  try
+    dowhile t addr (
+      fun _ c ->
+       let b =
+         if !i = 0 then (
+           c = '_' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z'
+         ) else (
+           if c = '\000' then false
+           else (
+             if c = '_' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' ||
+               c >= '0' && c <= '9' then
+                 true
+             else (
+               r := false;
+               false
+             )
+           )
+         ) in
+       incr i;
+       b
+    );
+    !r
+  with
+    Invalid_argument _ -> false
+
+(* The following functions are actually written in C
+ * because memmem(3) is likely to be much faster than anything
+ * we could write in OCaml.
+ *
+ * Also OCaml bigarrays are specifically designed to be accessed
+ * easily from C:
+ *   http://caml.inria.fr/pub/docs/manual-ocaml/manual043.html
+ *)
+(*
 (* Array+offset = string? *)
 let string_at arr offset str strlen =
   let j = ref offset in
@@ -144,26 +524,30 @@ let _find_in start align str arr =
     loop ()
   )
   else Some start
+*)
+external _find_in :
+  int -> int -> string -> (char,int8_unsigned_elt,c_layout) Array1.t ->
+  int option = "virt_mem_mmap_find_in"
 
 (* Generic find function. *)
-let _find t start align str =
-  _find_map t (
-    fun { start = mstart; size = msize; arr = arr } ->
-      if mstart >= start then (
-       (* Check this mapping from the beginning. *)
-       match _find_in 0 align str arr with
-       | Some offset -> Some (mstart +^ Int64.of_int offset)
-       | None -> None
-      )
-      else if mstart < start && start <= mstart+^msize then (
-       (* Check this mapping from somewhere in the middle. *)
-       let offset = Int64.to_int (start -^ mstart) in
-       match _find_in offset align str arr with
-       | Some offset -> Some (mstart +^ Int64.of_int offset)
+let _find { tree = tree } start align str =
+  let rec loop addr =
+    let rightend, mapping = get_mapping addr tree in
+    match mapping with
+    | Some { start = start; size = size; arr = arr } ->
+       (* Offset within this mapping. *)
+       let offset = Int64.to_int (addr -^ start) in
+
+       (match _find_in offset align str arr with
        | None -> None
-      )
-      else None
-  )
+       | Some offset -> Some (start +^ Int64.of_int offset)
+       )
+
+    | None ->
+       (* Find functions all silently skip holes, so: *)
+       loop rightend
+  in
+  loop start
 
 let find t ?(start=0L) str =
   _find t start 1 str
@@ -200,9 +584,9 @@ and string_of_addr t addr =
   let bits = bits_of_wordsize (get_wordsize t) in
   let e = get_endian t in
   let bs = BITSTRING { addr : bits : endian (e) } in
-  Bitmatch.string_of_bitstring bs
+  Bitstring.string_of_bitstring bs
 *)
-(* XXX bitmatch is missing 'construct_int64_le_unsigned' so we
+(* XXX bitstring is missing 'construct_int64_le_unsigned' so we
  * have to force this to 32 bits for the moment.
  *)
 and string_of_addr t addr =
@@ -210,157 +594,14 @@ and string_of_addr t addr =
   assert (bits = 32);
   let e = get_endian t in
   let bs = BITSTRING { Int64.to_int32 addr : 32 : endian (e) } in
-  Bitmatch.string_of_bitstring bs
-
-and addr_of_string t str =
-  let bits = bits_of_wordsize (get_wordsize t) in
-  let e = get_endian t in
-  let bs = Bitmatch.bitstring_of_string str in
-  bitmatch bs with
-  | { addr : bits : endian (e) } -> addr
-  | { _ } -> invalid_arg "addr_of_string"
-
-let get_byte { mappings = mappings } addr =
-  let rec loop = function
-    | [] -> invalid_arg "get_byte"
-    | { start = start; size = size; arr = arr } :: _
-       when start <= addr && addr < start +^ size ->
-       let offset = Int64.to_int (addr -^ start) in
-       Char.code (Array1.get arr offset)
-    | _ :: ms -> loop ms
-  in
-  loop mappings
-
-(* Take bytes until a condition is not met.  This is efficient in that
- * we stay within the same mapping as long as we can.
- *)
-let dowhile { mappings = mappings } addr cond =
-  let rec get_next_mapping addr = function
-    | [] -> invalid_arg "dowhile"
-    | { start = start; size = size; arr = arr } :: _
-       when start <= addr && addr < start +^ size ->
-       let offset = Int64.to_int (addr -^ start) in
-       let len = Int64.to_int size - offset in
-       arr, offset, len
-    | _ :: ms -> get_next_mapping addr ms
-  in
-  let rec loop addr =
-    let arr, offset, len = get_next_mapping addr mappings in
-    let rec loop2 i =
-      if i < len then (
-       let c = Array1.get arr (offset+i) in
-       if cond c then loop2 (i+1)
-      ) else
-       loop (addr +^ Int64.of_int len)
-    in
-    loop2 0
-  in
-  loop addr
-
-let get_bytes t addr len =
-  let str = String.create len in
-  let i = ref 0 in
-  try
-    dowhile t addr (
-      fun c ->
-       str.[!i] <- c;
-       incr i;
-       !i < len
-    );
-    str
-  with
-    Invalid_argument _ -> invalid_arg "get_bytes"
-
-let get_int32 t addr =
-  let e = get_endian t in
-  let str = get_bytes t addr 4 in
-  let bs = Bitmatch.bitstring_of_string str in
-  bitmatch bs with
-  | { addr : 32 : endian (e) } -> addr
-  | { _ } -> invalid_arg "follow_pointer"
-
-let get_int64 t addr =
-  let e = get_endian t in
-  let str = get_bytes t addr 8 in
-  let bs = Bitmatch.bitstring_of_string str in
-  bitmatch bs with
-  | { addr : 64 : endian (e) } -> addr
-  | { _ } -> invalid_arg "follow_pointer"
-
-let get_C_int = get_int32
-
-let get_C_long t addr =
-  let ws = get_wordsize t in
-  match ws with
-  | W32 -> Int64.of_int32 (get_int32 t addr)
-  | W64 -> get_int64 t addr
-
-let get_string t addr =
-  let chars = ref [] in
-  try
-    dowhile t addr (
-      fun c ->
-       if c <> '\000' then (
-         chars := c :: !chars;
-         true
-       ) else false
-    );
-    let chars = List.rev !chars in
-    let len = List.length chars in
-    let str = String.create len in
-    let i = ref 0 in
-    List.iter (fun c -> str.[!i] <- c; incr i) chars;
-    str
-  with
-    Invalid_argument _ -> invalid_arg "get_string"
-
-let is_string t addr =
-  try dowhile t addr (fun c -> c <> '\000'); true
-  with Invalid_argument _ -> false
-
-let is_C_identifier t addr =
-  let i = ref 0 in
-  let r = ref true in
-  try
-    dowhile t addr (
-      fun c ->
-       let b =
-         if !i = 0 then (
-           c = '_' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z'
-         ) else (
-           if c = '\000' then false
-           else (
-             if c = '_' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' ||
-               c >= '0' && c <= '9' then
-                 true
-             else (
-               r := false;
-               false
-             )
-           )
-         ) in
-       incr i;
-       b
-    );
-    !r
-  with
-    Invalid_argument _ -> false
-
-let is_mapped { mappings = mappings } addr =
-  let rec loop = function
-    | [] -> false
-    | { start = start; size = size; arr = arr } :: _
-       when start <= addr && addr < start +^ size -> true
-    | _ :: ms -> loop ms
-  in
-  loop mappings
+  Bitstring.string_of_bitstring bs
 
 let follow_pointer t addr =
   let ws = get_wordsize t in
   let e = get_endian t in
   let bits = bits_of_wordsize ws in
   let str = get_bytes t addr (bytes_of_wordsize ws) in
-  let bs = Bitmatch.bitstring_of_string str in
+  let bs = Bitstring.bitstring_of_string str in
   bitmatch bs with
   | { addr : bits : endian (e) } -> addr
   | { _ } -> invalid_arg "follow_pointer"
index 0ed9176..0294efd 100644 (file)
@@ -1,3 +1,4 @@
+(** Memory map. *)
 (* Memory info command for virtual domains.
    (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
    http://libvirt.org/
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-   Functions for making a memory map of a virtual machine from
-   various sources.  The memory map will most certainly have holes.
  *)
 
-type ('a,'b) t
-(** Memory map. *)
+(** {2 Memory maps}
+
+    Memory maps represent the virtual memory of a virtual machine.
+
+    We are mostly interested in the kernel memory and kernel data
+    structures.  In Linux this stays at the same virtual memory
+    address whichever task is actually running (eg. on i386 machines,
+    the kernel is often found at virtual address 0xC0100000).  Kernel
+    memory is spread out over several ranges of addresses, with gaps
+    of uninteresting or non-existant virtual addresses in between, and
+    this structure captures that.
+
+    A memory map is a range of 64 bit addresses from [0] to [2^64-1].
+    (Note that 64 bit addresses are used even for 32 bit virtual
+    machines - just ignore everything above 0xFFFFFFFF).
+
+    A memory map consists of zero or more {b mappings} of data.  A
+    mapping starts at some address and has some size, and the data for
+    a mapping can come from some source such as a file or OCaml
+    string.  Use {!of_file}, {!of_string}, {!add_file}, {!add_string}
+    to create a memory map from mappings.
+
+    {3 Overlapping mappings and holes}
+
+    If mappings overlap, then the mapping which was added later
+    overrides/overwrites earlier mappings at any addresses which
+    coincide.
+
+    Where there is no mapping for a particular address, the memory map
+    is said to have a hole.  (Typically almost all of a memory map is
+    holes).  In general, the searching functions such as {!find} skip
+    over holes, while the accessor functions such as {!get_bytes}
+    raise an error if you try to read a hole, but read the individual
+    function documentation.
+
+    {3 Word size and endianness}
+
+    Memory maps may (or may not) have an associated word size and
+    endianness for the whole map.  These are used when we look at
+    integers and pointers in the memory.  See {!get_endian},
+    {!set_endian}, {!get_wordsize} and {!set_wordsize}, and accessor
+    functions such as {!get_int32} and {!follow_pointer}.
+
+    {3 Efficiency}
+
+    Mappings' data are stored in 1D Bigarrays.  The advantages of
+    using a Bigarray are: (a) hidden from the garbage collector, (b)
+    easily accessible from C, (c) uses mmap(2) where possible.
+
+    Some low level functions are written in C for speed.
+
+    Mappings are stored in a segment tree for efficient access, but
+    the segment tree has to be rebuilt from scratch each time you add
+    a new mapping.  It is not known if there is a more efficient way
+    to incrementally update a segment tree.  In any case, as long as
+    you are mainly doing lookups / searches / getting bytes, this is
+    very fast.
+*)
+
+(** {2 Types} *)
+
+type ('ws,'e,'hm) t
+(** Memory map.
+
+    The ['ws], ['e] and ['hm] type parameters are phantom types
+    designed to ensure you don't try illegal operations before
+    initializing certain parts of the memory map.  If you are not
+    familiar with phantom types, you can just ignore them.
+
+    See also
+    {{:http://camltastic.blogspot.com/2008/05/phantom-types.html}this
+    posting about the phantom types used in virt-mem}.
+
+    The memory map structure is an example of a
+    {{:http://en.wikipedia.org/wiki/Purely_functional}persistent
+    data structure}.
+*)
 
 type addr = int64
 (** Virtual memory addresses (even on 32 bit machines). *)
 
-val create : unit -> ([`NoWordsize], [`NoEndian]) t
+(** {2 Create a memory map, add mappings} *)
+
+val create : unit -> ([`NoWordsize], [`NoEndian], [`NoMappings]) t
 (** Create a new, empty memory map. *)
 
-val set_wordsize : ([`NoWordsize], 'b) t -> Virt_mem_utils.wordsize ->
-  ([`Wordsize], 'b) t
+val of_file : Unix.file_descr -> addr ->
+  ([`NoWordsize], [`NoEndian], [`HasMapping]) t
+(** Create a new memory map, mapping file [fd] at address [addr]. *)
+
+val add_file : ('ws, 'e, 'hm) t -> Unix.file_descr -> addr ->
+  ('ws, 'e, [`HasMapping]) t
+(** Add file [fd] at address [addr] to an existing memory map.
+    The new mapping can overwrite all or part of an existing mapping. *)
+
+val of_string : string -> addr -> ([`NoWordsize], [`NoEndian], [`HasMapping]) t
+(** Create a new memory map, mapping string at address [addr]. *)
+
+val add_string : ('ws, 'e, 'hm) t -> string -> addr ->
+  ('ws, 'e, [`HasMapping]) t
+(** Add string at address [addr] to an existing memory map.
+    The new mapping can overwrite all or part of an existing mapping. *)
+
+val set_wordsize : ([`NoWordsize], 'e, 'hm) t -> Virt_mem_utils.wordsize ->
+  ([`Wordsize], 'e, 'hm) t
 (** Set the natural wordsize of the memory map.  This is used
-    for matching pointers within the map and can be set only once. *)
+    for matching integers and pointers within the map and can be
+    set only once. *)
 
-val set_endian : ('a, [`NoEndian]) t -> Bitmatch.endian ->
-  ('a, [`Endian]) t
+val set_endian : ('ws, [`NoEndian], 'hm) t -> Bitstring.endian ->
+  ('ws, [`Endian], 'hm) t
 (** Set the natural endianness of the memory map.  This is used
-    for matching pointers within the map and can be set only once. *)
+    for matching integers and pointers within the map and can be
+    set only once. *)
 
-val get_wordsize : ([`Wordsize], 'b) t -> Virt_mem_utils.wordsize
+val get_wordsize : ([`Wordsize], 'e, 'hm) t -> Virt_mem_utils.wordsize
 (** Return the wordsize previously set for this memory map. *)
 
-val get_endian : ('a, [`Endian]) t -> Bitmatch.endian
+val get_endian : ('ws, [`Endian], 'hm) t -> Bitstring.endian
 (** Return the endianness previously set for this memory map. *)
 
-val of_file : Unix.file_descr -> addr -> ([`NoWordsize], [`NoEndian]) t
-(** Create a new memory map, mapping file [fd] at address [addr]. *)
+(** {2 Searching} *)
 
-val add_file : ('a, 'b) t -> Unix.file_descr -> addr -> ('a, 'b) t
-(** Add file [fd] at address [addr] to an existing memory map.
-    Behaviour is undefined if memory mappings overlap. *)
+val find : ('ws, 'e, [`HasMapping]) t -> ?start:addr -> string -> addr option
+(** Find string in a memory map and return its address (if found)
+    or [None] (if not found).  You can pass an optional starting
+    address.  If no start address is given, we begin searching at
+    the beginning of the first mapping.
 
-val of_string : string -> addr -> ([`NoWordsize], [`NoEndian]) t
-(** Create a new memory map, mapping string at address [addr]. *)
+    Any holes in the memory map are skipped automatically.
 
-val add_string : ('a, 'b) t -> string -> addr -> ('a, 'b) t
-(** Add string at address [addr] to an existing memory map.
-    Behaviour is undefined if memory mappings overlap. *)
+    Note that this doesn't find strings which straddle the
+    boundary of two adjacent or overlapping mappings.
 
-val find : ('a, 'b) t -> ?start:addr -> string -> addr option
-(** Find string in a memory map and return its address (if found).
-    You can pass an optional starting address.  Any holes in
-    the memory map are skipped automatically. *)
+    Note that because the string being matched is an OCaml
+    string it may contain NULs (zero bytes) and those are matched
+    properly. *)
 
-val find_align : ([`Wordsize], 'b) t -> ?start:addr -> string -> addr option
-(** Find a string aligned to the wordsize in the memory map. *)
+val find_align : ([`Wordsize], 'e, [`HasMapping]) t -> ?start:addr -> string ->
+  addr option
+(** Same as {!find}, but the string must be aligned to the word size of
+    the memory map. *)
 
-val find_all : ('a, 'b) t -> ?start:addr -> string -> addr list
-(** Find all occurrences of a string in a memory map. *)
+val find_all : ('ws, 'e, [`HasMapping]) t -> ?start:addr -> string -> addr list
+(** Same as {!find}, but returns all occurrences of a string in a memory map. *)
 
-val find_all_align : ([`Wordsize], 'b) t -> ?start:addr -> string -> addr list
-(** Find all occurrences of a string in a memory map. *)
+val find_all_align : ([`Wordsize], 'e, [`HasMapping]) t -> ?start:addr ->
+  string -> addr list
+(** Same as {!find_all}, but the strings must be aligned to the word size. *)
 
-val find_pointer : ([`Wordsize], [`Endian]) t -> ?start:addr -> addr ->
-  addr option
+val find_pointer : ([`Wordsize], [`Endian], [`HasMapping]) t -> ?start:addr ->
+  addr -> addr option
 (** Find a pointer (address) in the memory map.
     The pointer must be aligned to a word. *)
 
-val find_pointer_all : ([`Wordsize], [`Endian]) t -> ?start:addr -> addr ->
-  addr list
+val find_pointer_all : ([`Wordsize], [`Endian], [`HasMapping]) t ->
+  ?start:addr -> addr -> addr list
 (** Find all occurrences of a pointer in the memory map. *)
 
-val get_byte : ('a, 'b) t -> addr -> int
+(** {2 Get bytes and ranges of bytes} *)
+
+val get_byte : ('ws, 'e, [`HasMapping]) t -> addr -> int
 (** Return the byte at the given address.
 
-    This may raise [Invalid_argument "get_byte"] if the address is
-    not mapped. *)
+    This will raise [Invalid_argument "get_byte"] if the address is
+    a hole (not mapped). *)
 
-val get_bytes : ('a, 'b) t -> addr -> int -> string
+val get_bytes : ('ws, 'e, [`HasMapping]) t -> addr -> int -> string
 (** Return the sequence of bytes starting at the given address.
 
-    This may raise [Invalid_argument "get_bytes"] if the address range
-    is not fully mapped. *)
+    This will raise [Invalid_argument "get_bytes"] if the address range
+    contains holes. *)
 
-val get_int32 : ('a, [`Endian]) t -> addr -> int32
+val get_int32 : ('ws, [`Endian], [`HasMapping]) t -> addr -> int32
 (** Return the 32-bit int at [addr]. *)
 
-val get_int64 : ('a, [`Endian]) t -> addr -> int64
+val get_int64 : ('ws, [`Endian], [`HasMapping]) t -> addr -> int64
 (** Return the 64-bit int at [addr]. *)
 
-val get_C_int : ([`Wordsize], [`Endian]) t -> addr -> int32
+val get_C_int : ([`Wordsize], [`Endian], [`HasMapping]) t -> addr -> int32
 (** Return the C 32-bit int at [addr]. *)
 
-val get_C_long : ([`Wordsize], [`Endian]) t -> addr -> int64
+val get_C_long : ([`Wordsize], [`Endian], [`HasMapping]) t -> addr -> int64
 (** Return the C 32 or 64-bit long at [addr]. *)
 
-val get_string : ('a, 'b) t -> addr -> string
+val get_string : ('ws, 'e, [`HasMapping]) t -> addr -> string
 (** Return the sequence of bytes starting at [addr] up to (but not
     including) the first ASCII NUL character.  In other words, this
     returns a C-style string.
 
-    This may raise [Invalid_argument "get_string"] if we reach an
-    unmapped address before finding the end of the string.
+    This may raise [Invalid_argument "get_string"] if we reach a
+    hole (unmapped address) before finding the end of the string.
 
-    See also {!is_string} and {!is_C_identifier}. *)
+    See also {!get_bytes}, {!is_string} and {!is_C_identifier}. *)
 
-val is_string : ('a, 'b) t -> addr -> bool
+val is_string : ('ws, 'e, [`HasMapping]) t -> addr -> bool
 (** Return true or false if the address contains an ASCII NUL-terminated
     string. *)
 
-val is_C_identifier : ('a, 'b) t -> addr -> bool
+val is_C_identifier : ('ws, 'e, [`HasMapping]) t -> addr -> bool
 (** Return true or false if the address contains a NUL-terminated
     C identifier. *)
 
-val is_mapped : ('a, 'b) t -> addr -> bool
+val is_mapped : ('ws, 'e, 'hm) t -> addr -> bool
 (** Return true if the single address [addr] is mapped. *)
 
-val follow_pointer : ([`Wordsize], [`Endian]) t -> addr -> addr
+val is_mapped_range : ('ws, 'e, 'hm) t -> addr -> int -> bool
+(** Return true if all addresses in the range [addr] to [addr+size-1]
+    are mapped. *)
+
+val follow_pointer : ([`Wordsize], [`Endian], [`HasMapping]) t -> addr -> addr
 (** Follow (dereference) the pointer at [addr] and return
     the address pointed to. *)
 
-val succ_long : ([`Wordsize], 'b) t -> addr -> addr
+val succ_long : ([`Wordsize], 'e, [`HasMapping]) t -> addr -> addr
 (** Add wordsize bytes to [addr] and return it. *)
 
-val pred_long : ([`Wordsize], 'b) t -> addr -> addr
+val pred_long : ([`Wordsize], 'e, [`HasMapping]) t -> addr -> addr
 (** Subtract wordsize bytes from [addr] and return it. *)
 
-val align : ([`Wordsize], 'b) t -> addr -> addr
+val align : ([`Wordsize], 'e, [`HasMapping]) t -> addr -> addr
 (** Align the [addr] to the next wordsize boundary.  If it already
     aligned, this just returns [addr]. *)
+
+(** {2 Save and load memory maps} *)
+
+(*val to_channel : ('ws, 'e, [`HasMapping]) t -> out_channel -> unit*)
+(** Write the memory map and data to the given output channel in
+    a reasonably efficient and stable binary format. *)
+
+(*val from_channel : in_channel -> ('?, '?, [`HasMapping]) t*)
+(** Read a previously saved memory map.  If the input channel does
+    not contain a memory map, this raises [Invalid_argument]. *)
diff --git a/lib/virt_mem_mmap_c.c b/lib/virt_mem_mmap_c.c
new file mode 100644 (file)
index 0000000..29dca72
--- /dev/null
@@ -0,0 +1,77 @@
+/* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   This contains hand-coded C functions written for speed.
+*/
+
+#include <config.h>
+
+#include <string.h>
+
+#include <caml/config.h>
+#include <caml/alloc.h>
+#include <caml/memory.h>
+#include <caml/mlvalues.h>
+#include <caml/bigarray.h>
+
+CAMLprim value
+virt_mem_mmap_find_in (value startv, value alignv, value strv, value arrv)
+{
+  CAMLparam4 (startv, alignv, strv, arrv);
+  CAMLlocal2 (rv, vv);
+  long start = Long_val (startv); /* Start offset for search. */
+  long align = Long_val (alignv); /* Alignment for search. */
+  char *str = String_val (strv);  /* String to search for. */
+  int strlen = caml_string_length (strv);
+  void *data = Data_bigarray_val (arrv); /* Data in bigarray. */
+  int datalen = Bigarray_val(arrv)->dim[0]; /* Total length of bigarray. */
+  long i, r = -1;
+  void *p;
+
+  /* memmem is a GNU extension.  Note that we cannot use strstr because
+   * OCaml strings may contain NULs, and in this case it is very likely
+   * that it does contain NULs.
+   */
+#ifdef HAVE_MEMMEM
+  if (align == 1) {
+    p = memmem (data+start, datalen-start, str, strlen);
+    r = p ? p-data : -1;
+    goto ret;
+  }
+#endif
+
+  p = data+start;
+  for (i = start; i < datalen-strlen; i += align) {
+    if (memcmp (p, str, strlen) == 0) {
+      r = p-data;
+      goto ret;
+    }
+    p += align;
+  }
+
+ ret:
+  if (r == -1)
+    rv = Val_int (0);          /* None */
+  else {
+    vv = Val_long (r);         /* Some r */
+    rv = caml_alloc (1, 0);
+    Store_field (rv, 0, vv);
+  }
+
+  CAMLreturn (rv);
+}
diff --git a/lib/virt_mem_types.ml b/lib/virt_mem_types.ml
new file mode 100644 (file)
index 0000000..c3da932
--- /dev/null
@@ -0,0 +1,121 @@
+(** Common types. *)
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   Common types.
+ *)
+
+module D = Libvirt.Domain
+
+open Virt_mem_utils
+open Virt_mem_mmap
+
+type ksym = string
+
+module Ksymmap = Map.Make (String)
+
+type image0 = {
+  dom : Libvirt.ro D.t option;
+  domname : string;
+  arch : Virt_mem_utils.architecture;
+  mem : ([`Wordsize], [`Endian], [`HasMapping]) Virt_mem_mmap.t;
+  kernel_min : addr;
+  kernel_max : addr;
+}
+
+type image1 =
+    image0
+    * addr Ksymmap.t
+
+type image2 =
+    image0
+    * addr Ksymmap.t
+    * utsname option
+
+and utsname = {
+  kernel_name : string;
+  nodename : string;
+  kernel_release : string;
+  kernel_version : string;
+  machine : string;
+  domainname : string;
+}
+
+(* This is the maximum we can download in one go over the libvirt
+ * remote connection.
+ *
+ * XXX Should have a 'D.max_peek' function.
+ *)
+let max_memory_peek = 65536
+
+type load_memory_error =
+  | AddressOutOfRange
+  | DomIsNull
+
+exception LoadMemoryError of load_memory_error * string
+
+let _load_memory mem dom start size =
+  let str = String.create size in
+  let rec loop i =
+    let remaining = size - i in
+    if remaining > 0 then (
+      let size = min remaining max_memory_peek in
+      D.memory_peek dom [D.Virtual] (start +^ Int64.of_int i) size str i;
+      loop (i + size)
+    )
+  in
+  loop 0;
+
+  add_string mem str start
+
+let load_static_memory ~dom ~domname ~arch ~wordsize ~endian
+    ~kernel_min ~kernel_max start size =
+  if start < kernel_min then
+    raise (LoadMemoryError (AddressOutOfRange,
+                           "load_memory: start < kernel_min"))
+  else if start +^ Int64.of_int size > kernel_max then
+    raise (LoadMemoryError (AddressOutOfRange,
+                           "load_memory: start+size > kernel_max"))
+  else (
+    let mem = Virt_mem_mmap.create () in
+    let mem = Virt_mem_mmap.set_wordsize mem wordsize in
+    let mem = Virt_mem_mmap.set_endian mem endian in
+
+    let mem = _load_memory mem dom start size in
+
+    { dom = Some dom; domname = domname; mem = mem; arch = arch;
+      kernel_min = kernel_min; kernel_max = kernel_max }
+  )
+
+let load_memory ({ dom = dom; mem = mem; kernel_min = kernel_min;
+                  kernel_max = kernel_max } as image) start size =
+  if start < kernel_min then
+    raise (LoadMemoryError (AddressOutOfRange,
+                           "load_memory: start < kernel_min"))
+  else if start +^ Int64.of_int size > kernel_max then
+    raise (LoadMemoryError (AddressOutOfRange,
+                           "load_memory: start+size > kernel_max"))
+  else if is_mapped_range mem start size then image
+  else (
+    match dom with
+    | None ->
+       raise (LoadMemoryError (DomIsNull, "load_memory: dom = None"))
+    | Some dom ->
+       let mem = _load_memory mem dom start size in
+       { image with mem = mem }
+  )
diff --git a/lib/virt_mem_types.mli b/lib/virt_mem_types.mli
new file mode 100644 (file)
index 0000000..f537664
--- /dev/null
@@ -0,0 +1,110 @@
+(** Common types. *)
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   Common types.
+ *)
+
+(** {2 Kernel symbols} *)
+
+type ksym = string
+  (** A kernel symbol. *)
+
+module Ksymmap : sig
+  type key = String.t
+  type 'a t = 'a Map.Make(String).t
+  val empty : 'a t
+  val is_empty : 'a t -> bool
+  val add : key -> 'a -> 'a t -> 'a t
+  val find : key -> 'a t -> 'a
+  val remove : key -> 'a t -> 'a t
+  val mem : key -> 'a t -> bool
+  val iter : (key -> 'a -> unit) -> 'a t -> unit
+  val map : ('a -> 'b) -> 'a t -> 'b t
+  val mapi : (key -> 'a -> 'b) -> 'a t -> 'b t
+  val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+  val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
+  val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
+end
+  (** A map of kernel symbols to addresses. *)
+
+(** {2 Kernel images and associated data} *)
+
+type utsname = {
+  kernel_name : string;
+  nodename : string;
+  kernel_release : string;
+  kernel_version : string;
+  machine : string;
+  domainname : string;
+}
+  (** Kernel version, from utsname structure in the kernel. *)
+
+type image0 = {
+  dom : Libvirt.ro Libvirt.Domain.t option; (** Domain, if known. *)
+  domname : string;                    (** Domain name. *)
+  arch : Virt_mem_utils.architecture;  (** Architecture, eg. i386. *)
+  mem : ([`Wordsize], [`Endian], [`HasMapping]) Virt_mem_mmap.t;
+                                        (** Memory map. *)
+  kernel_min : Virt_mem_mmap.addr;     (** Minimum addr of kernel pointers. *)
+  kernel_max : Virt_mem_mmap.addr;     (** Maximum addr of kernel pointers. *)
+}
+  (** A basic kernel image. *)
+
+type image1 =
+    image0
+    * Virt_mem_mmap.addr Ksymmap.t     (* Kernel symbol map. *)
+  (** A kernel image, after finding kernel symbols. *)
+
+type image2 =
+    image0
+    * Virt_mem_mmap.addr Ksymmap.t     (* Kernel symbol map. *)
+    * utsname option                   (* Kernel version, etc., if found. *)
+  (** A kernel image, after finding kernel version (like 'uname'). *)
+
+(** {2 Load kernel memory} *)
+
+type load_memory_error =
+  | AddressOutOfRange          (** Address not in [kernel_min..kernel_max] *)
+  | DomIsNull                  (** image.dom = None *)
+
+exception LoadMemoryError of load_memory_error * string
+
+val load_static_memory : dom:Libvirt.ro Libvirt.Domain.t ->
+  domname:string ->
+  arch:Virt_mem_utils.architecture ->
+  wordsize:Virt_mem_utils.wordsize -> endian:Bitstring.endian ->
+  kernel_min:Virt_mem_mmap.addr -> kernel_max:Virt_mem_mmap.addr ->
+  Virt_mem_mmap.addr -> int -> image0
+  (** [load_static_memory ~dom (*...*) start size] creates an [image0]
+      object, and initializes it with static kernel memory loaded
+      from the [start] address and [size] of [dom].
+
+      See also {!load_memory} for exceptions this can raise. *)
+
+val load_memory : image0 -> Virt_mem_mmap.addr -> int -> image0
+  (** [load_memory img start size] tries to load [size] bytes from
+      the start address into the memory map.  If the memory was loaded
+      previously, then it is not requested again.
+
+      Note that the memory map may be updated by this, so a modified
+      image structure is returned.
+
+      This function can raise many different sorts of exceptions and
+      the caller is advised to catch any exceptions and deal with them
+      appropriately. *)
index db759dd..a1eab8f 100644 (file)
@@ -1,3 +1,4 @@
+(** Common and utility functions. *)
 (* Memory info command for virtual domains.
    (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
    http://libvirt.org/
@@ -57,9 +58,9 @@ let architecture_of_string = function
                  str)
 
 let endian_of_architecture = function
-  | I386 | X86_64 -> Bitmatch.LittleEndian
-  | IA64 -> Bitmatch.LittleEndian (* XXX usually? *)
-  | PPC | PPC64 | SPARC | SPARC64 -> Bitmatch.BigEndian
+  | I386 | X86_64 -> Bitstring.LittleEndian
+  | IA64 -> Bitstring.LittleEndian (* XXX usually? *)
+  | PPC | PPC64 | SPARC | SPARC64 -> Bitstring.BigEndian
 
 type wordsize =
   | W32 | W64
@@ -78,9 +79,8 @@ let bits_of_wordsize = function
 let bytes_of_wordsize = function
   | W32 -> 4 | W64 -> 8
 
-(* Returns (count, value) in order of highest frequency occurring in the
- * list.
- *)
+(** Returns (count, value) in order of highest frequency occurring in the
+    list. *)
 let frequency xs =
   let xs = List.sort compare xs in
   let rec loop = function
@@ -95,3 +95,72 @@ let frequency xs =
   in
   let xs = loop xs in
   List.rev (List.sort compare xs)
+
+(** Like the Unix uniq(1) command. *)
+let rec uniq ?(cmp = Pervasives.compare) = function
+  | [] -> []
+  | [x] -> [x]
+  | x :: y :: xs when cmp x y = 0 ->
+      uniq (x :: xs)
+  | x :: y :: xs ->
+      x :: uniq (y :: xs)
+
+(** Like the Unix pipeline 'sort|uniq'. *)
+let sort_uniq ?cmp xs =
+  let xs = ExtList.List.sort ?cmp xs in
+  let xs = uniq ?cmp xs in
+  xs
+
+(** Pad a string to a fixed width (from virt-top, but don't truncate). *)
+let pad width str =
+  let n = String.length str in
+  if n >= width then str
+  else (* if n < width then *) str ^ String.make (width-n) ' '
+
+(* Truncate an OCaml string at the first ASCII NUL character, ie. as
+ * if it were a C string.
+ *)
+let truncate_c_string str =
+  try
+    let i = String.index str '\000' in
+    String.sub str 0 i
+  with
+    Not_found -> str
+
+(** General binary tree type.  Data 'a is stored in the leaves and 'b
+    is stored in the nodes. *)
+type ('a,'b) binary_tree =
+  | Leaf of 'a
+  | Node of ('a,'b) binary_tree * 'b * ('a,'b) binary_tree
+
+(** Print out the binary tree in graphviz dot format. *)
+let print_binary_tree leaf_printer node_printer tree =
+  (* Assign a unique, fixed label to each node. *)
+  let label =
+    let i = ref 0 in
+    let hash = Hashtbl.create 13 in
+    fun node ->
+      try Hashtbl.find hash node
+      with Not_found ->
+       let i = incr i; !i in
+       let label = "n" ^ string_of_int i in
+       Hashtbl.add hash node label;
+       label
+  in
+  (* Recursively generate the graphviz file. *)
+  let rec print = function
+    | (Leaf a as leaf) ->
+       eprintf "  %s [shape=box, label=\"%s\"];\n"
+         (label leaf) (leaf_printer a)
+    | (Node (left,b,right) as node) ->
+       eprintf "  %s [label=\"%s\"];\n"
+         (label node) (node_printer b);
+       eprintf "  %s -> %s [tailport=sw];\n" (label node) (label left);
+       eprintf "  %s -> %s [tailport=se];\n" (label node) (label right);
+       print left;
+       print right;
+  in
+  eprintf "/* Use 'dot -Tpng foo.dot > foo.png' to convert to a png file. */\n";
+  eprintf "digraph G {\n";
+  print tree;
+  eprintf "}\n%!"
diff --git a/lib/virt_mem_utsname.ml b/lib/virt_mem_utsname.ml
new file mode 100644 (file)
index 0000000..33ee969
--- /dev/null
@@ -0,0 +1,83 @@
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *)
+
+open Printf
+
+open Virt_mem_gettext.Gettext
+open Virt_mem_utils
+open Virt_mem_types
+open Virt_mem_mmap
+
+let parse_utsname bits =
+  (* Expect the first (sysname) field to always be "Linux", which is
+   * also a good way to tell if we're synchronized to the right bit of
+   * memory.
+   *)
+  bitmatch bits with
+  | { "Linux\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" : 65*8 : string;
+      nodename : 65*8 : string;
+      release : 65*8 : string;
+      version : 65*8 : string;
+      machine : 65*8 : string;
+      domainname : 65*8 : string } ->
+      Some {
+       kernel_name = "Linux";
+       nodename = truncate_c_string nodename;
+       kernel_release = truncate_c_string release;
+       kernel_version = truncate_c_string version;
+       machine = truncate_c_string machine;
+       domainname = truncate_c_string domainname
+      }
+  | { _ } ->
+      None
+
+let find_utsname debug ({ domname = name; mem = mem } as image, ksymmap) =
+  let utsname =
+    (* In Linux 2.6.25, the symbol is init_uts_ns.
+     * http://lxr.linux.no/linux/init/version.c
+     *)
+    try
+      let addr = Ksymmap.find "init_uts_ns" ksymmap in
+
+      let bs = Bitstring.bitstring_of_string (get_bytes mem addr (65*6+4)) in
+      (bitmatch bs with
+       | { _ : 32 : int;             (* the kref, atomic_t, always 32 bits *)
+          new_utsname : -1 : bitstring } ->
+          parse_utsname new_utsname
+       | { _ } ->
+          if debug then
+            eprintf (f_"%s: unexpected init_uts_ns in kernel image\n") name;
+          None
+      )
+    with
+      Not_found ->
+       (* In Linux 2.6.9, the symbol is system_utsname.
+        * http://lxr.linux.no/linux-bk+v2.6.9/include/linux/utsname.h#L24
+        *)
+       try
+         let addr = Ksymmap.find "system_utsname" ksymmap in
+
+         let bits =
+           Bitstring.bitstring_of_string (get_bytes mem addr (65*6)) in
+         parse_utsname bits
+           with
+             Not_found ->
+               eprintf (f_"%s: could not find utsname in kernel image\n") name
+  in
+  (image, ksymmap, utsname)
diff --git a/lib/virt_mem_utsname.mli b/lib/virt_mem_utsname.mli
new file mode 100644 (file)
index 0000000..7b62d42
--- /dev/null
@@ -0,0 +1,22 @@
+(** Get system utsname (like 'uname') from kernel. *)
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *)
+
+val find_utsname : bool -> Virt_mem_types.image1 -> Virt_mem_types.image2
+(** Find the system utsname structure. *)
diff --git a/mem/.depend b/mem/.depend
new file mode 100644 (file)
index 0000000..fd7322a
--- /dev/null
@@ -0,0 +1,2 @@
+virt_mem_main.cmo: ../lib/virt_mem_capture.cmo ../lib/virt_mem.cmi 
+virt_mem_main.cmx: ../lib/virt_mem_capture.cmx ../lib/virt_mem.cmx 
diff --git a/mem/Makefile.in b/mem/Makefile.in
new file mode 100644 (file)
index 0000000..f05c763
--- /dev/null
@@ -0,0 +1,74 @@
+# virt-mem
+# @configure_input@
+# Copyright (C) 2008 Red Hat Inc., Richard W.M. Jones
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+
+PACKAGE                = @PACKAGE_NAME@
+VERSION                = @PACKAGE_VERSION@
+
+INSTALL                = @INSTALL@
+MKDIR_P                = @MKDIR_P@
+
+prefix         = @prefix@
+exec_prefix    = @exec_prefix@
+bindir         = @bindir@
+
+pkg_gettext    = @pkg_gettext@
+
+SYNTAX         = -syntax bitstring.syntax
+
+OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light,bitstring.syntax -I ../lib
+
+ifneq ($(pkg_gettext),no)
+OCAMLCPACKAGES += -package gettext-stub
+endif
+
+OCAMLCFLAGS    = @OCAMLCFLAGS@ $(SYNTAX)
+OCAMLCLIBS     = -linkpkg bitstring.cma ../lib/virt_mem.cma
+
+OCAMLOPTFLAGS  = @OCAMLOPTFLAGS@ $(SYNTAX)
+OCAMLOPTPACKAGES = $(OCAMLCPACKAGES)
+OCAMLOPTLIBS   = -linkpkg bitstring.cmxa ../lib/virt_mem.cmxa
+
+OCAMLDOCFLAGS  = -html -sort $(OCAMLCPACKAGES) $(SYNTAX)
+
+OCAMLDEPFLAGS  = $(SYNTAX)
+
+TARGETS                = virt-mem virt-mem.opt
+
+OBJS           = $(shell for t in $(TOOLS); do echo ../$$t/virt_$$t.cmo; done) virt_mem_main.cmo
+XOBJS          = $(OBJS:%.cmo=%.cmx)
+
+all:   $(TARGETS)
+
+virt-mem: ../lib/virt_mem.cma $(OBJS)
+       ocamlfind ocamlc \
+         $(OCAMLCFLAGS) $(OCAMLCPACKAGES) $(OCAMLCLIBS) $(OBJS) -o $@
+
+virt-mem.opt: ../lib/virt_mem.cmxa $(XOBJS)
+       ocamlfind ocamlopt \
+         $(OCAMLOPTFLAGS) $(OCAMLOPTPACKAGES) $(OCAMLOPTLIBS) $(XOBJS) -o $@
+
+install:
+       if [ -x virt-mem.opt ]; then \
+         $(MKDIR_P) $(DESTDIR)$(bindir); \
+         $(INSTALL) -m 0755 virt-mem.opt $(DESTDIR)$(bindir)/virt-mem; \
+         (cd $(DESTDIR)$(bindir) && \
+           for t in $(TOOLS); do ln -f virt-mem virt-$$t; done \
+         ); \
+       fi
+
+include ../Make.rules
\ No newline at end of file
diff --git a/mem/virt_mem_main.ml b/mem/virt_mem_main.ml
new file mode 100644 (file)
index 0000000..78c7ab7
--- /dev/null
@@ -0,0 +1,32 @@
+(* Memory info command for virtual domains.
+   (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc.
+   http://libvirt.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   Links everything into a single executable and invokes 'main'.
+ *)
+
+(* Because internal commands like 'virt-mem capture' are stored
+ * in a library [*.cma/*.cmxa], they don't automatically get
+ * loaded/registered unless someone seems to be using them.  So
+ * we need to pretend to be using them here.  External commands
+ * like 'virt-ps' are OK because they are linked as *.cmo/*.cmx
+ * files.
+ *)
+let _ = Virt_mem_capture.summary
+
+(* Call main program. *)
+let () = Virt_mem.main ()
index 210b986..1828a68 100644 (file)
@@ -23,7 +23,7 @@ LINGUAS               = $(shell cat LINGUAS)
 SOURCES                = POTFILES
 
 OCAML_GETTEXT  = @OCAML_GETTEXT@
-OCAML_GETTEXT_EXTRACT_OPTIONS = --extract-default-option "-I +camlp4 pa_o.cmo -I $$(ocamlc -where)/bitmatch bitmatch.cma pa_bitmatch.cmo"
+OCAML_GETTEXT_EXTRACT_OPTIONS = --extract-default-option "-I +camlp4 pa_o.cmo -I $$(ocamlc -where)/bitstring bitstring.cma bitstring_persistent.cma pa_bitstring.cmo"
 OCAML_GETTEXT_COMPILE_OPTIONS =
 OCAML_GETTEXT_INSTALL_OPTIONS =
 OCAML_GETTEXT_MERGE_OPTIONS   =
index 49394b0..1fd9445 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -11,103 +11,139 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: ../lib/virt_mem.ml:392
-msgid "%s: cannot find start of kernel symbol table\\n"
+#: ../ps/virt_ps.ml:40
+msgid "%s: %s: unknown kernel version\nTry a newer version of virt-mem, or if the guest is not from a\nsupported Linux distribution, see this page about adding support:\n  http://et.redhat.com/~rjones/virt-mem/faq.html\\n"
 msgstr ""
 
-#: ../dmesg/virt_dmesg.ml:86
+#: ../ps/virt_ps.ml:53
+msgid "%s: could not find init_task in kernel image\\n"
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:72
 msgid "%s: could not find kernel log buffer in kernel image\\n"
 msgstr ""
 
-#: ../uname/virt_uname.ml:101
-msgid "%s: could not find utsname in kernel image\\n"
+#: ../ps/virt_ps.ml:35
+msgid "%s: could not guess kernel version\\n"
 msgstr ""
 
-#: ../uname/virt_uname.ml:86
-msgid "%s: unexpected init_uts_ns in kernel image\\n"
+#: ../lib/virt_mem.ml:352
+msgid "%s: domain is not running"
 msgstr ""
 
-#: ../uname/virt_uname.ml:68
-msgid "%s: unexpected system_utsname in kernel image\\n"
+#: ../uname/virt_uname.ml:34
+msgid "%s: no system_utsname in kernel image\\n"
 msgstr ""
 
-#: ../lib/virt_mem.ml:136
-msgid "%s: unknown parameter"
+#: ../lib/virt_mem.ml:347
+msgid "%s: unknown domain (not a UUID, name or ID of any active domain)"
 msgstr ""
 
-#: ../lib/virt_mem.ml:207 ../lib/virt_mem.ml:265
+#: ../lib/virt_mem.ml:398 ../lib/virt_mem.ml:463
 msgid "%s: use -A to define architecture (i386/x86-64 only) for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:198 ../lib/virt_mem.ml:256
+#: ../lib/virt_mem.ml:389 ../lib/virt_mem.ml:454
 msgid "%s: use -E to define endianness for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:211 ../lib/virt_mem.ml:269
+#: ../lib/virt_mem.ml:404 ../lib/virt_mem.ml:467
 msgid "%s: use -T to define kernel load address for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:191 ../lib/virt_mem.ml:249
+#: ../lib/virt_mem.ml:382 ../lib/virt_mem.ml:447
 msgid "%s: use -W to define word size for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:124 ../lib/virt_mem.ml:126
+#: ../lib/virt_mem.ml:256 ../lib/virt_mem.ml:258
 msgid "Connect to URI"
 msgstr ""
 
-#: ../lib/virt_mem.ml:128
+#: ../lib/virt_mem.ml:260
 msgid "Debug mode (default: false)"
 msgstr ""
 
-#: ../lib/virt_mem.ml:132
+#: ../lib/virt_mem.ml:264
 msgid "Display version and exit"
 msgstr ""
 
-#: ../dmesg/virt_dmesg.ml:26
-msgid "NAME\n  virt-dmesg - dmesg command for virtual machines\n\nSUMMARY\n  virt-dmesg [-options] [domains]\n\nDESCRIPTION\n  virt-dmesg prints the kernel messages for virtual machines running\n  under libvirt.  The output is similar to the ordinary dmesg command\n  run inside the virtual machine."
-msgstr ""
-
-#: ../ps/virt_ps.ml:26
-msgid "NAME\n  virt-ps - process listing command for virtual machines\n\nSUMMARY\n  virt-ps [-options] [domains]\n\nDESCRIPTION\n  virt-ps prints a process listing for virtual machines running under\n  libvirt."
-msgstr ""
-
-#: ../uname/virt_uname.ml:26
-msgid "NAME\n  virt-uname - uname command for virtual machines\n\nSUMMARY\n  virt-uname [-options] [domains]\n\nDESCRIPTION\n  virt-uname prints the uname information such as OS version,\n  architecture and node name for virtual machines running under\n  libvirt."
-msgstr ""
-
-#: ../lib/virt_mem.ml:154
+#: ../lib/virt_mem.ml:323
 msgid "NB: If you want to monitor a local Xen hypervisor, you usually need to be root"
 msgstr ""
 
-#: ../lib/virt_mem.ml:116
+#: ../lib/virt_mem.ml:248
 msgid "Set kernel architecture, endianness and word size"
 msgstr ""
 
-#: ../lib/virt_mem.ml:118
+#: ../lib/virt_mem.ml:250
 msgid "Set kernel endianness"
 msgstr ""
 
-#: ../lib/virt_mem.ml:120
+#: ../lib/virt_mem.ml:252
 msgid "Set kernel text address"
 msgstr ""
 
-#: ../lib/virt_mem.ml:122
+#: ../lib/virt_mem.ml:254
 msgid "Set kernel word size"
 msgstr ""
 
-#: ../lib/virt_mem.ml:130
+#: ../lib/virt_mem.ml:262
 msgid "Use saved kernel memory image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:137
-msgid "\\n\\nOPTIONS"
+#: ../lib/virt_mem.ml:139
+msgid "\\\n\n%s: %s\n\nDescription:\n%s\n\nOptions:"
+msgstr ""
+
+#: ../lib/virt_mem.ml:119
+msgid "\\\n\nvirt-mem: Tools for providing information about virtual machines\n\nCurrently available tools include:\n%s\n\nGeneral usage is:\n  <tool> [-options] [domains...]\n\nTo display extra help for a single tool, do:\n  virt-mem help <tool>\n\nOptions:"
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:76
+msgid "\\\nvirt-dmesg prints the kernel messages for virtual machines running\nunder libvirt.  The output is similar to the ordinary dmesg command\nrun inside the virtual machine."
+msgstr ""
+
+#: ../lib/virt_mem.ml:300
+msgid "\\\nvirt-mem: I could not work out which tool you are trying to run.\nUse 'virt-mem --help' for more help or read the manual page virt-mem(1)"
+msgstr ""
+
+#: ../ps/virt_ps.ml:97
+msgid "\\\nvirt-ps prints a process listing for virtual machines running under\nlibvirt."
+msgstr ""
+
+#: ../uname/virt_uname.ml:37
+msgid "\\\nvirt-uname prints the uname information such as OS version,\narchitecture and node name for virtual machines running under\nlibvirt."
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:75
+msgid "display kernel messages"
+msgstr ""
+
+#: ../ps/virt_ps.ml:96
+msgid "list processes in virtual machine"
 msgstr ""
 
-#: ../lib/virt_mem.ml:71
+#: ../lib/virt_mem.ml:171
 msgid "set_endian: %s: unknown endianness"
 msgstr ""
 
-#: ../lib/virt_mem.ml:60
+#: ../lib/virt_mem.ml:214
+msgid "set_text_addr: %s: incorrect number of parameters to -T option"
+msgstr ""
+
+#: ../lib/virt_mem.ml:160
 msgid "set_wordsize: %s: unknown wordsize"
 msgstr ""
 
+#: ../uname/virt_uname.ml:36
+msgid "uname command for virtual machines"
+msgstr ""
+
+#: ../lib/virt_mem.ml:417
+msgid "virt-mem: error loading kernel memory: address out of range\nPossibly the '-T' command line parameter was used inconsistently."
+msgstr ""
+
+#: ../lib/virt_mem.ml:434
+msgid "virt-mem: if -t given on command line, then no domain arguments should be listed"
+msgstr ""
+
index 5d9cb97..c6d5f68 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -10,103 +10,139 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../lib/virt_mem.ml:392
-msgid "%s: cannot find start of kernel symbol table\\n"
+#: ../ps/virt_ps.ml:40
+msgid "%s: %s: unknown kernel version\nTry a newer version of virt-mem, or if the guest is not from a\nsupported Linux distribution, see this page about adding support:\n  http://et.redhat.com/~rjones/virt-mem/faq.html\\n"
 msgstr ""
 
-#: ../dmesg/virt_dmesg.ml:86
+#: ../ps/virt_ps.ml:53
+msgid "%s: could not find init_task in kernel image\\n"
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:72
 msgid "%s: could not find kernel log buffer in kernel image\\n"
 msgstr ""
 
-#: ../uname/virt_uname.ml:101
-msgid "%s: could not find utsname in kernel image\\n"
+#: ../ps/virt_ps.ml:35
+msgid "%s: could not guess kernel version\\n"
 msgstr ""
 
-#: ../uname/virt_uname.ml:86
-msgid "%s: unexpected init_uts_ns in kernel image\\n"
+#: ../lib/virt_mem.ml:352
+msgid "%s: domain is not running"
 msgstr ""
 
-#: ../uname/virt_uname.ml:68
-msgid "%s: unexpected system_utsname in kernel image\\n"
+#: ../uname/virt_uname.ml:34
+msgid "%s: no system_utsname in kernel image\\n"
 msgstr ""
 
-#: ../lib/virt_mem.ml:136
-msgid "%s: unknown parameter"
-msgstr "%s: nieznany parametr"
+#: ../lib/virt_mem.ml:347
+msgid "%s: unknown domain (not a UUID, name or ID of any active domain)"
+msgstr ""
 
-#: ../lib/virt_mem.ml:207 ../lib/virt_mem.ml:265
+#: ../lib/virt_mem.ml:398 ../lib/virt_mem.ml:463
 msgid "%s: use -A to define architecture (i386/x86-64 only) for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:198 ../lib/virt_mem.ml:256
+#: ../lib/virt_mem.ml:389 ../lib/virt_mem.ml:454
 msgid "%s: use -E to define endianness for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:211 ../lib/virt_mem.ml:269
+#: ../lib/virt_mem.ml:404 ../lib/virt_mem.ml:467
 msgid "%s: use -T to define kernel load address for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:191 ../lib/virt_mem.ml:249
+#: ../lib/virt_mem.ml:382 ../lib/virt_mem.ml:447
 msgid "%s: use -W to define word size for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:124 ../lib/virt_mem.ml:126
+#: ../lib/virt_mem.ml:256 ../lib/virt_mem.ml:258
 msgid "Connect to URI"
 msgstr ""
 
-#: ../lib/virt_mem.ml:128
+#: ../lib/virt_mem.ml:260
 msgid "Debug mode (default: false)"
 msgstr ""
 
-#: ../lib/virt_mem.ml:132
+#: ../lib/virt_mem.ml:264
 msgid "Display version and exit"
 msgstr "WyÅ›wietl wersjÄ™ i zakoÅ„cz"
 
-#: ../dmesg/virt_dmesg.ml:26
-msgid "NAME\n  virt-dmesg - dmesg command for virtual machines\n\nSUMMARY\n  virt-dmesg [-options] [domains]\n\nDESCRIPTION\n  virt-dmesg prints the kernel messages for virtual machines running\n  under libvirt.  The output is similar to the ordinary dmesg command\n  run inside the virtual machine."
-msgstr ""
-
-#: ../ps/virt_ps.ml:26
-msgid "NAME\n  virt-ps - process listing command for virtual machines\n\nSUMMARY\n  virt-ps [-options] [domains]\n\nDESCRIPTION\n  virt-ps prints a process listing for virtual machines running under\n  libvirt."
-msgstr ""
-
-#: ../uname/virt_uname.ml:26
-msgid "NAME\n  virt-uname - uname command for virtual machines\n\nSUMMARY\n  virt-uname [-options] [domains]\n\nDESCRIPTION\n  virt-uname prints the uname information such as OS version,\n  architecture and node name for virtual machines running under\n  libvirt."
-msgstr ""
-
-#: ../lib/virt_mem.ml:154
+#: ../lib/virt_mem.ml:323
 msgid "NB: If you want to monitor a local Xen hypervisor, you usually need to be root"
 msgstr "NB: jeÅ›li chcesz monitorować lokalnego nadzorcÄ™ Xena, zwykle musisz być rootem"
 
-#: ../lib/virt_mem.ml:116
+#: ../lib/virt_mem.ml:248
 msgid "Set kernel architecture, endianness and word size"
 msgstr ""
 
-#: ../lib/virt_mem.ml:118
+#: ../lib/virt_mem.ml:250
 msgid "Set kernel endianness"
 msgstr ""
 
-#: ../lib/virt_mem.ml:120
+#: ../lib/virt_mem.ml:252
 msgid "Set kernel text address"
 msgstr ""
 
-#: ../lib/virt_mem.ml:122
+#: ../lib/virt_mem.ml:254
 msgid "Set kernel word size"
 msgstr ""
 
-#: ../lib/virt_mem.ml:130
+#: ../lib/virt_mem.ml:262
 msgid "Use saved kernel memory image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:137
-msgid "\\n\\nOPTIONS"
+#: ../lib/virt_mem.ml:139
+msgid "\\\n\n%s: %s\n\nDescription:\n%s\n\nOptions:"
+msgstr ""
+
+#: ../lib/virt_mem.ml:119
+msgid "\\\n\nvirt-mem: Tools for providing information about virtual machines\n\nCurrently available tools include:\n%s\n\nGeneral usage is:\n  <tool> [-options] [domains...]\n\nTo display extra help for a single tool, do:\n  virt-mem help <tool>\n\nOptions:"
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:76
+msgid "\\\nvirt-dmesg prints the kernel messages for virtual machines running\nunder libvirt.  The output is similar to the ordinary dmesg command\nrun inside the virtual machine."
+msgstr ""
+
+#: ../lib/virt_mem.ml:300
+msgid "\\\nvirt-mem: I could not work out which tool you are trying to run.\nUse 'virt-mem --help' for more help or read the manual page virt-mem(1)"
 msgstr ""
 
-#: ../lib/virt_mem.ml:71
+#: ../ps/virt_ps.ml:97
+msgid "\\\nvirt-ps prints a process listing for virtual machines running under\nlibvirt."
+msgstr ""
+
+#: ../uname/virt_uname.ml:37
+msgid "\\\nvirt-uname prints the uname information such as OS version,\narchitecture and node name for virtual machines running under\nlibvirt."
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:75
+msgid "display kernel messages"
+msgstr ""
+
+#: ../ps/virt_ps.ml:96
+msgid "list processes in virtual machine"
+msgstr ""
+
+#: ../lib/virt_mem.ml:171
 msgid "set_endian: %s: unknown endianness"
 msgstr ""
 
-#: ../lib/virt_mem.ml:60
+#: ../lib/virt_mem.ml:214
+msgid "set_text_addr: %s: incorrect number of parameters to -T option"
+msgstr ""
+
+#: ../lib/virt_mem.ml:160
 msgid "set_wordsize: %s: unknown wordsize"
 msgstr ""
 
+#: ../uname/virt_uname.ml:36
+msgid "uname command for virtual machines"
+msgstr ""
+
+#: ../lib/virt_mem.ml:417
+msgid "virt-mem: error loading kernel memory: address out of range\nPossibly the '-T' command line parameter was used inconsistently."
+msgstr ""
+
+#: ../lib/virt_mem.ml:434
+msgid "virt-mem: if -t given on command line, then no domain arguments should be listed"
+msgstr ""
+
index 493cef3..7accb44 100644 (file)
@@ -14,103 +14,139 @@ msgstr ""
 "X-Poedit-Language: Portuguese\n"
 "X-Poedit-Country: BRAZIL\n"
 
-#: ../lib/virt_mem.ml:392
-msgid "%s: cannot find start of kernel symbol table\\n"
+#: ../ps/virt_ps.ml:40
+msgid "%s: %s: unknown kernel version\nTry a newer version of virt-mem, or if the guest is not from a\nsupported Linux distribution, see this page about adding support:\n  http://et.redhat.com/~rjones/virt-mem/faq.html\\n"
 msgstr ""
 
-#: ../dmesg/virt_dmesg.ml:86
+#: ../ps/virt_ps.ml:53
+msgid "%s: could not find init_task in kernel image\\n"
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:72
 msgid "%s: could not find kernel log buffer in kernel image\\n"
 msgstr ""
 
-#: ../uname/virt_uname.ml:101
-msgid "%s: could not find utsname in kernel image\\n"
+#: ../ps/virt_ps.ml:35
+msgid "%s: could not guess kernel version\\n"
 msgstr ""
 
-#: ../uname/virt_uname.ml:86
-msgid "%s: unexpected init_uts_ns in kernel image\\n"
+#: ../lib/virt_mem.ml:352
+msgid "%s: domain is not running"
 msgstr ""
 
-#: ../uname/virt_uname.ml:68
-msgid "%s: unexpected system_utsname in kernel image\\n"
+#: ../uname/virt_uname.ml:34
+msgid "%s: no system_utsname in kernel image\\n"
 msgstr ""
 
-#: ../lib/virt_mem.ml:136
-msgid "%s: unknown parameter"
-msgstr "%s: parâmetro desconhecido"
+#: ../lib/virt_mem.ml:347
+msgid "%s: unknown domain (not a UUID, name or ID of any active domain)"
+msgstr ""
 
-#: ../lib/virt_mem.ml:207 ../lib/virt_mem.ml:265
+#: ../lib/virt_mem.ml:398 ../lib/virt_mem.ml:463
 msgid "%s: use -A to define architecture (i386/x86-64 only) for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:198 ../lib/virt_mem.ml:256
+#: ../lib/virt_mem.ml:389 ../lib/virt_mem.ml:454
 msgid "%s: use -E to define endianness for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:211 ../lib/virt_mem.ml:269
+#: ../lib/virt_mem.ml:404 ../lib/virt_mem.ml:467
 msgid "%s: use -T to define kernel load address for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:191 ../lib/virt_mem.ml:249
+#: ../lib/virt_mem.ml:382 ../lib/virt_mem.ml:447
 msgid "%s: use -W to define word size for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:124 ../lib/virt_mem.ml:126
+#: ../lib/virt_mem.ml:256 ../lib/virt_mem.ml:258
 msgid "Connect to URI"
 msgstr ""
 
-#: ../lib/virt_mem.ml:128
+#: ../lib/virt_mem.ml:260
 msgid "Debug mode (default: false)"
 msgstr ""
 
-#: ../lib/virt_mem.ml:132
+#: ../lib/virt_mem.ml:264
 msgid "Display version and exit"
 msgstr "Exibe a versão e sai."
 
-#: ../dmesg/virt_dmesg.ml:26
-msgid "NAME\n  virt-dmesg - dmesg command for virtual machines\n\nSUMMARY\n  virt-dmesg [-options] [domains]\n\nDESCRIPTION\n  virt-dmesg prints the kernel messages for virtual machines running\n  under libvirt.  The output is similar to the ordinary dmesg command\n  run inside the virtual machine."
-msgstr ""
-
-#: ../ps/virt_ps.ml:26
-msgid "NAME\n  virt-ps - process listing command for virtual machines\n\nSUMMARY\n  virt-ps [-options] [domains]\n\nDESCRIPTION\n  virt-ps prints a process listing for virtual machines running under\n  libvirt."
-msgstr ""
-
-#: ../uname/virt_uname.ml:26
-msgid "NAME\n  virt-uname - uname command for virtual machines\n\nSUMMARY\n  virt-uname [-options] [domains]\n\nDESCRIPTION\n  virt-uname prints the uname information such as OS version,\n  architecture and node name for virtual machines running under\n  libvirt."
-msgstr ""
-
-#: ../lib/virt_mem.ml:154
+#: ../lib/virt_mem.ml:323
 msgid "NB: If you want to monitor a local Xen hypervisor, you usually need to be root"
 msgstr "NB: Se você quiser monitorar um hipervisor local do Xen, você precisa ser root."
 
-#: ../lib/virt_mem.ml:116
+#: ../lib/virt_mem.ml:248
 msgid "Set kernel architecture, endianness and word size"
 msgstr ""
 
-#: ../lib/virt_mem.ml:118
+#: ../lib/virt_mem.ml:250
 msgid "Set kernel endianness"
 msgstr ""
 
-#: ../lib/virt_mem.ml:120
+#: ../lib/virt_mem.ml:252
 msgid "Set kernel text address"
 msgstr ""
 
-#: ../lib/virt_mem.ml:122
+#: ../lib/virt_mem.ml:254
 msgid "Set kernel word size"
 msgstr ""
 
-#: ../lib/virt_mem.ml:130
+#: ../lib/virt_mem.ml:262
 msgid "Use saved kernel memory image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:137
-msgid "\\n\\nOPTIONS"
+#: ../lib/virt_mem.ml:139
+msgid "\\\n\n%s: %s\n\nDescription:\n%s\n\nOptions:"
+msgstr ""
+
+#: ../lib/virt_mem.ml:119
+msgid "\\\n\nvirt-mem: Tools for providing information about virtual machines\n\nCurrently available tools include:\n%s\n\nGeneral usage is:\n  <tool> [-options] [domains...]\n\nTo display extra help for a single tool, do:\n  virt-mem help <tool>\n\nOptions:"
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:76
+msgid "\\\nvirt-dmesg prints the kernel messages for virtual machines running\nunder libvirt.  The output is similar to the ordinary dmesg command\nrun inside the virtual machine."
+msgstr ""
+
+#: ../lib/virt_mem.ml:300
+msgid "\\\nvirt-mem: I could not work out which tool you are trying to run.\nUse 'virt-mem --help' for more help or read the manual page virt-mem(1)"
 msgstr ""
 
-#: ../lib/virt_mem.ml:71
+#: ../ps/virt_ps.ml:97
+msgid "\\\nvirt-ps prints a process listing for virtual machines running under\nlibvirt."
+msgstr ""
+
+#: ../uname/virt_uname.ml:37
+msgid "\\\nvirt-uname prints the uname information such as OS version,\narchitecture and node name for virtual machines running under\nlibvirt."
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:75
+msgid "display kernel messages"
+msgstr ""
+
+#: ../ps/virt_ps.ml:96
+msgid "list processes in virtual machine"
+msgstr ""
+
+#: ../lib/virt_mem.ml:171
 msgid "set_endian: %s: unknown endianness"
 msgstr ""
 
-#: ../lib/virt_mem.ml:60
+#: ../lib/virt_mem.ml:214
+msgid "set_text_addr: %s: incorrect number of parameters to -T option"
+msgstr ""
+
+#: ../lib/virt_mem.ml:160
 msgid "set_wordsize: %s: unknown wordsize"
 msgstr ""
 
+#: ../uname/virt_uname.ml:36
+msgid "uname command for virtual machines"
+msgstr ""
+
+#: ../lib/virt_mem.ml:417
+msgid "virt-mem: error loading kernel memory: address out of range\nPossibly the '-T' command line parameter was used inconsistently."
+msgstr ""
+
+#: ../lib/virt_mem.ml:434
+msgid "virt-mem: if -t given on command line, then no domain arguments should be listed"
+msgstr ""
+
index 67178a0..3f01df4 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-06-10 16:27+0000\n"
+"POT-Creation-Date: 2008-08-07 10:58+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,103 +17,139 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: ../lib/virt_mem.ml:392
-msgid "%s: cannot find start of kernel symbol table\\n"
+#: ../ps/virt_ps.ml:40
+msgid "%s: %s: unknown kernel version\nTry a newer version of virt-mem, or if the guest is not from a\nsupported Linux distribution, see this page about adding support:\n  http://et.redhat.com/~rjones/virt-mem/faq.html\\n"
 msgstr ""
 
-#: ../dmesg/virt_dmesg.ml:86
+#: ../ps/virt_ps.ml:53
+msgid "%s: could not find init_task in kernel image\\n"
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:72
 msgid "%s: could not find kernel log buffer in kernel image\\n"
 msgstr ""
 
-#: ../uname/virt_uname.ml:101
-msgid "%s: could not find utsname in kernel image\\n"
+#: ../ps/virt_ps.ml:35
+msgid "%s: could not guess kernel version\\n"
 msgstr ""
 
-#: ../uname/virt_uname.ml:86
-msgid "%s: unexpected init_uts_ns in kernel image\\n"
+#: ../lib/virt_mem.ml:352
+msgid "%s: domain is not running"
 msgstr ""
 
-#: ../uname/virt_uname.ml:68
-msgid "%s: unexpected system_utsname in kernel image\\n"
+#: ../uname/virt_uname.ml:34
+msgid "%s: no system_utsname in kernel image\\n"
 msgstr ""
 
-#: ../lib/virt_mem.ml:136
-msgid "%s: unknown parameter"
+#: ../lib/virt_mem.ml:347
+msgid "%s: unknown domain (not a UUID, name or ID of any active domain)"
 msgstr ""
 
-#: ../lib/virt_mem.ml:265 ../lib/virt_mem.ml:207
+#: ../lib/virt_mem.ml:463 ../lib/virt_mem.ml:398
 msgid "%s: use -A to define architecture (i386/x86-64 only) for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:256 ../lib/virt_mem.ml:198
+#: ../lib/virt_mem.ml:454 ../lib/virt_mem.ml:389
 msgid "%s: use -E to define endianness for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:269 ../lib/virt_mem.ml:211
+#: ../lib/virt_mem.ml:467 ../lib/virt_mem.ml:404
 msgid "%s: use -T to define kernel load address for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:249 ../lib/virt_mem.ml:191
+#: ../lib/virt_mem.ml:447 ../lib/virt_mem.ml:382
 msgid "%s: use -W to define word size for this image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:126 ../lib/virt_mem.ml:124
+#: ../lib/virt_mem.ml:258 ../lib/virt_mem.ml:256
 msgid "Connect to URI"
 msgstr ""
 
-#: ../lib/virt_mem.ml:128
+#: ../lib/virt_mem.ml:260
 msgid "Debug mode (default: false)"
 msgstr ""
 
-#: ../lib/virt_mem.ml:132
+#: ../lib/virt_mem.ml:264
 msgid "Display version and exit"
 msgstr ""
 
-#: ../dmesg/virt_dmesg.ml:26
-msgid "NAME\n  virt-dmesg - dmesg command for virtual machines\n\nSUMMARY\n  virt-dmesg [-options] [domains]\n\nDESCRIPTION\n  virt-dmesg prints the kernel messages for virtual machines running\n  under libvirt.  The output is similar to the ordinary dmesg command\n  run inside the virtual machine."
-msgstr ""
-
-#: ../ps/virt_ps.ml:26
-msgid "NAME\n  virt-ps - process listing command for virtual machines\n\nSUMMARY\n  virt-ps [-options] [domains]\n\nDESCRIPTION\n  virt-ps prints a process listing for virtual machines running under\n  libvirt."
-msgstr ""
-
-#: ../uname/virt_uname.ml:26
-msgid "NAME\n  virt-uname - uname command for virtual machines\n\nSUMMARY\n  virt-uname [-options] [domains]\n\nDESCRIPTION\n  virt-uname prints the uname information such as OS version,\n  architecture and node name for virtual machines running under\n  libvirt."
-msgstr ""
-
-#: ../lib/virt_mem.ml:154
+#: ../lib/virt_mem.ml:323
 msgid "NB: If you want to monitor a local Xen hypervisor, you usually need to be root"
 msgstr ""
 
-#: ../lib/virt_mem.ml:116
+#: ../lib/virt_mem.ml:248
 msgid "Set kernel architecture, endianness and word size"
 msgstr ""
 
-#: ../lib/virt_mem.ml:118
+#: ../lib/virt_mem.ml:250
 msgid "Set kernel endianness"
 msgstr ""
 
-#: ../lib/virt_mem.ml:120
+#: ../lib/virt_mem.ml:252
 msgid "Set kernel text address"
 msgstr ""
 
-#: ../lib/virt_mem.ml:122
+#: ../lib/virt_mem.ml:254
 msgid "Set kernel word size"
 msgstr ""
 
-#: ../lib/virt_mem.ml:130
+#: ../lib/virt_mem.ml:262
 msgid "Use saved kernel memory image"
 msgstr ""
 
-#: ../lib/virt_mem.ml:137
-msgid "\\n\\nOPTIONS"
+#: ../lib/virt_mem.ml:139
+msgid "\\\n\n%s: %s\n\nDescription:\n%s\n\nOptions:"
+msgstr ""
+
+#: ../lib/virt_mem.ml:119
+msgid "\\\n\nvirt-mem: Tools for providing information about virtual machines\n\nCurrently available tools include:\n%s\n\nGeneral usage is:\n  <tool> [-options] [domains...]\n\nTo display extra help for a single tool, do:\n  virt-mem help <tool>\n\nOptions:"
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:76
+msgid "\\\nvirt-dmesg prints the kernel messages for virtual machines running\nunder libvirt.  The output is similar to the ordinary dmesg command\nrun inside the virtual machine."
+msgstr ""
+
+#: ../lib/virt_mem.ml:300
+msgid "\\\nvirt-mem: I could not work out which tool you are trying to run.\nUse 'virt-mem --help' for more help or read the manual page virt-mem(1)"
+msgstr ""
+
+#: ../ps/virt_ps.ml:97
+msgid "\\\nvirt-ps prints a process listing for virtual machines running under\nlibvirt."
+msgstr ""
+
+#: ../uname/virt_uname.ml:37
+msgid "\\\nvirt-uname prints the uname information such as OS version,\narchitecture and node name for virtual machines running under\nlibvirt."
+msgstr ""
+
+#: ../dmesg/virt_dmesg.ml:75
+msgid "display kernel messages"
+msgstr ""
+
+#: ../ps/virt_ps.ml:96
+msgid "list processes in virtual machine"
 msgstr ""
 
-#: ../lib/virt_mem.ml:71
+#: ../lib/virt_mem.ml:171
 msgid "set_endian: %s: unknown endianness"
 msgstr ""
 
-#: ../lib/virt_mem.ml:60
+#: ../lib/virt_mem.ml:214
+msgid "set_text_addr: %s: incorrect number of parameters to -T option"
+msgstr ""
+
+#: ../lib/virt_mem.ml:160
 msgid "set_wordsize: %s: unknown wordsize"
 msgstr ""
 
+#: ../uname/virt_uname.ml:36
+msgid "uname command for virtual machines"
+msgstr ""
+
+#: ../lib/virt_mem.ml:417
+msgid "virt-mem: error loading kernel memory: address out of range\nPossibly the '-T' command line parameter was used inconsistently."
+msgstr ""
+
+#: ../lib/virt_mem.ml:434
+msgid "virt-mem: if -t given on command line, then no domain arguments should be listed"
+msgstr ""
+
index 3113447..11d70ae 100644 (file)
@@ -1,4 +1,6 @@
-virt_ps.cmo: ../lib/virt_mem_utils.cmo ../lib/virt_mem_mmap.cmi \
-    ../lib/virt_mem_gettext.cmo ../lib/virt_mem.cmi 
-virt_ps.cmx: ../lib/virt_mem_utils.cmx ../lib/virt_mem_mmap.cmx \
-    ../lib/virt_mem_gettext.cmx ../lib/virt_mem.cmx 
+virt_ps.cmo: ../lib/virt_mem_utils.cmo ../lib/virt_mem_types.cmi \
+    ../lib/virt_mem_mmap.cmi ../lib/virt_mem_gettext.cmo ../lib/virt_mem.cmi \
+    ../lib/kernel_task_struct.cmi 
+virt_ps.cmx: ../lib/virt_mem_utils.cmx ../lib/virt_mem_types.cmx \
+    ../lib/virt_mem_mmap.cmx ../lib/virt_mem_gettext.cmx ../lib/virt_mem.cmx \
+    ../lib/kernel_task_struct.cmx 
index b9de26b..8e0fc5d 100644 (file)
@@ -21,47 +21,33 @@ VERSION             = @PACKAGE_VERSION@
 
 INSTALL                = @INSTALL@
 MKDIR_P                = @MKDIR_P@
-bindir         = @bindir@
 
-SYNTAX         = -pp "camlp4o -I$$(ocamlc -where)/bitmatch bitmatch.cma pa_bitmatch.cmo"
+SYNTAX         = -syntax bitstring.syntax
 
-#OCAMLCPACKAGES        = -package unix,bigarray,extlib,libvirt,xml-light,bitmatch
-OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light -I +bitmatch -I ../lib
+OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light,bitstring.syntax -I ../lib
 
 ifneq ($(pkg_gettext),no)
 OCAMLCPACKAGES += -package gettext-stub
 endif
 
 OCAMLCFLAGS    = @OCAMLCFLAGS@ $(SYNTAX)
-OCAMLCLIBS     = -linkpkg bitmatch.cma ../lib/virt_mem.cma
+OCAMLCLIBS     = -linkpkg ../lib/virt_mem.cma
 
 OCAMLOPTFLAGS  = @OCAMLOPTFLAGS@ $(SYNTAX)
 OCAMLOPTPACKAGES = $(OCAMLCPACKAGES)
-OCAMLOPTLIBS   = -linkpkg bitmatch.cmxa ../lib/virt_mem.cmxa
+OCAMLOPTLIBS   = -linkpkg ../lib/virt_mem.cmxa
 
 OCAMLDOCFLAGS  = -html -sort $(OCAMLCPACKAGES) $(SYNTAX)
 
 OCAMLDEPFLAGS  = $(SYNTAX)
 
-TARGETS                = virt-ps virt-ps.opt
-
 OBJS           = virt_ps.cmo
 XOBJS          = virt_ps.cmx
 
-all:   $(TARGETS)
-
-virt-ps: $(OBJS) ../lib/virt_mem.cma
-       ocamlfind ocamlc \
-         $(OCAMLCFLAGS) $(OCAMLCPACKAGES) $(OCAMLCLIBS) $(OBJS) -o $@
+TARGETS                = $(OBJS) $(XOBJS)
 
-virt-ps.opt: $(XOBJS) ../lib/virt_mem.cmxa
-       ocamlfind ocamlopt \
-         $(OCAMLOPTFLAGS) $(OCAMLOPTPACKAGES) $(OCAMLOPTLIBS) $(XOBJS) -o $@
+all:   $(TARGETS)
 
 install:
-       if [ -x virt-ps.opt ]; then \
-         $(MKDIR_P) $(DESTDIR)$(bindir); \
-         $(INSTALL) -m 0755 virt-ps.opt $(DESTDIR)$(bindir)/virt-ps; \
-       fi
 
 include ../Make.rules
\ No newline at end of file
index 94301ce..a9bcf1f 100644 (file)
@@ -21,16 +21,81 @@ open Printf
 
 open Virt_mem_gettext.Gettext
 open Virt_mem_utils
-open Virt_mem_mmap
+open Virt_mem_types
 
-let usage = s_"NAME
-  virt-ps - process listing command for virtual machines
+open Kernel_task_struct
 
-SUMMARY
-  virt-ps [-options] [domains]
+let run debug (image, ksymmap, utsname) =
+  try
+    let { domname = domname } = image in
 
-DESCRIPTION
-  virt-ps prints a process listing for virtual machines running under
-  libvirt."
+    let kernel_version =
+      match utsname with
+      | None ->
+         eprintf (f_"%s: could not guess kernel version\n") domname;
+         raise Exit
+      | Some { kernel_release = v } -> v in
 
-let debug, images = Virt_mem.start usage
+    if not (task_struct_known kernel_version) then (
+      eprintf (f_"%s: %s: unknown kernel version
+Try a newer version of virt-mem, or if the guest is not from a
+supported Linux distribution, see this page about adding support:
+  http://et.redhat.com/~rjones/virt-mem/faq.html\n") domname kernel_version;
+      raise Exit
+    );
+
+    let task_struct_size = task_struct_size kernel_version in
+
+    let init_task, init_task_addr =
+      let init_task_addr =
+       try Ksymmap.find "init_task" ksymmap
+       with Not_found ->
+         eprintf (f_"%s: could not find init_task in kernel image\n") domname;
+         raise Exit in
+      let init_task =
+       get_task_struct kernel_version image.mem init_task_addr in
+      init_task, init_task_addr in
+
+    (* Starting at init_task, navigate through the linked list of
+     * tasks (through tasks.next).  Grab each task_struct as we go.
+     *)
+    let tasks, image =
+      let rec loop image acc task =
+       let next = task.task_struct_tasks'next in
+       if next <> init_task_addr then (
+         let mapped =
+           Virt_mem_mmap.is_mapped_range image.mem next task_struct_size in
+         let image =
+           if not mapped then load_memory image next task_struct_size
+           else image in
+         let task = get_task_struct kernel_version image.mem next in
+         let task = {
+           task with
+             task_struct_comm = truncate_c_string task.task_struct_comm
+         } in
+         let acc = task :: acc in
+         loop image acc task
+       ) else
+         acc, image
+      in
+      loop image [] init_task in
+
+    (* Sort tasks by PID. *)
+    let cmp { task_struct_pid = p1 } { task_struct_pid = p2 } = compare p1 p2 in
+    let tasks = List.sort cmp tasks in
+
+    printf "  PID STAT COMMAND\n";
+
+    List.iter (
+      fun task ->
+       printf "%5Ld      %s\n" task.task_struct_pid task.task_struct_comm
+    ) tasks
+
+  with Exit -> ()
+
+let summary = s_"list processes in virtual machine"
+let description = s_"\
+virt-ps prints a process listing for virtual machines running under
+libvirt."
+
+let () = Virt_mem.register "ps" summary description ~run
index 0adc4a7..34eaf05 100644 (file)
@@ -1,6 +1,4 @@
-virt_uname.cmo: ../lib/virt_mem_utils.cmo ../lib/virt_mem_mmap.cmi \
-    ../lib/virt_mem_gettext.cmo ../lib/virt_mem.cmi \
-    /usr/lib64/ocaml/bitmatch/bitmatch.cmi 
-virt_uname.cmx: ../lib/virt_mem_utils.cmx ../lib/virt_mem_mmap.cmx \
-    ../lib/virt_mem_gettext.cmx ../lib/virt_mem.cmx \
-    /usr/lib64/ocaml/bitmatch/bitmatch.cmi 
+virt_uname.cmo: ../lib/virt_mem_utils.cmo ../lib/virt_mem_types.cmi \
+    ../lib/virt_mem_gettext.cmo ../lib/virt_mem.cmi 
+virt_uname.cmx: ../lib/virt_mem_utils.cmx ../lib/virt_mem_types.cmx \
+    ../lib/virt_mem_gettext.cmx ../lib/virt_mem.cmx 
index 3c10dee..5a21e99 100644 (file)
@@ -21,47 +21,33 @@ VERSION             = @PACKAGE_VERSION@
 
 INSTALL                = @INSTALL@
 MKDIR_P                = @MKDIR_P@
-bindir         = @bindir@
 
-SYNTAX         = -pp "camlp4o -I$$(ocamlc -where)/bitmatch bitmatch.cma pa_bitmatch.cmo"
+SYNTAX         = -syntax bitstring.syntax
 
-#OCAMLCPACKAGES        = -package unix,bigarray,extlib,libvirt,xml-light,bitmatch
-OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light -I +bitmatch -I ../lib
+OCAMLCPACKAGES = -package unix,bigarray,extlib,libvirt,xml-light,bitstring.syntax -I ../lib
 
 ifneq ($(pkg_gettext),no)
 OCAMLCPACKAGES += -package gettext-stub
 endif
 
 OCAMLCFLAGS    = @OCAMLCFLAGS@ $(SYNTAX)
-OCAMLCLIBS     = -linkpkg bitmatch.cma ../lib/virt_mem.cma
+OCAMLCLIBS     = -linkpkg ../lib/virt_mem.cma
 
 OCAMLOPTFLAGS  = @OCAMLOPTFLAGS@ $(SYNTAX)
 OCAMLOPTPACKAGES = $(OCAMLCPACKAGES)
-OCAMLOPTLIBS   = -linkpkg bitmatch.cmxa ../lib/virt_mem.cmxa
+OCAMLOPTLIBS   = -linkpkg ../lib/virt_mem.cmxa
 
 OCAMLDOCFLAGS  = -html -sort $(OCAMLCPACKAGES) $(SYNTAX)
 
 OCAMLDEPFLAGS  = $(SYNTAX)
 
-TARGETS                = virt-uname virt-uname.opt
-
 OBJS           = virt_uname.cmo
 XOBJS          = virt_uname.cmx
 
-all:   $(TARGETS)
-
-virt-uname: $(OBJS) ../lib/virt_mem.cma
-       ocamlfind ocamlc \
-         $(OCAMLCFLAGS) $(OCAMLCPACKAGES) $(OCAMLCLIBS) $(OBJS) -o $@
+TARGETS                = $(OBJS) $(XOBJS)
 
-virt-uname.opt: $(XOBJS) ../lib/virt_mem.cmxa
-       ocamlfind ocamlopt \
-         $(OCAMLOPTFLAGS) $(OCAMLOPTPACKAGES) $(OCAMLOPTLIBS) $(XOBJS) -o $@
+all:   $(TARGETS)
 
 install:
-       if [ -x virt-uname.opt ]; then \
-         $(MKDIR_P) $(DESTDIR)$(bindir); \
-         $(INSTALL) -m 0755 virt-uname.opt $(DESTDIR)$(bindir)/virt-uname; \
-       fi
 
 include ../Make.rules
\ No newline at end of file
index fff6d7f..3d902ce 100644 (file)
@@ -21,82 +21,22 @@ open Printf
 
 open Virt_mem_gettext.Gettext
 open Virt_mem_utils
-open Virt_mem_mmap
-
-let usage = s_"NAME
-  virt-uname - uname command for virtual machines
-
-SUMMARY
-  virt-uname [-options] [domains]
-
-DESCRIPTION
-  virt-uname prints the uname information such as OS version,
-  architecture and node name for virtual machines running under
-  libvirt."
-
-let _, images = Virt_mem.start usage
-
-let () =
-  (* Print new_utsname structure from bitstring. *)
-  let print_new_utsname name bs =
-    (* Truncate an OCaml string at the first ASCII NUL character, ie. as
-     * if it were a C string.
-     *)
-    let truncate str =
-      try
-       let i = String.index str '\000' in
-       String.sub str 0 i
-      with
-       Not_found -> str
-    in
-    (* Expect the first (sysname) field to always be "Linux", which is
-     * also a good way to tell if we're synchronized to the right bit of
-     * memory.
-     *)
-    bitmatch bs with
-    | { "Linux\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" : 65*8 : string;
-       nodename : 65*8 : string;
-       release : 65*8 : string;
-       version : 65*8 : string;
-       machine : 65*8 : string;
-       domainname : 65*8 : string } ->
-       printf "%s: Linux %s %s %s %s %s\n"
-         name
-         (truncate nodename) (truncate release)
-         (truncate version) (truncate machine) (truncate domainname)
-    | { _ } ->
-       eprintf (f_"%s: unexpected system_utsname in kernel image\n")
-         name
-  in
-
-  List.iter (
-    fun (name, arch, mem, lookup_ksym) ->
-      (* In Linux 2.6.25, the symbol is init_uts_ns.
-       * http://lxr.linux.no/linux/init/version.c
-       *)
-      try
-       let addr = lookup_ksym "init_uts_ns" in
-
-       let bs = Bitmatch.bitstring_of_string (get_bytes mem addr (65*6+4)) in
-       (bitmatch bs with
-        | { _ : 32 : int;              (* the kref, atomic_t, always 32 bits *)
-            new_utsname : -1 : bitstring } ->
-            print_new_utsname name new_utsname
-        | { _ } ->
-            eprintf (f_"%s: unexpected init_uts_ns in kernel image\n")
-              name)
-      with
-       Not_found ->
-         (* In Linux 2.6.9, the symbol is system_utsname.
-          * http://lxr.linux.no/linux-bk+v2.6.9/include/linux/utsname.h#L24
-          *)
-         try
-           let addr = lookup_ksym "system_utsname" in
-
-           let bs =
-             Bitmatch.bitstring_of_string (get_bytes mem addr (65*6)) in
-           print_new_utsname name bs
-         with
-           Not_found ->
-             eprintf (f_"%s: could not find utsname in kernel image\n") name
-  ) images
+open Virt_mem_types
+
+let run debug ({ domname = domname }, _, utsname) =
+  match utsname with
+  | Some u ->
+      printf "%s: %s %s %s %s %s %s\n"
+       domname
+       u.kernel_name u.nodename u.kernel_release
+       u.kernel_version u.machine u.domainname
+  | None ->
+      eprintf (f_"%s: no system_utsname in kernel image\n") domname
+
+let summary = s_"uname command for virtual machines"
+let description = s_"\
+virt-uname prints the uname information such as OS version,
+architecture and node name for virtual machines running under
+libvirt."
+
+let () = Virt_mem.register "uname" summary description ~run
index eb35098..94be74d 100644 (file)
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
+.\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.05)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
 ..
 .\" Set up some character translations and predefined strings.  \*(-- will
 .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  | will give a
-.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
-.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
-.tr \(*W-|\(bv\*(Tr
+.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
+.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
 .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
 .ie n \{\
 .    ds -- \(*W-
 .    ds R" ''
 'br\}
 .\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el       .ds Aq '
+.\"
 .\" If the F register is turned on, we'll generate index entries on stderr for
 .\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
 .\" entries marked with X<> in POD.  Of course, you'll have to process the
 .\" output yourself in some meaningful fashion.
-.if \nF \{\
+.ie \nF \{\
 .    de IX
 .    tm Index:\\$1\t\\n%\t"\\$2"
 ..
 .    nr % 0
 .    rr F
 .\}
-.\"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.hy 0
-.if n .na
+.el \{\
+.    de IX
+..
+.\}
 .\"
 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
 .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
 .\" ========================================================================
 .\"
 .IX Title "VIRT-MEM 1"
-.TH VIRT-MEM 1 "2008-06-10" "virt-mem-0.2.1" "Virtualization Support"
+.TH VIRT-MEM 1 "2008-07-24" "virt-mem-0.2.7" "Virtualization Support"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
 .SH "NAME"
 virt\-uname \- system information for virtual machines
 .PP
 virt\-dmesg \- print kernel messages for virtual machines
+.PP
+virt\-mem \- tool with additional information output
 .SH "SUMMARY"
 .IX Header "SUMMARY"
 virt-uname [\-options] [domains...]
 .PP
 virt-dmesg [\-options] [domains...]
+.PP
+virt-mem uname [...]
+.PP
+virt-mem dmesg [...]
+.PP
+virt-mem [\-options]
 .SH "DESCRIPTION"
 .IX Header "DESCRIPTION"
-These virtualization tools allow you to inspect the status of
-virtual machines running Linux.
+These virtualization tools allow you to inspect the status of virtual
+machines running Linux.
+.PP
+These tools are designed to work like familiar Linux/Unix command line
+tools.
+.PP
+These tools all use libvirt so are capable of showing information
+across a variety of different virtualization systems.
 .PP
-The tools all use libvirt so are capable of showing stats across a
-variety of different virtualization systems.
+The virt-mem tools do not work on domains which are not active
+(running or paused).  eg. They do not work on shut down domains.
+However they can (usually) be used on domains which are active but
+hanging or unresponsive.  You also have the option of capturing a
+memory image of a domain for post-mortem analysis, allowing you to
+quickly reboot a failed domain and analyze it later at your leisure.
 .SH "COMMON OPTIONS"
 .IX Header "COMMON OPTIONS"
 Each command obeys a common set of options.  The general form is:
 .PP
 virt\-\fIprogram\fR [\-options] [domains...]
 .PP
-where \fIdomains\fR is a list of guest names to act on.  If no domains
-are specified then we act on all active domains by default.
+where \fIprogram\fR is a subtool such as \f(CW\*(C`uname\*(C'\fR, \f(CW\*(C`dmesg\*(C'\fR or \f(CW\*(C`ps\*(C'\fR, and
+\&\fIdomains\fR is a list of guest names to act on.  If no domains are
+specified then we act on all active domains by default.
 .PP
-A \fIdomain\fR may be specified either by its name or by its \s-1ID\s0.  Use
-\&\fIvirsh list\fR to get a list of active domain names and IDs.
+A \fIdomain\fR may be specified either by its name, by its \s-1ID\s0 or by its
+\&\s-1UUID\s0.  Use \fIvirsh list\fR to get a list of active domain names and IDs.
 .PP
-The virt-mem tools do not work on domains which are not active
-(running or paused).  eg. They do not work on shut down domains.
+Equivalently you can use the \f(CW\*(C`virt\-mem\*(C'\fR meta-tool with subcommands,
+as in:
+.PP
+virt-mem \fIprogram\fR [...]
+.PP
+The \f(CW\*(C`virt\-mem\*(C'\fR program offers additional features, such as the
+ability to capture \s-1VM\s0 images for post-mortem analysis (see below).
 .IP "\fB\-c uri\fR, \fB\-\-connect uri\fR" 4
 .IX Item "-c uri, --connect uri"
 Connect to libvirt \s-1URI\s0.  The default is to connect to the default
@@ -179,17 +210,22 @@ report a bug.
 Display usage summary.
 .IP "\fB\-t memoryimage\fR" 4
 .IX Item "-t memoryimage"
-Test mode.  Instead of checking libvirt for domain information, this
-runs the virt-mem tool directly on the memory image supplied.  You may
-specify the \fB\-t\fR option multiple times.
+Post-mortem analysis mode.
+.Sp
+Instead of checking libvirt for domain information, this runs the tool
+directly on the memory image supplied.  You may specify the \fB\-t\fR
+option multiple times.  Use the \f(CW\*(C`virt\-mem capture\*(C'\fR command to capture
+images (see below).
+.Sp
+See also the section \*(L"\s-1MEMORY\s0 \s-1IMAGES\s0\*(R" below.
 .IP "\fB\-\-version\fR" 4
 .IX Item "--version"
 Display version and exit.
 .IP "\fB\-E auto|littleendian|bigendian\fR" 4
 .IX Item "-E auto|littleendian|bigendian"
 .PD 0
-.IP "\fB\-T auto|i386|x86\-64|\f(BIaddress\fB\fR" 4
-.IX Item "-T auto|i386|x86-64|address"
+.IP "\fB\-T auto|i386|x86\-64|\f(BIaddress\fB|\f(BIaddress,min,max\fB\fR" 4
+.IX Item "-T auto|i386|x86-64|address|address,min,max"
 .IP "\fB\-W auto|32|64\fR" 4
 .IX Item "-W auto|32|64"
 .PD
@@ -203,13 +239,18 @@ to use these options if virt-mem tools get the automatic detection
 wrong.
 .Sp
 Endianness (\fI\-E\fR) sets the memory endianness, for data, pointers and
-so on.
+so on.  \fI\-E littleendian\fR is the endianness used on Intel i386,
+x86\-64 and (usually) \s-1IA64\s0.  \fI\-E bigendian\fR is the endianness used on
+many \s-1RISC\s0 chips such as \s-1SPARC\s0 and PowerPC.
 .Sp
-Text address (\fI\-T\fR) sets the base address of the kernel image.  \fI\-T
-i386\fR means to try some common addresses for i386\-based kernels.  \fI\-T
-x86\-64\fR means to try some common addresses for x86\-64\-based kernels.
-\&\fI\-T \fIaddress\fI\fR sets the address specifically (\fI0x\fR prefix is
-allowed to specify hex addresses).
+Text address (\fI\-T\fR) sets the base address and optionally min and max
+addresses of the kernel image.  \fI\-T i386\fR means to try some common
+addresses for i386\-based kernels.  \fI\-T x86\-64\fR means to try some
+common addresses for x86\-64\-based kernels.
+.Sp
+\&\fI\-T address\fR sets the kernel base address specifically (\fI0x\fR prefix
+is used to specify hex addresses).  \fI\-T address,min,max\fR sets the
+kernel base address, minimum address and maximum address.
 .Sp
 Word size (\fI\-W\fR) sets the word size, 32 or 64 bits.
 .IP "\fB\-A auto|i386|x86\-64|...\fR" 4
@@ -217,16 +258,50 @@ Word size (\fI\-W\fR) sets the word size, 32 or 64 bits.
 This option sets the architecture to one of a collection of known
 architectures.  It is equivalent to setting endianness and wordsize in
 one go, but not text address.
+.SH "virt-dmesg"
+.IX Header "virt-dmesg"
+This prints the latest kernel messages from the virtual machine, as if
+you were logged into the machine and used \fIdmesg\fR\|(1).
+.SH "virt-uname"
+.IX Header "virt-uname"
+This prints the contents of the system \f(CW\*(C`utsname\*(C'\fR structure, similar
+to what is printed by the \fIuname\fR\|(1) command.
+.SH "virt-mem"
+.IX Header "virt-mem"
+\&\f(CW\*(C`virt\-mem\*(C'\fR is a meta-tool which allows you to run all the commands
+above, and provides some extra features.
+.PP
+Instead of the preceeding commands such as \f(CW\*(C`virt\-dmesg\*(C'\fR you can
+write:
+.PP
+.Vb 1
+\& virt\-mem dmesg [...]
+.Ve
+.PP
+Options and other command line arguments work the same.
+.PP
+Additional \f(CW\*(C`virt\-mem\*(C'\fR subcommands are listed below.
+.Sh "virt-mem capture \-o memoryimage [\-options] [domains...]"
+.IX Subsection "virt-mem capture -o memoryimage [-options] [domains...]"
+Capture the memory image of a virtual machine for later post-mortem
+analysis.  Use the \fI\-t memoryimage\fR option for any other virt-mem
+tool to analyze the memory image later.
+.PP
+The \fI\-o memoryimage\fR option is required, and is used to name the
+output file.  If a single guest is captured, then the output is saved
+in the \fImemoryimage\fR file.  However, if multiple guests are captured,
+then their images are saved in \fImemoryimage.ID\fR where \fI\s-1ID\s0\fR is
+replaced with the domain \s-1ID\s0.
+.PP
+See also the section \*(L"\s-1MEMORY\s0 \s-1IMAGES\s0\*(R" below.
 .SH "EXAMPLES"
 .IX Header "EXAMPLES"
 .Vb 3
-\& # virt-uname
-\& f9x32kvm: Linux localhost.localdomain 2.6.24-0.155.rc7.git6.fc9 #1
+\& # virt\-uname
+\& f9x32kvm: Linux localhost.localdomain 2.6.24\-0.155.rc7.git6.fc9 #1
 \& SMP Tue Jan 15 17:52:31 EST 2008 i686 (none)
-.Ve
-.PP
-.Vb 11
-\& # virt-dmesg f9x32kvm | tail
+\&
+\& # virt\-dmesg f9x32kvm | tail
 \& <6>Bluetooth: Core ver 2.11
 \& <6>NET: Registered protocol family 31
 \& <6>Bluetooth: HCI device and connection manager initialized
@@ -238,25 +313,42 @@ one go, but not text address.
 \& <6>Bluetooth: RFCOMM ver 1.8
 \& <7>eth0: no IPv6 routers present
 .Ve
+.SH "MEMORY IMAGES"
+.IX Header "MEMORY IMAGES"
+All the tools can read dumped kernel images, using the common
+\&\fI\-t memoryimage\fR option.  In addition you can capture memory
+images from domains for post-mortem analysis using the
+\&\f(CW\*(C`virt\-mem capture\*(C'\fR command (see above).
+.PP
+The memory images which are saved by \f(CW\*(C`virt\-mem capture\*(C'\fR contain a
+header and some additional information about the kernel image, such as
+architecture, original text address, and so forth.  Thus these images
+can be reanalysed just using the \fI\-t memoryimage\fR option.
+.PP
+We also support analyzing raw kernel dumps, eg. produced using the
+\&\fIqemu\fR\|(1) monitor's \f(CW\*(C`memsave\*(C'\fR command.  In this case however you
+usually need to specify the original architecture, text address and
+perhaps other details using the \fI\-A\fR, \fI\-T\fR and other command line
+parameters.
 .SH "SHORTCOMINGS"
 .IX Header "SHORTCOMINGS"
 The virt-mem tools spy on the guest's memory image.  There are some
 shortcomings to this, described here.
-.PP
-(1) Only works on specific, tested releases of Linux kernels.  Support
+.IP "\(bu" 4
+Only works on specific, tested releases of Linux kernels.  Support
 for arbitrary Linux kernel versions may be patchy because of changes
 in the internal structures used.  Support for non-Linux kernels is
-currently non\-existent, and probably impossible for Windows because of
+currently non-existent, and probably impossible for Windows because of
 lack of an acceptable source license.
-.PP
-(2) Heuristics are used which may mean in the worst case that the
+.IP "\(bu" 4
+Heuristics are used which may mean in the worst case that the
 output is wrong.
-.PP
-(3) Structures which are frequently modified may cause errors.  This
+.IP "\(bu" 4
+Structures which are frequently modified may cause errors.  This
 could be a problem if, for example, the process table in the guest is
 being rapidly updated.
-.PP
-(4) We have to scan memory to find kernel symbols, etc., which can be
+.IP "\(bu" 4
+We have to scan memory to find kernel symbols, etc., which can be
 quite slow.  Optimizing the memory scanner would help, and caching the
 base address of the symbol table(s) would make it dramatically faster.
 .SH "SECURITY"
@@ -268,7 +360,10 @@ example guests which set up malicious kernel memory.
 \&\fIuname\fR\|(1),
 \&\fIdmesg\fR\|(1),
 \&\fIvirsh\fR\|(1),
+\&\fIvirt\-top\fR\|(1),
+\&\fIvirt\-df\fR\|(1),
 \&\fIxm\fR\|(1),
+\&\fIqemu\fR\|(1),
 <http://www.libvirt.org/ocaml/>,
 <http://www.libvirt.org/>,
 <http://et.redhat.com/~rjones/>,
@@ -299,7 +394,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, \s-1MA\s0 02139, \s-1USA\s0.
 Bugs can be viewed on the Red Hat Bugzilla page:
 <https://bugzilla.redhat.com/>.
 .PP
-If you find a bug in virt\-mem, please follow these steps to report it:
+If you find a bug in virt-mem, please follow these steps to report it:
 .IP "1. Check for existing bug reports" 4
 .IX Item "1. Check for existing bug reports"
 Go to <https://bugzilla.redhat.com/> and search for similar bugs.
index eeb027b..9a4fd32 100644 (file)
@@ -4,19 +4,37 @@ virt-uname - system information for virtual machines
 
 virt-dmesg - print kernel messages for virtual machines
 
+virt-mem - tool with additional information output
+
 =head1 SUMMARY
 
 virt-uname [-options] [domains...]
 
 virt-dmesg [-options] [domains...]
 
+virt-mem uname [...]
+
+virt-mem dmesg [...]
+
+virt-mem [-options]
+
 =head1 DESCRIPTION
 
-These virtualization tools allow you to inspect the status of
-virtual machines running Linux.
+These virtualization tools allow you to inspect the status of virtual
+machines running Linux.
+
+These tools are designed to work like familiar Linux/Unix command line
+tools.
 
-The tools all use libvirt so are capable of showing stats across a
-variety of different virtualization systems.
+These tools all use libvirt so are capable of showing information
+across a variety of different virtualization systems.
+
+The virt-mem tools do not work on domains which are not active
+(running or paused).  eg. They do not work on shut down domains.
+However they can (usually) be used on domains which are active but
+hanging or unresponsive.  You also have the option of capturing a
+memory image of a domain for post-mortem analysis, allowing you to
+quickly reboot a failed domain and analyze it later at your leisure.
 
 =head1 COMMON OPTIONS
 
@@ -24,14 +42,20 @@ Each command obeys a common set of options.  The general form is:
 
 virt-I<program> [-options] [domains...]
 
-where I<domains> is a list of guest names to act on.  If no domains
-are specified then we act on all active domains by default.
+where I<program> is a subtool such as C<uname>, C<dmesg> or C<ps>, and
+I<domains> is a list of guest names to act on.  If no domains are
+specified then we act on all active domains by default.
 
-A I<domain> may be specified either by its name or by its ID.  Use
-I<virsh list> to get a list of active domain names and IDs.
+A I<domain> may be specified either by its name, by its ID or by its
+UUID.  Use I<virsh list> to get a list of active domain names and IDs.
 
-The virt-mem tools do not work on domains which are not active
-(running or paused).  eg. They do not work on shut down domains.
+Equivalently you can use the C<virt-mem> meta-tool with subcommands,
+as in:
+
+virt-mem I<program> [...]
+
+The C<virt-mem> program offers additional features, such as the
+ability to capture VM images for post-mortem analysis (see below).
 
 =over 4
 
@@ -58,9 +82,14 @@ Display usage summary.
 
 =item B<-t memoryimage>
 
-Test mode.  Instead of checking libvirt for domain information, this
-runs the virt-mem tool directly on the memory image supplied.  You may
-specify the B<-t> option multiple times.
+Post-mortem analysis mode.
+
+Instead of checking libvirt for domain information, this runs the tool
+directly on the memory image supplied.  You may specify the B<-t>
+option multiple times.  Use the C<virt-mem capture> command to capture
+images (see below).
+
+See also the section L</"MEMORY IMAGES"> below.
 
 =item B<--version>
 
@@ -68,7 +97,7 @@ Display version and exit.
 
 =item B<-E auto|littleendian|bigendian>
 
-=item B<-T auto|i386|x86-64|I<address>>
+=item B<-T auto|i386|x86-64|I<address>|I<address,min,max>>
 
 =item B<-W auto|32|64>
 
@@ -82,13 +111,18 @@ to use these options if virt-mem tools get the automatic detection
 wrong.
 
 Endianness (I<-E>) sets the memory endianness, for data, pointers and
-so on.
+so on.  I<-E littleendian> is the endianness used on Intel i386,
+x86-64 and (usually) IA64.  I<-E bigendian> is the endianness used on
+many RISC chips such as SPARC and PowerPC.
+
+Text address (I<-T>) sets the base address and optionally min and max
+addresses of the kernel image.  I<-T i386> means to try some common
+addresses for i386-based kernels.  I<-T x86-64> means to try some
+common addresses for x86-64-based kernels.
 
-Text address (I<-T>) sets the base address of the kernel image.  I<-T
-i386> means to try some common addresses for i386-based kernels.  I<-T
-x86-64> means to try some common addresses for x86-64-based kernels.
-I<-T I<address>> sets the address specifically (I<0x> prefix is
-allowed to specify hex addresses).
+I<-T address> sets the kernel base address specifically (I<0x> prefix
+is used to specify hex addresses).  I<-T address,min,max> sets the
+kernel base address, minimum address and maximum address.
 
 Word size (I<-W>) sets the word size, 32 or 64 bits.
 
@@ -100,6 +134,44 @@ one go, but not text address.
 
 =back
 
+=head1 virt-dmesg
+
+This prints the latest kernel messages from the virtual machine, as if
+you were logged into the machine and used L<dmesg(1)>.
+
+=head1 virt-uname
+
+This prints the contents of the system C<utsname> structure, similar
+to what is printed by the L<uname(1)> command.
+
+=head1 virt-mem
+
+C<virt-mem> is a meta-tool which allows you to run all the commands
+above, and provides some extra features.
+
+Instead of the preceeding commands such as C<virt-dmesg> you can
+write:
+
+ virt-mem dmesg [...]
+
+Options and other command line arguments work the same.
+
+Additional C<virt-mem> subcommands are listed below.
+
+=head2 virt-mem capture -o memoryimage [-options] [domains...]
+
+Capture the memory image of a virtual machine for later post-mortem
+analysis.  Use the I<-t memoryimage> option for any other virt-mem
+tool to analyze the memory image later.
+
+The I<-o memoryimage> option is required, and is used to name the
+output file.  If a single guest is captured, then the output is saved
+in the I<memoryimage> file.  However, if multiple guests are captured,
+then their images are saved in I<memoryimage.ID> where I<ID> is
+replaced with the domain ID.
+
+See also the section L</"MEMORY IMAGES"> below.
+
 =head1 EXAMPLES
 
  # virt-uname
@@ -118,28 +190,58 @@ one go, but not text address.
  <6>Bluetooth: RFCOMM ver 1.8
  <7>eth0: no IPv6 routers present
 
+=head1 MEMORY IMAGES
+
+All the tools can read dumped kernel images, using the common
+I<-t memoryimage> option.  In addition you can capture memory
+images from domains for post-mortem analysis using the
+C<virt-mem capture> command (see above).
+
+The memory images which are saved by C<virt-mem capture> contain a
+header and some additional information about the kernel image, such as
+architecture, original text address, and so forth.  Thus these images
+can be reanalysed just using the I<-t memoryimage> option.
+
+We also support analyzing raw kernel dumps, eg. produced using the
+L<qemu(1)> monitor's C<memsave> command.  In this case however you
+usually need to specify the original architecture, text address and
+perhaps other details using the I<-A>, I<-T> and other command line
+parameters.
+
 =head1 SHORTCOMINGS
 
 The virt-mem tools spy on the guest's memory image.  There are some
 shortcomings to this, described here.
 
-(1) Only works on specific, tested releases of Linux kernels.  Support
+=over
+
+=item *
+
+Only works on specific, tested releases of Linux kernels.  Support
 for arbitrary Linux kernel versions may be patchy because of changes
 in the internal structures used.  Support for non-Linux kernels is
 currently non-existent, and probably impossible for Windows because of
 lack of an acceptable source license.
 
-(2) Heuristics are used which may mean in the worst case that the
+=item *
+
+Heuristics are used which may mean in the worst case that the
 output is wrong.
 
-(3) Structures which are frequently modified may cause errors.  This
+=item *
+
+Structures which are frequently modified may cause errors.  This
 could be a problem if, for example, the process table in the guest is
 being rapidly updated.
 
-(4) We have to scan memory to find kernel symbols, etc., which can be
+=item *
+
+We have to scan memory to find kernel symbols, etc., which can be
 quite slow.  Optimizing the memory scanner would help, and caching the
 base address of the symbol table(s) would make it dramatically faster.
 
+=back
+
 =head1 SECURITY
 
 The current code tries hard to be secure against malicious guests, for
@@ -150,7 +252,10 @@ example guests which set up malicious kernel memory.
 L<uname(1)>,
 L<dmesg(1)>,
 L<virsh(1)>,
+L<virt-top(1)>,
+L<virt-df(1)>,
 L<xm(1)>,
+L<qemu(1)>,
 L<http://www.libvirt.org/ocaml/>,
 L<http://www.libvirt.org/>,
 L<http://et.redhat.com/~rjones/>,
index bac5e16..1b36816 100644 (file)
@@ -3,31 +3,55 @@ NAME
 
     virt-dmesg - print kernel messages for virtual machines
 
+    virt-mem - tool with additional information output
+
 SUMMARY
     virt-uname [-options] [domains...]
 
     virt-dmesg [-options] [domains...]
 
+    virt-mem uname [...]
+
+    virt-mem dmesg [...]
+
+    virt-mem [-options]
+
 DESCRIPTION
     These virtualization tools allow you to inspect the status of virtual
     machines running Linux.
 
-    The tools all use libvirt so are capable of showing stats across a
-    variety of different virtualization systems.
+    These tools are designed to work like familiar Linux/Unix command line
+    tools.
+
+    These tools all use libvirt so are capable of showing information across
+    a variety of different virtualization systems.
+
+    The virt-mem tools do not work on domains which are not active (running
+    or paused). eg. They do not work on shut down domains. However they can
+    (usually) be used on domains which are active but hanging or
+    unresponsive. You also have the option of capturing a memory image of a
+    domain for post-mortem analysis, allowing you to quickly reboot a failed
+    domain and analyze it later at your leisure.
 
 COMMON OPTIONS
     Each command obeys a common set of options. The general form is:
 
     virt-*program* [-options] [domains...]
 
-    where *domains* is a list of guest names to act on. If no domains are
+    where *program* is a subtool such as "uname", "dmesg" or "ps", and
+    *domains* is a list of guest names to act on. If no domains are
     specified then we act on all active domains by default.
 
-    A *domain* may be specified either by its name or by its ID. Use *virsh
-    list* to get a list of active domain names and IDs.
+    A *domain* may be specified either by its name, by its ID or by its
+    UUID. Use *virsh list* to get a list of active domain names and IDs.
 
-    The virt-mem tools do not work on domains which are not active (running
-    or paused). eg. They do not work on shut down domains.
+    Equivalently you can use the "virt-mem" meta-tool with subcommands, as
+    in:
+
+    virt-mem *program* [...]
+
+    The "virt-mem" program offers additional features, such as the ability
+    to capture VM images for post-mortem analysis (see below).
 
     -c uri, --connect uri
         Connect to libvirt URI. The default is to connect to the default
@@ -48,15 +72,20 @@ COMMON OPTIONS
         Display usage summary.
 
     -t memoryimage
-        Test mode. Instead of checking libvirt for domain information, this
-        runs the virt-mem tool directly on the memory image supplied. You
-        may specify the -t option multiple times.
+        Post-mortem analysis mode.
+
+        Instead of checking libvirt for domain information, this runs the
+        tool directly on the memory image supplied. You may specify the -t
+        option multiple times. Use the "virt-mem capture" command to capture
+        images (see below).
+
+        See also the section "MEMORY IMAGES" below.
 
     --version
         Display version and exit.
 
     -E auto|littleendian|bigendian
-    -T auto|i386|x86-64|*address*
+    -T auto|i386|x86-64|*address*|*address,min,max*
     -W auto|32|64
         These options force the endianness, text address, and word size for
         the subsequent domains listed on the command line (or if no domains
@@ -68,13 +97,18 @@ COMMON OPTIONS
         detection wrong.
 
         Endianness (*-E*) sets the memory endianness, for data, pointers and
-        so on.
+        so on. *-E littleendian* is the endianness used on Intel i386,
+        x86-64 and (usually) IA64. *-E bigendian* is the endianness used on
+        many RISC chips such as SPARC and PowerPC.
+
+        Text address (*-T*) sets the base address and optionally min and max
+        addresses of the kernel image. *-T i386* means to try some common
+        addresses for i386-based kernels. *-T x86-64* means to try some
+        common addresses for x86-64-based kernels.
 
-        Text address (*-T*) sets the base address of the kernel image. *-T
-        i386* means to try some common addresses for i386-based kernels. *-T
-        x86-64* means to try some common addresses for x86-64-based kernels.
-        *-T *address** sets the address specifically (*0x* prefix is allowed
-        to specify hex addresses).
+        *-T address* sets the kernel base address specifically (*0x* prefix
+        is used to specify hex addresses). *-T address,min,max* sets the
+        kernel base address, minimum address and maximum address.
 
         Word size (*-W*) sets the word size, 32 or 64 bits.
 
@@ -83,6 +117,39 @@ COMMON OPTIONS
         architectures. It is equivalent to setting endianness and wordsize
         in one go, but not text address.
 
+virt-dmesg
+    This prints the latest kernel messages from the virtual machine, as if
+    you were logged into the machine and used dmesg(1).
+
+virt-uname
+    This prints the contents of the system "utsname" structure, similar to
+    what is printed by the uname(1) command.
+
+virt-mem
+    "virt-mem" is a meta-tool which allows you to run all the commands
+    above, and provides some extra features.
+
+    Instead of the preceeding commands such as "virt-dmesg" you can write:
+
+     virt-mem dmesg [...]
+
+    Options and other command line arguments work the same.
+
+    Additional "virt-mem" subcommands are listed below.
+
+  virt-mem capture -o memoryimage [-options] [domains...]
+    Capture the memory image of a virtual machine for later post-mortem
+    analysis. Use the *-t memoryimage* option for any other virt-mem tool to
+    analyze the memory image later.
+
+    The *-o memoryimage* option is required, and is used to name the output
+    file. If a single guest is captured, then the output is saved in the
+    *memoryimage* file. However, if multiple guests are captured, then their
+    images are saved in *memoryimage.ID* where *ID* is replaced with the
+    domain ID.
+
+    See also the section "MEMORY IMAGES" below.
+
 EXAMPLES
      # virt-uname
      f9x32kvm: Linux localhost.localdomain 2.6.24-0.155.rc7.git6.fc9 #1
@@ -100,35 +167,52 @@ EXAMPLES
      <6>Bluetooth: RFCOMM ver 1.8
      <7>eth0: no IPv6 routers present
 
+MEMORY IMAGES
+    All the tools can read dumped kernel images, using the common *-t
+    memoryimage* option. In addition you can capture memory images from
+    domains for post-mortem analysis using the "virt-mem capture" command
+    (see above).
+
+    The memory images which are saved by "virt-mem capture" contain a header
+    and some additional information about the kernel image, such as
+    architecture, original text address, and so forth. Thus these images can
+    be reanalysed just using the *-t memoryimage* option.
+
+    We also support analyzing raw kernel dumps, eg. produced using the
+    qemu(1) monitor's "memsave" command. In this case however you usually
+    need to specify the original architecture, text address and perhaps
+    other details using the *-A*, *-T* and other command line parameters.
+
 SHORTCOMINGS
     The virt-mem tools spy on the guest's memory image. There are some
     shortcomings to this, described here.
 
-    (1) Only works on specific, tested releases of Linux kernels. Support
-    for arbitrary Linux kernel versions may be patchy because of changes in
-    the internal structures used. Support for non-Linux kernels is currently
-    non-existent, and probably impossible for Windows because of lack of an
-    acceptable source license.
+    *   Only works on specific, tested releases of Linux kernels. Support
+        for arbitrary Linux kernel versions may be patchy because of changes
+        in the internal structures used. Support for non-Linux kernels is
+        currently non-existent, and probably impossible for Windows because
+        of lack of an acceptable source license.
 
-    (2) Heuristics are used which may mean in the worst case that the output
-    is wrong.
+    *   Heuristics are used which may mean in the worst case that the output
+        is wrong.
 
-    (3) Structures which are frequently modified may cause errors. This
-    could be a problem if, for example, the process table in the guest is
-    being rapidly updated.
+    *   Structures which are frequently modified may cause errors. This
+        could be a problem if, for example, the process table in the guest
+        is being rapidly updated.
 
-    (4) We have to scan memory to find kernel symbols, etc., which can be
-    quite slow. Optimizing the memory scanner would help, and caching the
-    base address of the symbol table(s) would make it dramatically faster.
+    *   We have to scan memory to find kernel symbols, etc., which can be
+        quite slow. Optimizing the memory scanner would help, and caching
+        the base address of the symbol table(s) would make it dramatically
+        faster.
 
 SECURITY
     The current code tries hard to be secure against malicious guests, for
     example guests which set up malicious kernel memory.
 
 SEE ALSO
-    uname(1), dmesg(1), virsh(1), xm(1), <http://www.libvirt.org/ocaml/>,
-    <http://www.libvirt.org/>, <http://et.redhat.com/~rjones/>,
-    <http://caml.inria.fr/>
+    uname(1), dmesg(1), virsh(1), virt-top(1), virt-df(1), xm(1), qemu(1),
+    <http://www.libvirt.org/ocaml/>, <http://www.libvirt.org/>,
+    <http://et.redhat.com/~rjones/>, <http://caml.inria.fr/>
 
 AUTHORS
     Richard W.M. Jones <rjones @ redhat . com>