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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).