From: Deepak Gupta <debug@rivosinc.com>
To: Alistair Francis <alistair23@gmail.com>
Cc: qemu-riscv@nongnu.org, qemu-devel@nongnu.org, palmer@dabbelt.com,
Alistair.Francis@wdc.com, laurent@vivier.eu, bmeng.cn@gmail.com,
liwei1518@gmail.com, dbarboza@ventanamicro.com,
zhiwei_liu@linux.alibaba.com, jim.shu@sifive.com,
andy.chiu@sifive.com, kito.cheng@sifive.com,
Richard Henderson <richard.henderson@linaro.org>
Subject: Re: [PATCH v11 13/20] target/riscv: mmu changes for zicfiss shadow stack protection
Date: Wed, 28 Aug 2024 16:45:28 -0700 [thread overview]
Message-ID: <Zs+2mIsAw2BKODtk@debug.ba.rivosinc.com> (raw)
In-Reply-To: <CAKmqyKPyyupykqc-0yrGm+msZPuf+=jVWvD86yz7mfqjn5MT9A@mail.gmail.com>
On Thu, Aug 29, 2024 at 09:29:49AM +1000, Alistair Francis wrote:
>On Thu, Aug 29, 2024 at 3:49 AM Deepak Gupta <debug@rivosinc.com> wrote:
>>
>> zicfiss protects shadow stack using new page table encodings PTE.W=1,
>> PTE.R=0 and PTE.X=0. This encoding is reserved if zicfiss is not
>> implemented or if shadow stack are not enabled.
>> Loads on shadow stack memory are allowed while stores to shadow stack
>> memory leads to access faults. Shadow stack accesses to RO memory
>> leads to store page fault.
>>
>> To implement special nature of shadow stack memory where only selected
>> stores (shadow stack stores from sspush) have to be allowed while rest
>> of regular stores disallowed, new MMU TLB index is created for shadow
>> stack.
>>
>> Signed-off-by: Deepak Gupta <debug@rivosinc.com>
>> Suggested-by: Richard Henderson <richard.henderson@linaro.org>
>> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>> target/riscv/cpu_helper.c | 37 +++++++++++++++++++++++++++++++------
>> target/riscv/internals.h | 3 +++
>> 2 files changed, 34 insertions(+), 6 deletions(-)
>>
>> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
>> index be4ac3d54e..39544cade6 100644
>> --- a/target/riscv/cpu_helper.c
>> +++ b/target/riscv/cpu_helper.c
>> @@ -893,6 +893,8 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
>> hwaddr ppn;
>> int napot_bits = 0;
>> target_ulong napot_mask;
>> + bool is_sstack_idx = ((mmu_idx & MMU_IDX_SS_WRITE) == MMU_IDX_SS_WRITE);
>> + bool sstack_page = false;
>>
>> /*
>> * Check if we should use the background registers for the two
>> @@ -1101,21 +1103,36 @@ restart:
>> return TRANSLATE_FAIL;
>> }
>>
>> + target_ulong rwx = pte & (PTE_R | PTE_W | PTE_X);
>> /* Check for reserved combinations of RWX flags. */
>> - switch (pte & (PTE_R | PTE_W | PTE_X)) {
>> - case PTE_W:
>> + switch (rwx) {
>> case PTE_W | PTE_X:
>> return TRANSLATE_FAIL;
>> + case PTE_W:
>> + /* if bcfi enabled, PTE_W is not reserved and shadow stack page */
>> + if (cpu_get_bcfien(env) && first_stage) {
>> + sstack_page = true;
>> + /* if ss index, read and write allowed. else only read allowed */
>> + rwx = is_sstack_idx ? PTE_R | PTE_W : PTE_R;
>> + break;
>> + }
>> + return TRANSLATE_FAIL;
>> + case PTE_R:
>> + /* shadow stack writes to readonly memory are page faults */
>> + if (is_sstack_idx && access_type == MMU_DATA_STORE) {
While responding to your question, I noticed there is a bug here. Its a leftover from
previous patches where I was promoting shadow stack loads to stores. No need to check
`access_type == MMU_DATA_STORE` because we store unwind information as part of tcg
compile.
Will fix it.
>> + return TRANSLATE_FAIL;
>> + }
>> + break;
>> }
>>
>> int prot = 0;
>> - if (pte & PTE_R) {
>> + if (rwx & PTE_R) {
>> prot |= PAGE_READ;
>> }
>> - if (pte & PTE_W) {
>> + if (rwx & PTE_W) {
>> prot |= PAGE_WRITE;
>> }
>> - if (pte & PTE_X) {
>> + if (rwx & PTE_X) {
>> bool mxr = false;
>>
>> /*
>> @@ -1160,7 +1177,7 @@ restart:
>>
>> if (!((prot >> access_type) & 1)) {
>> /* Access check failed */
>> - return TRANSLATE_FAIL;
>> + return sstack_page ? TRANSLATE_PMP_FAIL : TRANSLATE_FAIL;
>
>Why is it a PMP error if it's a shadow stack page?
A shadow stack page is readable by regular loads.
We are making sure of that in `case PTE_W` in above switch case.
But shadow stack page is not writeable via regular stores. And must raise
access fault. return code `TRANSLATE_PMP_FAIL` is translated to access fault
while raising fault.
>
>Alistair
next prev parent reply other threads:[~2024-08-28 23:45 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-28 17:47 [PATCH v11 00/20] riscv support for control flow integrity extensions Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 01/20] target/riscv: expose *envcfg csr and priv to qemu-user as well Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 02/20] target/riscv: Add zicfilp extension Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 03/20] target/riscv: Introduce elp state and enabling controls for zicfilp Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 04/20] target/riscv: save and restore elp state on priv transitions Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 05/20] target/riscv: additional code information for sw check Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 06/20] target/riscv: tracking indirect branches (fcfi) for zicfilp Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 07/20] target/riscv: zicfilp `lpad` impl and branch tracking Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 08/20] disas/riscv: enable `lpad` disassembly Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 09/20] target/riscv: Expose zicfilp extension as a cpu property Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 10/20] target/riscv: Add zicfiss extension Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 11/20] target/riscv: introduce ssp and enabling controls for zicfiss Deepak Gupta
2024-08-28 23:16 ` Alistair Francis
2024-08-28 17:47 ` [PATCH v11 12/20] target/riscv: tb flag for shadow stack instructions Deepak Gupta
2024-08-29 1:34 ` Richard Henderson
2024-08-28 17:47 ` [PATCH v11 13/20] target/riscv: mmu changes for zicfiss shadow stack protection Deepak Gupta
2024-08-28 23:29 ` Alistair Francis
2024-08-28 23:45 ` Deepak Gupta [this message]
2024-08-29 0:03 ` Alistair Francis
2024-08-29 0:17 ` Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 14/20] target/riscv: AMO operations always raise store/AMO fault Deepak Gupta
2024-08-28 23:33 ` Alistair Francis
2024-08-28 17:47 ` [PATCH v11 15/20] target/riscv: update `decode_save_opc` to store extra word2 Deepak Gupta
2024-08-28 23:36 ` Alistair Francis
2024-08-28 17:47 ` [PATCH v11 16/20] target/riscv: implement zicfiss instructions Deepak Gupta
2024-08-29 0:01 ` Alistair Francis
2024-08-29 0:06 ` Deepak Gupta
2024-08-29 0:07 ` Alistair Francis
2024-08-29 0:15 ` Deepak Gupta
2024-08-28 17:47 ` [PATCH v11 17/20] target/riscv: compressed encodings for sspush and sspopchk Deepak Gupta
2024-08-29 0:03 ` Alistair Francis
2024-08-28 17:47 ` [PATCH v11 18/20] disas/riscv: enable disassembly for zicfiss instructions Deepak Gupta
2024-08-29 0:04 ` Alistair Francis
2024-08-28 17:47 ` [PATCH v11 19/20] disas/riscv: enable disassembly for compressed sspush/sspopchk Deepak Gupta
2024-08-29 0:06 ` Alistair Francis
2024-08-28 17:47 ` [PATCH v11 20/20] target/riscv: Expose zicfiss extension as a cpu property Deepak Gupta
2024-08-29 0:06 ` Alistair Francis
2024-08-28 17:50 ` [PATCH v11 00/20] riscv support for control flow integrity extensions Deepak Gupta
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=Zs+2mIsAw2BKODtk@debug.ba.rivosinc.com \
--to=debug@rivosinc.com \
--cc=Alistair.Francis@wdc.com \
--cc=alistair23@gmail.com \
--cc=andy.chiu@sifive.com \
--cc=bmeng.cn@gmail.com \
--cc=dbarboza@ventanamicro.com \
--cc=jim.shu@sifive.com \
--cc=kito.cheng@sifive.com \
--cc=laurent@vivier.eu \
--cc=liwei1518@gmail.com \
--cc=palmer@dabbelt.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=zhiwei_liu@linux.alibaba.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 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.