linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bagas Sanjaya <bagasdotme@gmail.com>
To: Deepak Gupta <debug@rivosinc.com>,
	paul.walmsley@sifive.com, palmer@sifive.com, conor@kernel.org,
	linux-doc@vger.kernel.org, linux-riscv@lists.infradead.org,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	linux-arch@vger.kernel.org, linux-kselftest@vger.kernel.org
Cc: corbet@lwn.net, palmer@dabbelt.com, aou@eecs.berkeley.edu,
	robh@kernel.org, krzk+dt@kernel.org, oleg@redhat.com,
	tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
	dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com,
	peterz@infradead.org, akpm@linux-foundation.org, arnd@arndb.de,
	ebiederm@xmission.com, kees@kernel.org, Liam.Howlett@oracle.com,
	vbabka@suse.cz, lorenzo.stoakes@oracle.com, shuah@kernel.org,
	brauner@kernel.org, samuel.holland@sifive.com,
	andy.chiu@sifive.com, jerry.shih@sifive.com,
	greentime.hu@sifive.com, charlie@rivosinc.com, evan@rivosinc.com,
	cleger@rivosinc.com, xiao.w.wang@intel.com,
	ajones@ventanamicro.com, anup@brainfault.org,
	mchitale@ventanamicro.com, atishp@rivosinc.com,
	sameo@rivosinc.com, bjorn@rivosinc.com, alexghiti@rivosinc.com,
	david@redhat.com, libang.li@antgroup.com, jszhang@kernel.org,
	leobras@redhat.com, guoren@kernel.org, samitolvanen@google.com,
	songshuaishuai@tinylab.org, costa.shul@redhat.com,
	bhe@redhat.com, zong.li@sifive.com, puranjay@kernel.org,
	namcaov@gmail.com, antonb@tenstorrent.com, sorear@fastmail.com,
	quic_bjorande@quicinc.com, ancientmodern4@gmail.com,
	ben.dooks@codethink.co.uk, quic_zhonhan@quicinc.com,
	cuiyunhui@bytedance.com, yang.lee@linux.alibaba.com,
	ke.zhao@shingroup.cn, sunilvl@ventanamicro.com,
	tanzhasanwork@gmail.com, schwab@suse.de, dawei.li@shingroup.cn,
	rppt@kernel.org, willy@infradead.org, usama.anjum@collabora.com,
	osalvador@suse.de, ryan.roberts@arm.com, andrii@kernel.org,
	alx@kernel.org, catalin.marinas@arm.com, broonie@kernel.org,
	revest@chromium.org, bgray@linux.ibm.com, deller@gmx.de,
	zev@bewilderbeest.net
Subject: Re: [PATCH v4 28/30] riscv: Documentation for landing pad / indirect branch tracking
Date: Mon, 16 Sep 2024 09:41:09 +0700	[thread overview]
Message-ID: <ZueaxRZgIf0crs4a@archie.me> (raw)
In-Reply-To: <20240912231650.3740732-29-debug@rivosinc.com>

[-- Attachment #1: Type: text/plain, Size: 11329 bytes --]

On Thu, Sep 12, 2024 at 04:16:47PM -0700, Deepak Gupta wrote:
> Adding documentation on landing pad aka indirect branch tracking on riscv
> and kernel interfaces exposed so that user tasks can enable it.
> 
> Signed-off-by: Deepak Gupta <debug@rivosinc.com>
> ---
>  Documentation/arch/riscv/zicfilp.rst | 104 +++++++++++++++++++++++++++
>  1 file changed, 104 insertions(+)
>  create mode 100644 Documentation/arch/riscv/zicfilp.rst

Don't forget to add toctree entry:

---- >8 ----
diff --git a/Documentation/arch/riscv/index.rst b/Documentation/arch/riscv/index.rst
index eecf347ce84944..be7237b6968213 100644
--- a/Documentation/arch/riscv/index.rst
+++ b/Documentation/arch/riscv/index.rst
@@ -14,6 +14,7 @@ RISC-V architecture
     uabi
     vector
     cmodx
+    zicfilp

     features


> +Function pointers live in read-write memory and thus are susceptible to corruption
> +and allows an adversary to reach any program counter (PC) in address space. On
> +RISC-V zicfilp extension enforces a restriction on such indirect control transfers
> +
> +	- indirect control transfers must land on a landing pad instruction `lpad`.
> +	  There are two exception to this rule
> +		- rs1 = x1 or rs1 = x5, i.e. a return from a function and returns are
> +		  protected using shadow stack (see zicfiss.rst)
> +
> +		- rs1 = x7. On RISC-V compiler usually does below to reach function
> +		  which is beyond the offset possible J-type instruction.
> +
> +			"auipc x7, <imm>"
> +			"jalr (x7)"
> +
> +		  Such form of indirect control transfer are still immutable and don't rely
> +		  on memory and thus rs1=x7 is exempted from tracking and considered software
> +		  guarded jumps.

Sphinx reports new htmldocs warnings:

Documentation/arch/riscv/zicfilp.rst:30: ERROR: Unexpected indentation.
Documentation/arch/riscv/zicfilp.rst:96: ERROR: Unexpected indentation.	

I have to fix up the lists:

---- >8 ----
diff --git a/Documentation/arch/riscv/zicfilp.rst b/Documentation/arch/riscv/zicfilp.rst
index 23013ee711ac2c..c0fad1b5caa3d8 100644
--- a/Documentation/arch/riscv/zicfilp.rst
+++ b/Documentation/arch/riscv/zicfilp.rst
@@ -23,22 +23,24 @@ flow integrity (CFI) of the program.

 Function pointers live in read-write memory and thus are susceptible to corruption
 and allows an adversary to reach any program counter (PC) in address space. On
-RISC-V zicfilp extension enforces a restriction on such indirect control transfers
+RISC-V zicfilp extension enforces a restriction on such indirect control
+transfers:

-	- indirect control transfers must land on a landing pad instruction `lpad`.
-	  There are two exception to this rule
-		- rs1 = x1 or rs1 = x5, i.e. a return from a function and returns are
-		  protected using shadow stack (see zicfiss.rst)
+- indirect control transfers must land on a landing pad instruction `lpad`.
+  There are two exception to this rule:

-		- rs1 = x7. On RISC-V compiler usually does below to reach function
-		  which is beyond the offset possible J-type instruction.
+  - rs1 = x1 or rs1 = x5, i.e. a return from a function and returns are
+    protected using shadow stack (see zicfiss.rst)

-			"auipc x7, <imm>"
-			"jalr (x7)"
+  - rs1 = x7. On RISC-V compiler usually does below to reach function
+    which is beyond the offset possible J-type instruction.

-		  Such form of indirect control transfer are still immutable and don't rely
-		  on memory and thus rs1=x7 is exempted from tracking and considered software
-		  guarded jumps.
+      "auipc x7, <imm>"
+      "jalr (x7)"
+
+    Such form of indirect control transfer are still immutable and don't rely
+    on memory and thus rs1=x7 is exempted from tracking and considered software
+    guarded jumps.

 `lpad` instruction is pseudo of `auipc rd, <imm_20bit>` with `rd=x0`` and is a HINT
 nop. `lpad` instruction must be aligned on 4 byte boundary and compares 20 bit
@@ -92,10 +94,11 @@ to lock current settings.
 --------------------------------------------------

 Pertaining to indirect branch tracking, CPU raises software check exception in
-following conditions
-	- missing `lpad` after indirect call / jmp
-	- `lpad` not on 4 byte boundary
-	- `imm_20bit` embedded in `lpad` instruction doesn't match with `x7`
+following conditions:
+
+- missing `lpad` after indirect call / jmp
+- `lpad` not on 4 byte boundary
+- `imm_20bit` embedded in `lpad` instruction doesn't match with `x7`

 In all 3 cases, `*tval = 2` is captured and software check exception is raised
 (cause=18)


> +
> +`lpad` instruction is pseudo of `auipc rd, <imm_20bit>` with `rd=x0`` and is a HINT
> +nop. `lpad` instruction must be aligned on 4 byte boundary and compares 20 bit
> +immediate withx7. If `imm_20bit` == 0, CPU don't perform any comparision with x7. If
> +`imm_20bit` != 0, then `imm_20bit` must match x7 else CPU will raise
> +`software check exception` (cause=18)with `*tval = 2`.
> +

Also inline identifiers/keywords to be consistent with rest of riscv docs:

---- >8 ----
diff --git a/Documentation/arch/riscv/zicfilp.rst b/Documentation/arch/riscv/zicfilp.rst
index c0fad1b5caa3d8..b0a766098f2335 100644
--- a/Documentation/arch/riscv/zicfilp.rst
+++ b/Documentation/arch/riscv/zicfilp.rst
@@ -26,38 +26,38 @@ and allows an adversary to reach any program counter (PC) in address space. On
 RISC-V zicfilp extension enforces a restriction on such indirect control
 transfers:

-- indirect control transfers must land on a landing pad instruction `lpad`.
+- indirect control transfers must land on a landing pad instruction ``lpad``.
   There are two exception to this rule:

   - rs1 = x1 or rs1 = x5, i.e. a return from a function and returns are
     protected using shadow stack (see zicfiss.rst)

   - rs1 = x7. On RISC-V compiler usually does below to reach function
-    which is beyond the offset possible J-type instruction.
+    which is beyond the offset possible J-type instruction::

-      "auipc x7, <imm>"
-      "jalr (x7)"
+      auipc x7, <imm>
+      jalr (x7)

     Such form of indirect control transfer are still immutable and don't rely
     on memory and thus rs1=x7 is exempted from tracking and considered software
     guarded jumps.

-`lpad` instruction is pseudo of `auipc rd, <imm_20bit>` with `rd=x0`` and is a HINT
-nop. `lpad` instruction must be aligned on 4 byte boundary and compares 20 bit
-immediate withx7. If `imm_20bit` == 0, CPU don't perform any comparision with x7. If
-`imm_20bit` != 0, then `imm_20bit` must match x7 else CPU will raise
-`software check exception` (cause=18)with `*tval = 2`.
+``lpad`` instruction is pseudo of ``auipc rd, <imm_20bit>`` with ``rd=x0`` and
+is a HINT nop. ``lpad`` instruction must be aligned on 4 byte boundary and
+compares 20 bit immediate with x7. If ``imm_20bit`` == 0, CPU don't perform any
+comparision with x7. If ``imm_20bit`` != 0, then ``imm_20bit`` must match x7
+else CPU will raise software check exception (cause=18) with ``*tval = 2``.

 Compiler can generate a hash over function signatures and setup them (truncated
-to 20bit) in x7 at callsites and function prologues can have `lpad` with same
+to 20bit) in x7 at callsites and function prologues can have ``lpad`` with same
 function hash. This further reduces number of program counters a call site can
 reach.

 2. ELF and psABI
 -----------------

-Toolchain sets up `GNU_PROPERTY_RISCV_FEATURE_1_FCFI` for property
-`GNU_PROPERTY_RISCV_FEATURE_1_AND` in notes section of the object file.
+Toolchain sets up ``GNU_PROPERTY_RISCV_FEATURE_1_FCFI`` for property
+``GNU_PROPERTY_RISCV_FEATURE_1_AND`` in notes section of the object file.

 3. Linux enabling
 ------------------
@@ -70,25 +70,26 @@ indirect branch tracking for the program.
 4. prctl() enabling
 --------------------

-`PR_SET_INDIR_BR_LP_STATUS` / `PR_GET_INDIR_BR_LP_STATUS` /
-`PR_LOCK_INDIR_BR_LP_STATUS` are three prctls added to manage indirect branch
+``PR_SET_INDIR_BR_LP_STATUS`` / ``PR_GET_INDIR_BR_LP_STATUS`` /
+``PR_LOCK_INDIR_BR_LP_STATUS`` are three prctls added to manage indirect branch
 tracking. prctls are arch agnostic and returns -EINVAL on other arches.

-`PR_SET_INDIR_BR_LP_STATUS`: If arg1 `PR_INDIR_BR_LP_ENABLE` and if CPU supports
-`zicfilp` then kernel will enabled indirect branch tracking for the task.
-Dynamic loader can issue this `prctl` once it has determined that all the objects
-loaded in address space support indirect branch tracking. Additionally if there is
-a `dlopen` to an object which wasn't compiled with `zicfilp`, dynamic loader can
-issue this prctl with arg1 set to 0 (i.e. `PR_INDIR_BR_LP_ENABLE` being clear)
+``PR_SET_INDIR_BR_LP_STATUS``: If arg1 ``PR_INDIR_BR_LP_ENABLE`` and if CPU
+supports ``zicfilp`` then kernel will enabled indirect branch tracking for the
+task. Dynamic loader can issue this ``prctl`` once it has determined that all
+the objects loaded in address space support indirect branch tracking.
+Additionally if there is a ``dlopen`` to an object which wasn't compiled with
+``zicfilp``, dynamic loader can issue this prctl with arg1 set to 0 (i.e.
+``PR_INDIR_BR_LP_ENABLE`` being clear)

-`PR_GET_INDIR_BR_LP_STATUS`: Returns current status of indirect branch tracking.
-If enabled it'll return `PR_INDIR_BR_LP_ENABLE`
+``PR_GET_INDIR_BR_LP_STATUS``: Returns current status of indirect branch
+tracking. If enabled it'll return ``PR_INDIR_BR_LP_ENABLE``

-`PR_LOCK_INDIR_BR_LP_STATUS`: Locks current status of indirect branch tracking on
-the task. User space may want to run with strict security posture and wouldn't want
-loading of objects without `zicfilp` support in it and thus would want to disallow
-disabling of indirect branch tracking. In that case user space can use this prctl
-to lock current settings.
+``PR_LOCK_INDIR_BR_LP_STATUS``: Locks current status of indirect branch
+tracking on the task. User space may want to run with strict security posture
+and wouldn't want loading of objects without ``zicfilp`` support in it and thus
+would want to disallow disabling of indirect branch tracking. In that case user
+space can use this prctl to lock current settings.

 5. violations related to indirect branch tracking
 --------------------------------------------------
@@ -96,12 +97,12 @@ to lock current settings.
 Pertaining to indirect branch tracking, CPU raises software check exception in
 following conditions:

-- missing `lpad` after indirect call / jmp
-- `lpad` not on 4 byte boundary
-- `imm_20bit` embedded in `lpad` instruction doesn't match with `x7`
+- missing ``lpad`` after indirect call / jmp
+- ``lpad`` not on 4 byte boundary
+- ``imm_20bit`` embedded in ``lpad`` instruction doesn't match with x7

-In all 3 cases, `*tval = 2` is captured and software check exception is raised
+In all 3 cases, ``*tval = 2`` is captured and software check exception is raised
 (cause=18)

-Linux kernel will treat this as `SIGSEV`` with code = `SEGV_CPERR` and follow
+Linux kernel will treat this as ``SIGSEV`` with code = ``SEGV_CPERR`` and follow
 normal course of signal delivery.

Thanks.

-- 
An old man doll... just what I always wanted! - Clara

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

  reply	other threads:[~2024-09-16  2:41 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-12 23:16 [PATCH v4 00/30] riscv control-flow integrity for usermode Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 01/30] mm: Introduce ARCH_HAS_USER_SHADOW_STACK Deepak Gupta
2024-09-13 15:51   ` Carlos Bilbao
2024-09-12 23:16 ` [PATCH v4 02/30] mm: helper `is_shadow_stack_vma` to check shadow stack vma Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 03/30] riscv: Enable cbo.zero only when all harts support Zicboz Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 04/30] riscv: Add support for per-thread envcfg CSR values Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 05/30] riscv: Call riscv_user_isa_enable() only on the boot hart Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 06/30] riscv/Kconfig: enable HAVE_EXIT_THREAD for riscv Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 07/30] riscv: zicfilp / zicfiss in dt-bindings (extensions.yaml) Deepak Gupta
2024-09-13  0:18   ` Rob Herring (Arm)
2024-09-13 18:33   ` Conor Dooley
2024-09-12 23:16 ` [PATCH v4 08/30] riscv: zicfiss / zicfilp enumeration Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 09/30] riscv: zicfiss / zicfilp extension csr and bit definitions Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 10/30] riscv: usercfi state for task and save/restore of CSR_SSP on trap entry/exit Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 11/30] riscv/mm : ensure PROT_WRITE leads to VM_READ | VM_WRITE Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 12/30] riscv mm: manufacture shadow stack pte Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 13/30] riscv mmu: teach pte_mkwrite to manufacture shadow stack PTEs Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 14/30] riscv mmu: write protect and shadow stack Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 15/30] riscv/mm: Implement map_shadow_stack() syscall Deepak Gupta
2024-09-13 15:26   ` Mark Brown
2024-09-12 23:16 ` [PATCH v4 16/30] riscv/shstk: If needed allocate a new shadow stack on clone Deepak Gupta
2024-09-14  1:54   ` kernel test robot
2024-09-14  3:06   ` kernel test robot
2024-09-14  3:26   ` kernel test robot
2024-09-12 23:16 ` [PATCH v4 17/30] prctl: arch-agnostic prctl for shadow stack Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 18/30] prctl: arch-agnostic prctl for indirect branch tracking Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 19/30] riscv: Implements arch agnostic shadow stack prctls Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 20/30] riscv: Implements arch agnostic indirect branch tracking prctls Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 21/30] riscv/traps: Introduce software check exception Deepak Gupta
2024-09-13 19:35   ` Andy Chiu
2024-09-17  0:00     ` Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 22/30] riscv sigcontext: cfi state struct definition for sigcontext Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 23/30] riscv signal: save and restore of shadow stack for signal Deepak Gupta
2024-09-13 19:25   ` Andy Chiu
2024-09-16 22:03     ` Deepak Gupta
2024-09-17 22:03       ` Andy Chiu
2024-09-17 22:52         ` Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 24/30] riscv/kernel: update __show_regs to print shadow stack register Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 25/30] riscv/ptrace: riscv cfi status and state via ptrace and in core files Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 26/30] riscv/hwprobe: zicfilp / zicfiss enumeration in hwprobe Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 27/30] riscv: create a config for shadow stack and landing pad instr support Deepak Gupta
2024-09-12 23:16 ` [PATCH v4 28/30] riscv: Documentation for landing pad / indirect branch tracking Deepak Gupta
2024-09-16  2:41   ` Bagas Sanjaya [this message]
2024-09-12 23:16 ` [PATCH v4 29/30] riscv: Documentation for shadow stack on riscv Deepak Gupta
2024-09-16  3:20   ` Bagas Sanjaya
2024-09-12 23:16 ` [PATCH v4 30/30] kselftest/riscv: kselftest for user mode cfi 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=ZueaxRZgIf0crs4a@archie.me \
    --to=bagasdotme@gmail.com \
    --cc=Liam.Howlett@oracle.com \
    --cc=ajones@ventanamicro.com \
    --cc=akpm@linux-foundation.org \
    --cc=alexghiti@rivosinc.com \
    --cc=alx@kernel.org \
    --cc=ancientmodern4@gmail.com \
    --cc=andrii@kernel.org \
    --cc=andy.chiu@sifive.com \
    --cc=antonb@tenstorrent.com \
    --cc=anup@brainfault.org \
    --cc=aou@eecs.berkeley.edu \
    --cc=arnd@arndb.de \
    --cc=atishp@rivosinc.com \
    --cc=ben.dooks@codethink.co.uk \
    --cc=bgray@linux.ibm.com \
    --cc=bhe@redhat.com \
    --cc=bjorn@rivosinc.com \
    --cc=bp@alien8.de \
    --cc=brauner@kernel.org \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=charlie@rivosinc.com \
    --cc=cleger@rivosinc.com \
    --cc=conor@kernel.org \
    --cc=corbet@lwn.net \
    --cc=costa.shul@redhat.com \
    --cc=cuiyunhui@bytedance.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=david@redhat.com \
    --cc=dawei.li@shingroup.cn \
    --cc=debug@rivosinc.com \
    --cc=deller@gmx.de \
    --cc=devicetree@vger.kernel.org \
    --cc=ebiederm@xmission.com \
    --cc=evan@rivosinc.com \
    --cc=greentime.hu@sifive.com \
    --cc=guoren@kernel.org \
    --cc=hpa@zytor.com \
    --cc=jerry.shih@sifive.com \
    --cc=jszhang@kernel.org \
    --cc=ke.zhao@shingroup.cn \
    --cc=kees@kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=leobras@redhat.com \
    --cc=libang.li@antgroup.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=lorenzo.stoakes@oracle.com \
    --cc=mchitale@ventanamicro.com \
    --cc=mingo@redhat.com \
    --cc=namcaov@gmail.com \
    --cc=oleg@redhat.com \
    --cc=osalvador@suse.de \
    --cc=palmer@dabbelt.com \
    --cc=palmer@sifive.com \
    --cc=paul.walmsley@sifive.com \
    --cc=peterz@infradead.org \
    --cc=puranjay@kernel.org \
    --cc=quic_bjorande@quicinc.com \
    --cc=quic_zhonhan@quicinc.com \
    --cc=revest@chromium.org \
    --cc=robh@kernel.org \
    --cc=rppt@kernel.org \
    --cc=ryan.roberts@arm.com \
    --cc=sameo@rivosinc.com \
    --cc=samitolvanen@google.com \
    --cc=samuel.holland@sifive.com \
    --cc=schwab@suse.de \
    --cc=shuah@kernel.org \
    --cc=songshuaishuai@tinylab.org \
    --cc=sorear@fastmail.com \
    --cc=sunilvl@ventanamicro.com \
    --cc=tanzhasanwork@gmail.com \
    --cc=tglx@linutronix.de \
    --cc=usama.anjum@collabora.com \
    --cc=vbabka@suse.cz \
    --cc=willy@infradead.org \
    --cc=x86@kernel.org \
    --cc=xiao.w.wang@intel.com \
    --cc=yang.lee@linux.alibaba.com \
    --cc=zev@bewilderbeest.net \
    --cc=zong.li@sifive.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).