From: Charlie Jenkins <charlie@rivosinc.com>
To: Atish Patra <atishp@atishpatra.org>
Cc: "Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Jonathan Corbet" <corbet@lwn.net>,
"Conor Dooley" <conor.dooley@microchip.com>,
"Clément Léger" <cleger@rivosinc.com>,
"Randy Dunlap" <rdunlap@infradead.org>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
linux-doc@vger.kernel.org
Subject: Re: [PATCH v5 2/2] documentation: Document PR_RISCV_SET_ICACHE_FLUSH_CTX prctl
Date: Mon, 8 Jan 2024 18:20:55 -0800 [thread overview]
Message-ID: <ZZyth6Ijtsmy5D84@ghost> (raw)
In-Reply-To: <CAOnJCUJQ-M1bVC_VhogMLo47mRyk3Pzq-GFH5P7ADn70BN9ObA@mail.gmail.com>
On Mon, Jan 08, 2024 at 05:24:47PM -0800, Atish Patra wrote:
> On Mon, Jan 8, 2024 at 10:42 AM Charlie Jenkins <charlie@rivosinc.com> wrote:
> >
> > Provide documentation that explains how to properly do CMODX in riscv.
> >
> > Signed-off-by: Charlie Jenkins <charlie@rivosinc.com>
> > ---
> > Documentation/arch/riscv/cmodx.rst | 88 ++++++++++++++++++++++++++++++++++++++
> > Documentation/arch/riscv/index.rst | 1 +
> > 2 files changed, 89 insertions(+)
> >
> > diff --git a/Documentation/arch/riscv/cmodx.rst b/Documentation/arch/riscv/cmodx.rst
> > new file mode 100644
> > index 000000000000..afd7086c222c
> > --- /dev/null
> > +++ b/Documentation/arch/riscv/cmodx.rst
> > @@ -0,0 +1,88 @@
> > +.. SPDX-License-Identifier: GPL-2.0
> > +
> > +==============================================================================
> > +Concurrent Modification and Execution of Instructions (CMODX) for RISC-V Linux
> > +==============================================================================
> > +
> > +CMODX is a programming technique where a program executes instructions that were
> > +modified by the program itself. Instruction storage and the instruction cache
> > +(icache) are not guaranteed to be synchronized on RISC-V hardware. Therefore, the
> > +program must enforce its own synchronization with the unprivileged fence.i
> > +instruction.
> > +
> > +However, the default Linux ABI prohibits the use of fence.i in userspace
> > +applications. At any point the scheduler may migrate a task onto a new hart. If
> > +migration occurs after the userspace synchronized the icache and instruction
> > +storage with fence.i, the icache will no longer be clean. This is due to the
> > +behavior of fence.i only affecting the hart that it is called on. Thus, the hart
> > +that the task has been migrated to may not have synchronized instruction storage
> > +and icache.
> > +
> > +There are two ways to solve this problem: use the riscv_flush_icache() syscall,
> > +or use the ``PR_RISCV_SET_ICACHE_FLUSH_CTX`` prctl() and emit fence.i in
> > +userspace. The syscall performs a one-off icache flushing operation. The prctl
> > +changes the Linux ABI to allow userspace to emit icache flushing operations.
> > +
> > +prctl() Interface
> > +---------------------
> > +
> > +Call prctl() with ``PR_RISCV_SET_ICACHE_FLUSH_CTX`` as the first argument. The
> > +remaining arguments will be delegated to the riscv_set_icache_flush_ctx
> > +function detailed below.
> > +
> > +.. kernel-doc:: arch/riscv/mm/cacheflush.c
> > + :identifiers: riscv_set_icache_flush_ctx
> > +
>
> Document the arguments of the prctl as well ?
Do you mean to include the ``PR_RISCV_SET_ICACHE_FLUSH_CTX`` key in the
comment of riscv_set_icache_flush_ctx? The args to
riscv_set_icache_flush_ctx are the args to the prctl except for the key.
- Charlie
>
> > +Example usage:
> > +
> > +The following files are meant to be compiled and linked with each other. The
> > +modify_instruction() function replaces an add with 0 with an add with one,
> > +causing the instruction sequence in get_value() to change from returning a zero
> > +to returning a one.
> > +
> > +cmodx.c::
> > +
> > + #include <stdio.h>
> > + #include <sys/prctl.h>
> > +
> > + extern int get_value();
> > + extern void modify_instruction();
> > +
> > + int main()
> > + {
> > + int value = get_value();
> > + printf("Value before cmodx: %d\n", value);
> > +
> > + // Call prctl before first fence.i is called inside modify_instruction
> > + prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX_ON, PR_RISCV_CTX_SW_FENCEI, 0);
> > + modify_instruction();
> > +
> > + value = get_value();
> > + printf("Value after cmodx: %d\n", value);
> > + return 0;
> > + }
> > +
> > +cmodx.S::
> > +
> > + .option norvc
> > +
> > + .text
> > + .global modify_instruction
> > + modify_instruction:
> > + lw a0, new_insn
> > + lui a5,%hi(old_insn)
> > + sw a0,%lo(old_insn)(a5)
> > + fence.i
> > + ret
> > +
> > + .section modifiable, "awx"
> > + .global get_value
> > + get_value:
> > + li a0, 0
> > + old_insn:
> > + addi a0, a0, 0
> > + ret
> > +
> > + .data
> > + new_insn:
> > + addi a0, a0, 1
> > diff --git a/Documentation/arch/riscv/index.rst b/Documentation/arch/riscv/index.rst
> > index 4dab0cb4b900..eecf347ce849 100644
> > --- a/Documentation/arch/riscv/index.rst
> > +++ b/Documentation/arch/riscv/index.rst
> > @@ -13,6 +13,7 @@ RISC-V architecture
> > patch-acceptance
> > uabi
> > vector
> > + cmodx
> >
> > features
> >
> >
> > --
> > 2.43.0
> >
>
>
> --
> Regards,
> Atish
WARNING: multiple messages have this Message-ID (diff)
From: Charlie Jenkins <charlie@rivosinc.com>
To: Atish Patra <atishp@atishpatra.org>
Cc: "Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Jonathan Corbet" <corbet@lwn.net>,
"Conor Dooley" <conor.dooley@microchip.com>,
"Clément Léger" <cleger@rivosinc.com>,
"Randy Dunlap" <rdunlap@infradead.org>,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
linux-doc@vger.kernel.org
Subject: Re: [PATCH v5 2/2] documentation: Document PR_RISCV_SET_ICACHE_FLUSH_CTX prctl
Date: Mon, 8 Jan 2024 18:20:55 -0800 [thread overview]
Message-ID: <ZZyth6Ijtsmy5D84@ghost> (raw)
In-Reply-To: <CAOnJCUJQ-M1bVC_VhogMLo47mRyk3Pzq-GFH5P7ADn70BN9ObA@mail.gmail.com>
On Mon, Jan 08, 2024 at 05:24:47PM -0800, Atish Patra wrote:
> On Mon, Jan 8, 2024 at 10:42 AM Charlie Jenkins <charlie@rivosinc.com> wrote:
> >
> > Provide documentation that explains how to properly do CMODX in riscv.
> >
> > Signed-off-by: Charlie Jenkins <charlie@rivosinc.com>
> > ---
> > Documentation/arch/riscv/cmodx.rst | 88 ++++++++++++++++++++++++++++++++++++++
> > Documentation/arch/riscv/index.rst | 1 +
> > 2 files changed, 89 insertions(+)
> >
> > diff --git a/Documentation/arch/riscv/cmodx.rst b/Documentation/arch/riscv/cmodx.rst
> > new file mode 100644
> > index 000000000000..afd7086c222c
> > --- /dev/null
> > +++ b/Documentation/arch/riscv/cmodx.rst
> > @@ -0,0 +1,88 @@
> > +.. SPDX-License-Identifier: GPL-2.0
> > +
> > +==============================================================================
> > +Concurrent Modification and Execution of Instructions (CMODX) for RISC-V Linux
> > +==============================================================================
> > +
> > +CMODX is a programming technique where a program executes instructions that were
> > +modified by the program itself. Instruction storage and the instruction cache
> > +(icache) are not guaranteed to be synchronized on RISC-V hardware. Therefore, the
> > +program must enforce its own synchronization with the unprivileged fence.i
> > +instruction.
> > +
> > +However, the default Linux ABI prohibits the use of fence.i in userspace
> > +applications. At any point the scheduler may migrate a task onto a new hart. If
> > +migration occurs after the userspace synchronized the icache and instruction
> > +storage with fence.i, the icache will no longer be clean. This is due to the
> > +behavior of fence.i only affecting the hart that it is called on. Thus, the hart
> > +that the task has been migrated to may not have synchronized instruction storage
> > +and icache.
> > +
> > +There are two ways to solve this problem: use the riscv_flush_icache() syscall,
> > +or use the ``PR_RISCV_SET_ICACHE_FLUSH_CTX`` prctl() and emit fence.i in
> > +userspace. The syscall performs a one-off icache flushing operation. The prctl
> > +changes the Linux ABI to allow userspace to emit icache flushing operations.
> > +
> > +prctl() Interface
> > +---------------------
> > +
> > +Call prctl() with ``PR_RISCV_SET_ICACHE_FLUSH_CTX`` as the first argument. The
> > +remaining arguments will be delegated to the riscv_set_icache_flush_ctx
> > +function detailed below.
> > +
> > +.. kernel-doc:: arch/riscv/mm/cacheflush.c
> > + :identifiers: riscv_set_icache_flush_ctx
> > +
>
> Document the arguments of the prctl as well ?
Do you mean to include the ``PR_RISCV_SET_ICACHE_FLUSH_CTX`` key in the
comment of riscv_set_icache_flush_ctx? The args to
riscv_set_icache_flush_ctx are the args to the prctl except for the key.
- Charlie
>
> > +Example usage:
> > +
> > +The following files are meant to be compiled and linked with each other. The
> > +modify_instruction() function replaces an add with 0 with an add with one,
> > +causing the instruction sequence in get_value() to change from returning a zero
> > +to returning a one.
> > +
> > +cmodx.c::
> > +
> > + #include <stdio.h>
> > + #include <sys/prctl.h>
> > +
> > + extern int get_value();
> > + extern void modify_instruction();
> > +
> > + int main()
> > + {
> > + int value = get_value();
> > + printf("Value before cmodx: %d\n", value);
> > +
> > + // Call prctl before first fence.i is called inside modify_instruction
> > + prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX_ON, PR_RISCV_CTX_SW_FENCEI, 0);
> > + modify_instruction();
> > +
> > + value = get_value();
> > + printf("Value after cmodx: %d\n", value);
> > + return 0;
> > + }
> > +
> > +cmodx.S::
> > +
> > + .option norvc
> > +
> > + .text
> > + .global modify_instruction
> > + modify_instruction:
> > + lw a0, new_insn
> > + lui a5,%hi(old_insn)
> > + sw a0,%lo(old_insn)(a5)
> > + fence.i
> > + ret
> > +
> > + .section modifiable, "awx"
> > + .global get_value
> > + get_value:
> > + li a0, 0
> > + old_insn:
> > + addi a0, a0, 0
> > + ret
> > +
> > + .data
> > + new_insn:
> > + addi a0, a0, 1
> > diff --git a/Documentation/arch/riscv/index.rst b/Documentation/arch/riscv/index.rst
> > index 4dab0cb4b900..eecf347ce849 100644
> > --- a/Documentation/arch/riscv/index.rst
> > +++ b/Documentation/arch/riscv/index.rst
> > @@ -13,6 +13,7 @@ RISC-V architecture
> > patch-acceptance
> > uabi
> > vector
> > + cmodx
> >
> > features
> >
> >
> > --
> > 2.43.0
> >
>
>
> --
> Regards,
> Atish
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2024-01-09 2:20 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-08 18:42 [PATCH v5 0/2] riscv: Create and document PR_RISCV_SET_ICACHE_FLUSH_CTX prctl Charlie Jenkins
2024-01-08 18:42 ` Charlie Jenkins
2024-01-08 18:42 ` [PATCH v5 1/2] riscv: Include riscv_set_icache_flush_ctx prctl Charlie Jenkins
2024-01-08 18:42 ` Charlie Jenkins
2024-01-09 1:20 ` Atish Patra
2024-01-09 1:20 ` Atish Patra
2024-01-08 18:42 ` [PATCH v5 2/2] documentation: Document PR_RISCV_SET_ICACHE_FLUSH_CTX prctl Charlie Jenkins
2024-01-08 18:42 ` Charlie Jenkins
2024-01-09 1:24 ` Atish Patra
2024-01-09 1:24 ` Atish Patra
2024-01-09 2:20 ` Charlie Jenkins [this message]
2024-01-09 2:20 ` Charlie Jenkins
2024-01-09 7:51 ` Atish Patra
2024-01-09 7:51 ` Atish Patra
2024-01-09 17:54 ` Atish Patra
2024-01-09 17:54 ` Atish Patra
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=ZZyth6Ijtsmy5D84@ghost \
--to=charlie@rivosinc.com \
--cc=aou@eecs.berkeley.edu \
--cc=atishp@atishpatra.org \
--cc=cleger@rivosinc.com \
--cc=conor.dooley@microchip.com \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=rdunlap@infradead.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: 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.