From: Brijesh Singh <brijesh.singh@amd.com> To: x86@kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-efi@vger.kernel.org, platform-driver-x86@vger.kernel.org, linux-coco@lists.linux.dev, linux-mm@kvack.org, linux-crypto@vger.kernel.org Cc: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, Joerg Roedel <jroedel@suse.de>, Tom Lendacky <thomas.lendacky@amd.com>, "H. Peter Anvin" <hpa@zytor.com>, Ard Biesheuvel <ardb@kernel.org>, Paolo Bonzini <pbonzini@redhat.com>, Sean Christopherson <seanjc@google.com>, Vitaly Kuznetsov <vkuznets@redhat.com>, Wanpeng Li <wanpengli@tencent.com>, Jim Mattson <jmattson@google.com>, Andy Lutomirski <luto@kernel.org>, Dave Hansen <dave.hansen@linux.intel.com>, Sergio Lopez <slp@redhat.com>, Peter Gonda <pgonda@google.com>, Peter Zijlstra <peterz@infradead.org>, Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>, David Rientjes <rientjes@google.com>, Dov Murik <dovmurik@linux.ibm.com>, Tobin Feldman-Fitzthum <tobin@ibm.com>, Borislav Petkov <bp@alien8.de>, Michael Roth <michael.roth@amd.com>, Vlastimil Babka <vbabka@suse.cz>, tony.luck@intel.com, npmccallum@redhat.com, brijesh.ksingh@gmail.com, Brijesh Singh <brijesh.singh@amd.com> Subject: [PATCH Part2 RFC v4 12/40] crypto: ccp: Add support to initialize the AMD-SP for SEV-SNP Date: Wed, 7 Jul 2021 13:35:48 -0500 [thread overview] Message-ID: <20210707183616.5620-13-brijesh.singh@amd.com> (raw) In-Reply-To: <20210707183616.5620-1-brijesh.singh@amd.com> Before SNP VMs can be launched, the platform must be appropriately configured and initialized. Platform initialization is accomplished via the SNP_INIT command. Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> --- drivers/crypto/ccp/sev-dev.c | 114 +++++++++++++++++++++++++++++++++-- drivers/crypto/ccp/sev-dev.h | 2 + include/linux/psp-sev.h | 16 +++++ 3 files changed, 127 insertions(+), 5 deletions(-) diff --git a/drivers/crypto/ccp/sev-dev.c b/drivers/crypto/ccp/sev-dev.c index 32884d2bf4e5..d3c717bb5b50 100644 --- a/drivers/crypto/ccp/sev-dev.c +++ b/drivers/crypto/ccp/sev-dev.c @@ -591,6 +591,95 @@ static int sev_update_firmware(struct device *dev) return ret; } +static void snp_set_hsave_pa(void *arg) +{ + wrmsrl(MSR_VM_HSAVE_PA, 0); +} + +static int __sev_snp_init_locked(int *error) +{ + struct psp_device *psp = psp_master; + struct sev_device *sev; + int rc = 0; + + if (!psp || !psp->sev_data) + return -ENODEV; + + sev = psp->sev_data; + + if (sev->snp_inited) + return 0; + + /* + * The SNP_INIT requires the MSR_VM_HSAVE_PA must be set to 0h + * across all cores. + */ + on_each_cpu(snp_set_hsave_pa, NULL, 1); + + /* Prepare for first SEV guest launch after INIT */ + wbinvd_on_all_cpus(); + + /* Issue the SNP_INIT firmware command. */ + rc = __sev_do_cmd_locked(SEV_CMD_SNP_INIT, NULL, error); + if (rc) + return rc; + + sev->snp_inited = true; + dev_dbg(sev->dev, "SEV-SNP firmware initialized\n"); + + return rc; +} + +int sev_snp_init(int *error) +{ + int rc; + + if (!cpu_feature_enabled(X86_FEATURE_SEV_SNP)) + return -ENODEV; + + mutex_lock(&sev_cmd_mutex); + rc = __sev_snp_init_locked(error); + mutex_unlock(&sev_cmd_mutex); + + return rc; +} +EXPORT_SYMBOL_GPL(sev_snp_init); + +static int __sev_snp_shutdown_locked(int *error) +{ + struct sev_device *sev = psp_master->sev_data; + int ret; + + if (!sev->snp_inited) + return 0; + + /* SHUTDOWN requires the DF_FLUSH */ + wbinvd_on_all_cpus(); + __sev_do_cmd_locked(SEV_CMD_SNP_DF_FLUSH, NULL, NULL); + + ret = __sev_do_cmd_locked(SEV_CMD_SNP_SHUTDOWN, NULL, error); + if (ret) { + dev_err(sev->dev, "SEV-SNP firmware shutdown failed\n"); + return ret; + } + + sev->snp_inited = false; + dev_dbg(sev->dev, "SEV-SNP firmware shutdown\n"); + + return ret; +} + +static int sev_snp_shutdown(int *error) +{ + int rc; + + mutex_lock(&sev_cmd_mutex); + rc = __sev_snp_shutdown_locked(NULL); + mutex_unlock(&sev_cmd_mutex); + + return rc; +} + static int sev_ioctl_do_pek_import(struct sev_issue_cmd *argp, bool writable) { struct sev_device *sev = psp_master->sev_data; @@ -1095,6 +1184,21 @@ void sev_pci_init(void) "SEV: TMR allocation failed, SEV-ES support unavailable\n"); } + /* + * If boot CPU supports the SNP, then first attempt to initialize + * the SNP firmware. + */ + if (cpu_feature_enabled(X86_FEATURE_SEV_SNP)) { + rc = sev_snp_init(&error); + if (rc) { + /* + * If we failed to INIT SNP then don't abort the probe. + * Continue to initialize the legacy SEV firmware. + */ + dev_err(sev->dev, "SEV-SNP: failed to INIT error %#x\n", error); + } + } + /* Initialize the platform */ rc = sev_platform_init(&error); if (rc && (error == SEV_RET_SECURE_DATA_INVALID)) { @@ -1109,13 +1213,11 @@ void sev_pci_init(void) rc = sev_platform_init(&error); } - if (rc) { + if (rc) dev_err(sev->dev, "SEV: failed to INIT error %#x\n", error); - return; - } - dev_info(sev->dev, "SEV API:%d.%d build:%d\n", sev->api_major, - sev->api_minor, sev->build); + dev_info(sev->dev, "SEV%s API:%d.%d build:%d\n", sev->snp_inited ? + "-SNP" : "", sev->api_major, sev->api_minor, sev->build); return; @@ -1138,4 +1240,6 @@ void sev_pci_exit(void) get_order(SEV_ES_TMR_SIZE)); sev_es_tmr = NULL; } + + sev_snp_shutdown(NULL); } diff --git a/drivers/crypto/ccp/sev-dev.h b/drivers/crypto/ccp/sev-dev.h index 666c21eb81ab..186ad20cbd24 100644 --- a/drivers/crypto/ccp/sev-dev.h +++ b/drivers/crypto/ccp/sev-dev.h @@ -52,6 +52,8 @@ struct sev_device { u8 build; void *cmd_buf; + + bool snp_inited; }; int sev_dev_init(struct psp_device *psp); diff --git a/include/linux/psp-sev.h b/include/linux/psp-sev.h index c3755099ab55..1b53e8782250 100644 --- a/include/linux/psp-sev.h +++ b/include/linux/psp-sev.h @@ -748,6 +748,20 @@ struct sev_data_snp_init_ex { */ int sev_platform_init(int *error); +/** + * sev_snp_init - perform SEV SNP_INIT command + * + * @error: SEV command return code + * + * Returns: + * 0 if the SEV successfully processed the command + * -%ENODEV if the SEV device is not available + * -%ENOTSUPP if the SEV does not support SEV + * -%ETIMEDOUT if the SEV command timed out + * -%EIO if the SEV returned a non-zero return code + */ +int sev_snp_init(int *error); + /** * sev_platform_status - perform SEV PLATFORM_STATUS command * @@ -855,6 +869,8 @@ sev_platform_status(struct sev_user_data_status *status, int *error) { return -E static inline int sev_platform_init(int *error) { return -ENODEV; } +static inline int sev_snp_init(int *error) { return -ENODEV; } + static inline int sev_guest_deactivate(struct sev_data_deactivate *data, int *error) { return -ENODEV; } -- 2.17.1
next prev parent reply other threads:[~2021-07-07 18:38 UTC|newest] Thread overview: 178+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-07 18:35 [PATCH Part2 RFC v4 00/40] Add AMD Secure Nested Paging (SEV-SNP) Hypervisor Support Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 01/40] KVM: SVM: Add support to handle AP reset MSR protocol Brijesh Singh 2021-07-14 20:17 ` Sean Christopherson 2021-07-15 7:39 ` Joerg Roedel 2021-07-15 13:42 ` Tom Lendacky 2021-07-15 15:45 ` Sean Christopherson 2021-07-15 17:05 ` Tom Lendacky 2021-07-07 18:35 ` [PATCH Part2 RFC v4 02/40] KVM: SVM: Provide the Hypervisor Feature support VMGEXIT Brijesh Singh 2021-07-14 20:37 ` Sean Christopherson 2021-07-14 21:00 ` Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 03/40] x86/cpufeatures: Add SEV-SNP CPU feature Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 04/40] x86/sev: Add the host SEV-SNP initialization support Brijesh Singh 2021-07-14 21:07 ` Sean Christopherson 2021-07-14 22:02 ` Brijesh Singh 2021-07-14 22:06 ` Sean Christopherson 2021-07-14 22:11 ` Brijesh Singh 2022-06-02 11:47 ` Jarkko Sakkinen 2022-06-06 11:42 ` Dr. David Alan Gilbert 2021-07-07 18:35 ` [PATCH Part2 RFC v4 05/40] x86/sev: Add RMP entry lookup helpers Brijesh Singh 2021-07-15 18:37 ` Sean Christopherson 2021-07-15 19:28 ` Brijesh Singh 2021-07-16 17:22 ` Brijesh Singh 2021-07-20 22:06 ` Sean Christopherson 2021-07-20 23:10 ` Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 06/40] x86/sev: Add helper functions for RMPUPDATE and PSMASH instruction Brijesh Singh 2021-07-12 18:44 ` Peter Gonda 2021-07-12 19:00 ` Dave Hansen 2021-07-15 18:56 ` Sean Christopherson 2021-07-15 19:08 ` Dave Hansen 2021-07-15 19:18 ` Sean Christopherson 2021-07-07 18:35 ` [PATCH Part2 RFC v4 07/40] x86/sev: Split the physmap when adding the page in RMP table Brijesh Singh 2021-07-14 22:25 ` Sean Christopherson 2021-07-15 17:05 ` Brijesh Singh 2021-07-15 17:51 ` Sean Christopherson 2021-07-15 18:14 ` Brijesh Singh 2021-07-15 18:39 ` Sean Christopherson 2021-07-15 19:38 ` Brijesh Singh 2021-07-15 22:01 ` Sean Christopherson 2021-07-15 22:11 ` Brijesh Singh 2021-07-30 11:31 ` Vlastimil Babka 2021-07-30 16:10 ` Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 08/40] x86/traps: Define RMP violation #PF error code Brijesh Singh 2021-07-15 19:02 ` Sean Christopherson 2021-07-15 19:16 ` Dave Hansen 2021-07-07 18:35 ` [PATCH Part2 RFC v4 09/40] x86/fault: Add support to dump RMP entry on fault Brijesh Singh 2021-07-07 19:21 ` Dave Hansen 2021-07-08 15:02 ` Brijesh Singh 2021-07-08 15:30 ` Dave Hansen 2021-07-08 16:48 ` Brijesh Singh 2021-07-08 16:58 ` Dave Hansen 2021-07-08 17:11 ` Brijesh Singh 2021-07-08 17:15 ` Dave Hansen 2021-07-07 18:35 ` [PATCH Part2 RFC v4 10/40] x86/fault: Add support to handle the RMP fault for user address Brijesh Singh 2021-07-08 16:16 ` Dave Hansen 2021-07-12 15:43 ` Brijesh Singh 2021-07-12 16:00 ` Dave Hansen 2021-07-12 16:11 ` Brijesh Singh 2021-07-12 16:15 ` Dave Hansen 2021-07-12 16:24 ` Brijesh Singh 2021-07-12 16:29 ` Dave Hansen 2021-07-12 16:49 ` Brijesh Singh 2021-07-15 21:53 ` Sean Christopherson 2021-07-30 16:00 ` Vlastimil Babka 2021-07-30 16:31 ` Dave Hansen 2021-07-07 18:35 ` [PATCH Part2 RFC v4 11/40] crypto:ccp: Define the SEV-SNP commands Brijesh Singh 2021-07-07 18:35 ` Brijesh Singh [this message] 2021-07-07 18:35 ` [PATCH Part2 RFC v4 13/40] crypto: ccp: Shutdown SNP firmware on kexec Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 14/40] crypto:ccp: Provide APIs to issue SEV-SNP commands Brijesh Singh 2021-07-08 18:56 ` Dr. David Alan Gilbert 2021-07-07 18:35 ` [PATCH Part2 RFC v4 15/40] crypto: ccp: Handle the legacy TMR allocation when SNP is enabled Brijesh Singh 2021-07-14 13:22 ` Marc Orr 2021-07-14 16:45 ` Brijesh Singh 2021-07-14 18:14 ` Marc Orr 2021-07-15 23:48 ` Sean Christopherson 2021-07-16 12:55 ` Brijesh Singh 2021-07-16 15:35 ` Sean Christopherson 2021-07-16 15:47 ` Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 16/40] crypto: ccp: Handle the legacy SEV command " Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 17/40] crypto: ccp: Add the SNP_PLATFORM_STATUS command Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 18/40] crypto: ccp: Add the SNP_{SET,GET}_EXT_CONFIG command Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 19/40] crypto: ccp: provide APIs to query extended attestation report Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 20/40] KVM: SVM: Make AVIC backing, VMSA and VMCB memory allocation SNP safe Brijesh Singh 2021-07-14 13:35 ` Marc Orr 2021-07-14 16:47 ` Brijesh Singh 2021-07-20 18:02 ` Sean Christopherson 2021-08-03 14:38 ` Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 21/40] KVM: SVM: Add initial SEV-SNP support Brijesh Singh 2021-07-16 18:00 ` Sean Christopherson 2021-07-16 18:46 ` Brijesh Singh 2021-07-16 19:31 ` Sean Christopherson 2021-07-16 21:03 ` Brijesh Singh 2021-07-07 18:35 ` [PATCH Part2 RFC v4 22/40] KVM: SVM: Add KVM_SNP_INIT command Brijesh Singh 2021-07-16 19:33 ` Sean Christopherson 2021-07-16 21:25 ` Brijesh Singh 2021-07-19 20:24 ` Sean Christopherson 2021-07-07 18:35 ` [PATCH Part2 RFC v4 23/40] KVM: SVM: Add KVM_SEV_SNP_LAUNCH_START command Brijesh Singh 2021-07-12 18:45 ` Peter Gonda 2021-07-16 19:43 ` Sean Christopherson 2021-07-16 21:42 ` Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 24/40] KVM: SVM: Add KVM_SEV_SNP_LAUNCH_UPDATE command Brijesh Singh 2021-07-16 20:01 ` Sean Christopherson 2021-07-16 22:00 ` Brijesh Singh 2021-07-19 20:51 ` Sean Christopherson 2021-07-19 21:34 ` Brijesh Singh 2021-07-19 21:36 ` Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 25/40] KVM: SVM: Reclaim the guest pages when SEV-SNP VM terminates Brijesh Singh 2021-07-16 20:09 ` Sean Christopherson 2021-07-16 22:16 ` Brijesh Singh 2021-07-17 0:46 ` Sean Christopherson 2021-07-19 12:55 ` Brijesh Singh 2021-07-19 17:18 ` Sean Christopherson 2021-07-19 18:34 ` Brijesh Singh 2021-07-19 19:03 ` Sean Christopherson 2021-07-19 19:14 ` Sean Christopherson 2021-07-19 19:37 ` Brijesh Singh 2021-07-20 16:40 ` Sean Christopherson 2021-07-20 18:23 ` Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 26/40] KVM: SVM: Add KVM_SEV_SNP_LAUNCH_FINISH command Brijesh Singh 2021-07-16 20:18 ` Sean Christopherson 2021-07-16 22:48 ` Brijesh Singh 2021-07-19 16:54 ` Sean Christopherson 2021-07-19 18:29 ` Brijesh Singh 2021-07-19 19:14 ` Sean Christopherson 2021-07-19 19:49 ` Brijesh Singh 2021-07-19 20:13 ` Sean Christopherson 2021-07-21 17:53 ` Marc Orr 2021-07-07 18:36 ` [PATCH Part2 RFC v4 27/40] KVM: X86: Add kvm_x86_ops to get the max page level for the TDP Brijesh Singh 2021-07-16 19:19 ` Sean Christopherson 2021-07-16 20:41 ` Brijesh Singh 2021-07-20 19:38 ` Sean Christopherson 2021-07-20 20:06 ` Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 28/40] KVM: X86: Introduce kvm_mmu_map_tdp_page() for use by SEV Brijesh Singh 2021-07-16 18:15 ` Sean Christopherson 2021-07-07 18:36 ` [PATCH Part2 RFC v4 29/40] KVM: X86: Introduce kvm_mmu_get_tdp_walk() for SEV-SNP use Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 30/40] KVM: X86: Define new RMP check related #NPF error bits Brijesh Singh 2021-07-16 20:22 ` Sean Christopherson 2021-07-17 0:34 ` Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 31/40] KVM: X86: update page-fault trace to log the 64-bit error code Brijesh Singh 2021-07-16 20:25 ` Sean Christopherson 2021-07-17 0:35 ` Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 32/40] KVM: SVM: Add support to handle GHCB GPA register VMGEXIT Brijesh Singh 2021-07-16 20:45 ` Sean Christopherson 2021-07-17 0:44 ` Brijesh Singh 2021-07-19 20:04 ` Sean Christopherson 2021-07-07 18:36 ` [PATCH Part2 RFC v4 33/40] KVM: SVM: Add support to handle MSR based Page State Change VMGEXIT Brijesh Singh 2021-07-16 21:00 ` Sean Christopherson 2021-07-19 14:19 ` Brijesh Singh 2021-07-19 18:55 ` Sean Christopherson 2021-07-19 19:15 ` Brijesh Singh 2021-08-13 16:32 ` Borislav Petkov 2021-07-07 18:36 ` [PATCH Part2 RFC v4 34/40] KVM: SVM: Add support to handle " Brijesh Singh 2021-07-16 21:14 ` Sean Christopherson 2021-07-19 14:24 ` Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 35/40] KVM: Add arch hooks to track the host write to guest memory Brijesh Singh 2021-07-19 23:30 ` Sean Christopherson 2021-07-20 15:15 ` Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 36/40] KVM: X86: Export the kvm_zap_gfn_range() for the SNP use Brijesh Singh 2021-07-07 18:36 ` [PATCH Part2 RFC v4 37/40] KVM: SVM: Add support to handle the RMP nested page fault Brijesh Singh 2021-07-20 0:10 ` Sean Christopherson 2021-07-20 17:55 ` Brijesh Singh 2021-07-20 22:31 ` Sean Christopherson 2021-07-20 23:53 ` Brijesh Singh 2021-07-21 20:15 ` Sean Christopherson 2021-07-07 18:36 ` [PATCH Part2 RFC v4 38/40] KVM: SVM: Provide support for SNP_GUEST_REQUEST NAE event Brijesh Singh 2021-07-19 22:50 ` Sean Christopherson 2021-07-20 14:37 ` Brijesh Singh 2021-07-20 16:28 ` Sean Christopherson 2021-07-20 18:21 ` Brijesh Singh 2021-07-20 22:09 ` Sean Christopherson 2021-07-07 18:36 ` [PATCH Part2 RFC v4 39/40] KVM: SVM: Use a VMSA physical address variable for populating VMCB Brijesh Singh 2021-07-21 0:20 ` Sean Christopherson 2021-07-21 16:26 ` Tom Lendacky 2021-07-07 18:36 ` [PATCH Part2 RFC v4 40/40] KVM: SVM: Support SEV-SNP AP Creation NAE event Brijesh Singh 2021-07-21 0:01 ` Sean Christopherson 2021-07-21 17:47 ` Tom Lendacky 2021-07-21 19:52 ` Sean Christopherson 2021-08-20 14:44 ` Tom Lendacky 2021-07-08 15:40 ` [PATCH Part2 RFC v4 00/40] Add AMD Secure Nested Paging (SEV-SNP) Hypervisor Support Dave Hansen
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=20210707183616.5620-13-brijesh.singh@amd.com \ --to=brijesh.singh@amd.com \ --cc=ardb@kernel.org \ --cc=bp@alien8.de \ --cc=brijesh.ksingh@gmail.com \ --cc=dave.hansen@linux.intel.com \ --cc=dovmurik@linux.ibm.com \ --cc=hpa@zytor.com \ --cc=jmattson@google.com \ --cc=jroedel@suse.de \ --cc=kvm@vger.kernel.org \ --cc=linux-coco@lists.linux.dev \ --cc=linux-crypto@vger.kernel.org \ --cc=linux-efi@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=luto@kernel.org \ --cc=michael.roth@amd.com \ --cc=mingo@redhat.com \ --cc=npmccallum@redhat.com \ --cc=pbonzini@redhat.com \ --cc=peterz@infradead.org \ --cc=pgonda@google.com \ --cc=platform-driver-x86@vger.kernel.org \ --cc=rientjes@google.com \ --cc=seanjc@google.com \ --cc=slp@redhat.com \ --cc=srinivas.pandruvada@linux.intel.com \ --cc=tglx@linutronix.de \ --cc=thomas.lendacky@amd.com \ --cc=tobin@ibm.com \ --cc=tony.luck@intel.com \ --cc=vbabka@suse.cz \ --cc=vkuznets@redhat.com \ --cc=wanpengli@tencent.com \ --cc=x86@kernel.org \ --subject='Re: [PATCH Part2 RFC v4 12/40] crypto: ccp: Add support to initialize the AMD-SP for SEV-SNP' \ /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
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).