From: Julien Thierry <julien.thierry@arm.com> To: Dave Martin <Dave.Martin@arm.com>, kvmarm@lists.cs.columbia.edu Cc: Okamoto Takayuki <tokamoto@jp.fujitsu.com>, Christoffer Dall <cdall@kernel.org>, Ard Biesheuvel <ard.biesheuvel@linaro.org>, Marc Zyngier <marc.zyngier@arm.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will.deacon@arm.com>, Zhang Lei <zhang.lei@jp.fujitsu.com>, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v5 17/26] KVM: arm64: Reject ioctl access to FPSIMD V-regs on SVE vcpus Date: Thu, 21 Feb 2019 12:06:23 +0000 [thread overview] Message-ID: <696ae744-c016-9cc2-d393-fd321d341df4@arm.com> (raw) In-Reply-To: <1550519559-15915-18-git-send-email-Dave.Martin@arm.com> On 18/02/2019 19:52, Dave Martin wrote: > In order to avoid the pointless complexity of maintaining two ioctl > register access views of the same data, this patch blocks ioctl > access to the FPSIMD V-registers on vcpus that support SVE. > > This will make it more straightforward to add SVE register access > support. > > Since SVE is an opt-in feature for userspace, this will not affect > existing users. > > Signed-off-by: Dave Martin <Dave.Martin@arm.com> Reviewed-by: Julien Thierry <julien.thierry@arm.com> > --- > arch/arm64/kvm/guest.c | 38 +++++++++++++++++++++++++++----------- > 1 file changed, 27 insertions(+), 11 deletions(-) > > diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c > index f83fe22..f491456 100644 > --- a/arch/arm64/kvm/guest.c > +++ b/arch/arm64/kvm/guest.c > @@ -95,7 +95,14 @@ static int core_reg_size_from_offset(u64 off) > return -EINVAL; > } > > -static int validate_core_offset(const struct kvm_one_reg *reg) > +static bool core_reg_offset_is_vreg(u64 off) > +{ > + return off >= KVM_REG_ARM_CORE_REG(fp_regs.vregs) && > + off < KVM_REG_ARM_CORE_REG(fp_regs.fpsr); > +} > + > +static int validate_core_offset(const struct kvm_vcpu *vcpu, > + const struct kvm_one_reg *reg) > { > u64 off = core_reg_offset_from_id(reg->id); > int size = core_reg_size_from_offset(off); > @@ -103,10 +110,18 @@ static int validate_core_offset(const struct kvm_one_reg *reg) > if (size < 0) > return -EINVAL; > > - if (KVM_REG_SIZE(reg->id) == size) > - return 0; > + if (KVM_REG_SIZE(reg->id) != size) > + return -EINVAL; > > - return -EINVAL; > + /* > + * The KVM_REG_ARM64_SVE regs must be used instead of > + * KVM_REG_ARM_CORE for accessing the FPSIMD V-registers on > + * SVE-enabled vcpus: > + */ > + if (vcpu_has_sve(vcpu) && core_reg_offset_is_vreg(off)) > + return -EINVAL; > + > + return 0; > } > > static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) > @@ -128,7 +143,7 @@ static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) > (off + (KVM_REG_SIZE(reg->id) / sizeof(__u32))) >= nr_regs) > return -ENOENT; > > - if (validate_core_offset(reg)) > + if (validate_core_offset(vcpu, reg)) > return -EINVAL; > > if (copy_to_user(uaddr, ((u32 *)regs) + off, KVM_REG_SIZE(reg->id))) > @@ -153,7 +168,7 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) > (off + (KVM_REG_SIZE(reg->id) / sizeof(__u32))) >= nr_regs) > return -ENOENT; > > - if (validate_core_offset(reg)) > + if (validate_core_offset(vcpu, reg)) > return -EINVAL; > > if (KVM_REG_SIZE(reg->id) > sizeof(tmp)) > @@ -206,7 +221,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) > return -EINVAL; > } > > -static int copy_core_reg_indices(u64 __user **uind) > +static int copy_core_reg_indices(const struct kvm_vcpu *vcpu, > + u64 __user **uind) > { > unsigned int i; > int n = 0; > @@ -248,9 +264,9 @@ static int copy_core_reg_indices(u64 __user **uind) > return n; > } > > -static unsigned long num_core_regs(void) > +static unsigned long num_core_regs(const struct kvm_vcpu *vcpu) > { > - return copy_core_reg_indices(NULL); > + return copy_core_reg_indices(vcpu, NULL); > } > > /** > @@ -315,7 +331,7 @@ unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu) > { > unsigned long res = 0; > > - res += num_core_regs(); > + res += num_core_regs(vcpu); > res += kvm_arm_num_sys_reg_descs(vcpu); > res += kvm_arm_get_fw_num_regs(vcpu); > res += NUM_TIMER_REGS; > @@ -332,7 +348,7 @@ int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) > { > int ret; > > - ret = copy_core_reg_indices(&uindices); > + ret = copy_core_reg_indices(vcpu, &uindices); > if (ret < 0) > return ret; > > -- Julien Thierry
WARNING: multiple messages have this Message-ID (diff)
From: Julien Thierry <julien.thierry@arm.com> To: Dave Martin <Dave.Martin@arm.com>, kvmarm@lists.cs.columbia.edu Cc: Okamoto Takayuki <tokamoto@jp.fujitsu.com>, Christoffer Dall <cdall@kernel.org>, Ard Biesheuvel <ard.biesheuvel@linaro.org>, Marc Zyngier <marc.zyngier@arm.com>, Catalin Marinas <catalin.marinas@arm.com>, Will Deacon <will.deacon@arm.com>, Zhang Lei <zhang.lei@jp.fujitsu.com>, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v5 17/26] KVM: arm64: Reject ioctl access to FPSIMD V-regs on SVE vcpus Date: Thu, 21 Feb 2019 12:06:23 +0000 [thread overview] Message-ID: <696ae744-c016-9cc2-d393-fd321d341df4@arm.com> (raw) In-Reply-To: <1550519559-15915-18-git-send-email-Dave.Martin@arm.com> On 18/02/2019 19:52, Dave Martin wrote: > In order to avoid the pointless complexity of maintaining two ioctl > register access views of the same data, this patch blocks ioctl > access to the FPSIMD V-registers on vcpus that support SVE. > > This will make it more straightforward to add SVE register access > support. > > Since SVE is an opt-in feature for userspace, this will not affect > existing users. > > Signed-off-by: Dave Martin <Dave.Martin@arm.com> Reviewed-by: Julien Thierry <julien.thierry@arm.com> > --- > arch/arm64/kvm/guest.c | 38 +++++++++++++++++++++++++++----------- > 1 file changed, 27 insertions(+), 11 deletions(-) > > diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c > index f83fe22..f491456 100644 > --- a/arch/arm64/kvm/guest.c > +++ b/arch/arm64/kvm/guest.c > @@ -95,7 +95,14 @@ static int core_reg_size_from_offset(u64 off) > return -EINVAL; > } > > -static int validate_core_offset(const struct kvm_one_reg *reg) > +static bool core_reg_offset_is_vreg(u64 off) > +{ > + return off >= KVM_REG_ARM_CORE_REG(fp_regs.vregs) && > + off < KVM_REG_ARM_CORE_REG(fp_regs.fpsr); > +} > + > +static int validate_core_offset(const struct kvm_vcpu *vcpu, > + const struct kvm_one_reg *reg) > { > u64 off = core_reg_offset_from_id(reg->id); > int size = core_reg_size_from_offset(off); > @@ -103,10 +110,18 @@ static int validate_core_offset(const struct kvm_one_reg *reg) > if (size < 0) > return -EINVAL; > > - if (KVM_REG_SIZE(reg->id) == size) > - return 0; > + if (KVM_REG_SIZE(reg->id) != size) > + return -EINVAL; > > - return -EINVAL; > + /* > + * The KVM_REG_ARM64_SVE regs must be used instead of > + * KVM_REG_ARM_CORE for accessing the FPSIMD V-registers on > + * SVE-enabled vcpus: > + */ > + if (vcpu_has_sve(vcpu) && core_reg_offset_is_vreg(off)) > + return -EINVAL; > + > + return 0; > } > > static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) > @@ -128,7 +143,7 @@ static int get_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) > (off + (KVM_REG_SIZE(reg->id) / sizeof(__u32))) >= nr_regs) > return -ENOENT; > > - if (validate_core_offset(reg)) > + if (validate_core_offset(vcpu, reg)) > return -EINVAL; > > if (copy_to_user(uaddr, ((u32 *)regs) + off, KVM_REG_SIZE(reg->id))) > @@ -153,7 +168,7 @@ static int set_core_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) > (off + (KVM_REG_SIZE(reg->id) / sizeof(__u32))) >= nr_regs) > return -ENOENT; > > - if (validate_core_offset(reg)) > + if (validate_core_offset(vcpu, reg)) > return -EINVAL; > > if (KVM_REG_SIZE(reg->id) > sizeof(tmp)) > @@ -206,7 +221,8 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) > return -EINVAL; > } > > -static int copy_core_reg_indices(u64 __user **uind) > +static int copy_core_reg_indices(const struct kvm_vcpu *vcpu, > + u64 __user **uind) > { > unsigned int i; > int n = 0; > @@ -248,9 +264,9 @@ static int copy_core_reg_indices(u64 __user **uind) > return n; > } > > -static unsigned long num_core_regs(void) > +static unsigned long num_core_regs(const struct kvm_vcpu *vcpu) > { > - return copy_core_reg_indices(NULL); > + return copy_core_reg_indices(vcpu, NULL); > } > > /** > @@ -315,7 +331,7 @@ unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu) > { > unsigned long res = 0; > > - res += num_core_regs(); > + res += num_core_regs(vcpu); > res += kvm_arm_num_sys_reg_descs(vcpu); > res += kvm_arm_get_fw_num_regs(vcpu); > res += NUM_TIMER_REGS; > @@ -332,7 +348,7 @@ int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) > { > int ret; > > - ret = copy_core_reg_indices(&uindices); > + ret = copy_core_reg_indices(vcpu, &uindices); > if (ret < 0) > return ret; > > -- Julien Thierry _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-02-21 12:06 UTC|newest] Thread overview: 189+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-02-18 19:52 [PATCH v5 00/26] KVM: arm64: SVE guest support Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 01/26] KVM: Documentation: Document arm64 core registers in detail Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-21 11:48 ` Julien Grall 2019-02-21 11:48 ` Julien Grall 2019-02-26 12:05 ` Dave Martin 2019-02-26 12:05 ` Dave Martin 2019-02-21 11:57 ` Peter Maydell 2019-02-21 11:57 ` Peter Maydell 2019-02-18 19:52 ` [PATCH v5 02/26] arm64: fpsimd: Always set TIF_FOREIGN_FPSTATE on task state flush Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-21 12:39 ` Julien Grall 2019-02-26 12:06 ` Dave Martin 2019-02-26 12:06 ` Dave Martin 2019-02-26 12:35 ` Julien Grall 2019-02-26 12:35 ` Julien Grall 2019-02-18 19:52 ` [PATCH v5 03/26] KVM: arm64: Delete orphaned declaration for __fpsimd_enabled() Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 04/26] KVM: arm64: Refactor kvm_arm_num_regs() for easier maintenance Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 05/26] KVM: arm64: Add missing #include of <linux/bitmap.h> to kvm_host.h Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-20 15:23 ` Mark Rutland 2019-02-20 15:23 ` Mark Rutland 2019-02-26 12:06 ` Dave Martin 2019-02-26 12:06 ` Dave Martin 2019-02-26 12:31 ` Mark Rutland 2019-02-26 12:33 ` Dave Martin 2019-02-26 12:33 ` Dave Martin 2019-02-26 12:40 ` Mark Rutland 2019-02-26 12:40 ` Mark Rutland 2019-02-18 19:52 ` [PATCH v5 06/26] arm64/sve: Check SVE virtualisability Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-20 11:12 ` Julien Thierry 2019-02-20 11:12 ` Julien Thierry 2019-02-26 12:06 ` Dave Martin 2019-02-26 12:06 ` Dave Martin 2019-03-01 12:39 ` Julien Thierry 2019-03-01 12:39 ` Julien Thierry 2019-03-01 14:44 ` Dave Martin 2019-03-01 14:44 ` Dave Martin 2019-02-21 13:36 ` Julien Grall 2019-02-21 13:36 ` Julien Grall 2019-02-26 12:06 ` Dave Martin 2019-02-26 12:06 ` Dave Martin 2019-02-26 15:43 ` Julien Grall 2019-02-26 15:43 ` Julien Grall 2019-02-18 19:52 ` [PATCH v5 07/26] arm64/sve: Clarify role of the VQ map maintenance functions Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-20 11:43 ` Julien Thierry 2019-02-20 11:43 ` Julien Thierry 2019-02-26 12:06 ` Dave Martin 2019-02-26 12:06 ` Dave Martin 2019-02-21 13:46 ` Julien Grall 2019-02-21 13:46 ` Julien Grall 2019-02-26 12:07 ` Dave Martin 2019-02-26 12:07 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 08/26] arm64/sve: Enable SVE state tracking for non-task contexts Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-22 15:26 ` Julien Grall 2019-02-22 15:26 ` Julien Grall 2019-02-26 12:07 ` Dave Martin 2019-02-26 12:07 ` Dave Martin 2019-02-26 15:49 ` Julien Grall 2019-02-26 15:49 ` Julien Grall 2019-02-26 15:58 ` Dave Martin 2019-02-26 15:58 ` Dave Martin 2019-02-26 15:59 ` Julien Grall 2019-02-26 15:59 ` Julien Grall 2019-02-26 16:03 ` Dave Martin 2019-02-26 16:03 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 09/26] KVM: arm64: Add a vcpu flag to control SVE visibility for the guest Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 10/26] KVM: arm64: Propagate vcpu into read_id_reg() Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 11/26] KVM: arm64: Extend reset_unknown() to handle mixed RES0/UNKNOWN registers Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-20 13:33 ` Julien Thierry 2019-02-20 13:33 ` Julien Thierry 2019-02-26 12:07 ` Dave Martin 2019-02-26 12:07 ` Dave Martin 2019-02-22 16:04 ` Julien Grall 2019-02-22 16:04 ` Julien Grall 2019-02-18 19:52 ` [PATCH v5 12/26] KVM: arm64: Support runtime sysreg visibility filtering Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-20 14:33 ` Julien Thierry 2019-02-20 14:33 ` Julien Thierry 2019-02-26 12:07 ` Dave Martin 2019-02-26 12:07 ` Dave Martin 2019-02-20 15:37 ` Mark Rutland 2019-02-20 15:37 ` Mark Rutland 2019-02-26 12:12 ` Dave Martin 2019-02-26 12:12 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 13/26] KVM: arm64/sve: System register context switch and access support Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-20 16:48 ` Julien Thierry 2019-02-20 16:48 ` Julien Thierry 2019-02-26 16:32 ` Julien Grall 2019-02-26 16:32 ` Julien Grall 2019-02-26 17:01 ` Dave Martin 2019-02-26 17:01 ` Dave Martin 2019-02-27 12:02 ` Julien Grall 2019-02-27 12:02 ` Julien Grall 2019-02-27 13:50 ` Dave Martin 2019-02-27 13:50 ` Dave Martin 2019-02-27 14:17 ` Julien Grall 2019-02-27 14:17 ` Julien Grall 2019-02-27 14:38 ` Dave Martin 2019-02-27 14:38 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 14/26] KVM: arm64/sve: Context switch the SVE registers Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-20 16:19 ` Mark Rutland 2019-02-20 16:19 ` Mark Rutland 2019-02-26 12:13 ` Dave Martin 2019-02-26 12:13 ` Dave Martin 2019-02-20 16:46 ` Julien Thierry 2019-02-20 16:46 ` Julien Thierry 2019-02-26 12:13 ` Dave Martin 2019-02-26 12:13 ` Dave Martin 2019-02-26 16:56 ` Julien Grall 2019-02-26 16:56 ` Julien Grall 2019-02-27 13:37 ` Dave Martin 2019-02-27 13:37 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 15/26] KVM: Allow 2048-bit register access via ioctl interface Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 16/26] KVM: arm64: Add missing #include of <linux/string.h> in guest.c Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 17/26] KVM: arm64: Reject ioctl access to FPSIMD V-regs on SVE vcpus Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-21 12:06 ` Julien Thierry [this message] 2019-02-21 12:06 ` Julien Thierry 2019-02-26 12:13 ` Dave Martin 2019-02-26 12:13 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 18/26] KVM: arm64/sve: Add SVE support to register access ioctl interface Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-21 15:23 ` Julien Thierry 2019-02-21 15:23 ` Julien Thierry 2019-02-26 12:13 ` Dave Martin 2019-02-26 12:13 ` Dave Martin 2019-03-01 13:03 ` Julien Thierry 2019-03-01 13:03 ` Julien Thierry 2019-03-01 14:45 ` Dave Martin 2019-03-01 14:45 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 19/26] KVM: arm64: Enumerate SVE register indices for KVM_GET_REG_LIST Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-21 16:28 ` Julien Thierry 2019-02-21 16:28 ` Julien Thierry 2019-02-18 19:52 ` [PATCH v5 20/26] arm64/sve: In-kernel vector length availability query interface Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 21/26] KVM: arm/arm64: Add hook to finalize the vcpu configuration Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 22/26] KVM: arm64/sve: Add pseudo-register for the guest's vector lengths Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-21 17:48 ` Julien Thierry 2019-02-21 17:48 ` Julien Thierry 2019-02-26 12:13 ` Dave Martin 2019-02-26 12:13 ` Dave Martin 2019-03-01 13:28 ` Julien Thierry 2019-03-01 13:28 ` Julien Thierry 2019-03-01 14:55 ` Dave Martin 2019-03-01 14:55 ` Dave Martin 2019-03-07 13:47 ` Marc Zyngier 2019-03-07 13:47 ` Marc Zyngier 2019-03-07 15:30 ` Dave Martin 2019-03-07 15:30 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 23/26] KVM: arm64/sve: Allow userspace to enable SVE for vcpus Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-22 9:05 ` Julien Thierry 2019-02-22 9:05 ` Julien Thierry 2019-02-26 12:13 ` Dave Martin 2019-02-26 12:13 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 24/26] KVM: arm64: Add a capabillity to advertise SVE support Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-22 9:10 ` Julien Thierry 2019-02-22 9:10 ` Julien Thierry 2019-02-26 12:14 ` Dave Martin 2019-02-26 12:14 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 25/26] KVM: Document errors for KVM_GET_ONE_REG and KVM_SET_ONE_REG Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-18 19:52 ` [PATCH v5 26/26] KVM: arm64/sve: Document KVM API extensions for SVE Dave Martin 2019-02-18 19:52 ` Dave Martin 2019-02-20 15:47 ` [PATCH v5 00/26] KVM: arm64: SVE guest support Dave Martin 2019-02-20 15:47 ` Dave Martin 2019-03-03 2:40 ` Zhang, Lei 2019-03-05 9:47 ` Dave Martin 2019-03-05 9:47 ` Dave Martin 2019-03-08 7:06 ` Zhang, Lei 2019-03-08 7:06 ` Zhang, Lei
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=696ae744-c016-9cc2-d393-fd321d341df4@arm.com \ --to=julien.thierry@arm.com \ --cc=Dave.Martin@arm.com \ --cc=ard.biesheuvel@linaro.org \ --cc=catalin.marinas@arm.com \ --cc=cdall@kernel.org \ --cc=kvmarm@lists.cs.columbia.edu \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=marc.zyngier@arm.com \ --cc=tokamoto@jp.fujitsu.com \ --cc=will.deacon@arm.com \ --cc=zhang.lei@jp.fujitsu.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: linkBe 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.