From: LIU Zhiwei <zhiwei_liu@c-sky.com> To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Cc: peter.maydell@linaro.org, richard.henderson@linaro.org, wxy194768@alibaba-inc.com, chihmin.chao@sifive.com, wenmeng_zhang@c-sky.com, Alistair.Francis@wdc.com, alex.bennee@linaro.org, LIU Zhiwei <zhiwei_liu@c-sky.com> Subject: [PATCH 10/11] riscv: Implement payload load interfaces Date: Sun, 12 Jul 2020 00:16:54 +0800 [thread overview] Message-ID: <20200711161655.2856-11-zhiwei_liu@c-sky.com> (raw) In-Reply-To: <20200711161655.2856-1-zhiwei_liu@c-sky.com> When a risu op emits, the signal handler wll take over execution before running the payload again. The signal handler need some interfaces, such as setting struct reginfo and the comparison of struct reginfo. Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com> --- risu_reginfo_riscv64.c | 132 +++++++++++++++++++++++++++++++++++++++++ risu_riscv64.c | 47 +++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 risu_reginfo_riscv64.c create mode 100644 risu_riscv64.c diff --git a/risu_reginfo_riscv64.c b/risu_reginfo_riscv64.c new file mode 100644 index 0000000..763001f --- /dev/null +++ b/risu_reginfo_riscv64.c @@ -0,0 +1,132 @@ +/****************************************************************************** + * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * LIU Zhiwei (T-Head) - initial implementation + * based on Peter Maydell's risu_arm.c + *****************************************************************************/ + +#include <stdio.h> +#include <ucontext.h> +#include <string.h> +#include <signal.h> /* for FPSIMD_MAGIC */ +#include <stdlib.h> +#include <stddef.h> +#include <stdbool.h> +#include <inttypes.h> +#include <assert.h> +#include <sys/prctl.h> + +#include "risu.h" +#include "risu_reginfo_riscv64.h" + +const struct option * const arch_long_opts; +const char * const arch_extra_help; + +void process_arch_opt(int opt, const char *arg) +{ + abort(); +} + +const int reginfo_size(void) +{ + return sizeof(struct reginfo); +} + +/* reginfo_init: initialize with a ucontext */ +void reginfo_init(struct reginfo *ri, ucontext_t *uc) +{ + int i; + union __riscv_mc_fp_state *fp; + /* necessary to be able to compare with memcmp later */ + memset(ri, 0, sizeof(*ri)); + + for (i = 0; i < 32; i++) { + ri->regs[i] = uc->uc_mcontext.__gregs[i]; + } + + ri->regs[2] = 0xdeadbeefdeadbeef; + ri->regs[3] = 0xdeadbeefdeadbeef; + ri->regs[4] = 0xdeadbeefdeadbeef; + ri->pc = uc->uc_mcontext.__gregs[0] - image_start_address; + ri->regs[0] = ri->pc; + ri->faulting_insn = *((uint32_t *) uc->uc_mcontext.__gregs[0]); + fp = &uc->uc_mcontext.__fpregs; +#if __riscv_flen == 64 + ri->fcsr = fp->__d.__fcsr; + + for (i = 0; i < 32; i++) { + ri->fregs[i] = fp->__d.__f[i]; + } +#else +# error "Unsupported fp length" +#endif +} + +/* reginfo_is_eq: compare the reginfo structs, returns nonzero if equal */ +int reginfo_is_eq(struct reginfo *r1, struct reginfo *r2) +{ + return memcmp(r1, r2, reginfo_size()) == 0; +} + +/* reginfo_dump: print state to a stream, returns nonzero on success */ +int reginfo_dump(struct reginfo *ri, FILE * f) +{ + int i; + fprintf(f, " faulting insn %08x\n", ri->faulting_insn); + + for (i = 1; i < 32; i++) { + fprintf(f, " X%-2d : %016" PRIx64 "\n", i, ri->regs[i]); + } + + fprintf(f, " pc : %016" PRIx64 "\n", ri->pc); + fprintf(f, " fcsr : %08x\n", ri->fcsr); + + for (i = 0; i < 32; i++) { + fprintf(f, " F%-2d : %016" PRIx64 "\n", i, ri->fregs[i]); + } + + return !ferror(f); +} + +/* reginfo_dump_mismatch: print mismatch details to a stream, ret nonzero=ok */ +int reginfo_dump_mismatch(struct reginfo *m, struct reginfo *a, FILE * f) +{ + int i; + fprintf(f, "mismatch detail (master : apprentice):\n"); + if (m->faulting_insn != a->faulting_insn) { + fprintf(f, " faulting insn mismatch %08x vs %08x\n", + m->faulting_insn, a->faulting_insn); + } + for (i = 1; i < 32; i++) { + if (m->regs[i] != a->regs[i]) { + fprintf(f, " X%-2d : %016" PRIx64 " vs %016" PRIx64 "\n", + i, m->regs[i], a->regs[i]); + } + } + + if (m->pc != a->pc) { + fprintf(f, " pc : %016" PRIx64 " vs %016" PRIx64 "\n", + m->pc, a->pc); + } + + if (m->fcsr != a->fcsr) { + fprintf(f, " fcsr : %08x vs %08x\n", m->fcsr, a->fcsr); + } + + for (i = 0; i < 32; i++) { + if (m->fregs[i] != a->fregs[i]) { + fprintf(f, " F%-2d : " + "%016" PRIx64 " vs " + "%016" PRIx64 "\n", i, + (uint64_t) m->fregs[i], + (uint64_t) a->fregs[i]); + } + } + + return !ferror(f); +} diff --git a/risu_riscv64.c b/risu_riscv64.c new file mode 100644 index 0000000..06dbb2d --- /dev/null +++ b/risu_riscv64.c @@ -0,0 +1,47 @@ +/****************************************************************************** + * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * LIU Zhiwei(Linaro) - initial implementation + * based on Peter Maydell's risu_arm.c + *****************************************************************************/ + +#include "risu.h" + +void advance_pc(void *vuc) +{ + ucontext_t *uc = vuc; + uc->uc_mcontext.__gregs[0] += 4; +} + +void set_ucontext_paramreg(void *vuc, uint64_t value) +{ + ucontext_t *uc = vuc; + uc->uc_mcontext.__gregs[10] = value; +} + +uint64_t get_reginfo_paramreg(struct reginfo *ri) +{ + return ri->regs[10]; +} + +int get_risuop(struct reginfo *ri) +{ + /* Return the risuop we have been asked to do + * (or -1 if this was a SIGILL for a non-risuop insn) + */ + uint32_t insn = ri->faulting_insn; + uint32_t op = (insn & 0xf00) >> 8; + uint32_t key = insn & ~0xf00; + uint32_t risukey = 0x0000006b; + return (key != risukey) ? -1 : op; +} + +uintptr_t get_pc(struct reginfo *ri) +{ + return ri->pc; +} -- 2.23.0
WARNING: multiple messages have this Message-ID (diff)
From: LIU Zhiwei <zhiwei_liu@c-sky.com> To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Cc: richard.henderson@linaro.org, Alistair.Francis@wdc.com, chihmin.chao@sifive.com, alex.bennee@linaro.org, peter.maydell@linaro.org, wenmeng_zhang@c-sky.com, wxy194768@alibaba-inc.com, LIU Zhiwei <zhiwei_liu@c-sky.com> Subject: [PATCH 10/11] riscv: Implement payload load interfaces Date: Sun, 12 Jul 2020 00:16:54 +0800 [thread overview] Message-ID: <20200711161655.2856-11-zhiwei_liu@c-sky.com> (raw) In-Reply-To: <20200711161655.2856-1-zhiwei_liu@c-sky.com> When a risu op emits, the signal handler wll take over execution before running the payload again. The signal handler need some interfaces, such as setting struct reginfo and the comparison of struct reginfo. Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com> --- risu_reginfo_riscv64.c | 132 +++++++++++++++++++++++++++++++++++++++++ risu_riscv64.c | 47 +++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 risu_reginfo_riscv64.c create mode 100644 risu_riscv64.c diff --git a/risu_reginfo_riscv64.c b/risu_reginfo_riscv64.c new file mode 100644 index 0000000..763001f --- /dev/null +++ b/risu_reginfo_riscv64.c @@ -0,0 +1,132 @@ +/****************************************************************************** + * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * LIU Zhiwei (T-Head) - initial implementation + * based on Peter Maydell's risu_arm.c + *****************************************************************************/ + +#include <stdio.h> +#include <ucontext.h> +#include <string.h> +#include <signal.h> /* for FPSIMD_MAGIC */ +#include <stdlib.h> +#include <stddef.h> +#include <stdbool.h> +#include <inttypes.h> +#include <assert.h> +#include <sys/prctl.h> + +#include "risu.h" +#include "risu_reginfo_riscv64.h" + +const struct option * const arch_long_opts; +const char * const arch_extra_help; + +void process_arch_opt(int opt, const char *arg) +{ + abort(); +} + +const int reginfo_size(void) +{ + return sizeof(struct reginfo); +} + +/* reginfo_init: initialize with a ucontext */ +void reginfo_init(struct reginfo *ri, ucontext_t *uc) +{ + int i; + union __riscv_mc_fp_state *fp; + /* necessary to be able to compare with memcmp later */ + memset(ri, 0, sizeof(*ri)); + + for (i = 0; i < 32; i++) { + ri->regs[i] = uc->uc_mcontext.__gregs[i]; + } + + ri->regs[2] = 0xdeadbeefdeadbeef; + ri->regs[3] = 0xdeadbeefdeadbeef; + ri->regs[4] = 0xdeadbeefdeadbeef; + ri->pc = uc->uc_mcontext.__gregs[0] - image_start_address; + ri->regs[0] = ri->pc; + ri->faulting_insn = *((uint32_t *) uc->uc_mcontext.__gregs[0]); + fp = &uc->uc_mcontext.__fpregs; +#if __riscv_flen == 64 + ri->fcsr = fp->__d.__fcsr; + + for (i = 0; i < 32; i++) { + ri->fregs[i] = fp->__d.__f[i]; + } +#else +# error "Unsupported fp length" +#endif +} + +/* reginfo_is_eq: compare the reginfo structs, returns nonzero if equal */ +int reginfo_is_eq(struct reginfo *r1, struct reginfo *r2) +{ + return memcmp(r1, r2, reginfo_size()) == 0; +} + +/* reginfo_dump: print state to a stream, returns nonzero on success */ +int reginfo_dump(struct reginfo *ri, FILE * f) +{ + int i; + fprintf(f, " faulting insn %08x\n", ri->faulting_insn); + + for (i = 1; i < 32; i++) { + fprintf(f, " X%-2d : %016" PRIx64 "\n", i, ri->regs[i]); + } + + fprintf(f, " pc : %016" PRIx64 "\n", ri->pc); + fprintf(f, " fcsr : %08x\n", ri->fcsr); + + for (i = 0; i < 32; i++) { + fprintf(f, " F%-2d : %016" PRIx64 "\n", i, ri->fregs[i]); + } + + return !ferror(f); +} + +/* reginfo_dump_mismatch: print mismatch details to a stream, ret nonzero=ok */ +int reginfo_dump_mismatch(struct reginfo *m, struct reginfo *a, FILE * f) +{ + int i; + fprintf(f, "mismatch detail (master : apprentice):\n"); + if (m->faulting_insn != a->faulting_insn) { + fprintf(f, " faulting insn mismatch %08x vs %08x\n", + m->faulting_insn, a->faulting_insn); + } + for (i = 1; i < 32; i++) { + if (m->regs[i] != a->regs[i]) { + fprintf(f, " X%-2d : %016" PRIx64 " vs %016" PRIx64 "\n", + i, m->regs[i], a->regs[i]); + } + } + + if (m->pc != a->pc) { + fprintf(f, " pc : %016" PRIx64 " vs %016" PRIx64 "\n", + m->pc, a->pc); + } + + if (m->fcsr != a->fcsr) { + fprintf(f, " fcsr : %08x vs %08x\n", m->fcsr, a->fcsr); + } + + for (i = 0; i < 32; i++) { + if (m->fregs[i] != a->fregs[i]) { + fprintf(f, " F%-2d : " + "%016" PRIx64 " vs " + "%016" PRIx64 "\n", i, + (uint64_t) m->fregs[i], + (uint64_t) a->fregs[i]); + } + } + + return !ferror(f); +} diff --git a/risu_riscv64.c b/risu_riscv64.c new file mode 100644 index 0000000..06dbb2d --- /dev/null +++ b/risu_riscv64.c @@ -0,0 +1,47 @@ +/****************************************************************************** + * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * LIU Zhiwei(Linaro) - initial implementation + * based on Peter Maydell's risu_arm.c + *****************************************************************************/ + +#include "risu.h" + +void advance_pc(void *vuc) +{ + ucontext_t *uc = vuc; + uc->uc_mcontext.__gregs[0] += 4; +} + +void set_ucontext_paramreg(void *vuc, uint64_t value) +{ + ucontext_t *uc = vuc; + uc->uc_mcontext.__gregs[10] = value; +} + +uint64_t get_reginfo_paramreg(struct reginfo *ri) +{ + return ri->regs[10]; +} + +int get_risuop(struct reginfo *ri) +{ + /* Return the risuop we have been asked to do + * (or -1 if this was a SIGILL for a non-risuop insn) + */ + uint32_t insn = ri->faulting_insn; + uint32_t op = (insn & 0xf00) >> 8; + uint32_t key = insn & ~0xf00; + uint32_t risukey = 0x0000006b; + return (key != risukey) ? -1 : op; +} + +uintptr_t get_pc(struct reginfo *ri) +{ + return ri->pc; +} -- 2.23.0
next prev parent reply other threads:[~2020-07-11 16:20 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-07-11 16:16 [PATCH 00/11] RISC-V risu porting LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 01/11] riscv: Add RV64I instructions description LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 02/11] riscv: Add RV64M " LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 03/11] riscv: Add RV64A " LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 04/11] riscv: Add RV64F " LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 05/11] riscv: Add RV64D " LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 06/11] riscv: Add RV64C " LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 07/11] riscv: Generate payload scripts LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 08/11] riscv: Add standard test case LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` [PATCH 09/11] riscv: Define riscv struct reginfo LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei [this message] 2020-07-11 16:16 ` [PATCH 10/11] riscv: Implement payload load interfaces LIU Zhiwei 2020-07-11 16:16 ` [PATCH 11/11] riscv: Add configure script LIU Zhiwei 2020-07-11 16:16 ` LIU Zhiwei 2020-07-22 2:50 ` [PATCH 00/11] RISC-V risu porting LIU Zhiwei 2020-07-22 2:50 ` LIU Zhiwei
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=20200711161655.2856-11-zhiwei_liu@c-sky.com \ --to=zhiwei_liu@c-sky.com \ --cc=Alistair.Francis@wdc.com \ --cc=alex.bennee@linaro.org \ --cc=chihmin.chao@sifive.com \ --cc=peter.maydell@linaro.org \ --cc=qemu-devel@nongnu.org \ --cc=qemu-riscv@nongnu.org \ --cc=richard.henderson@linaro.org \ --cc=wenmeng_zhang@c-sky.com \ --cc=wxy194768@alibaba-inc.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: 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.