From: Sumit Garg <sumit.garg@kernel.org>
To: Amirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com>
Cc: "Jens Wiklander" <jens.wiklander@linaro.org>,
"Bjorn Andersson" <andersson@kernel.org>,
"Konrad Dybcio" <konradybcio@kernel.org>,
"Bartosz Golaszewski" <bartosz.golaszewski@linaro.org>,
"Apurupa Pattapu" <quic_apurupa@quicinc.com>,
"Kees Cook" <kees@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Christian König" <christian.koenig@amd.com>,
"Harshal Dev" <quic_hdev@quicinc.com>,
linux-arm-msm@vger.kernel.org, op-tee@lists.trustedfirmware.org,
linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org,
dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
linux-doc@vger.kernel.org
Subject: Re: [PATCH v5 12/12] Documentation: tee: Add Qualcomm TEE driver
Date: Mon, 7 Jul 2025 17:49:58 +0530 [thread overview]
Message-ID: <aGu7boxOTB3TFRNU@sumit-X1> (raw)
In-Reply-To: <20250526-qcom-tee-using-tee-ss-without-mem-obj-v5-12-024e3221b0b9@oss.qualcomm.com>
On Mon, May 26, 2025 at 11:56:57PM -0700, Amirreza Zarrabi wrote:
> Add documentation for the Qualcomm TEE driver.
>
> Signed-off-by: Amirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com>
> ---
> Documentation/tee/index.rst | 1 +
> Documentation/tee/qtee.rst | 150 ++++++++++++++++++++++++++++++++++++++++++++
> MAINTAINERS | 1 +
> 3 files changed, 152 insertions(+)
>
> diff --git a/Documentation/tee/index.rst b/Documentation/tee/index.rst
> index 4be6e69d7837..62afb7ee9b52 100644
> --- a/Documentation/tee/index.rst
> +++ b/Documentation/tee/index.rst
> @@ -11,6 +11,7 @@ TEE Subsystem
> op-tee
> amd-tee
> ts-tee
> + qtee
>
> .. only:: subproject and html
>
> diff --git a/Documentation/tee/qtee.rst b/Documentation/tee/qtee.rst
> new file mode 100644
> index 000000000000..8ae4da17c3a7
> --- /dev/null
> +++ b/Documentation/tee/qtee.rst
> @@ -0,0 +1,150 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +=============================================
> +QTEE (Qualcomm Trusted Execution Environment)
> +=============================================
> +
> +The QTEE driver handles communication with Qualcomm TEE [1].
> +
> +The lowest level of communication with QTEE builds on the ARM SMC Calling
> +Convention (SMCCC) [2], which is the foundation for QTEE's Secure Channel
> +Manager (SCM) [3] used internally by the driver [4].
> +
> +In a QTEE-based system, services are represented as objects with a series of
> +operations that can be called to produce results, including other objects.
> +
> +When an object is hosted within QTEE, executing its operations is referred
> +to as direct invocation. QTEE can invoke objects hosted in the kernel or
> +userspace using a method known as callback requests.
> +
> +The SCM provides two functions for direct invocation and callback request:
> +
> +- QCOM_SCM_SMCINVOKE_INVOKE for direct invocation. It can return either
> + a result or a callback request.
> +- QCOM_SCM_SMCINVOKE_CB_RSP submits a response for a previous callback request.
> +
> +The QTEE Transport Message [5] is stacked on top of the SCM driver functions.
> +
> +A message consists of two buffers shared with QTEE: inbound and outbound
> +buffers. The inbound buffer is used for direct invocation, and the outbound
> +buffer is used to make callback requests. This picture shows the contents of
> +a QTEE transport message::
> +
> + +---------------------+
> + | v
> + +-----------------+-------+-------+------+--------------------------+
> + | qcomtee_msg_ |object | buffer | |
> + | object_invoke | id | offset, size | | (inbound buffer)
> + +-----------------+-------+--------------+--------------------------+
> + <---- header -----><---- arguments ------><- in/out buffer payload ->
> +
> + +-----------+
> + | v
> + +-----------------+-------+-------+------+----------------------+
> + | qcomtee_msg_ |object | buffer | |
> + | callback | id | offset, size | | (outbound buffer)
> + +-----------------+-------+--------------+----------------------+
> +
> +Each buffer is started with a header and array of arguments.
> +
> +QTEE Transport Message supports four types of arguments:
> +
> +- Input Object (IO) is an object parameter to the current invocation
> + or callback request.
> +- Output Object (OO) is an object parameter from the current invocation
> + or callback request.
> +- Input Buffer (IB) is (offset, size) pair to the inbound or outbound region
> + to store parameter to the current invocation or callback request.
> +- Output Buffer (OB) is (offset, size) pair to the inbound or outbound region
> + to store parameter from the current invocation or callback request.
> +
> +The QTEE driver provides the qcomtee_object, which represents an object within
> +both QTEE and the kernel. To access any service in QTEE, a client needs to
> +invoke an instance of this object. Any structure intended to represent a service
> +for export to QTEE should include an instance of qcomtee_object::
> +
> + struct driver_service {
> + struct qcomtee_object object;
> + ...
> + };
> +
> + #define to_driver_service_object(o) container_of((o), struct driver_service, object)
> +
> + static int driver_service_dispatch(struct qcomtee_object *object, u32 op,
> + struct qcomtee_arg *args)
> + {
> + struct driver_service *so = to_driver_service_object(object);
> +
> + switch(op) {
> + case OBJECT_OP1:
> + ...
> + break;
> + default:
> + return -EINVAL;
> + }
> + }
> +
> + static void driver_service_object_release(struct si_object *object)
> + {
> + struct driver_service *so = to_driver_service_object(object);
> + kfree(so);
> + }
> +
> + struct si_object_operations driver_service_ops = {
> + .release = driver_service_object_release;
> + .dispatch = driver_service_dispatch;
> + };
> +
> + void service_init(void)
> + {
> + struct driver_service *so = kzalloc(sizeof(*so), GFP_KERNEL);
> +
> + /* Initialize so->object as a callback object. */
> + qcomtee_object_user_init(&so->object, QCOMTEE_OBJECT_TYPE_CB_OBJECT,
> + &driver_service_ops, "driver_service_object");
> +
> + /* Invoke a QTEE object and pass/register 'so->object' with QTEE. */
> + ...
> + }
> + module_init(service_init);
Lets drop any reference for kernel client/services since they aren't
supported by this patch-set yet.
-Sumit
> +
> +The QTEE driver utilizes qcomtee_object to encapsulate userspace objects. When
> +a callback request is made, it translates into calling the dispatch operation.
> +For userspace objects, this is converted into requests accessible to callback
> +servers and available through generic TEE API IOCTLs.
> +
> +Picture of the relationship between the different components in the QTEE
> +architecture::
> +
> + User space Kernel Secure world
> + ~~~~~~~~~~ ~~~~~~ ~~~~~~~~~~~~
> + +--------+ +----------+ +--------------+
> + | Client | |callback | | Trusted |
> + +--------+ |server | | Application |
> + /\ +----------+ +--------------+
> + || +----------+ /\ /\
> + || |callback | || ||
> + || |server | || \/
> + || +----------+ || +--------------+
> + \/ /\ || | TEE Internal |
> + +-------+ || || | API |
> + | TEE | || || +--------+--------+ +--------------+
> + | Client| || || | TEE | QTEE | | QTEE |
> + | API | \/ \/ | subsys | driver | | Trusted OS |
> + +-------+----------------+----+-------+----+-------------+--------------+
> + | Generic TEE API | | QTEE MSG |
> + | IOCTL (TEE_IOC_*) | | SMCCC (QCOM_SCM_SMCINVOKE_*) |
> + +-----------------------------+ +---------------------------------+
> +
> +References
> +==========
> +
> +[1] https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-11/qualcomm-trusted-execution-environment.html
> +
> +[2] http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html
> +
> +[3] drivers/firmware/qcom/qcom_scm.c
> +
> +[4] drivers/tee/qcomtee/qcom_scm.c
> +
> +[5] drivers/tee/qcomtee/qcomtee_msg.h
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 99fe1ae22ae0..42823d33cc03 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -20515,6 +20515,7 @@ QUALCOMM TEE (QCOMTEE) DRIVER
> M: Amirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com>
> L: linux-arm-msm@vger.kernel.org
> S: Maintained
> +F: Documentation/tee/qtee.rst
> F: drivers/tee/qcomtee/
> F: include/linux/firmware/qcom/qcom_tee.h
>
>
> --
> 2.34.1
>
WARNING: multiple messages have this Message-ID (diff)
From: Sumit Garg via OP-TEE <op-tee@lists.trustedfirmware.org>
To: Amirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com>
Cc: "Bjorn Andersson" <andersson@kernel.org>,
"Konrad Dybcio" <konradybcio@kernel.org>,
"Bartosz Golaszewski" <bartosz.golaszewski@linaro.org>,
"Apurupa Pattapu" <quic_apurupa@quicinc.com>,
"Kees Cook" <kees@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
"Christian König" <christian.koenig@amd.com>,
"Harshal Dev" <quic_hdev@quicinc.com>,
linux-arm-msm@vger.kernel.org, op-tee@lists.trustedfirmware.org,
linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org,
dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org,
linux-doc@vger.kernel.org
Subject: Re: [PATCH v5 12/12] Documentation: tee: Add Qualcomm TEE driver
Date: Mon, 7 Jul 2025 17:49:58 +0530 [thread overview]
Message-ID: <aGu7boxOTB3TFRNU@sumit-X1> (raw)
In-Reply-To: <20250526-qcom-tee-using-tee-ss-without-mem-obj-v5-12-024e3221b0b9@oss.qualcomm.com>
On Mon, May 26, 2025 at 11:56:57PM -0700, Amirreza Zarrabi wrote:
> Add documentation for the Qualcomm TEE driver.
>
> Signed-off-by: Amirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com>
> ---
> Documentation/tee/index.rst | 1 +
> Documentation/tee/qtee.rst | 150 ++++++++++++++++++++++++++++++++++++++++++++
> MAINTAINERS | 1 +
> 3 files changed, 152 insertions(+)
>
> diff --git a/Documentation/tee/index.rst b/Documentation/tee/index.rst
> index 4be6e69d7837..62afb7ee9b52 100644
> --- a/Documentation/tee/index.rst
> +++ b/Documentation/tee/index.rst
> @@ -11,6 +11,7 @@ TEE Subsystem
> op-tee
> amd-tee
> ts-tee
> + qtee
>
> .. only:: subproject and html
>
> diff --git a/Documentation/tee/qtee.rst b/Documentation/tee/qtee.rst
> new file mode 100644
> index 000000000000..8ae4da17c3a7
> --- /dev/null
> +++ b/Documentation/tee/qtee.rst
> @@ -0,0 +1,150 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +=============================================
> +QTEE (Qualcomm Trusted Execution Environment)
> +=============================================
> +
> +The QTEE driver handles communication with Qualcomm TEE [1].
> +
> +The lowest level of communication with QTEE builds on the ARM SMC Calling
> +Convention (SMCCC) [2], which is the foundation for QTEE's Secure Channel
> +Manager (SCM) [3] used internally by the driver [4].
> +
> +In a QTEE-based system, services are represented as objects with a series of
> +operations that can be called to produce results, including other objects.
> +
> +When an object is hosted within QTEE, executing its operations is referred
> +to as direct invocation. QTEE can invoke objects hosted in the kernel or
> +userspace using a method known as callback requests.
> +
> +The SCM provides two functions for direct invocation and callback request:
> +
> +- QCOM_SCM_SMCINVOKE_INVOKE for direct invocation. It can return either
> + a result or a callback request.
> +- QCOM_SCM_SMCINVOKE_CB_RSP submits a response for a previous callback request.
> +
> +The QTEE Transport Message [5] is stacked on top of the SCM driver functions.
> +
> +A message consists of two buffers shared with QTEE: inbound and outbound
> +buffers. The inbound buffer is used for direct invocation, and the outbound
> +buffer is used to make callback requests. This picture shows the contents of
> +a QTEE transport message::
> +
> + +---------------------+
> + | v
> + +-----------------+-------+-------+------+--------------------------+
> + | qcomtee_msg_ |object | buffer | |
> + | object_invoke | id | offset, size | | (inbound buffer)
> + +-----------------+-------+--------------+--------------------------+
> + <---- header -----><---- arguments ------><- in/out buffer payload ->
> +
> + +-----------+
> + | v
> + +-----------------+-------+-------+------+----------------------+
> + | qcomtee_msg_ |object | buffer | |
> + | callback | id | offset, size | | (outbound buffer)
> + +-----------------+-------+--------------+----------------------+
> +
> +Each buffer is started with a header and array of arguments.
> +
> +QTEE Transport Message supports four types of arguments:
> +
> +- Input Object (IO) is an object parameter to the current invocation
> + or callback request.
> +- Output Object (OO) is an object parameter from the current invocation
> + or callback request.
> +- Input Buffer (IB) is (offset, size) pair to the inbound or outbound region
> + to store parameter to the current invocation or callback request.
> +- Output Buffer (OB) is (offset, size) pair to the inbound or outbound region
> + to store parameter from the current invocation or callback request.
> +
> +The QTEE driver provides the qcomtee_object, which represents an object within
> +both QTEE and the kernel. To access any service in QTEE, a client needs to
> +invoke an instance of this object. Any structure intended to represent a service
> +for export to QTEE should include an instance of qcomtee_object::
> +
> + struct driver_service {
> + struct qcomtee_object object;
> + ...
> + };
> +
> + #define to_driver_service_object(o) container_of((o), struct driver_service, object)
> +
> + static int driver_service_dispatch(struct qcomtee_object *object, u32 op,
> + struct qcomtee_arg *args)
> + {
> + struct driver_service *so = to_driver_service_object(object);
> +
> + switch(op) {
> + case OBJECT_OP1:
> + ...
> + break;
> + default:
> + return -EINVAL;
> + }
> + }
> +
> + static void driver_service_object_release(struct si_object *object)
> + {
> + struct driver_service *so = to_driver_service_object(object);
> + kfree(so);
> + }
> +
> + struct si_object_operations driver_service_ops = {
> + .release = driver_service_object_release;
> + .dispatch = driver_service_dispatch;
> + };
> +
> + void service_init(void)
> + {
> + struct driver_service *so = kzalloc(sizeof(*so), GFP_KERNEL);
> +
> + /* Initialize so->object as a callback object. */
> + qcomtee_object_user_init(&so->object, QCOMTEE_OBJECT_TYPE_CB_OBJECT,
> + &driver_service_ops, "driver_service_object");
> +
> + /* Invoke a QTEE object and pass/register 'so->object' with QTEE. */
> + ...
> + }
> + module_init(service_init);
Lets drop any reference for kernel client/services since they aren't
supported by this patch-set yet.
-Sumit
> +
> +The QTEE driver utilizes qcomtee_object to encapsulate userspace objects. When
> +a callback request is made, it translates into calling the dispatch operation.
> +For userspace objects, this is converted into requests accessible to callback
> +servers and available through generic TEE API IOCTLs.
> +
> +Picture of the relationship between the different components in the QTEE
> +architecture::
> +
> + User space Kernel Secure world
> + ~~~~~~~~~~ ~~~~~~ ~~~~~~~~~~~~
> + +--------+ +----------+ +--------------+
> + | Client | |callback | | Trusted |
> + +--------+ |server | | Application |
> + /\ +----------+ +--------------+
> + || +----------+ /\ /\
> + || |callback | || ||
> + || |server | || \/
> + || +----------+ || +--------------+
> + \/ /\ || | TEE Internal |
> + +-------+ || || | API |
> + | TEE | || || +--------+--------+ +--------------+
> + | Client| || || | TEE | QTEE | | QTEE |
> + | API | \/ \/ | subsys | driver | | Trusted OS |
> + +-------+----------------+----+-------+----+-------------+--------------+
> + | Generic TEE API | | QTEE MSG |
> + | IOCTL (TEE_IOC_*) | | SMCCC (QCOM_SCM_SMCINVOKE_*) |
> + +-----------------------------+ +---------------------------------+
> +
> +References
> +==========
> +
> +[1] https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-11/qualcomm-trusted-execution-environment.html
> +
> +[2] http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html
> +
> +[3] drivers/firmware/qcom/qcom_scm.c
> +
> +[4] drivers/tee/qcomtee/qcom_scm.c
> +
> +[5] drivers/tee/qcomtee/qcomtee_msg.h
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 99fe1ae22ae0..42823d33cc03 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -20515,6 +20515,7 @@ QUALCOMM TEE (QCOMTEE) DRIVER
> M: Amirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com>
> L: linux-arm-msm@vger.kernel.org
> S: Maintained
> +F: Documentation/tee/qtee.rst
> F: drivers/tee/qcomtee/
> F: include/linux/firmware/qcom/qcom_tee.h
>
>
> --
> 2.34.1
>
next prev parent reply other threads:[~2025-07-07 12:20 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-27 6:56 [PATCH v5 00/12] Trusted Execution Environment (TEE) driver for Qualcomm TEE (QTEE) Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 01/12] tee: allow a driver to allocate a tee_device without a pool Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 02/12] tee: add close_context to TEE driver operation Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 03/12] tee: add TEE_IOCTL_PARAM_ATTR_TYPE_UBUF Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-28 0:04 ` kernel test robot
2025-06-11 22:40 ` Andrew Davis
2025-06-11 22:40 ` Andrew Davis via OP-TEE
2025-06-11 23:45 ` Amirreza Zarrabi
2025-06-11 23:45 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 04/12] tee: add TEE_IOCTL_PARAM_ATTR_TYPE_OBJREF Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 05/12] tee: increase TEE_MAX_ARG_SIZE to 4096 Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-06-11 13:02 ` Sumit Garg
2025-06-11 13:02 ` Sumit Garg via OP-TEE
2025-05-27 6:56 ` [PATCH v5 06/12] firmware: qcom: scm: add support for object invocation Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 07/12] firmware: qcom: scm: remove unused arguments to the shm_brige Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 08/12] firmware: qcom: tzmem: export shm_bridge create/delete Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-07-01 11:47 ` Kuldeep Singh
2025-07-01 11:47 ` Kuldeep Singh
2025-07-08 0:18 ` Amirreza Zarrabi
2025-07-08 0:18 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 09/12] tee: add Qualcomm TEE driver Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-27 21:28 ` kernel test robot
2025-07-07 12:09 ` Sumit Garg
2025-07-07 12:09 ` Sumit Garg via OP-TEE
2025-07-11 7:05 ` Amirreza Zarrabi
2025-07-11 7:05 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 10/12] qcomtee: add primordial object Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-05-27 6:56 ` [PATCH v5 11/12] qcomtee: enable TEE_IOC_SHM_ALLOC ioctl Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-07-07 12:15 ` Sumit Garg
2025-07-07 12:15 ` Sumit Garg via OP-TEE
2025-05-27 6:56 ` [PATCH v5 12/12] Documentation: tee: Add Qualcomm TEE driver Amirreza Zarrabi
2025-05-27 6:56 ` Amirreza Zarrabi via OP-TEE
2025-07-07 12:19 ` Sumit Garg [this message]
2025-07-07 12:19 ` Sumit Garg via OP-TEE
2025-07-11 5:05 ` Amirreza Zarrabi
2025-07-11 5:05 ` Amirreza Zarrabi via OP-TEE
2025-07-08 10:02 ` [PATCH v5 00/12] Trusted Execution Environment (TEE) driver for Qualcomm TEE (QTEE) Harshal Dev
2025-07-08 10:02 ` Harshal Dev
-- strict thread matches above, loose matches on Subject: below --
2025-05-27 22:20 [PATCH v5 09/12] tee: add Qualcomm TEE driver kernel test robot
2025-05-28 5:22 ` Dan Carpenter
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=aGu7boxOTB3TFRNU@sumit-X1 \
--to=sumit.garg@kernel.org \
--cc=amirreza.zarrabi@oss.qualcomm.com \
--cc=andersson@kernel.org \
--cc=bartosz.golaszewski@linaro.org \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=gustavoars@kernel.org \
--cc=jens.wiklander@linaro.org \
--cc=kees@kernel.org \
--cc=konradybcio@kernel.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=op-tee@lists.trustedfirmware.org \
--cc=quic_apurupa@quicinc.com \
--cc=quic_hdev@quicinc.com \
--cc=sumit.semwal@linaro.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.