From: Wen Congyang <wency@cn.fujitsu.com>
To: Rabin Vincent <rabin@rab.in>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/4] dump: extract out note helper
Date: Wed, 04 Jul 2012 10:31:03 +0800 [thread overview]
Message-ID: <4FF3AAE7.4080807@cn.fujitsu.com> (raw)
In-Reply-To: <1340213303-596-2-git-send-email-rabin@rab.in>
At 06/21/2012 01:28 AM, Rabin Vincent Wrote:
> Make a common helper function to add ELF notes.
>
> Signed-off-by: Rabin Vincent <rabin@rab.in>
> ---
> dump.c | 49 +++++++++++
> dump.h | 4 +
> target-i386/arch_dump.c | 206 +++++++++++------------------------------------
> 3 files changed, 100 insertions(+), 159 deletions(-)
>
> diff --git a/dump.c b/dump.c
> index 5c5cb4d..be96c6c 100644
> --- a/dump.c
> +++ b/dump.c
> @@ -468,6 +468,55 @@ static target_phys_addr_t get_offset(target_phys_addr_t phys_addr,
> return -1;
> }
>
> +int dump_write_elf_note(int class, const char *name, uint32_t type,
> + void *desc, size_t descsz,
> + write_core_dump_function f, void *opaque)
> +{
> + Elf64_Nhdr *note64;
> + Elf32_Nhdr *note32;
> + void *note;
> + char *buf;
> + size_t note_size, name_size, note_head_size;
> + int ret;
> +
> + name_size = strlen(name) + 1;
> +
> + if (class == ELFCLASS32) {
> + note_head_size = sizeof(Elf32_Nhdr);
> + } else {
> + note_head_size = sizeof(Elf64_Nhdr);
> + }
> + note_size = ((note_head_size + 3) / 4 + (name_size + 3) / 4 +
> + (descsz + 3) / 4) * 4;
> + note = g_malloc(note_size);
> +
> + memset(note, 0, note_size);
> + if (class == ELFCLASS32) {
> + note32 = note;
> + note32->n_namesz = cpu_to_le32(name_size);
> + note32->n_descsz = cpu_to_le32(descsz);
> + note32->n_type = cpu_to_le32(type);
> + } else {
> + note64 = note;
> + note64->n_namesz = cpu_to_le32(name_size);
> + note64->n_descsz = cpu_to_le32(descsz);
> + note64->n_type = cpu_to_le32(type);
> + }
> + buf = note;
> + buf += ((note_head_size + 3) / 4) * 4;
> + memcpy(buf, name, name_size);
> + buf += ((name_size + 3) / 4) * 4;
> + memcpy(buf, desc, descsz);
> +
> + ret = f(note, note_size, opaque);
> + g_free(note);
> + if (ret < 0) {
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> static int write_elf_loads(DumpState *s)
> {
> target_phys_addr_t offset;
> diff --git a/dump.h b/dump.h
> index e25b7cf..b07816a 100644
> --- a/dump.h
> +++ b/dump.h
> @@ -32,4 +32,8 @@ int cpu_write_elf32_qemunote(write_core_dump_function f, CPUArchState *env,
> int cpu_get_dump_info(ArchDumpInfo *info);
> ssize_t cpu_get_note_size(int class, int machine, int nr_cpus);
>
> +int dump_write_elf_note(int class, const char *name, uint32_t type, void *desc,
> + size_t descsz, write_core_dump_function f,
> + void *opaque);
> +
> #endif
> diff --git a/target-i386/arch_dump.c b/target-i386/arch_dump.c
> index 4240278..dbc94bc 100644
> --- a/target-i386/arch_dump.c
> +++ b/target-i386/arch_dump.c
> @@ -38,66 +38,41 @@ static int x86_64_write_elf64_note(write_core_dump_function f,
> CPUArchState *env, int id,
> void *opaque)
> {
> - x86_64_user_regs_struct regs;
> - Elf64_Nhdr *note;
> - char *buf;
> - int descsz, note_size, name_size = 5;
> - const char *name = "CORE";
> - int ret;
> -
> - regs.r15 = env->regs[15];
> - regs.r14 = env->regs[14];
> - regs.r13 = env->regs[13];
> - regs.r12 = env->regs[12];
> - regs.r11 = env->regs[11];
> - regs.r10 = env->regs[10];
> - regs.r9 = env->regs[9];
> - regs.r8 = env->regs[8];
> - regs.rbp = env->regs[R_EBP];
> - regs.rsp = env->regs[R_ESP];
> - regs.rdi = env->regs[R_EDI];
> - regs.rsi = env->regs[R_ESI];
> - regs.rdx = env->regs[R_EDX];
> - regs.rcx = env->regs[R_ECX];
> - regs.rbx = env->regs[R_EBX];
> - regs.rax = env->regs[R_EAX];
> - regs.rip = env->eip;
> - regs.eflags = env->eflags;
> -
> - regs.orig_rax = 0; /* FIXME */
> - regs.cs = env->segs[R_CS].selector;
> - regs.ss = env->segs[R_SS].selector;
> - regs.fs_base = env->segs[R_FS].base;
> - regs.gs_base = env->segs[R_GS].base;
> - regs.ds = env->segs[R_DS].selector;
> - regs.es = env->segs[R_ES].selector;
> - regs.fs = env->segs[R_FS].selector;
> - regs.gs = env->segs[R_GS].selector;
> -
> - descsz = sizeof(x86_64_elf_prstatus);
> - note_size = ((sizeof(Elf64_Nhdr) + 3) / 4 + (name_size + 3) / 4 +
> - (descsz + 3) / 4) * 4;
> - note = g_malloc(note_size);
> -
> - memset(note, 0, note_size);
> - note->n_namesz = cpu_to_le32(name_size);
> - note->n_descsz = cpu_to_le32(descsz);
> - note->n_type = cpu_to_le32(NT_PRSTATUS);
> - buf = (char *)note;
> - buf += ((sizeof(Elf64_Nhdr) + 3) / 4) * 4;
> - memcpy(buf, name, name_size);
> - buf += ((name_size + 3) / 4) * 4;
> - memcpy(buf + 32, &id, 4); /* pr_pid */
> - buf += descsz - sizeof(x86_64_user_regs_struct)-sizeof(target_ulong);
> - memcpy(buf, ®s, sizeof(x86_64_user_regs_struct));
> -
> - ret = f(note, note_size, opaque);
> - g_free(note);
> - if (ret < 0) {
> - return -1;
> - }
> -
> - return 0;
> + x86_64_elf_prstatus prstatus;
You should set all fileds of prstatus to 0. If not,
I guess you may meet some surprising problem when
you deal with the core.
Thanks
Wen Congyang
> +
> + prstatus.pid = id;
> + prstatus.regs.r15 = env->regs[15];
> + prstatus.regs.r14 = env->regs[14];
> + prstatus.regs.r13 = env->regs[13];
> + prstatus.regs.r12 = env->regs[12];
> + prstatus.regs.r11 = env->regs[11];
> + prstatus.regs.r10 = env->regs[10];
> + prstatus.regs.r9 = env->regs[9];
> + prstatus.regs.r8 = env->regs[8];
> + prstatus.regs.rbp = env->regs[R_EBP];
> + prstatus.regs.rsp = env->regs[R_ESP];
> + prstatus.regs.rdi = env->regs[R_EDI];
> + prstatus.regs.rsi = env->regs[R_ESI];
> + prstatus.regs.rdx = env->regs[R_EDX];
> + prstatus.regs.rcx = env->regs[R_ECX];
> + prstatus.regs.rbx = env->regs[R_EBX];
> + prstatus.regs.rax = env->regs[R_EAX];
> + prstatus.regs.rip = env->eip;
> + prstatus.regs.eflags = env->eflags;
> +
> + prstatus.regs.orig_rax = 0; /* FIXME */
> + prstatus.regs.cs = env->segs[R_CS].selector;
> + prstatus.regs.ss = env->segs[R_SS].selector;
> + prstatus.regs.fs_base = env->segs[R_FS].base;
> + prstatus.regs.gs_base = env->segs[R_GS].base;
> + prstatus.regs.ds = env->segs[R_DS].selector;
> + prstatus.regs.es = env->segs[R_ES].selector;
> + prstatus.regs.fs = env->segs[R_FS].selector;
> + prstatus.regs.gs = env->segs[R_GS].selector;
> +
> + return dump_write_elf_note(ELFCLASS64, "CORE", NT_PRSTATUS,
> + &prstatus, sizeof(prstatus),
> + f, opaque);
> }
> #endif
>
> @@ -148,35 +123,12 @@ static int x86_write_elf64_note(write_core_dump_function f, CPUArchState *env,
> int id, void *opaque)
> {
> x86_elf_prstatus prstatus;
> - Elf64_Nhdr *note;
> - char *buf;
> - int descsz, note_size, name_size = 5;
> - const char *name = "CORE";
> - int ret;
>
> x86_fill_elf_prstatus(&prstatus, env, id);
> - descsz = sizeof(x86_elf_prstatus);
> - note_size = ((sizeof(Elf64_Nhdr) + 3) / 4 + (name_size + 3) / 4 +
> - (descsz + 3) / 4) * 4;
> - note = g_malloc(note_size);
> -
> - memset(note, 0, note_size);
> - note->n_namesz = cpu_to_le32(name_size);
> - note->n_descsz = cpu_to_le32(descsz);
> - note->n_type = cpu_to_le32(NT_PRSTATUS);
> - buf = (char *)note;
> - buf += ((sizeof(Elf64_Nhdr) + 3) / 4) * 4;
> - memcpy(buf, name, name_size);
> - buf += ((name_size + 3) / 4) * 4;
> - memcpy(buf, &prstatus, sizeof(prstatus));
> -
> - ret = f(note, note_size, opaque);
> - g_free(note);
> - if (ret < 0) {
> - return -1;
> - }
>
> - return 0;
> + return dump_write_elf_note(ELFCLASS64, "CORE", NT_PRSTATUS,
> + &prstatus, sizeof(prstatus),
> + f, opaque);
> }
>
> int cpu_write_elf64_note(write_core_dump_function f, CPUArchState *env,
> @@ -202,35 +154,12 @@ int cpu_write_elf32_note(write_core_dump_function f, CPUArchState *env,
> int cpuid, void *opaque)
> {
> x86_elf_prstatus prstatus;
> - Elf32_Nhdr *note;
> - char *buf;
> - int descsz, note_size, name_size = 5;
> - const char *name = "CORE";
> - int ret;
>
> x86_fill_elf_prstatus(&prstatus, env, cpuid);
> - descsz = sizeof(x86_elf_prstatus);
> - note_size = ((sizeof(Elf32_Nhdr) + 3) / 4 + (name_size + 3) / 4 +
> - (descsz + 3) / 4) * 4;
> - note = g_malloc(note_size);
> -
> - memset(note, 0, note_size);
> - note->n_namesz = cpu_to_le32(name_size);
> - note->n_descsz = cpu_to_le32(descsz);
> - note->n_type = cpu_to_le32(NT_PRSTATUS);
> - buf = (char *)note;
> - buf += ((sizeof(Elf32_Nhdr) + 3) / 4) * 4;
> - memcpy(buf, name, name_size);
> - buf += ((name_size + 3) / 4) * 4;
> - memcpy(buf, &prstatus, sizeof(prstatus));
> -
> - ret = f(note, note_size, opaque);
> - g_free(note);
> - if (ret < 0) {
> - return -1;
> - }
>
> - return 0;
> + return dump_write_elf_note(ELFCLASS32, "CORE", NT_PRSTATUS,
> + &prstatus, sizeof(prstatus),
> + f, opaque);
> }
>
> /*
> @@ -317,69 +246,28 @@ static void qemu_get_cpustate(QEMUCPUState *s, CPUArchState *env)
> s->cr[4] = env->cr[4];
> }
>
> -static inline int cpu_write_qemu_note(write_core_dump_function f,
> +static inline int cpu_write_qemu_note(int class, write_core_dump_function f,
> CPUArchState *env,
> - void *opaque,
> - int type)
> + void *opaque)
> {
> QEMUCPUState state;
> - Elf64_Nhdr *note64;
> - Elf32_Nhdr *note32;
> - void *note;
> - char *buf;
> - int descsz, note_size, name_size = 5, note_head_size;
> - const char *name = "QEMU";
> - int ret;
>
> qemu_get_cpustate(&state, env);
>
> - descsz = sizeof(state);
> - if (type == 0) {
> - note_head_size = sizeof(Elf32_Nhdr);
> - } else {
> - note_head_size = sizeof(Elf64_Nhdr);
> - }
> - note_size = ((note_head_size + 3) / 4 + (name_size + 3) / 4 +
> - (descsz + 3) / 4) * 4;
> - note = g_malloc(note_size);
> -
> - memset(note, 0, note_size);
> - if (type == 0) {
> - note32 = note;
> - note32->n_namesz = cpu_to_le32(name_size);
> - note32->n_descsz = cpu_to_le32(descsz);
> - note32->n_type = 0;
> - } else {
> - note64 = note;
> - note64->n_namesz = cpu_to_le32(name_size);
> - note64->n_descsz = cpu_to_le32(descsz);
> - note64->n_type = 0;
> - }
> - buf = note;
> - buf += ((note_head_size + 3) / 4) * 4;
> - memcpy(buf, name, name_size);
> - buf += ((name_size + 3) / 4) * 4;
> - memcpy(buf, &state, sizeof(state));
> -
> - ret = f(note, note_size, opaque);
> - g_free(note);
> - if (ret < 0) {
> - return -1;
> - }
> -
> - return 0;
> + return dump_write_elf_note(class, "QEMU", 0, &state, sizeof(state),
> + f, opaque);
> }
>
> int cpu_write_elf64_qemunote(write_core_dump_function f, CPUArchState *env,
> void *opaque)
> {
> - return cpu_write_qemu_note(f, env, opaque, 1);
> + return cpu_write_qemu_note(ELFCLASS64, f, env, opaque);
> }
>
> int cpu_write_elf32_qemunote(write_core_dump_function f, CPUArchState *env,
> void *opaque)
> {
> - return cpu_write_qemu_note(f, env, opaque, 0);
> + return cpu_write_qemu_note(ELFCLASS32, f, env, opaque);
> }
>
> int cpu_get_dump_info(ArchDumpInfo *info)
next prev parent reply other threads:[~2012-07-04 2:26 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-20 17:28 [Qemu-devel] [PATCH 1/4] dump: create writable files Rabin Vincent
2012-06-20 17:28 ` [Qemu-devel] [PATCH 2/4] dump: extract out note helper Rabin Vincent
2012-07-04 2:21 ` Wen Congyang
2012-07-04 2:31 ` Wen Congyang [this message]
2012-06-20 17:28 ` [Qemu-devel] [PATCH 3/4] dump: extract out get note size function Rabin Vincent
2012-07-04 2:25 ` Wen Congyang
2012-06-20 17:28 ` [Qemu-devel] [PATCH 4/4] target-arm: add minimal dump-guest-memory support Rabin Vincent
[not found] ` <CAFEAcA_x1HKmzgdjbi1Xv90Kwn3fwL3U3+_hiaO0wkTiNFR4pA@mail.gmail.com>
2012-07-01 6:22 ` Rabin Vincent
2012-07-04 2:48 ` Wen Congyang
[not found] ` <4FEDA2C0.7040405@suse.de>
2012-07-04 2:57 ` Wen Congyang
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=4FF3AAE7.4080807@cn.fujitsu.com \
--to=wency@cn.fujitsu.com \
--cc=qemu-devel@nongnu.org \
--cc=rabin@rab.in \
/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.