All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Andreas Färber" <afaerber@suse.de>
To: Jens Freimann <jfrei@linux.vnet.ibm.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>,
	Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>,
	Alexander Graf <agraf@suse.de>,
	qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH v3] s390: Implement dump-guest-memory support for target s390x
Date: Tue, 25 Jun 2013 17:39:34 +0200	[thread overview]
Message-ID: <51C9B9B6.5050801@suse.de> (raw)
In-Reply-To: <1372155462-22001-1-git-send-email-jfrei@linux.vnet.ibm.com>

Hi Jens,

Am 25.06.2013 12:17, schrieb Jens Freimann:
> With this patch dump-guest-memory on s390 produces an ELF formatted,
> crash-readable dump.
> In order to implement this, the arch-specific part of dump-guest-memory
> was added:
> target-s390x/arch_dump.c contains the whole set of function for writing
> Elf note sections of all types for s390x.
> 
> Signed-off-by: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>

Just some more nitpicks...

> ---
>  include/elf.h              |   6 ++
>  target-s390x/Makefile.objs |   2 +-
>  target-s390x/arch_dump.c   | 229 +++++++++++++++++++++++++++++++++++++++++++++
>  target-s390x/cpu-qom.h     |   5 +
>  target-s390x/cpu.c         |   4 +
>  5 files changed, 245 insertions(+), 1 deletion(-)
>  create mode 100644 target-s390x/arch_dump.c
> 
> diff --git a/include/elf.h b/include/elf.h
> index cf0d3e2..58bfbf8 100644
> --- a/include/elf.h
> +++ b/include/elf.h
> @@ -1348,11 +1348,17 @@ typedef struct elf64_shdr {
>  
>  /* Notes used in ET_CORE */
>  #define NT_PRSTATUS	1
> +#define NT_FPREGSET     2
>  #define NT_PRFPREG	2
>  #define NT_PRPSINFO	3
>  #define NT_TASKSTRUCT	4
>  #define NT_AUXV		6
>  #define NT_PRXFPREG     0x46e62b7f      /* copied from gdb5.1/include/elf/common.h */
> +#define NT_S390_PREFIX  0x305           /* s390 prefix register */
> +#define NT_S390_CTRS    0x304           /* s390 control registers */
> +#define NT_S390_TODPREG 0x303           /* s390 TOD programmable register */
> +#define NT_S390_TODCMP  0x302           /* s390 TOD clock comparator register */
> +#define NT_S390_TIMER   0x301           /* s390 timer register */
>  
>  
>  /* Note header in a PT_NOTE section */
> diff --git a/target-s390x/Makefile.objs b/target-s390x/Makefile.objs
> index 4e63417..c34f654 100644
> --- a/target-s390x/Makefile.objs
> +++ b/target-s390x/Makefile.objs
> @@ -1,4 +1,4 @@
>  obj-y += translate.o helper.o cpu.o interrupt.o
>  obj-y += int_helper.o fpu_helper.o cc_helper.o mem_helper.o misc_helper.o
> -obj-$(CONFIG_SOFTMMU) += ioinst.o
> +obj-$(CONFIG_SOFTMMU) += ioinst.o arch_dump.o
>  obj-$(CONFIG_KVM) += kvm.o
> diff --git a/target-s390x/arch_dump.c b/target-s390x/arch_dump.c
> new file mode 100644
> index 0000000..df95e46
> --- /dev/null
> +++ b/target-s390x/arch_dump.c
> @@ -0,0 +1,229 @@
> +/*
> + * writing ELF notes for s390x arch
> + *
> + *
> + * Copyright IBM Corp. 2012, 2013
> + *
> + *     Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include "cpu.h"
> +#include "elf.h"
> +#include "exec/cpu-all.h"
> +#include "sysemu/dump.h"
> +#include "sysemu/kvm.h"
> +
> +
> +struct s390x_user_regs_struct {
> +    uint64_t        psw[2];
> +    uint64_t        gprs[16];
> +    uint32_t        acrs[16];
> +} QEMU_PACKED;
> +
> +typedef struct s390x_user_regs_struct s390x_user_regs;

Are these copied from the kernel or somewhere? QEMU expects CamelCase
for both struct and typedef.

> +
> +struct s390x_elf_prstatus_struct {
> +    uint8_t pad1[32];
> +    uint32_t pid;
> +    uint8_t pad2[76];
> +    s390x_user_regs regs;
> +    uint8_t pad3[16];
> +} QEMU_PACKED;
> +
> +typedef struct s390x_elf_prstatus_struct s390x_elf_prstatus;
> +
> +struct s390x_elf_fpregset_struct {
> +        uint32_t        fpc;
> +        uint32_t        pad;
> +        uint64_t        fprs[16];

Indentation?

> +} QEMU_PACKED;
> +
> +typedef struct s390x_elf_fpregset_struct s390x_elf_fpregset;
> +
> +    typedef struct note_struct {
> +        Elf64_Nhdr hdr;
> +        char name[5];
> +        char pad3[3];
> +        union {
> +            s390x_elf_prstatus prstatus;
> +            s390x_elf_fpregset fpregset;
> +            uint32_t prefix;
> +            uint64_t timer;
> +            uint64_t todcmp;
> +            uint32_t todpreg;
> +            uint64_t ctrs[16];
> +        } contents;
> +    } QEMU_PACKED note_t;

Why indented?

*_t has been criticized as being reserved for POSIX.

> +
> +static int s390x_write_elf64_prstatus(note_t *note, CPUArchState *env)

Please don't use CPUArchState in s390x-only code, use CPUS390XState
where needed; for static helpers please prefer S390CPU.

`git grep CPUArchState` flags to me where I still need to touch things,
same for ENV_GET_CPU() (which Jason recently introduced, fix upcoming).

> +{
> +    int i;
> +    s390x_user_regs *regs;
> +
> +    note->hdr.n_type = cpu_to_be32(NT_PRSTATUS);
> +
> +    regs = &(note->contents.prstatus.regs);
> +    regs->psw[0] =  cpu_to_be64(env->psw.mask);
> +    regs->psw[1] =  cpu_to_be64(env->psw.addr);

Two spaces accidental?

> +    for (i = 0; i <= 15; i++) {
> +        regs->acrs[i] = cpu_to_be32(env->aregs[i]);
> +        regs->gprs[i] = cpu_to_be64(env->regs[i]);
> +    }
> +
> +    return 0;
> +}

Already returns 0, make it void? Same for all callbacks below.

> +
> +static int s390x_write_elf64_fpregset(note_t *note, CPUArchState *env)
> +{
> +    int i;
> +
> +    note->hdr.n_type = cpu_to_be32(NT_FPREGSET);
> +
> +    note->contents.fpregset.fpc = cpu_to_be32(env->fpc);
> +    for (i = 0; i <= 15; i++) {
> +        note->contents.fpregset.fprs[i] =  cpu_to_be64(env->fregs[i].ll);
> +    }
> +
> +    return 0;
> +}
> +
> +
> +static int s390x_write_elf64_timer(note_t *note, CPUArchState *env)
> +{
> +    note->hdr.n_type = cpu_to_be32(NT_S390_TIMER);
> +
> +    note->contents.timer = cpu_to_be64((uint64_t)(env->cputm));
> +
> +    return 0;
> +}
> +
> +static int s390x_write_elf64_todcmp(note_t *note, CPUArchState *env)
> +{
> +    note->hdr.n_type = cpu_to_be32(NT_S390_TODCMP);
> +
> +    note->contents.todcmp = cpu_to_be64((uint64_t)(env->ckc));
> +
> +    return 0;
> +}
> +
> +static int s390x_write_elf64_todpreg(note_t *note, CPUArchState *env)
> +{
> +    note->hdr.n_type = cpu_to_be32(NT_S390_TODPREG);
> +
> +    note->contents.todpreg = cpu_to_be32((uint32_t)(env->todpr));
> +
> +    return 0;
> +}
> +
> +static int s390x_write_elf64_ctrs(note_t *note, CPUArchState *env)
> +{
> +    int i;
> +
> +    note->hdr.n_type = cpu_to_be32(NT_S390_CTRS);
> +
> +    for (i = 0; i <= 15; i++) {
> +        note->contents.ctrs[i] =  cpu_to_be64(env->cregs[i]);
> +    }
> +
> +    return 0;
> +}
> +
> +static int s390x_write_elf64_prefix(note_t *note, CPUArchState *env)
> +{
> +    note->hdr.n_type = cpu_to_be32(NT_S390_PREFIX);
> +
> +    note->contents.prefix = cpu_to_be32((uint32_t)(env->psa));
> +
> +    return 0;
> +}
> +
> +
> +struct note_func_desc_struct {
> +    int contents_size;
> +    int (*note_contents_func)(note_t *note, CPUArchState *env);
> +} note_func[] = {
> +    {sizeof(((note_t *)0)->contents.prstatus), s390x_write_elf64_prstatus},
> +    {sizeof(((note_t *)0)->contents.prefix),   s390x_write_elf64_prefix},
> +    {sizeof(((note_t *)0)->contents.fpregset), s390x_write_elf64_fpregset},
> +    {sizeof(((note_t *)0)->contents.ctrs),     s390x_write_elf64_ctrs},
> +    {sizeof(((note_t *)0)->contents.timer),    s390x_write_elf64_timer},
> +    {sizeof(((note_t *)0)->contents.todcmp),   s390x_write_elf64_todcmp},
> +    {sizeof(((note_t *)0)->contents.todpreg),  s390x_write_elf64_todpreg},
> +    { 0, NULL}
> +};
> +
> +
> +static int s390x_write_all_elf64_notes(const char *note_name,
> +                                   WriteCoreDumpFunction f,
> +                                   CPUArchState *env, int id,
> +                                   void *opaque)

Odd indentation?

> +{
> +    note_t note;
> +    struct note_func_desc_struct *nf;

typedef and CamelCase

> +    int note_size;
> +    int ret = -1;
> +
> +    for (nf = note_func; nf->note_contents_func; nf++) {
> +        note.hdr.n_namesz = cpu_to_be32(sizeof(note.name));
> +        note.hdr.n_descsz = cpu_to_be32(nf->contents_size);
> +        strncpy(note.name, note_name, sizeof(note.name));
> +        ret = (*nf->note_contents_func)(&note, env);
> +
> +        note_size = sizeof(note) - sizeof(note.contents) + nf->contents_size;
> +        ret = f(&note, note_size, opaque);
> +
> +        if (ret < 0) {
> +            return -1;
> +        }
> +
> +    }
> +
> +    return 0;
> +}
> +
> +
> +int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
> +                              int cpuid, void *opaque)
> +{
> +    S390CPU *cpu = S390_CPU(cs);

Here you have the S390CPU that you could just pass on.

> +    return s390x_write_all_elf64_notes("CORE", f, &cpu->env, cpuid, opaque);
> +}
> +
> +int cpu_get_dump_info(ArchDumpInfo *info)
> +{
> +    info->d_machine = EM_S390;
> +    info->d_endian = ELFDATA2MSB;
> +    info->d_class = ELFCLASS64;
> +
> +    return 0;
> +}
> +
> +ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
> +{
> +    int name_size = 8; /* "CORE" or "QEMU" rounded */
> +    size_t elf_note_size = 0;
> +    int note_head_size;
> +    struct note_func_desc_struct *nf;
> +
> +    assert(class == ELFCLASS64);
> +    assert(machine == EM_S390);
> +
> +    note_head_size = sizeof(Elf64_Nhdr);
> +
> +    for (nf = note_func; nf->note_contents_func; nf++) {
> +        elf_note_size = elf_note_size + note_head_size + name_size +
> +                        nf->contents_size;
> +    }
> +
> +    return (elf_note_size) * nr_cpus;
> +}
> +
> +int s390_cpu_write_elf64_qemunote(WriteCoreDumpFunction f,
> +        CPUState *env, void *opaque)

Please don't mix env with CPUState. Indentation?

> +{
> +    return 0;
> +}
> diff --git a/target-s390x/cpu-qom.h b/target-s390x/cpu-qom.h
> index 34d45c2..6327802 100644
> --- a/target-s390x/cpu-qom.h
> +++ b/target-s390x/cpu-qom.h
> @@ -72,5 +72,10 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)
>  #define ENV_OFFSET offsetof(S390CPU, env)
>  
>  void s390_cpu_do_interrupt(CPUState *cpu);
> +int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
> +                         int cpuid, void *opaque);
> +
> +int s390_cpu_write_elf64_qemunote(WriteCoreDumpFunction f,
> +         CPUState *env, void *opaque);

Consistent indentation?

>  
>  #endif
> diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
> index 23fe51f..9376a6c 100644
> --- a/target-s390x/cpu.c
> +++ b/target-s390x/cpu.c
> @@ -171,6 +171,10 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
>  
>      cc->do_interrupt = s390_cpu_do_interrupt;
>      dc->vmsd = &vmstate_s390_cpu;
> +#ifndef CONFIG_USER_ONLY
> +    cc->write_elf64_note = s390_cpu_write_elf64_note;
> +    cc->write_elf64_qemunote = s390_cpu_write_elf64_qemunote;
> +#endif
>  }
>  
>  static const TypeInfo s390_cpu_type_info = {

Regards,
Andreas

-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

  reply	other threads:[~2013-06-25 15:39 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-12  8:09 [Qemu-devel] [PATCH v2] s390: support dump-guest-memory on s390 Jens Freimann
2013-06-12  8:09 ` [Qemu-devel] [PATCH v2] s390: Implement dump-guest-memory support for target s390x Jens Freimann
2013-06-20 12:21   ` Alexander Graf
2013-06-25 10:17     ` [Qemu-devel] [PATCH v3] " Jens Freimann
2013-06-25 15:39       ` Andreas Färber [this message]
2013-06-26 14:46         ` [Qemu-devel] [PATCH v4] " Jens Freimann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51C9B9B6.5050801@suse.de \
    --to=afaerber@suse.de \
    --cc=agraf@suse.de \
    --cc=borntraeger@de.ibm.com \
    --cc=jfrei@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=tumanova@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.