From: Alexey Baturo <baturo.alexey@gmail.com>
Cc: baturo.alexey@gmail.com,
"open list:RISC-V TCG CPUs" <qemu-riscv@nongnu.org>,
Sagar Karandikar <sagark@eecs.berkeley.edu>,
Bastian Koppelmann <kbastian@mail.uni-paderborn.de>,
"open list:All patches CC here" <qemu-devel@nongnu.org>,
space.monkey.delivers@gmail.com,
Alistair Francis <Alistair.Francis@wdc.com>,
Anatoly Parshintsev <kupokupokupopo@gmail.com>,
Palmer Dabbelt <palmer@dabbelt.com>
Subject: [PATCH 4/5] [RISCV_PM] Add address masking functions required for RISC-V Pointer Masking extension
Date: Wed, 14 Oct 2020 20:01:58 +0300 [thread overview]
Message-ID: <20201014170159.26932-5-space.monkey.delivers@gmail.com> (raw)
In-Reply-To: <20201014170159.26932-1-space.monkey.delivers@gmail.com>
From: Anatoly Parshintsev <kupokupokupopo@gmail.com>
Signed-off-by: Anatoly Parshintsev <kupokupokupopo@gmail.com>
---
target/riscv/translate.c | 65 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 65 insertions(+)
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
index 79dca2291b..338a967e0c 100644
--- a/target/riscv/translate.c
+++ b/target/riscv/translate.c
@@ -63,6 +63,10 @@ typedef struct DisasContext {
uint16_t vlen;
uint16_t mlen;
bool vl_eq_vlmax;
+ /* PointerMasking extension */
+ uint8_t pm_enabled;
+ target_ulong pm_mask;
+ target_ulong pm_base;
} DisasContext;
#ifdef TARGET_RISCV64
@@ -90,6 +94,38 @@ static inline bool has_ext(DisasContext *ctx, uint32_t ext)
return ctx->misa & ext;
}
+/* Generates address adjustment for PointerMasking */
+static void gen_pm_adjust_address(DisasContext *s,
+ TCGv_i64 dst,
+ TCGv_i64 src)
+{
+ if (s->pm_enabled == 0) {
+ /* Load unmodified address */
+ tcg_gen_mov_i64(dst, src);
+ } else {
+ TCGv_i64 mask_neg = tcg_const_i64(~s->pm_mask);
+ TCGv_i64 base = tcg_const_i64(s->pm_base);
+ /* calculate (addr & ~mask) */
+ TCGv res1 = tcg_temp_new();
+ tcg_gen_and_tl(res1, mask_neg, src);
+ /* calculate (1) | (base) */
+ TCGv res2 = tcg_temp_new();
+ tcg_gen_or_tl(res2, res1, base);
+ /* move result to dst */
+ tcg_gen_mov_i64(dst, res2);
+ /* free allocated temps */
+ tcg_temp_free(res1);
+ tcg_temp_free(res2);
+ tcg_temp_free_i64(mask_neg);
+ tcg_temp_free_i64(base);
+ }
+}
+
+static TCGv_i64 apply_pointer_masking(DisasContext *s, TCGv_i64 addr)
+{
+ gen_pm_adjust_address(s, addr, addr);
+ return addr;
+}
/*
* RISC-V requires NaN-boxing of narrower width floating point values.
* This applies when a 32-bit value is assigned to a 64-bit FP register.
@@ -800,8 +836,36 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
} else {
ctx->virt_enabled = false;
}
+ if (riscv_has_ext(env, RVJ)) {
+ switch (env->priv) {
+ case PRV_U:
+ ctx->pm_enabled = get_field(env->mmte, UMTE_U_PM_ENABLE);
+ ctx->pm_mask = env->upmmask;
+ ctx->pm_base = env->upmbase;
+ break;
+ case PRV_S:
+ ctx->pm_enabled = get_field(env->mmte, SMTE_S_PM_ENABLE);
+ ctx->pm_mask = env->spmmask;
+ ctx->pm_base = env->spmbase;
+ break;
+ case PRV_M:
+ ctx->pm_enabled = get_field(env->mmte, MMTE_M_PM_ENABLE);
+ ctx->pm_mask = env->mpmmask;
+ ctx->pm_base = env->mpmbase;
+ break;
+ default:
+ assert(0 && "Unreachable");
+ }
+ } else {
+ ctx->pm_enabled = 0;
+ ctx->pm_mask = 0;
+ ctx->pm_base = 0;
+ }
#else
ctx->virt_enabled = false;
+ ctx->pm_enabled = 0;
+ ctx->pm_mask = 0;
+ ctx->pm_base = 0;
#endif
ctx->misa = env->misa;
ctx->frm = -1; /* unknown rounding mode */
@@ -932,3 +996,4 @@ void riscv_translate_init(void)
load_val = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, load_val),
"load_val");
}
+
--
2.20.1
next prev parent reply other threads:[~2020-10-14 17:08 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20201014170159.26932-1-space.monkey.delivers@gmail.com>
2020-10-14 17:01 ` [PATCH 1/5] [RISCV_PM] Add J-extension into RISC-V Alexey Baturo
2020-10-14 17:01 ` [PATCH 2/5] [RISCV_PM] Support CSRs required for RISC-V PM extension except for ones in hypervisor mode Alexey Baturo
2020-10-14 17:01 ` [PATCH 3/5] [RISCV_PM] Print new PM CSRs in QEMU logs Alexey Baturo
2020-10-14 18:41 ` Richard Henderson
2020-10-14 20:01 ` Alexey Baturo
2020-10-14 17:01 ` Alexey Baturo [this message]
2020-10-14 19:19 ` [PATCH 4/5] [RISCV_PM] Add address masking functions required for RISC-V Pointer Masking extension Richard Henderson
2020-10-14 20:10 ` Alexey Baturo
2020-10-15 15:23 ` Alexey Baturo
2020-10-14 17:01 ` [PATCH 5/5] [RISCV_PM] Support pointer masking for RISC-V for i/c/f/d/a types of instructions Alexey Baturo
2020-10-14 19:24 ` Richard Henderson
2020-10-14 20:13 ` Alexey Baturo
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=20201014170159.26932-5-space.monkey.delivers@gmail.com \
--to=baturo.alexey@gmail.com \
--cc=Alistair.Francis@wdc.com \
--cc=kbastian@mail.uni-paderborn.de \
--cc=kupokupokupopo@gmail.com \
--cc=palmer@dabbelt.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=sagark@eecs.berkeley.edu \
--cc=space.monkey.delivers@gmail.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: 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).