From: Andrew Jones <drjones@redhat.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, agraf@suse.de, armbru@redhat.com,
qemu-arm@nongnu.org, qemu-ppc@nongnu.org, afaerber@suse.de,
rth@twiddle.net
Subject: [Qemu-devel] [PATCH v4 8/8] target-arm: dump-guest-memory: add vfp notes for arm
Date: Mon, 11 Jan 2016 20:56:25 +0100 [thread overview]
Message-ID: <1452542185-10914-9-git-send-email-drjones@redhat.com> (raw)
In-Reply-To: <1452542185-10914-1-git-send-email-drjones@redhat.com>
gdb won't actually dump these with 'info all-registers' since
it first tries to confirm that it should by checking the VFP
hwcap in the .auxv note. Well, we don't generate an .auxv note.
Signed-off-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
---
target-arm/arch_dump.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 46 insertions(+), 3 deletions(-)
diff --git a/target-arm/arch_dump.c b/target-arm/arch_dump.c
index d7b63a0d7ee91..f45125ffe6b0b 100644
--- a/target-arm/arch_dump.c
+++ b/target-arm/arch_dump.c
@@ -183,15 +183,28 @@ struct arm_elf_prstatus {
QEMU_BUILD_BUG_ON(sizeof(struct arm_elf_prstatus) != 148);
+/* struct user_vfp from arch/arm/include/asm/user.h */
+struct arm_user_vfp_state {
+ uint64_t vregs[32];
+ uint32_t fpscr;
+} QEMU_PACKED;
+
+QEMU_BUILD_BUG_ON(sizeof(struct arm_user_vfp_state) != 260);
+
struct arm_note {
Elf32_Nhdr hdr;
- char name[8]; /* align_up(sizeof("CORE"), 4) */
- struct arm_elf_prstatus prstatus;
+ char name[8]; /* align_up(sizeof("LINUX"), 4) */
+ union {
+ struct arm_elf_prstatus prstatus;
+ struct arm_user_vfp_state vfp;
+ };
} QEMU_PACKED;
#define ARM_NOTE_HEADER_SIZE offsetof(struct arm_note, prstatus)
#define ARM_PRSTATUS_NOTE_SIZE \
(ARM_NOTE_HEADER_SIZE + sizeof(struct arm_elf_prstatus))
+#define ARM_VFP_NOTE_SIZE \
+ (ARM_NOTE_HEADER_SIZE + sizeof(struct arm_user_vfp_state))
static void arm_note_init(struct arm_note *note, DumpState *s,
const char *name, Elf32_Word namesz,
@@ -206,17 +219,40 @@ static void arm_note_init(struct arm_note *note, DumpState *s,
memcpy(note->name, name, namesz);
}
+static int arm_write_elf32_vfp(WriteCoreDumpFunction f, CPUARMState *env,
+ int cpuid, DumpState *s)
+{
+ struct arm_note note;
+ int ret, i;
+
+ arm_note_init(¬e, s, "LINUX", 6, NT_ARM_VFP, sizeof(note.vfp));
+
+ for (i = 0; i < 32; ++i) {
+ note.vfp.vregs[i] = cpu_to_dump64(s, float64_val(env->vfp.regs[i]));
+ }
+
+ note.vfp.fpscr = cpu_to_dump32(s, vfp_get_fpscr(env));
+
+ ret = f(¬e, ARM_VFP_NOTE_SIZE, s);
+ if (ret < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
int cpuid, void *opaque)
{
struct arm_note note;
CPUARMState *env = &ARM_CPU(cs)->env;
DumpState *s = opaque;
- int ret, i;
+ int ret, i, fpvalid = !!arm_feature(env, ARM_FEATURE_VFP);
arm_note_init(¬e, s, "CORE", 5, NT_PRSTATUS, sizeof(note.prstatus));
note.prstatus.pr_pid = cpu_to_dump32(s, cpuid);
+ note.prstatus.pr_fpvalid = cpu_to_dump32(s, fpvalid);
for (i = 0; i < 16; ++i) {
note.prstatus.pr_reg.regs[i] = cpu_to_dump32(s, env->regs[i]);
@@ -226,6 +262,8 @@ int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
ret = f(¬e, ARM_PRSTATUS_NOTE_SIZE, s);
if (ret < 0) {
return -1;
+ } else if (fpvalid) {
+ return arm_write_elf32_vfp(f, env, cpuid, s);
}
return 0;
@@ -280,6 +318,8 @@ int cpu_get_dump_info(ArchDumpInfo *info,
ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
{
+ ARMCPU *cpu = ARM_CPU(first_cpu);
+ CPUARMState *env = &cpu->env;
size_t note_size;
if (class == ELFCLASS64) {
@@ -287,6 +327,9 @@ ssize_t cpu_get_note_size(int class, int machine, int nr_cpus)
note_size += AARCH64_PRFPREG_NOTE_SIZE;
} else {
note_size = ARM_PRSTATUS_NOTE_SIZE;
+ if (arm_feature(env, ARM_FEATURE_VFP)) {
+ note_size += ARM_VFP_NOTE_SIZE;
+ }
}
return note_size * nr_cpus;
--
2.4.3
next prev parent reply other threads:[~2016-01-11 19:56 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-11 19:56 [Qemu-devel] [PATCH v4 0/8] target-arm: enable qmp-dump-guest-memory Andrew Jones
2016-01-11 19:56 ` [Qemu-devel] [PATCH v4 1/8] qapi-schema: dump-guest-memory: Improve text Andrew Jones
2016-01-11 19:56 ` [Qemu-devel] [PATCH v4 2/8] dump: qemunotes aren't commonly needed Andrew Jones
2016-01-11 19:56 ` [Qemu-devel] [PATCH v4 3/8] dump: allow target to set the page size Andrew Jones
2016-01-11 19:56 ` [Qemu-devel] [PATCH v4 4/8] dump: allow target to set the physical base Andrew Jones
2016-01-11 19:56 ` [Qemu-devel] [PATCH v4 5/8] target-arm: support QMP dump-guest-memory Andrew Jones
2016-01-15 14:56 ` Peter Maydell
2016-01-11 19:56 ` [Qemu-devel] [PATCH v4 6/8] target-arm: dump-guest-memory: add prfpreg notes for aarch64 Andrew Jones
2016-01-11 19:56 ` [Qemu-devel] [PATCH v4 7/8] elf: add arm note types Andrew Jones
2016-01-11 19:56 ` Andrew Jones [this message]
2016-01-15 14:43 ` [Qemu-devel] [PATCH v4 0/8] target-arm: enable qmp-dump-guest-memory Peter Maydell
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=1452542185-10914-9-git-send-email-drjones@redhat.com \
--to=drjones@redhat.com \
--cc=afaerber@suse.de \
--cc=agraf@suse.de \
--cc=armbru@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=rth@twiddle.net \
/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).