From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1762912AbcINOCZ (ORCPT ); Wed, 14 Sep 2016 10:02:25 -0400 Received: from mail-by2nam03on0076.outbound.protection.outlook.com ([104.47.42.76]:39680 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1762099AbcINOCU (ORCPT ); Wed, 14 Sep 2016 10:02:20 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Thomas.Lendacky@amd.com; Subject: Re: [RFC PATCH v2 18/20] x86/kvm: Enable Secure Memory Encryption of nested page tables To: Borislav Petkov References: <20160822223529.29880.50884.stgit@tlendack-t1.amdoffice.net> <20160822223849.29880.35462.stgit@tlendack-t1.amdoffice.net> <20160912143555.26lxdu3lv3o5hjp7@pd.tnic> CC: , , , , , , , , , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Arnd Bergmann , Jonathan Corbet , Matt Fleming , Joerg Roedel , Konrad Rzeszutek Wilk , Andrey Ryabinin , Ingo Molnar , Andy Lutomirski , "H. Peter Anvin" , Paolo Bonzini , Alexander Potapenko , Thomas Gleixner , Dmitry Vyukov From: Tom Lendacky Message-ID: Date: Wed, 14 Sep 2016 09:02:09 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160912143555.26lxdu3lv3o5hjp7@pd.tnic> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: BN6PR17CA0027.namprd17.prod.outlook.com (10.175.189.13) To MWHPR12MB1152.namprd12.prod.outlook.com (10.169.204.16) X-MS-Office365-Filtering-Correlation-Id: 1aa01699-e4db-49f7-3249-08d3dca7bd12 X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;2:vafSfH/zM+txS1e2ZLqf8NafMRBn9MhY82DyJfF/4jWRIYaeshbjNPMHAmM+iATA4LFcJsHO4YB3EG9xdQIG20Te3SMl4H+cMr14lMRVcV6Tsrr9UqsQPWbXArsFvgY34wlQVsFRG33/Mz0lHswW9n2V7DGNDgdv80Tj+s/J3zKh6v3lKFJY59wiWR9qeXkQ;3:QzSZiSQRWtR1YG9yyM7VqHI7Vxj1xFYVmbxtJWZW0mgVmDqZER0opJZR6/A5CKN8oD/41tgL9xFOUcx8IxKldAjYm+Ys3EQiotqr8MvwBTh+jLTh64u8KfIN80EzgoVz;25:9AR4wRkq63G86Bfn+CPH0wSYJRUYCDHTrlOrP7yF35AtarUq0BxXkPBX4owslKdonK7waPjcSBhJgL2StQgMMrLwKMRBc0YNtUN6MxLypC/5iwSNAjUtc7SRSYknj0TeZmtt2jNndx/5RUF1LOHBCEeUR+7jpmUpOTYbx+Pk8oskx87Nk89p1uN0skuEkcNFiLOO9ccKrY16jXyJTUNyPpvKPw8gWfu5F4G5NlShZPbJe0J0V1JrHEGejUkK/1+HrsjFPsmkWGcDAvEGyZDL5SBUUQirkI23m4ZCmXAxKmjyDiF/etzwNOBSHOAjTOpKuhp3QXYseHjDBhYOrBbpQ+oOvU55FXZUn5w3Cu1DLfOfsyE2NUYiCfAPZKPcKm3iRnTYEAYZeSnmE7ML1P6cSWMFAj9zZpUnD+nJtrRaAJk= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1152; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;31:GVwZqsrz7jm/WeS9g29qCtOWW973bAsWdLBmQity45s0kGoOzr0s2oAOFuxddXBObexrpcwbd74XAr22xExTa4xeuPsEp9MUM/KJ5MD6DXHTfsZbKq8cq+RNNw54Y0LvLCC4LBUzi1SQeLL37wHQG/lcLM188z2PEsk/0FOecQH9411SfJeFSYlYkbIxsKEdlP0eJU4xeluXthDW96i4fwA/DAadB0/AvnfvlR4ZNnI=;20:zj+/ZCamxpX6etOsMeNYyvBOe61eftkoNjpGpGTCtNJyUlVPXri2vmD+7ntEEANFoBGjIgKVcdCTVZHF5smC34bQ6oEM5COJxnjahTaYwh+IsK9PyPtP1TzIr/2HkA9E7oQ+8sKhmRv02h6lKnOs4U1IYPl5J3BFJ6T9DqzoFchGJIbvpcB3Saywy0psD0O/UK3651yUeJ5fBrEe1qbCfR7b1dOTNPjjhjtuVULVVD/T0KDAJ8Bcmf5Xow2IWGWvm+tzMw4YRouGMkOQl4zdpAuhvkj33cSqKez7cUhcj0qgr030jArhcUCXUDCAFP8RS9Ehzd8aB2d/j+83Zd0MjCFrYMwkMZTnoWcfOusGvFE+obE6nxaQdaWfr8HGPj4MrXLx7RA+7X9rIqEijtPlmiOlAzsiRq+LaLXU9JGD+lsg36ADHGb0uloOffDSgTgei96IdLEVDXR0oLDoNbYm5HLzp6aoBxIpabn8PoHmTS97aijnS1gc/FjY10y91uz3 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:MWHPR12MB1152;BCL:0;PCL:0;RULEID:;SRVR:MWHPR12MB1152; X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;4:15mYHF/pMyWZLUnJdkpx/J3b0aFNXXdngVpYynEJ0UVIpv+m2xis17JC9P+IB2T+HTjVGmikoa1y0ITcAG/JB8BFOL939NIQjGctKzG64vBlHuUAPxGTdyQ4HiZi8ywjed2YjjsDJBbUf43VFLtB4tjDAOydGiFiF9omSGDsh5w4l8zFLw1uxGgDlAuKO3T9BPQ2xJWBVUXpKrVB23PFv5P46xI7KrU7JcztcxDCXLpiAFEpvG9KTockPrvFypxgMY+bBB0KClxpBhpCwJzTsu3lFRmywu/LECjAPDL/ScTCE2CAo4Ky0sGusf4nGJlKmoYTJ7ccm5z1C9HD78iefUshL7Nw4KP9uQbK4OzegAx8HkgsXPxkzxhlq36ZaNegAyQscTMXa6NGv9+d+3gJu6103E5n1gJuded9yBUogoeCltaOzTI0rDU+D4wX7ttM X-Forefront-PRVS: 006546F32A X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6049001)(6009001)(7916002)(199003)(189002)(24454002)(377454003)(23676002)(65806001)(47776003)(64126003)(92566002)(97736004)(7736002)(83506001)(4001350100001)(7846002)(86362001)(6116002)(68736007)(230700001)(77096005)(4326007)(31696002)(33646002)(3846002)(586003)(2950100001)(305945005)(50466002)(76176999)(19580395003)(189998001)(2906002)(19580405001)(50986999)(54356999)(31686004)(66066001)(81156014)(101416001)(8676002)(42186005)(65826007)(36756003)(7416002)(81166006)(105586002)(106356001)(65956001)(5660300001)(110136003)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR12MB1152;H:[10.236.18.82];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtNV0hQUjEyTUIxMTUyOzIzOjNPenIwdUtVWE13ZFptZ0tKNXVPeTBwY243?= =?utf-8?B?bWhocjhFU05ldGE4TWpGYmZxbjlWQWtLM3RINUhOZlQ4QTYyWXh2YldoT1pk?= =?utf-8?B?NVNhYlZUeVlvdmNMM0M5aGNNOFBHeEpldUVtL0RKVzBFQzUraS9OSlkwSzEx?= =?utf-8?B?N1UxT2NDMU1tTjlWZm9EK2FBWFpKVENsdnlWaXBURDVDQ1NwNUZLYTZvRTFJ?= =?utf-8?B?bGxpU1dnMkM3UWVvUzNjWEp2djlIYzRkSnVHUzRSMFkvb2N3T1MvMDlDelli?= =?utf-8?B?Smt5YjMyMk1lZUpQMmZ3U2Rpd2lkOVJzZGMrenNlUm9EcUxkaUluK1plVUQ4?= =?utf-8?B?a1c2ekwxUTNRcFRadEtiVHhzQWtickxaQ25ramo1TXB6ZmpLRFBCamp4ZVFn?= =?utf-8?B?ckFWQ0xabDdSNFZnUFV3UVVYRU4xY3RwK1BnenAxcmJ2eEIzR055TlNSQ0Va?= =?utf-8?B?Sys5bDhnWlRsd1h4VjU0WkM2SG43SVlKVGMyWUwwRWZOSkRIQTRmMldlei9y?= =?utf-8?B?azVhR0ZMOVJqb0lTcEt4ZDRUajBNUEk3cFpTdXg5WlFHZHRteEF1OW5qdVV2?= =?utf-8?B?cVBFeGVRM01nRXR4aUNsaXJpbTV3Z3dlb3BLdmxMVUgyRFJEbnZsSjhaWnpE?= =?utf-8?B?Y0ZqZkNDbFRQUU8wTkJIQjVRSnhRdXltYkZ6Zi9lSW5ycWM5RXVWMXJPdWor?= =?utf-8?B?d3V2V2ZQSDBkMTJaNHVIL2FyUTZPRGZuT1dpWXVSeU5OMDQ5LzJFb0FpMllB?= =?utf-8?B?QUt3dE1YOXF5R2M1SGd2ZEs0aGx1dkdPSUR6QkRGQVFxVVNwUmFmclJDNVNH?= =?utf-8?B?clk1QnA3a3h5SDk0NVBvcjRrQTJsd0Z5RUJxZFdHbUtoanpscy9XakhwbDM5?= =?utf-8?B?RXJrTzVyT2p5U01mYW9EbDdMNmNSbzR2RXFwRnFzeVJIWGVJSCtIeStVSkdo?= =?utf-8?B?cEJweUs3bjc5bllDRmZobmxZdEloVXpWT0tvMHF2R3orb2VsUVhRc21rUnln?= =?utf-8?B?NlAza3RZOEZyQTJUQllTRWpFMmw5NlVnMEJ5dG5MamNuYVUzOHg1SmhjalRT?= =?utf-8?B?M1p6TnFwYStqVW55aVAxZ2w1aWptV1JzYkFLVVFkV2xscVlLOUpJR1c4VWNI?= =?utf-8?B?Q0EraGxxMXNzaktUWVh1aWpKeVcvOWFnSzBLY0tjNlRma1BCVDdubVJ3bEpi?= =?utf-8?B?L1pRVnRGN25PYjVNdkMxNHRYUi81NnFtZkJvdS9pdTJUNTFRdXRhQSswZFp5?= =?utf-8?B?TjNzZTh3dC84ZDZ1TExpSk5naHVrOWYvMndncUZseWNzRDZxL0pwdEwwek41?= =?utf-8?B?R3p6OVllNk5sd1NkWTdPOTBBbFNOOG1HQzhHK2g5WHE2Mi83Ty9HdG1PTHA5?= =?utf-8?B?UjZJb0RmTERRSnNaNUc5blBybVlrcm5EUXVHUVptbzFUMVg0dG5PaytDREQv?= =?utf-8?B?WUVlVFhzc2tvQiswL0NtLy9qRVJaaGduV3o1dkJOZHk4WVhydnJrdUpTQlRG?= =?utf-8?B?MVN0d1NyT2Rja2JvM3orVFdEdVdvNjhVWk4vY3gyUW15dWY4MzJLLzcybFhC?= =?utf-8?B?M1M2RzNKQlNaakdiQ1NtSmRVd2RaZnltdUlzOTYrZmJjUEs5TER4bTJxWEs1?= =?utf-8?B?c2N4Q0hRZWRHZDliRnhCVkVVWm1UaHZ5QUZjY2c5SC9XbWQwcHBHeHIvUHlI?= =?utf-8?B?dGpUY2pKbXR6bkdkdGVoTU0waG1SU0ZMSXMyU21JQTA2RS9Ra01HNno3Yzhn?= =?utf-8?B?K0RHYlBOL3pINy83TFZGQVpFWkEvcmIwOTlNU1BmSm03bEpFZVVRZDR3bEFo?= =?utf-8?Q?18HlfpBjk04yh?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;6:j6DpCukuCf01na5XXhmmcY2mwO/xxnZgn13OQG0i5EZaVfjq9G9x4wr1CMfrC+iM4y3sm4UBVOIGa6vksIkc7lII0iL7YYRZT0qR024YF2iz5V14jh0ZVAM6NpyJ2AeQmr+9RN51kH1afMyoKQELsPRhmogANB2jyjxoyvC/cIR89MmfZv8YbSWO0glvUEH20MZmx5jy+hqq/OR6Fe31WhKFDdxZE1H+ZqsoOd6aDrrVStHWjFSfpJKV4Nedk+O2HS8wxaFj7gmAcczgZ+bpvEdFXUucykW5Hl9j67d5vtPfXynBQSiYwqyyGnuknkyoPFXo4gg49+YCyLg6ZUVgQg==;5:OW27/CgPhEEYmEVhQld6aJ4iU3fIueDaSdr1rfoxwDTWe2mKztcim2yFkWjn1vFZFvIsPl4hMfpxElu79roWjYgcQZx1d0uWQ72SWYbnp5Znvdgo/R7AO3Q9cXXPsv6jTGnD7P6kcBWgEb9Xi8BZBQ==;24:mu9lzn8IiE7deoC1SMYhh9XLV6fuNFNnWRdOQjmUWr4qhYBRQwCDFYsr6XSfbVTs88xSqfmRXB3vk5bPE95N84zQR4u9yL+JvigI4jzfu78=;7:rmqpOfhmkXZtKjircXA22wi027gSm7XQf3D5/BWvs4kbfH9eXtPtVjpZJa+4K4r9TQ40SRH5ItBQrQ2CJEYTYHmEQuBLult0L/H6NFMSw5MVou3j6pkncCDB7C5FszVucAYrm4a6kD5TIDSyZj41E+XZ+3Yjp9M3xTwByDFUGj0mByv3iDLz5fq/l6UUCP4X7MOEiwbms7LCKoFLixfSQQUamCzVUKfypZUuBvhKgL7cBSqzcJTRL27d0NPfb5Ls SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR12MB1152;20:2P2CFUJyTwv9Fq9PAv3CVfaOaQmx91tzVL1X9frB8G3N5GcGXgKMUakJbWpiB7P4mufCXG6fRWP9Vv3XNGSSFcrC59gHXCJtueJGHu37Y2EsWlUvNFQ/VF7986HPo6ATK9sg75Kr7P/YxB2eEzimZlY+A3lmUD3SMH1soBWHvWLaJnRj8Jx97J9XE/7/8+N5obXG6vQJujW2lIVWuXZI/tOnqVwFbSphwo3OtBZWyGW+rl30fyZ8He1ilsjXq6Ls X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2016 14:02:14.3487 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR12MB1152 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 09/12/2016 09:35 AM, Borislav Petkov wrote: > On Mon, Aug 22, 2016 at 05:38:49PM -0500, Tom Lendacky wrote: >> Update the KVM support to include the memory encryption mask when creating >> and using nested page tables. >> >> Signed-off-by: Tom Lendacky >> --- >> arch/x86/include/asm/kvm_host.h | 3 ++- >> arch/x86/kvm/mmu.c | 8 ++++++-- >> arch/x86/kvm/vmx.c | 3 ++- >> arch/x86/kvm/x86.c | 3 ++- >> 4 files changed, 12 insertions(+), 5 deletions(-) >> >> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h >> index 33ae3a4..c51c1cb 100644 >> --- a/arch/x86/include/asm/kvm_host.h >> +++ b/arch/x86/include/asm/kvm_host.h >> @@ -1039,7 +1039,8 @@ void kvm_mmu_setup(struct kvm_vcpu *vcpu); >> void kvm_mmu_init_vm(struct kvm *kvm); >> void kvm_mmu_uninit_vm(struct kvm *kvm); >> void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask, >> - u64 dirty_mask, u64 nx_mask, u64 x_mask, u64 p_mask); >> + u64 dirty_mask, u64 nx_mask, u64 x_mask, u64 p_mask, >> + u64 me_mask); > > Why do you need a separate mask? > > arch/x86/kvm/mmu.c::set_spte() ORs in shadow_present_mask > unconditionally. So you can simply do: > > > kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, > PT_DIRTY_MASK, PT64_NX_MASK, 0, > PT_PRESENT_MASK | sme_me_mask); > > and have this change much simpler. Just keeping in step with the way this is done for the other masks. They each have a specific meaning so I was trying not to combine them in case they may be used differently in the future. > >> void kvm_mmu_reset_context(struct kvm_vcpu *vcpu); >> void kvm_mmu_slot_remove_write_access(struct kvm *kvm, >> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c >> index 3d4cc8cc..a7040f4 100644 >> --- a/arch/x86/kvm/mmu.c >> +++ b/arch/x86/kvm/mmu.c >> @@ -122,7 +122,7 @@ module_param(dbg, bool, 0644); >> * PT32_LEVEL_BITS))) - 1)) >> >> #define PT64_PERM_MASK (PT_PRESENT_MASK | PT_WRITABLE_MASK | shadow_user_mask \ >> - | shadow_x_mask | shadow_nx_mask) >> + | shadow_x_mask | shadow_nx_mask | shadow_me_mask) > > This would be sme_me_mask, of course, like with the baremetal masks. > > Or am I missing something? Given the current patch, this would be shadow_me_mask since that value is set by the call to kvm_mmu_set_mask_ptes. Thanks, Tom > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tom Lendacky Subject: Re: [RFC PATCH v2 18/20] x86/kvm: Enable Secure Memory Encryption of nested page tables Date: Wed, 14 Sep 2016 09:02:09 -0500 Message-ID: References: <20160822223529.29880.50884.stgit@tlendack-t1.amdoffice.net> <20160822223849.29880.35462.stgit@tlendack-t1.amdoffice.net> <20160912143555.26lxdu3lv3o5hjp7@pd.tnic> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20160912143555.26lxdu3lv3o5hjp7@pd.tnic> Sender: owner-linux-mm@kvack.org To: Borislav Petkov Cc: linux-arch@vger.kernel.org, linux-efi@vger.kernel.org, kvm@vger.kernel.org, linux-doc@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, linux-mm@kvack.org, iommu@lists.linux-foundation.org, =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , Arnd Bergmann , Jonathan Corbet , Matt Fleming , Joerg Roedel , Konrad Rzeszutek Wilk , Andrey Ryabinin , Ingo Molnar , Andy Lutomirski , "H. Peter Anvin" , Paolo Bonzini , Alexander Potapenko , Thomas Gleixner , Dmitry Vyukov List-Id: linux-efi@vger.kernel.org On 09/12/2016 09:35 AM, Borislav Petkov wrote: > On Mon, Aug 22, 2016 at 05:38:49PM -0500, Tom Lendacky wrote: >> Update the KVM support to include the memory encryption mask when creating >> and using nested page tables. >> >> Signed-off-by: Tom Lendacky >> --- >> arch/x86/include/asm/kvm_host.h | 3 ++- >> arch/x86/kvm/mmu.c | 8 ++++++-- >> arch/x86/kvm/vmx.c | 3 ++- >> arch/x86/kvm/x86.c | 3 ++- >> 4 files changed, 12 insertions(+), 5 deletions(-) >> >> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h >> index 33ae3a4..c51c1cb 100644 >> --- a/arch/x86/include/asm/kvm_host.h >> +++ b/arch/x86/include/asm/kvm_host.h >> @@ -1039,7 +1039,8 @@ void kvm_mmu_setup(struct kvm_vcpu *vcpu); >> void kvm_mmu_init_vm(struct kvm *kvm); >> void kvm_mmu_uninit_vm(struct kvm *kvm); >> void kvm_mmu_set_mask_ptes(u64 user_mask, u64 accessed_mask, >> - u64 dirty_mask, u64 nx_mask, u64 x_mask, u64 p_mask); >> + u64 dirty_mask, u64 nx_mask, u64 x_mask, u64 p_mask, >> + u64 me_mask); > > Why do you need a separate mask? > > arch/x86/kvm/mmu.c::set_spte() ORs in shadow_present_mask > unconditionally. So you can simply do: > > > kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, > PT_DIRTY_MASK, PT64_NX_MASK, 0, > PT_PRESENT_MASK | sme_me_mask); > > and have this change much simpler. Just keeping in step with the way this is done for the other masks. They each have a specific meaning so I was trying not to combine them in case they may be used differently in the future. > >> void kvm_mmu_reset_context(struct kvm_vcpu *vcpu); >> void kvm_mmu_slot_remove_write_access(struct kvm *kvm, >> diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c >> index 3d4cc8cc..a7040f4 100644 >> --- a/arch/x86/kvm/mmu.c >> +++ b/arch/x86/kvm/mmu.c >> @@ -122,7 +122,7 @@ module_param(dbg, bool, 0644); >> * PT32_LEVEL_BITS))) - 1)) >> >> #define PT64_PERM_MASK (PT_PRESENT_MASK | PT_WRITABLE_MASK | shadow_user_mask \ >> - | shadow_x_mask | shadow_nx_mask) >> + | shadow_x_mask | shadow_nx_mask | shadow_me_mask) > > This would be sme_me_mask, of course, like with the baremetal masks. > > Or am I missing something? Given the current patch, this would be shadow_me_mask since that value is set by the call to kvm_mmu_set_mask_ptes. Thanks, Tom > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org