|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4 of 4] KEXEC: Introduce new crashtables interface
>>> On 09.03.12 at 15:42, Andrew Cooper <andrew.cooper3@xxxxxxxxxx> wrote:
> --- a/xen/common/kexec.c
> +++ b/xen/common/kexec.c
> @@ -82,6 +85,21 @@ paddr_t crashinfo_maxaddr_bits = 64;
> /* Pointers to keep track of the crash heap region. */
> static void *crash_heap_current = NULL, *crash_heap_end = NULL;
>
> +char * StringTab = NULL;
> +size_t StringTabSize = 0;
static? Naming convention?
> +
> +static val64tab_t ValTab[] =
const? Naming convention?
> +{
> + { XEN_VALTAB_TOP_OF_MEM, 0 },
> + { XEN_VALTAB_CONRING_SIZE, 0 }
> +};
> +
> +static sym64tab_t SymTab[] =
const? Naming convention?
> +{
> + { XEN_SYMTAB_CONRING, 0 }
> +};
> +
> +
> /*
> * Parse command lines in the format
> *
> @@ -262,12 +280,116 @@ void kexec_crash_save_cpu(void)
> elf_core_save_regs(&prstatus->pr_reg, xencore);
> }
>
> +/* Round val up to a machine word alignment */
> +size_t round_up(size_t val)
> +{
> + return ((val + (sizeof(unsigned long)-1)) &
> + ~((sizeof (unsigned long))-1));
> +}
> +
> +
> +extern xen_commandline_t saved_cmdline;
> +static int setup_stringtable(void)
> +{
> + char * ptr;
> + size_t sl = sizeof(unsigned long);
> +
> +#define STRING(x) #x
> +#define INT2STR(x) STRING(x)
> +
> +#define XEN_STR_VERSION INT2STR(XEN_VERSION) "." INT2STR(XEN_SUBVERSION) \
> + XEN_EXTRAVERSION
> +#define XEN_STR_COMPILED_BY XEN_COMPILE_BY "@" XEN_COMPILE_HOST "." \
> + XEN_COMPILE_DOMAIN
> +
> + size_t size =
> + sl + round_up(sizeof(XEN_STR_VERSION)) +
> + sl + round_up(sizeof(XEN_CHANGESET)) +
> + sl + round_up(sizeof(XEN_COMPILE_DATE)) +
> + sl + round_up(sizeof(XEN_STR_COMPILED_BY)) +
> + sl + round_up(sizeof(XEN_COMPILER)) +
> + sl + round_up(strlen(saved_cmdline)+1);
> +
> + StringTab = xmalloc_bytes(size);
> + if ( ! StringTab )
> + return -ENOMEM;
> +
> + StringTabSize = size;
> + memset(StringTab, 0, size);
> +
> + ptr = StringTab;
> +
> +#define WRITE_STRTAB_ENTRY_CONST(v, s) \
> + *(unsigned long*)ptr = (v); ptr += sl; \
> + memcpy(ptr, s, sizeof(s)); ptr += round_up(sizeof(s))
> +
> +#define WRITE_STRTAB_ENTRY_VAR(v, s) \
> + *(unsigned long*)ptr = (v); ptr += sl; \
> + memcpy(ptr, s, strlen(s)); ptr += round_up(strlen(s)+1)
> +
> + WRITE_STRTAB_ENTRY_CONST(XEN_STRINGTAB_VERSION, XEN_STR_VERSION);
> + WRITE_STRTAB_ENTRY_CONST(XEN_STRINGTAB_CSET, XEN_CHANGESET);
> + WRITE_STRTAB_ENTRY_CONST(XEN_STRINGTAB_COMPILE_DATE, XEN_COMPILE_DATE);
> + WRITE_STRTAB_ENTRY_CONST(XEN_STRINGTAB_COMPILED_BY, XEN_STR_COMPILED_BY);
> + WRITE_STRTAB_ENTRY_CONST(XEN_STRINGTAB_COMPILER, XEN_COMPILER);
> + WRITE_STRTAB_ENTRY_VAR(XEN_STRINGTAB_CMDLINE, saved_cmdline);
> +
> +#undef WRITE_STRTAB_ENTRY_VAR
> +#undef WRITE_STRTAB_ENTRY_CONST
> +#undef XEN_STR_COMPILED_BY
> +#undef XEN_STR_VERSION
> +#undef INT2STR
> +#undef STRING
> +
> + return 0;
> +}
> +
> +static void write_val64tab(void)
> +{
> + int i;
> + for ( i=0; i<ARRAY_SIZE(ValTab); ++i )
> + {
> + switch( ValTab[i].id )
> + {
> + case XEN_VALTAB_TOP_OF_MEM:
> + ValTab[i].val = (uint64_t)top_of_mem;
> + break;
> + case XEN_VALTAB_CONRING_SIZE:
> + ValTab[i].val = (uint64_t)conring_size;
> + break;
> + default:
> + printk(XENLOG_WARNING "Unrecognised ValTab ID 0x%016"PRIx64"\n",
> + ValTab[i].id);
Sorry, but this is a BUG() or an ASSERT(), but not a warning.
> + break;
> + }
> + }
> +}
> +
> +static void write_sym64tab(void)
> +{
> + int i;
> + for ( i=0; i<ARRAY_SIZE(SymTab); ++i )
> + {
> + switch( SymTab[i].id )
> + {
> + case XEN_SYMTAB_CONRING:
> + SymTab[i].addr = (uint64_t)__pa(conring);
> + break;
> + default:
> + printk(XENLOG_WARNING "Unrecognised SymTab ID 0x%016"PRIx64"\n",
> + SymTab[i].id);
Same here.
> + break;
> + }
> + }
> +}
> +
> /* Set up the single Xen-specific-info crash note. */
> crash_xen_info_t *kexec_crash_save_info(void)
> {
> int cpu = smp_processor_id();
> crash_xen_info_t info;
> crash_xen_info_t *out = (crash_xen_info_t *)ELFNOTE_DESC(xen_crash_note);
> + char * details;
>
> BUG_ON(!cpumask_test_and_set_cpu(cpu, &crash_saved_cpus));
>
> @@ -284,6 +406,17 @@ crash_xen_info_t *kexec_crash_save_info(
> /* Copy from guaranteed-aligned local copy to possibly-unaligned dest. */
> memcpy(out, &info, sizeof(info));
>
> + details = ELFNOTE_DESC(xen_stringtab);
> + memcpy(details, StringTab, StringTabSize);
> +
> + details = ELFNOTE_DESC(xen_valtab);
> + write_val64tab();
> + memcpy(details, ValTab, sizeof(ValTab));
> +
> + details = ELFNOTE_DESC(xen_symtab);
> + write_sym64tab();
> + memcpy(details, SymTab, sizeof(SymTab));
> +
> return out;
> }
>
> @@ -365,7 +498,10 @@ static size_t sizeof_cpu_notes(const uns
> /* CPU0 also presents the crash_xen_info note. */
> if ( ! cpu )
> bytes = bytes +
> - sizeof_note("Xen", sizeof(crash_xen_info_t));
> + sizeof_note("Xen", sizeof(crash_xen_info_t)) +
> + sizeof_note("Xen", StringTabSize) +
> + sizeof_note("Xen", sizeof(ValTab)) +
> + sizeof_note("Xen", sizeof(SymTab));
>
> return bytes;
> }
> @@ -449,6 +585,21 @@ static int kexec_init_cpu_notes(const un
> xen_crash_note = note = ELFNOTE_NEXT(note);
> setup_note(note, "Xen", XEN_ELFNOTE_CRASH_INFO,
> sizeof(crash_xen_info_t));
> +
> + /* Set up Xen StringTab note. */
> + xen_stringtab = note = ELFNOTE_NEXT(note);
> + setup_note(note, "Xen", XEN_CRASHTABLE_STRINGTAB,
> + StringTabSize);
> +
> + /* Set up Xen ValTab note. */
> + xen_valtab = note = ELFNOTE_NEXT(note);
> + setup_note(note, "Xen", XEN_CRASHTABLE_VAL64TAB,
> + sizeof(ValTab));
> +
> + /* Set up Xen SymTab note. */
> + xen_symtab = note = ELFNOTE_NEXT(note);
> + setup_note(note, "Xen", XEN_CRASHTABLE_SYM64TAB,
> + sizeof(SymTab));
> }
> }
> }
> @@ -505,6 +656,9 @@ static int __init kexec_init(void)
>
> register_keyhandler('C', &crashdump_trigger_keyhandler);
>
> + if ( setup_stringtable() )
> + return -ENOMEM;
Given that this is an extension, I don't think failing to set this up
should be fatal in any way. Just don't write those new notes when
you can't set them up.
> +
> if ( low_crashinfo_mode > LOW_CRASHINFO_NONE )
> {
> size_t crash_heap_size;
> --- a/xen/drivers/char/console.c
> +++ b/xen/drivers/char/console.c
> @@ -59,8 +59,8 @@ size_param("conring_size", opt_conring_s
> #define _CONRING_SIZE 16384
> #define CONRING_IDX_MASK(i) ((i)&(conring_size-1))
> static char __initdata _conring[_CONRING_SIZE];
> -static char *__read_mostly conring = _conring;
> -static uint32_t __read_mostly conring_size = _CONRING_SIZE;
> +char *__read_mostly conring = _conring;
> +uint32_t __read_mostly conring_size = _CONRING_SIZE;
Please don't. If anything, add a call into this file to have the note
fields filled.
> static uint32_t conringc, conringp;
>
> static int __read_mostly sercon_handle = -1;
> --- /dev/null
> +++ b/xen/include/public/crashtables.h
> @@ -0,0 +1,77 @@
> +/******************************************************************************
> + * crashtables.h
> + *
> + * Definitions used for the Xen ELF crash notes.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> copy
> + * of this software and associated documentation files (the "Software"), to
> + * deal in the Software without restriction, including without limitation the
> + * rights to use, copy, modify, merge, publish, distribute, sublicense,
> and/or
> + * sell copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + *
> + * Copyright (c) 2011,2012 Andrew Cooper, Citrix Ltd.
> + */
> +
> +#ifndef __XEN_PUBLIC_CRASHTABLES_H__
> +#define __XEN_PUBLIC_CRASHTABLES_H__
> +
> +#include "xen.h"
> +
> +/*
> + * Xen string crash table.
> + * Note is a list in the form of:
> + * Machine word (32/64bit) String ID.
> + * Null terminating string, 0-extended to word alignment.
> + */
> +#define XEN_CRASHTABLE_STRINGTAB 0x3000000
The number looks as if it wasn't picked arbitrarily, so a comment should
say what it was derived from. Or if it is truly (and compatibly) arbitrary,
imo this should be stated here too.
> +
> +#define XEN_STRINGTAB_VERSION 0
> +#define XEN_STRINGTAB_CSET 1
> +#define XEN_STRINGTAB_COMPILE_DATE 2
> +#define XEN_STRINGTAB_COMPILED_BY 3
> +#define XEN_STRINGTAB_COMPILER 4
> +#define XEN_STRINGTAB_CMDLINE 5
> +
> +/*
> + * Xen value crash table.
> + * Note is a list in the form of:
> + * Machine word (32/64bit) Value ID.
> + * 64bit value.
> + */
> +#define XEN_CRASHTABLE_VAL64TAB 0x3000001
> +
> +typedef struct { unsigned long id; uint64_t val; } val64tab_t;
You're saying you're doing this to improve 32-/64-bit interaction. How
is using 'unsigned long' here (and below) fitting into this picture?
> +
> +#define XEN_VALTAB_TOP_OF_MEM 0
> +#define XEN_VALTAB_CONRING_SIZE 1
> +
> +/*
> + * Xen symbol crash table
> + * Note is a list in the form of:
> + * Machine word (32/64bit) Symbol ID.
> + * Symbol Address (64bit pointers).
> + */
> +#define XEN_CRASHTABLE_SYM64TAB 0x3000002
> +
> +typedef struct { unsigned long id; uint64_t addr; } sym64tab_t;
> +
> +#define XEN_SYMTAB_CONRING 0
> +
> +
> +#endif /* __XEN_PUBLIC_CRASHTABLES_H__ */
> +
> +/*
> +TODO: reintroduce local vars here. emacs doesn't get on well with patch
> files claiming to be C files
> + */
???
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |