From: Alistair Francis <alistair23@gmail.com> To: Jim Wilson <jimw@sifive.com> Cc: "qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>, qemu-riscv@nongnu.org Subject: Re: [Qemu-devel] [PATCH 5/5 v2] RISC-V: Add hooks to use the gdb xml files. Date: Tue, 22 Jan 2019 13:52:12 -0800 [thread overview] Message-ID: <CAKmqyKMT7F_ziNjbdTU08ph33DnSkKyt+dSMSVXLVZffSvBu-w@mail.gmail.com> (raw) In-Reply-To: <20181228221102.5080-1-jimw@sifive.com> On Fri, Dec 28, 2018 at 2:20 PM Jim Wilson <jimw@sifive.com> wrote: > > Signed-off-by: Jim Wilson <jimw@sifive.com> > --- > target/riscv/cpu.c | 9 ++++++- > target/riscv/gdbstub.c | 73 ++++++++++++++++++++++++++++++++++++++++++++------ > 2 files changed, 73 insertions(+), 9 deletions(-) > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index a025a0a..b248e3e 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -305,6 +305,8 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) > return; > } > > + riscv_cpu_register_gdb_regs_for_features(cs); > + > qemu_init_vcpu(cs); > cpu_reset(cs); > > @@ -345,7 +347,12 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data) > cc->synchronize_from_tb = riscv_cpu_synchronize_from_tb; > cc->gdb_read_register = riscv_cpu_gdb_read_register; > cc->gdb_write_register = riscv_cpu_gdb_write_register; > - cc->gdb_num_core_regs = 65; > + cc->gdb_num_core_regs = 33; > +#if defined(TARGET_RISCV32) > + cc->gdb_core_xml_file = "riscv-32bit-cpu.xml"; > +#elif defined(TARGET_RISCV64) > + cc->gdb_core_xml_file = "riscv-64bit-cpu.xml"; > +#endif > cc->gdb_stop_before_watchpoint = true; > cc->disas_set_info = riscv_cpu_disas_set_info; > #ifdef CONFIG_USER_ONLY > diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c > index b06f0fa..9558d80 100644 > --- a/target/riscv/gdbstub.c > +++ b/target/riscv/gdbstub.c > @@ -31,10 +31,6 @@ int riscv_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) > return gdb_get_regl(mem_buf, env->gpr[n]); > } else if (n == 32) { > return gdb_get_regl(mem_buf, env->pc); > - } else if (n < 65) { > - return gdb_get_reg64(mem_buf, env->fpr[n - 33]); > - } else if (n < 4096 + 65) { > - return gdb_get_regl(mem_buf, csr_read_helper(env, n - 65, true)); > } > return 0; > } > @@ -53,11 +49,72 @@ int riscv_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) > } else if (n == 32) { > env->pc = ldtul_p(mem_buf); > return sizeof(target_ulong); > - } else if (n < 65) { > - env->fpr[n - 33] = ldq_p(mem_buf); /* always 64-bit */ > + } > + return 0; > +} > + > +static int riscv_gdb_get_fpu(CPURISCVState *env, uint8_t *mem_buf, int n) > +{ > + if (n < 32) { > + return gdb_get_reg64(mem_buf, env->fpr[n]); > + } else if (n < 35) { > + /* > + * CSR_FFLAGS is 0x001, and gdb says it is FP register 32, so we > + * subtract 31 to map the gdb FP register number to the CSR number. > + * This also works for CSR_FRM and CSR_FCSR. > + */ > + return gdb_get_regl(mem_buf, csr_read_helper(env, n - 31, true)); > + } > + return 0; > +} > + > +static int riscv_gdb_set_fpu(CPURISCVState *env, uint8_t *mem_buf, int n) > +{ > + if (n < 32) { > + env->fpr[n] = ldq_p(mem_buf); /* always 64-bit */ > return sizeof(uint64_t); > - } else if (n < 4096 + 65) { > - csr_write_helper(env, ldtul_p(mem_buf), n - 65, true); > + } else if (n < 35) { > + /* > + * CSR_FFLAGS is 0x001, and gdb says it is FP register 32, so we > + * subtract 31 to map the gdb FP register number to the CSR number. > + * This also works for CSR_FRM and CSR_FCSR. > + */ > + csr_write_helper(env, ldtul_p(mem_buf), n - 31, true); > } > return 0; > } > + > +static int riscv_gdb_get_csr(CPURISCVState *env, uint8_t *mem_buf, int n) > +{ > + if (n < ARRAY_SIZE(csr_register_map)) { > + return gdb_get_regl(mem_buf, csr_read_helper(env, csr_register_map[n], > + true)); > + } > + return 0; > +} > + > +static int riscv_gdb_set_csr(CPURISCVState *env, uint8_t *mem_buf, int n) > +{ > + if (n < ARRAY_SIZE(csr_register_map)) { > + csr_write_helper(env, ldtul_p(mem_buf), csr_register_map[n], true); > + } > + return 0; > +} > + > +void riscv_cpu_register_gdb_regs_for_features(CPUState *cs) > +{ > + /* ??? Assume all targets have FPU regs for now. */ You can get env and then check for floating point support: CPURISCVState *env = &cs->env; if (env->misa_mask & RVF) { ... Alistair > +#if defined(TARGET_RISCV32) > + gdb_register_coprocessor(cs, riscv_gdb_get_fpu, riscv_gdb_set_fpu, > + 35, "riscv-32bit-fpu.xml", 0); > + > + gdb_register_coprocessor(cs, riscv_gdb_get_csr, riscv_gdb_set_csr, > + 4096, "riscv-32bit-csr.xml", 0); > +#elif defined(TARGET_RISCV64) > + gdb_register_coprocessor(cs, riscv_gdb_get_fpu, riscv_gdb_set_fpu, > + 35, "riscv-64bit-fpu.xml", 0); > + > + gdb_register_coprocessor(cs, riscv_gdb_get_csr, riscv_gdb_set_csr, > + 4096, "riscv-64bit-csr.xml", 0); > +#endif > +} > -- > 2.7.4 > >
WARNING: multiple messages have this Message-ID (diff)
From: Alistair Francis <alistair23@gmail.com> To: Jim Wilson <jimw@sifive.com> Cc: "qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>, qemu-riscv@nongnu.org Subject: Re: [Qemu-riscv] [Qemu-devel] [PATCH 5/5 v2] RISC-V: Add hooks to use the gdb xml files. Date: Tue, 22 Jan 2019 13:52:12 -0800 [thread overview] Message-ID: <CAKmqyKMT7F_ziNjbdTU08ph33DnSkKyt+dSMSVXLVZffSvBu-w@mail.gmail.com> (raw) In-Reply-To: <20181228221102.5080-1-jimw@sifive.com> On Fri, Dec 28, 2018 at 2:20 PM Jim Wilson <jimw@sifive.com> wrote: > > Signed-off-by: Jim Wilson <jimw@sifive.com> > --- > target/riscv/cpu.c | 9 ++++++- > target/riscv/gdbstub.c | 73 ++++++++++++++++++++++++++++++++++++++++++++------ > 2 files changed, 73 insertions(+), 9 deletions(-) > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index a025a0a..b248e3e 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -305,6 +305,8 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) > return; > } > > + riscv_cpu_register_gdb_regs_for_features(cs); > + > qemu_init_vcpu(cs); > cpu_reset(cs); > > @@ -345,7 +347,12 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data) > cc->synchronize_from_tb = riscv_cpu_synchronize_from_tb; > cc->gdb_read_register = riscv_cpu_gdb_read_register; > cc->gdb_write_register = riscv_cpu_gdb_write_register; > - cc->gdb_num_core_regs = 65; > + cc->gdb_num_core_regs = 33; > +#if defined(TARGET_RISCV32) > + cc->gdb_core_xml_file = "riscv-32bit-cpu.xml"; > +#elif defined(TARGET_RISCV64) > + cc->gdb_core_xml_file = "riscv-64bit-cpu.xml"; > +#endif > cc->gdb_stop_before_watchpoint = true; > cc->disas_set_info = riscv_cpu_disas_set_info; > #ifdef CONFIG_USER_ONLY > diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c > index b06f0fa..9558d80 100644 > --- a/target/riscv/gdbstub.c > +++ b/target/riscv/gdbstub.c > @@ -31,10 +31,6 @@ int riscv_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) > return gdb_get_regl(mem_buf, env->gpr[n]); > } else if (n == 32) { > return gdb_get_regl(mem_buf, env->pc); > - } else if (n < 65) { > - return gdb_get_reg64(mem_buf, env->fpr[n - 33]); > - } else if (n < 4096 + 65) { > - return gdb_get_regl(mem_buf, csr_read_helper(env, n - 65, true)); > } > return 0; > } > @@ -53,11 +49,72 @@ int riscv_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) > } else if (n == 32) { > env->pc = ldtul_p(mem_buf); > return sizeof(target_ulong); > - } else if (n < 65) { > - env->fpr[n - 33] = ldq_p(mem_buf); /* always 64-bit */ > + } > + return 0; > +} > + > +static int riscv_gdb_get_fpu(CPURISCVState *env, uint8_t *mem_buf, int n) > +{ > + if (n < 32) { > + return gdb_get_reg64(mem_buf, env->fpr[n]); > + } else if (n < 35) { > + /* > + * CSR_FFLAGS is 0x001, and gdb says it is FP register 32, so we > + * subtract 31 to map the gdb FP register number to the CSR number. > + * This also works for CSR_FRM and CSR_FCSR. > + */ > + return gdb_get_regl(mem_buf, csr_read_helper(env, n - 31, true)); > + } > + return 0; > +} > + > +static int riscv_gdb_set_fpu(CPURISCVState *env, uint8_t *mem_buf, int n) > +{ > + if (n < 32) { > + env->fpr[n] = ldq_p(mem_buf); /* always 64-bit */ > return sizeof(uint64_t); > - } else if (n < 4096 + 65) { > - csr_write_helper(env, ldtul_p(mem_buf), n - 65, true); > + } else if (n < 35) { > + /* > + * CSR_FFLAGS is 0x001, and gdb says it is FP register 32, so we > + * subtract 31 to map the gdb FP register number to the CSR number. > + * This also works for CSR_FRM and CSR_FCSR. > + */ > + csr_write_helper(env, ldtul_p(mem_buf), n - 31, true); > } > return 0; > } > + > +static int riscv_gdb_get_csr(CPURISCVState *env, uint8_t *mem_buf, int n) > +{ > + if (n < ARRAY_SIZE(csr_register_map)) { > + return gdb_get_regl(mem_buf, csr_read_helper(env, csr_register_map[n], > + true)); > + } > + return 0; > +} > + > +static int riscv_gdb_set_csr(CPURISCVState *env, uint8_t *mem_buf, int n) > +{ > + if (n < ARRAY_SIZE(csr_register_map)) { > + csr_write_helper(env, ldtul_p(mem_buf), csr_register_map[n], true); > + } > + return 0; > +} > + > +void riscv_cpu_register_gdb_regs_for_features(CPUState *cs) > +{ > + /* ??? Assume all targets have FPU regs for now. */ You can get env and then check for floating point support: CPURISCVState *env = &cs->env; if (env->misa_mask & RVF) { ... Alistair > +#if defined(TARGET_RISCV32) > + gdb_register_coprocessor(cs, riscv_gdb_get_fpu, riscv_gdb_set_fpu, > + 35, "riscv-32bit-fpu.xml", 0); > + > + gdb_register_coprocessor(cs, riscv_gdb_get_csr, riscv_gdb_set_csr, > + 4096, "riscv-32bit-csr.xml", 0); > +#elif defined(TARGET_RISCV64) > + gdb_register_coprocessor(cs, riscv_gdb_get_fpu, riscv_gdb_set_fpu, > + 35, "riscv-64bit-fpu.xml", 0); > + > + gdb_register_coprocessor(cs, riscv_gdb_get_csr, riscv_gdb_set_csr, > + 4096, "riscv-64bit-csr.xml", 0); > +#endif > +} > -- > 2.7.4 > >
next prev parent reply other threads:[~2019-01-22 21:52 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-12-28 22:05 [Qemu-devel] [PATCH 0/5 v2] RISC-V: Add gdb xml files and gdbstub support Jim Wilson 2018-12-28 22:05 ` [Qemu-riscv] " Jim Wilson 2018-12-28 22:07 ` [Qemu-devel] [PATCH 1/5 v2] RISC-V: Add 32-bit gdb xml files Jim Wilson 2018-12-28 22:07 ` [Qemu-riscv] " Jim Wilson 2018-12-29 22:20 ` [Qemu-devel] " Richard Henderson 2018-12-29 22:20 ` [Qemu-riscv] " Richard Henderson 2018-12-30 19:56 ` Jim Wilson 2018-12-30 19:56 ` [Qemu-riscv] " Jim Wilson 2019-01-22 21:53 ` Alistair Francis 2019-01-22 21:53 ` [Qemu-riscv] " Alistair Francis 2018-12-28 22:08 ` [Qemu-devel] [PATCH 2/5 v2] RISC-V: Add 64-bit " Jim Wilson 2018-12-28 22:08 ` [Qemu-riscv] " Jim Wilson 2019-01-22 21:53 ` [Qemu-devel] " Alistair Francis 2019-01-22 21:53 ` [Qemu-riscv] " Alistair Francis 2018-12-28 22:09 ` [Qemu-devel] [PATCH 3/5 v2] RISC-V: Map gdb CSR reg numbers to hw reg numbers Jim Wilson 2018-12-28 22:09 ` [Qemu-riscv] " Jim Wilson 2018-12-29 22:23 ` [Qemu-devel] " Richard Henderson 2018-12-29 22:23 ` [Qemu-riscv] " Richard Henderson 2018-12-30 19:22 ` Jim Wilson 2018-12-30 19:22 ` [Qemu-riscv] " Jim Wilson 2019-01-22 21:45 ` Alistair Francis 2019-01-22 21:45 ` [Qemu-riscv] " Alistair Francis 2019-01-29 3:00 ` Jim Wilson 2019-01-29 3:00 ` [Qemu-riscv] " Jim Wilson 2018-12-28 22:10 ` [Qemu-devel] [PATCH 4/5 v2] RISC-V: Add debug support for accessing CSRs Jim Wilson 2018-12-28 22:10 ` [Qemu-riscv] " Jim Wilson 2018-12-29 22:25 ` [Qemu-devel] " Richard Henderson 2018-12-29 22:25 ` [Qemu-riscv] " Richard Henderson 2019-01-22 21:46 ` Alistair Francis 2019-01-22 21:46 ` [Qemu-riscv] " Alistair Francis 2018-12-28 22:11 ` [Qemu-devel] [PATCH 5/5 v2] RISC-V: Add hooks to use the gdb xml files Jim Wilson 2018-12-28 22:11 ` [Qemu-riscv] " Jim Wilson 2019-01-22 21:52 ` Alistair Francis [this message] 2019-01-22 21:52 ` [Qemu-riscv] [Qemu-devel] " Alistair Francis 2019-01-29 3:11 ` Jim Wilson 2019-01-29 3:11 ` [Qemu-riscv] " Jim Wilson 2019-01-29 23:21 ` Palmer Dabbelt 2019-01-29 23:21 ` [Qemu-riscv] " Palmer Dabbelt
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=CAKmqyKMT7F_ziNjbdTU08ph33DnSkKyt+dSMSVXLVZffSvBu-w@mail.gmail.com \ --to=alistair23@gmail.com \ --cc=jimw@sifive.com \ --cc=qemu-devel@nongnu.org \ --cc=qemu-riscv@nongnu.org \ /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: linkBe 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.