Re: [Crash-utility] [PATCH] Add support for 'foreign' page sizes in kdump dumps
by Dave Anderson
----- "Bernhard Walle" <bwalle(a)suse.de> wrote:
> This affects only ppc64 and ia64 since that are the only architectures
> that have a page size that is configurable at runtime by the system (which means
> at boot by the kernel).
>
> It also only affects dumps of the formats diskdump (which includes kdump
> compressed dumps created by makedumpfile) and netdump (which includes kdump
> ELF dumps copied from /proc/vmcore without any filtering applied and created
> by makedumpfile with the -E option).
>
> The patch reads the page size from the diskdump header or from the VMCOREINFO
> in case of netdump (if it's there). For ia64 it also evaluates the page size
> of the zero page to *change* the page size. In the past id didn't change the
> page size, it only printed an error.
>
> The patch has been tested on ppc64 (4k vs. 64k), ia64 (16k vs. 64k) and x86-64
> (always 4k). It has been tested for compilation on i386, x86-64, ia64, PPC,
> ppc64, s390 and s390x. Everything on a SLES 11/openSUSE 11.1 code base.
>
>
> Signed-off-by: Bernhard Walle <bwalle(a)suse.de>
For starters, I've got a few issues with this patch (in addition to the earlier
diskdump.c question):
(1) Your patch would only work with 32-bit ELF kdumps since the vmcoreinfo_read_integer()
function is only called by dump_Elf32_Nhdr() -- and not by dump_Elf64_Nhdr().
I wouldn't think that ppc64 and ia64 could even create 32-bit ELF kdumps since
they would by definition have to truncate certain fields? I presume you either
forgot the 64-bit part of the patch, or maybe incorrectly put the code in the
wrong function?
(2) Even so, in the dump_Elf32_Nhdr() switch statement, you're taking over the
"0" case, whereas it used to be picked up by the "default" case -- which
currently dumps the vmcoreinfo data. Now that code can never be run, and
I don't want to give up that capability.
(3) I think I'd like to keep it forcibly segregated to ia64 and ppc64, instead of
letting the other architectures even call vmcoreinfo_read_integer(PAGESIZE).
I don't want to even allow a *remote* possibility of breaking things on the
other arches.
(4) vmcore_info_read_integer() shouldn't be called if the "store" paramter isn't set.
(5) Minor nit -- I'd just as soon leave any changes to ia64_init_hyper() to its
maintainer, especially since it makes no sense to make a follow-up call to
ia64_check_adjust_pagesize().
Thanks,
Dave
15 years, 10 months
[PATCH] Add support for 'foreign' page sizes in kdump dumps
by Bernhard Walle
This affects only ppc64 and ia64 since that are the only architectures
that have a page size that is configurable at runtime by the system (which means
at boot by the kernel).
It also only affects dumps of the formats diskdump (which includes kdump
compressed dumps created by makedumpfile) and netdump (which includes kdump
ELF dumps copied from /proc/vmcore without any filtering applied and created
by makedumpfile with the -E option).
The patch reads the page size from the diskdump header or from the VMCOREINFO
in case of netdump (if it's there). For ia64 it also evaluates the page size
of the zero page to *change* the page size. In the past id didn't change the
page size, it only printed an error.
The patch has been tested on ppc64 (4k vs. 64k), ia64 (16k vs. 64k) and x86-64
(always 4k). It has been tested for compilation on i386, x86-64, ia64, PPC,
ppc64, s390 and s390x. Everything on a SLES 11/openSUSE 11.1 code base.
Signed-off-by: Bernhard Walle <bwalle(a)suse.de>
4 files changed, 182 insertions(+), 92 deletions(-)
diskdump.c | 26 ++++------
ia64.c | 146 ++++++++++++++++++++++++++++--------------------------------
netdump.c | 100 +++++++++++++++++++++++++++++++++++++++++
netdump.h | 2
15 years, 10 months
Re: [Crash-utility] [PATCH] Fix segmentation fault
by Dave Anderson
----- "Bernhard Walle" <bwalle(a)suse.de> wrote:
> * Sachin P. Sant [2009-01-15 11:02]:
> >
> > Dave Anderson wrote:
> > > ----- "Bernhard Walle" <bwalle(a)suse.de> wrote:
> > >
> > >
> > >> * Executing crash without any parameter results in a segmentation fault.
> > >> * Add a NULL check for pc->orig_namelist to avoid the segmentation fault.
> > >>
> > >
> > > Huh?
> > >
> > > The crash utility's program_context structure doesn't even
> > > have an "orig_namelist" member.
> > >
> > > Is this perhaps a bug in the SUSE crash utility derivative?
> > >
> > >
> > Yup not a problem with upstream crash.
>
> Yes, my fault. I was too fast in sending not upstreamed patches upstream. :-|
>
> Explanation: I have some patch to read gzip'd kernels (mainly for
> ia64 /boot/vmlinuz and for x86 /boot/vmlinux.gz). That patch added the
> orig_namelist member. Because I extract the /boot/vmlinux.gz to a
> temporary file but need the orig_namelist to print out nice error
> messages.
>
> I always wanted to 'polish' that patch for upstream inclusion. Any
> interest in that feature? Then I would have some motivation to finally
> do. :-)
Not a bad idea -- just post the patch without the segmentation violation. ;-)
> I've chosen that temporary uncompression in favor to replace all reads
> and writes with zlib equivalents because it's just extremely less
> intrusive.
I agree. In fact during runtime the reads from the vmlinux file are
primarily done by the gdb module code, so it would have to be hacked
at both levels (crash and gdb).
Years ago I did tinker with using the zlib equivalents for accessing
the dumpfile compressed. But the gzseek()'s were so painfully slow
that it was pretty much unusable.
Dave
15 years, 10 months
Re: [Crash-utility] [PATCH] Fix segmentation fault
by Dave Anderson
----- "Bernhard Walle" <bwalle(a)suse.de> wrote:
> * Executing crash without any parameter results in a segmentation fault.
> * Add a NULL check for pc->orig_namelist to avoid the segmentation fault.
Huh?
The crash utility's program_context structure doesn't even
have an "orig_namelist" member.
Is this perhaps a bug in the SUSE crash utility derivative?
Dave
>
>
> Signed-off-by: Sachin Sant <sachinp(a)in.ibm.com>
> Acked-by: Bernhard Walle <bwalle(a)suse.de>
>
>
> 1 file changed, 3 insertions(+)
> symbols.c | 3 +++
>
>
>
> diff --git a/symbols.c b/symbols.c
> --- a/symbols.c
> +++ b/symbols.c
> @@ -266,6 +266,9 @@
> error(NOTE, "gnu_debuglink file: %s\ncrc32: %lx\n",
> contents, crc32);
>
> + if (pc->orig_namelist == NULL)
> + return FALSE;
> +
> if ((pc->debuginfo_file = (char *)
> malloc(((strlen(pc->namelist) + strlen("/.debug/") +
> + strlen(".debug") + strlen(" /usr/lib/debug/boot/ "))*10)
15 years, 10 months
Re: [Crash-utility] [PATCH] Increase limit for get_syment_array() call to 400
by Dave Anderson
----- "Bernhard Walle" <bwalle(a)suse.de> wrote:
> Because s390 kernel System.map contains symbols that repeat very often
>
> grep -c 'L2^B1$' System.map-2.6.27.7-4-default
> 276
>
> this patch increases the limit in the get_syment_array() call from
> 200 to 400. This is a workaround.
>
> Andreas Krebbel already worked to resolve the problem in binutils which prevents
> that symbols from being included in System.map.
> http://sourceware.org/ml/binutils/2009-01/msg00181.html
>
> However, since there are kernels (all 2.6.28 at least) out that contain that
> problem, we should also workaround that in crash in my opinion.
>
>
> Signed-off-by: Bernhard Walle <bwalle(a)suse.de>
>
>
> 1 file changed, 2 insertions(+), 2 deletions(-)
> symbols.c | 4 ++--
I don't like this patch, mainly because it's a waste of space to even
accept those types of symbols in the first place.
Instead they should be recognized and rejected in the s390_verify_symbol()
and s390x_verify_symbol() functions.
Dave
15 years, 10 months
Re: [Xen-devel] [PATCH] Support cross-bitness guest when core-dumping
by Isaku Yamahata
[CCed to Anderson, Oda and crash-utility ml]
Hi Bruce. Nice patch.
Could you please update the documentation about its format too?
docs/misc/dump-core-format.txt
- Elf header section, and
- revision history at the end of the file.
And what is the impact on the crash utility?
thanks,
On Wed, Jan 14, 2009 at 04:47:41PM -0700, Bruce Rogers wrote:
> This patch allows core-dumping to work on a cross-bit host/guest configuration, whereas previously that was not supported. It supports both PV and FV guests. The core file format generated by the host, needs to match that of the guest, so an alignment issue is addressed, along with the p2m frame list handling being done according to the guest size.
>
> Signed-off-by: Bruce Rogers <brogers(a)novell.com>
>
> diff -r 77476eeb8c42 tools/libxc/xc_core.c
> --- a/tools/libxc/xc_core.c Wed Jan 14 11:39:01 2009 +0000
> +++ b/tools/libxc/xc_core.c Wed Jan 14 16:40:17 2009 -0700
> @@ -57,9 +57,6 @@
>
> /* number of pages to write at a time */
> #define DUMP_INCREMENT (4 * 1024)
> -
> -/* Don't yet support cross-address-size core dump */
> -#define guest_width (sizeof (unsigned long))
>
> /* string table */
> struct xc_core_strtab {
> @@ -240,7 +237,7 @@ xc_core_ehdr_init(Elf64_Ehdr *ehdr)
> ehdr->e_ident[EI_ABIVERSION] = EV_CURRENT;
>
> ehdr->e_type = ET_CORE;
> - ehdr->e_machine = ELF_ARCH_MACHINE;
> + /* e_machine will be filled in later */
> ehdr->e_version = EV_CURRENT;
> ehdr->e_entry = 0;
> ehdr->e_phoff = 0;
> @@ -359,7 +356,8 @@ elfnote_dump_core_header(
> }
>
> static int
> -elfnote_dump_xen_version(void *args, dumpcore_rtn_t dump_rtn, int xc_handle)
> +elfnote_dump_xen_version(void *args, dumpcore_rtn_t dump_rtn, int xc_handle,
> + unsigned int guest_width)
> {
> int sts;
> struct elfnote elfnote;
> @@ -371,6 +369,12 @@ elfnote_dump_xen_version(void *args, dum
> elfnote.descsz = sizeof(xen_version);
> elfnote.type = XEN_ELFNOTE_DUMPCORE_XEN_VERSION;
> elfnote_fill_xen_version(xc_handle, &xen_version);
> + if (guest_width < sizeof(unsigned long))
> + {
> + // 32 bit elf file format differs in pagesize's alignment
> + char *p = (char *)&xen_version.pagesize;
> + memmove(p - 4, p, sizeof(xen_version.pagesize));
> + }
> sts = dump_rtn(args, (char*)&elfnote, sizeof(elfnote));
> if ( sts != 0 )
> return sts;
> @@ -396,6 +400,24 @@ elfnote_dump_format_version(void *args,
> return dump_rtn(args, (char*)&format_version, sizeof(format_version));
> }
>
> +static int
> +get_guest_width(int xc_handle,
> + uint32_t domid,
> + unsigned int *guest_width)
> +{
> + DECLARE_DOMCTL;
> +
> + memset(&domctl, 0, sizeof(domctl));
> + domctl.domain = domid;
> + domctl.cmd = XEN_DOMCTL_get_address_size;
> +
> + if ( do_domctl(xc_handle, &domctl) != 0 )
> + return 1;
> +
> + *guest_width = domctl.u.address_size.size / 8;
> + return 0;
> +}
> +
> int
> xc_domain_dumpcore_via_callback(int xc_handle,
> uint32_t domid,
> @@ -403,7 +425,8 @@ xc_domain_dumpcore_via_callback(int xc_h
> dumpcore_rtn_t dump_rtn)
> {
> xc_dominfo_t info;
> - shared_info_t *live_shinfo = NULL;
> + shared_info_any_t *live_shinfo = NULL;
> + unsigned int guest_width;
>
> int nr_vcpus = 0;
> char *dump_mem, *dump_mem_start = NULL;
> @@ -437,6 +460,12 @@ xc_domain_dumpcore_via_callback(int xc_h
> uint16_t strtab_idx;
> struct xc_core_section_headers *sheaders = NULL;
> Elf64_Shdr *shdr;
> +
> + if ( get_guest_width(xc_handle, domid, &guest_width) != 0 )
> + {
> + PERROR("Could not get address size for domain");
> + return sts;
> + }
>
> xc_core_arch_context_init(&arch_ctxt);
> if ( (dump_mem_start = malloc(DUMP_INCREMENT*PAGE_SIZE)) == NULL )
> @@ -500,7 +529,7 @@ xc_domain_dumpcore_via_callback(int xc_h
> goto out;
> }
>
> - sts = xc_core_arch_map_p2m(xc_handle, &info, live_shinfo,
> + sts = xc_core_arch_map_p2m(xc_handle, guest_width, &info, live_shinfo,
> &p2m, &p2m_size);
> if ( sts != 0 )
> goto out;
> @@ -676,6 +705,7 @@ xc_domain_dumpcore_via_callback(int xc_h
> /* write out elf header */
> ehdr.e_shnum = sheaders->num;
> ehdr.e_shstrndx = strtab_idx;
> + ehdr.e_machine = ELF_ARCH_MACHINE;
> sts = dump_rtn(args, (char*)&ehdr, sizeof(ehdr));
> if ( sts != 0 )
> goto out;
> @@ -697,7 +727,7 @@ xc_domain_dumpcore_via_callback(int xc_h
> goto out;
>
> /* elf note section: xen version */
> - sts = elfnote_dump_xen_version(args, dump_rtn, xc_handle);
> + sts = elfnote_dump_xen_version(args, dump_rtn, xc_handle, guest_width);
> if ( sts != 0 )
> goto out;
>
> @@ -757,9 +787,21 @@ xc_domain_dumpcore_via_callback(int xc_h
>
> if ( !auto_translated_physmap )
> {
> - gmfn = p2m[i];
> - if ( gmfn == INVALID_P2M_ENTRY )
> - continue;
> + if ( guest_width >= sizeof(unsigned long) )
> + {
> + if ( guest_width == sizeof(unsigned long) )
> + gmfn = p2m[i];
> + else
> + gmfn = ((uint64_t *)p2m)[i];
> + if ( gmfn == INVALID_P2M_ENTRY )
> + continue;
> + }
> + else
> + {
> + gmfn = ((uint32_t *)p2m)[i];
> + if ( gmfn == (uint32_t)INVALID_P2M_ENTRY )
> + continue;
> + }
>
> p2m_array[j].pfn = i;
> p2m_array[j].gmfn = gmfn;
> @@ -802,7 +844,7 @@ copy_done:
> /* When live dump-mode (-L option) is specified,
> * guest domain may reduce memory. pad with zero pages.
> */
> - IPRINTF("j (%ld) != nr_pages (%ld)", j , nr_pages);
> + IPRINTF("j (%ld) != nr_pages (%ld)", j, nr_pages);
> memset(dump_mem_start, 0, PAGE_SIZE);
> for (; j < nr_pages; j++) {
> sts = dump_rtn(args, dump_mem_start, PAGE_SIZE);
> @@ -891,7 +933,7 @@ xc_domain_dumpcore(int xc_handle,
> struct dump_args da;
> int sts;
>
> - if ( (da.fd = open(corename, O_CREAT|O_RDWR, S_IWUSR|S_IRUSR)) < 0 )
> + if ( (da.fd = open(corename, O_CREAT|O_RDWR|O_TRUNC, S_IWUSR|S_IRUSR)) < 0 )
> {
> PERROR("Could not open corefile %s", corename);
> return -errno;
> diff -r 77476eeb8c42 tools/libxc/xc_core.h
> --- a/tools/libxc/xc_core.h Wed Jan 14 11:39:01 2009 +0000
> +++ b/tools/libxc/xc_core.h Wed Jan 14 16:40:17 2009 -0700
> @@ -136,12 +136,12 @@ struct xc_core_arch_context;
> struct xc_core_arch_context;
> int xc_core_arch_memory_map_get(int xc_handle,
> struct xc_core_arch_context *arch_ctxt,
> - xc_dominfo_t *info, shared_info_t *live_shinfo,
> + xc_dominfo_t *info, shared_info_any_t *live_shinfo,
> xc_core_memory_map_t **mapp,
> unsigned int *nr_entries);
> -int xc_core_arch_map_p2m(int xc_handle, xc_dominfo_t *info,
> - shared_info_t *live_shinfo, xen_pfn_t **live_p2m,
> - unsigned long *pfnp);
> +int xc_core_arch_map_p2m(int xc_handle, unsigned int guest_width,
> + xc_dominfo_t *info, shared_info_any_t *live_shinfo,
> + xen_pfn_t **live_p2m, unsigned long *pfnp);
>
>
> #if defined (__i386__) || defined (__x86_64__)
> diff -r 77476eeb8c42 tools/libxc/xc_core_ia64.c
> --- a/tools/libxc/xc_core_ia64.c Wed Jan 14 11:39:01 2009 +0000
> +++ b/tools/libxc/xc_core_ia64.c Wed Jan 14 16:40:17 2009 -0700
> @@ -235,7 +235,7 @@ old:
> }
>
> int
> -xc_core_arch_map_p2m(int xc_handle, xc_dominfo_t *info,
> +xc_core_arch_map_p2m(int xc_handle, unsigned int guest_width, xc_dominfo_t *info,
> shared_info_t *live_shinfo, xen_pfn_t **live_p2m,
> unsigned long *pfnp)
> {
> diff -r 77476eeb8c42 tools/libxc/xc_core_x86.c
> --- a/tools/libxc/xc_core_x86.c Wed Jan 14 11:39:01 2009 +0000
> +++ b/tools/libxc/xc_core_x86.c Wed Jan 14 16:40:17 2009 -0700
> @@ -20,9 +20,25 @@
>
> #include "xg_private.h"
> #include "xc_core.h"
> +#include "xc_e820.h"
>
> -/* Don't yet support cross-address-size core dump */
> -#define guest_width (sizeof (unsigned long))
> +#define GET_FIELD(_p, _f) ((guest_width==8) ? ((_p)->x64._f) : ((_p)->x32._f))
> +
> +#ifndef MAX
> +#define MAX(_a, _b) ((_a) >= (_b) ? (_a) : (_b))
> +#endif
> +
> +int
> +xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt,
> + unsigned long pfn)
> +{
> + if ((pfn >= 0xa0 && pfn < 0xc0) /* VGA hole */
> + || (pfn >= (HVM_BELOW_4G_MMIO_START >> PAGE_SHIFT)
> + && pfn < (1ULL<<32) >> PAGE_SHIFT)) /* MMIO */
> + return 0;
> + return 1;
> +}
> +
>
> static int nr_gpfns(int xc_handle, domid_t domid)
> {
> @@ -37,7 +53,7 @@ xc_core_arch_auto_translated_physmap(con
>
> int
> xc_core_arch_memory_map_get(int xc_handle, struct xc_core_arch_context *unused,
> - xc_dominfo_t *info, shared_info_t *live_shinfo,
> + xc_dominfo_t *info, shared_info_any_t *live_shinfo,
> xc_core_memory_map_t **mapp,
> unsigned int *nr_entries)
> {
> @@ -60,17 +76,22 @@ xc_core_arch_memory_map_get(int xc_handl
> }
>
> int
> -xc_core_arch_map_p2m(int xc_handle, xc_dominfo_t *info,
> - shared_info_t *live_shinfo, xen_pfn_t **live_p2m,
> +xc_core_arch_map_p2m(int xc_handle, unsigned int guest_width, xc_dominfo_t *info,
> + shared_info_any_t *live_shinfo, xen_pfn_t **live_p2m,
> unsigned long *pfnp)
> {
> /* Double and single indirect references to the live P2M table */
> xen_pfn_t *live_p2m_frame_list_list = NULL;
> xen_pfn_t *live_p2m_frame_list = NULL;
> + /* Copies of the above. */
> + xen_pfn_t *p2m_frame_list_list = NULL;
> + xen_pfn_t *p2m_frame_list = NULL;
> +
> uint32_t dom = info->domid;
> unsigned long p2m_size = nr_gpfns(xc_handle, info->domid);
> int ret = -1;
> int err;
> + int i;
>
> if ( p2m_size < info->nr_pages )
> {
> @@ -80,7 +101,7 @@ xc_core_arch_map_p2m(int xc_handle, xc_d
>
> live_p2m_frame_list_list =
> xc_map_foreign_range(xc_handle, dom, PAGE_SIZE, PROT_READ,
> - live_shinfo->arch.pfn_to_mfn_frame_list_list);
> + GET_FIELD(live_shinfo, arch.pfn_to_mfn_frame_list_list));
>
> if ( !live_p2m_frame_list_list )
> {
> @@ -88,9 +109,28 @@ xc_core_arch_map_p2m(int xc_handle, xc_d
> goto out;
> }
>
> + /* Get a local copy of the live_P2M_frame_list_list */
> + if ( !(p2m_frame_list_list = malloc(PAGE_SIZE)) )
> + {
> + ERROR("Couldn't allocate p2m_frame_list_list array");
> + goto out;
> + }
> + memcpy(p2m_frame_list_list, live_p2m_frame_list_list, PAGE_SIZE);
> +
> + /* Canonicalize guest's unsigned long vs ours */
> + if ( guest_width > sizeof(unsigned long) )
> + for ( i = 0; i < PAGE_SIZE/sizeof(unsigned long); i++ )
> + if ( i < PAGE_SIZE/guest_width )
> + p2m_frame_list_list[i] = ((uint64_t *)p2m_frame_list_list)[i];
> + else
> + p2m_frame_list_list[i] = 0;
> + else if ( guest_width < sizeof(unsigned long) )
> + for ( i = PAGE_SIZE/sizeof(unsigned long) - 1; i >= 0; i-- )
> + p2m_frame_list_list[i] = ((uint32_t *)p2m_frame_list_list)[i];
> +
> live_p2m_frame_list =
> xc_map_foreign_pages(xc_handle, dom, PROT_READ,
> - live_p2m_frame_list_list,
> + p2m_frame_list_list,
> P2M_FLL_ENTRIES);
>
> if ( !live_p2m_frame_list )
> @@ -99,8 +139,25 @@ xc_core_arch_map_p2m(int xc_handle, xc_d
> goto out;
> }
>
> + /* Get a local copy of the live_P2M_frame_list */
> + if ( !(p2m_frame_list = malloc(P2M_TOOLS_FL_SIZE)) )
> + {
> + ERROR("Couldn't allocate p2m_frame_list array");
> + goto out;
> + }
> + memset(p2m_frame_list, 0, P2M_TOOLS_FL_SIZE);
> + memcpy(p2m_frame_list, live_p2m_frame_list, P2M_GUEST_FL_SIZE);
> +
> + /* Canonicalize guest's unsigned long vs ours */
> + if ( guest_width > sizeof(unsigned long) )
> + for ( i = 0; i < P2M_FL_ENTRIES; i++ )
> + p2m_frame_list[i] = ((uint64_t *)p2m_frame_list)[i];
> + else if ( guest_width < sizeof(unsigned long) )
> + for ( i = P2M_FL_ENTRIES - 1; i >= 0; i-- )
> + p2m_frame_list[i] = ((uint32_t *)p2m_frame_list)[i];
> +
> *live_p2m = xc_map_foreign_pages(xc_handle, dom, PROT_READ,
> - live_p2m_frame_list,
> + p2m_frame_list,
> P2M_FL_ENTRIES);
>
> if ( !*live_p2m )
> @@ -122,6 +179,12 @@ out:
> if ( live_p2m_frame_list )
> munmap(live_p2m_frame_list, P2M_FLL_ENTRIES * PAGE_SIZE);
>
> + if ( p2m_frame_list_list )
> + free(p2m_frame_list_list);
> +
> + if ( p2m_frame_list )
> + free(p2m_frame_list);
> +
> errno = err;
> return ret;
> }
> diff -r 77476eeb8c42 tools/libxc/xc_core_x86.h
> --- a/tools/libxc/xc_core_x86.h Wed Jan 14 11:39:01 2009 +0000
> +++ b/tools/libxc/xc_core_x86.h Wed Jan 14 16:40:17 2009 -0700
> @@ -21,15 +21,8 @@
> #ifndef XC_CORE_X86_H
> #define XC_CORE_X86_H
>
> -#if defined(__i386__) || defined(__x86_64__)
> #define ELF_ARCH_DATA ELFDATA2LSB
> -#if defined (__i386__)
> -# define ELF_ARCH_MACHINE EM_386
> -#else
> -# define ELF_ARCH_MACHINE EM_X86_64
> -#endif
> -#endif /* __i386__ or __x86_64__ */
> -
> +#define ELF_ARCH_MACHINE (guest_width == 8 ? EM_X86_64 : EM_386)
>
> struct xc_core_arch_context {
> /* nothing */
> @@ -40,8 +33,10 @@ struct xc_core_arch_context {
> #define xc_core_arch_context_get(arch_ctxt, ctxt, xc_handle, domid) \
> (0)
> #define xc_core_arch_context_dump(arch_ctxt, args, dump_rtn) (0)
> -#define xc_core_arch_gpfn_may_present(arch_ctxt, i) (1)
>
> +int
> +xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt,
> + unsigned long pfn);
> static inline int
> xc_core_arch_context_get_shdr(struct xc_core_arch_context *arch_ctxt,
> struct xc_core_section_headers *sheaders,
> _______________________________________________
> Xen-devel mailing list
> Xen-devel(a)lists.xensource.com
> http://lists.xensource.com/xen-devel
--
yamahata
15 years, 10 months
Re: [Crash-utility] [PATCH] Fix ps -l buffer overflow problem
by Dave Anderson
----- "Jeff Moyer" <jmoyer(a)redhat.com> wrote:
> Bernhard Walle <bwalle(a)suse.de> writes:
>
> > That should also go mainline.
> >
> >
> > Signed-off-by : Sachin Sant <sachinp(a)in.ibm.com>
> > Acked-by: Bernhard Walle <bwalle(a)suse.de>
> >
> >
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> > task.c | 2 +-
> >
> >
> > That should also go mainline.
> >
> >
> > Signed-off-by : Sachin Sant <sachinp(a)in.ibm.com>
> > Acked-by: Bernhard Walle <bwalle(a)suse.de>
> >
> > diff --git a/task.c b/task.c
> > --- a/task.c
> > +++ b/task.c
> > @@ -2902,7 +2902,7 @@
> > {
> > int i, c;
> > struct task_context *tcp;
> > - char format[10];
> > + char format[15];
>
>
> c = strlen(buf);
> sprintf(format, "[%c%dll%c] ", '%', c,
> pc->output_radix == 10 ? 'u' : 'x');
>
> Looks like it should be 11, no? You have 6 characters + '\0' + the %d,
> which can be up to 1500 (BUFSIZE). Of course, it wouldn't kill us to
> use snprintf, either.
You're right, it can only be a maximum of 11 bytes, i.e., either "[%20llu] "
(decimal) or "[%16llx] " (hex), plus their trailing NULLs. It's apparently
worked OK by dumb luck by putting the NULL either in the stack variable location
of the preceding "tcp" pointer or the "buf[BUFSIZE]" array (I guess???), which
as it turns out, is safe to do.
Anyway I'll bump it up...
Thanks,
Dave
15 years, 10 months
[PATCH] Fix ps -l buffer overflow problem
by Bernhard Walle
That should also go mainline.
Signed-off-by : Sachin Sant <sachinp(a)in.ibm.com>
Acked-by: Bernhard Walle <bwalle(a)suse.de>
1 file changed, 1 insertion(+), 1 deletion(-)
task.c | 2 +-
15 years, 10 months
[PATCH] Fix segmentation fault
by Bernhard Walle
* Executing crash without any parameter results in a segmentation fault.
* Add a NULL check for pc->orig_namelist to avoid the segmentation fault.
Signed-off-by: Sachin Sant <sachinp(a)in.ibm.com>
Acked-by: Bernhard Walle <bwalle(a)suse.de>
1 file changed, 3 insertions(+)
symbols.c | 3 +++
15 years, 10 months
[PATCH] Increase limit for get_syment_array() call to 400
by Bernhard Walle
Because s390 kernel System.map contains symbols that repeat very often
grep -c 'L2^B1$' System.map-2.6.27.7-4-default
276
this patch increases the limit in the get_syment_array() call from
200 to 400. This is a workaround.
Andreas Krebbel already worked to resolve the problem in binutils which prevents
that symbols from being included in System.map.
http://sourceware.org/ml/binutils/2009-01/msg00181.html
However, since there are kernels (all 2.6.28 at least) out that contain that
problem, we should also workaround that in crash in my opinion.
Signed-off-by: Bernhard Walle <bwalle(a)suse.de>
1 file changed, 2 insertions(+), 2 deletions(-)
symbols.c | 4 ++--
15 years, 10 months