From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933396AbcIENfk (ORCPT ); Mon, 5 Sep 2016 09:35:40 -0400 Received: from mail-db5eur01on0119.outbound.protection.outlook.com ([104.47.2.119]:9632 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932692AbcIENfb (ORCPT ); Mon, 5 Sep 2016 09:35:31 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=dsafonov@virtuozzo.com; From: Dmitry Safonov To: CC: <0x7f454c46@gmail.com>, , , , , , , , , , Dmitry Safonov Subject: [PATCHv5 4/6] x86/coredump: use pr_reg size, rather that TIF_IA32 flag Date: Mon, 5 Sep 2016 16:33:06 +0300 Message-ID: <20160905133308.28234-5-dsafonov@virtuozzo.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160905133308.28234-1-dsafonov@virtuozzo.com> References: <20160905133308.28234-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM3PR03CA038.eurprd03.prod.outlook.com (10.141.191.166) To DB6PR0801MB1733.eurprd08.prod.outlook.com (10.169.226.148) X-MS-Office365-Filtering-Correlation-Id: 520cf1fd-2451-4b83-1bdf-08d3d5917e9a X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;2:r9gg0LkGtBf6Wb7/ijsWVUWRT3zbeGxW3oPCutpkjaaF9kV7Blh1YVRr541vAnjtLNA9aojx1eugA2TXLeLqmc5wqjBZEisoLLLdE43K7OnPaVFou9kCZP5C3KDV7JA5wRaArutPZomj83NiUtlPwnwkIlZPASDzob2JbxN7uG/UOGTR89NCgdr4nNUQd5uA;3:YyII4LcYNLPwiyZJX9zX2J1YeU2SZG+KuHitH2DQwE+qAyKQZgnDdpAluTue1sDcbzuDzjgP4uIUhu8J5XB3Po9+DUtzPVDJN2+4Vjswl0FcXah7SQKpuM78AfA7eKUZ X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1733; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;25:tfcPLbKqffPB207hMKDaWd1OaVm10g5fGh1SvSTMoW7ELtG5OAuQXhUcMNfT3GuMAjgcYXgQEk3+nEqjaC21cN0xyxRAUOXd1PctH736XCB1N/VHCa6SwXzr7djOoPXM7b1WBVYgBwUlFI8PAUx8dB0KZB/vLJe59bGDpij5MG0rm+B5zKT5QCqt7rl8tXlLRgR97UrM3zhbNMd5wtNW18cJhmU0AP0MC0mudFdEO4cnxsp7eO+EsXP1WZInBof7IVzEGYm4ngbnGFYp5ODj8CYh6cATHgfdyENciEDYQLEgMYB8C3NyXyU8dHkg4FVSwT7Sv7YwVnPNGyPCSdaBagslgcXbkLRbEUcA1IUCN5sZFlQlto1CAM9SHKp+d+7OBXFslPY0de6bbVhawYfJZj2367jPPya9Etp52LkfKjok9837mCc7T87PQPxRBJSu5MEXUawK3a4OJXwIb8L+DWacDNntAuBah7S2qTO2tDaiLNjoQS2dYzoCNnQUOzXVGKYCFqRjqtqRailjKl9psgKshV536n7x/H3gYlLPtgpieYhIcUubHQwUDHLFz/x7YpIREw15fR23pzRceKJbM2+0qIZta3IugEvS0VBszEMMkxBRuhPznliuo+jtWc7jUlodsCaUD7tOmI5v1nw5cqqHM8nOrnAQ+vV3i16Q0Gl26621UX/fDpTDCfIpmjXF;31:FNvQcZ1RH2bJD8FZigh5W47vj7vPzEOSuJXxs1lSnZYApujfwaHC1j8ykQrqoRoPbu8lhQTkMH1NNyKiUEv/DasD7lUH7d9HZZ+ofbCmc3+HwazWL/zATg7Nt0L2Pg1jyry/AtM3ya20pGtenc7t5JkryKmZ/dY2KRWZCcgZiqoyXc+vcT9K8iFombrZ7ErQqY0Aam7Nas8Q8BTCvY4No+9rqH6OHEcV8VInAsCiQUg= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6043046)(6042046);SRVR:DB6PR0801MB1733;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0801MB1733; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;4:k0/6Snp1RDRtVuAw6hmj9nsUGd+jHjB9frNOf2u4wGWrXVAbnlZhPfXDa6u2SjXLmQ05Kh3fCl4DvHlYR5SLFBuZjdY2gHnDSfxS0jEBj3H931mdETkNcNM6lFVUBHRWEw+V+MKm4DVhoLMJZbMk7SjqXqgGQbEFWgGCtf1/N640MvMpGrKmq1vK4ZT3G0tt8wqiKjaXNcJ7Z88fnfwt4OcQ3KOxIFwV2AdO1PThV65wok5X9ZNzETaMaNuv808INpJhsyBtA4IZ3dH/rVJes660r2dv+k7jLY6OP/yzk9FLmHSk7EhuKhx19o0ek/k7od/xsZ+1nnPpQ7WLqT6VXG9GURxLonND9/4S84UdqppL0IM+ts9SH95iFqFH7PVijZ4IVGWqZA5NgZ2hfxuM+RC5viY9fx9XyQdesZswTDM= X-Forefront-PRVS: 005671E15D X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(199003)(189002)(33646002)(2351001)(50226002)(105586002)(106356001)(76176999)(19580405001)(4326007)(586003)(5003940100001)(189998001)(69596002)(50986999)(2906002)(305945005)(66066001)(1076002)(19580395003)(6116002)(8676002)(48376002)(107886002)(97736004)(3846002)(110136002)(101416001)(86362001)(7846002)(36756003)(77096005)(7736002)(53416004)(81166006)(229853001)(81156014)(50466002)(2950100001)(47776003)(4001430100002)(5660300001)(92566002)(68736007)(42186005);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0801MB1733;H:dsafonov.sw.ru;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0801MB1733;23:T37WCSDZZ2c0rTp88HhRJEVVijj87xYZxsqJilD?= =?us-ascii?Q?U6xxBb7NEtpY3f4euOwwM9WH1nOqAPmsNC7Or8mk3ZTGhZfB+nCcmegqQwCb?= =?us-ascii?Q?TsVk4Wt1I8O8Fjt1zIfnWMPSryFcMs5yL6wPNlwwMcgSUHfgNPkXuJguY5ke?= =?us-ascii?Q?tMrKm5HU8GknVSrP83sMdt4PxQ+06JXGwBhdmOuUsx/Fb/DVNzYOeUg03mCB?= =?us-ascii?Q?fGrXCIVyi2M5sXYti7oeVfHuyq1s4LD/GSdOL2s1cS8ngsUeSiqWe9RqXcOC?= =?us-ascii?Q?SN0wEcU7Vh5HAQjpuh4HDxt3wVt36nnh0Ekbe69tA5s8MFsj/c2xeTS9/QkD?= =?us-ascii?Q?2SK1n2ZHUJZ6r3ZvxWRxdfW8c/E9vj6nwuGs+r+y4dOC8EjXe7VN3f4s+5Eu?= =?us-ascii?Q?zX9NqITBxQwTPYD4Zdgj7bBFMfAsyQBgVJ/blnv0KUIc9evUR1D/lUX73+28?= =?us-ascii?Q?IctxgZVo1KR1+OauObm4ID1K1l2xbrnWpx+uWnr9nocTO1OLopVfAmAxvwvB?= =?us-ascii?Q?VwaWuV6rfla7l2F8Uh9SrdF5PdB+hkBhtY9fDvBYQtf9izRIqv73tpUnBaZN?= =?us-ascii?Q?SKo75lYRZ+T/wiTyHVATU/G+on0Ut84c2UbFg6+Mdvwa68f4rcOoFHcnwT8b?= =?us-ascii?Q?AUw7iA1IyWb/VOR0viMsHWHLEG+Clbp3T2IphViwZtk5p2KGbAYNTX4D4tb7?= =?us-ascii?Q?fDXrio9ylLLL3MsaBkyYIWp+qJF9/u3KVhtVatRXHeVVq1j8OmhdgEkZcQqB?= =?us-ascii?Q?Ky0OFms9+Yew6SzLcq//5fVMFAMzymjLeCOCuifOmxrQGoI3dUcRoZ81e3Vu?= =?us-ascii?Q?YPlThGNgzRUDFb7SqlvEQ+x/zvAlxagbeFPCGtqlJe5dwY2a9iE+X7QFazfE?= =?us-ascii?Q?7p0LZ8L3MDpEXzdFp0Hl6HIwLtdFNN008KfZa3E/NE+s4nn9HqWAs5FgUQHa?= =?us-ascii?Q?SdX2HrqWUTLDUaS74NYCVHxWVXXivdnq8VF+PD6NNXIHlstzW6waVp0/SmTN?= =?us-ascii?Q?QHtRTzt7wBdO6bJEn2w7WsEYYMA95zn1R+M0xzNuWGfjnWHry6ZokRY9pgDm?= =?us-ascii?Q?w+VMxzs3wR22MGzHs16cAn+oxpezBh7BDT3WUfC9Job1xBUW+9ZoIP4TQS3l?= =?us-ascii?Q?0/W2Mj9WpSOV+dzUAL0RDoSNQPboQRalTBKrhycL8mIcXovMYbhF0E+t3jWG?= =?us-ascii?Q?v/nx9nGLBS4DMXjQE+VoD+kszlNBG8xz6l5cS?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;6:dlynMpj3daEnoHv3BaAt8RNFebxa8ifANfBK+l2RxHGywPFk1URmX8RRC7X7AKiXVya8X5mbNYBDpQ4KWW0VJAOCE9CVj/KtmlZOkRI1jEQcWDyN9zrIQgQLuidhYE83SmUXzx9wPWj7cu5ht+G387VfnW4lpgBb6rSAx1sklJs+M1SbfFzLBj2ZfPBzmPFVTicWmv5fo2PJM9E04HXxxi1LEbdvaZACdb1PqBE+/qkxkHuGNAk13+DpMuNPKhF2AJ03tc/cvK5H5UZ7//THxchDKkv5nHd0hifAPwP2dX4NDodH3AtdoYp7VI9cs96J;5:At5hpJH/5qH+Ej3vUUhdjo+th5xD8OfgYuTfGpVQjOGrkA9xWvwqKEbx6ngmsRlCM6ojITzbE4oUPqPE1URvi8HOXIfPXtC/QiWNPRRocRUkE3FLvYuILqYunObrB/jcRRfap+CliVW8ogFAlFNqqg==;24:58NubGZKDnCjSAkImjMMHSc+QPMb2BK+yCCb3OyytUOQhzZx/8JjA5Rw2qRqeOazbsS4HLvbF9Q1Y0BOFBpk0IQgWlT/rtpMOX6nOtoNWC4=;7:NNr4aRkUNmLHUnc+61968QPDUpbZiNxEH7ejxB7VYv5x4o3T345VFUPTK1QQFlElcVZRh9NHMvGUTqpZWhYzW9sD167rDv6OCNkffqQeLqX4yyn5SETGv6+RgYYfEjN1546/T1ss1ehx/5Qq3ms47ddT0JlpAZxoX8Bci/8z1jQMebJhXYg4MscnWRWFXmD/9F5egWezEK1AO0dQcWQ4Qa7pNVlrDMDPTx8pOZvQnm1LyASsTXmB3bEbRKVsN+dV SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;DB6PR0801MB1733;20:aDzJpVs557QyqLC7NSLCHe9Uysk+Hks4AOm7wR8+qti11bKNBSkCVObCSGAsNUhwv6wk1FMaicIs5NnhKKhUmVvUePAoadqja1OzKb4RNaZDHexxfdFV0Io9jvJoKKOQA0Etj11xvalP9KKWFDfR0vU/3EQoMilF2sWxcUtBLY4= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Sep 2016 13:35:25.0606 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0801MB1733 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Killed PR_REG_SIZE and PR_REG_PTR macro as we can get regset size from regset view. I wish I could also kill PRSTATUS_SIZE nicely. Cc: Andy Lutomirski Cc: Oleg Nesterov Cc: Thomas Gleixner Cc: "H. Peter Anvin" Cc: Ingo Molnar Cc: linux-mm@kvack.org Cc: x86@kernel.org Cc: Cyrill Gorcunov Cc: Pavel Emelyanov Suggested-by: Oleg Nesterov Signed-off-by: Dmitry Safonov --- arch/x86/include/asm/compat.h | 8 ++++---- fs/binfmt_elf.c | 23 ++++++++--------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h index a18806165fe4..03d269bed941 100644 --- a/arch/x86/include/asm/compat.h +++ b/arch/x86/include/asm/compat.h @@ -275,10 +275,10 @@ struct compat_shmid64_ds { #ifdef CONFIG_X86_X32_ABI typedef struct user_regs_struct compat_elf_gregset_t; -#define PR_REG_SIZE(S) (test_thread_flag(TIF_IA32) ? 68 : 216) -#define PRSTATUS_SIZE(S) (test_thread_flag(TIF_IA32) ? 144 : 296) -#define SET_PR_FPVALID(S,V) \ - do { *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE(0)) = (V); } \ +/* Full regset -- prstatus on x32, otherwise on ia32 */ +#define PRSTATUS_SIZE(S, R) (R != sizeof(S.pr_reg) ? 144 : 296) +#define SET_PR_FPVALID(S, V, R) \ + do { *(int *) (((void *) &((S)->pr_reg)) + R) = (V); } \ while (0) #define COMPAT_USE_64BIT_TIME \ diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index e5495f37c6ed..2472af2798c7 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1624,20 +1624,12 @@ static void do_thread_regset_writeback(struct task_struct *task, regset->writeback(task, regset, 1); } -#ifndef PR_REG_SIZE -#define PR_REG_SIZE(S) sizeof(S) -#endif - #ifndef PRSTATUS_SIZE -#define PRSTATUS_SIZE(S) sizeof(S) -#endif - -#ifndef PR_REG_PTR -#define PR_REG_PTR(S) (&((S)->pr_reg)) +#define PRSTATUS_SIZE(S, R) sizeof(S) #endif #ifndef SET_PR_FPVALID -#define SET_PR_FPVALID(S, V) ((S)->pr_fpvalid = (V)) +#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V)) #endif static int fill_thread_core_info(struct elf_thread_core_info *t, @@ -1645,6 +1637,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, long signr, size_t *total) { unsigned int i; + unsigned int regset_size = view->regsets[0].n * view->regsets[0].size; /* * NT_PRSTATUS is the one special case, because the regset data @@ -1653,12 +1646,11 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, * We assume that regset 0 is NT_PRSTATUS. */ fill_prstatus(&t->prstatus, t->task, signr); - (void) view->regsets[0].get(t->task, &view->regsets[0], - 0, PR_REG_SIZE(t->prstatus.pr_reg), - PR_REG_PTR(&t->prstatus), NULL); + (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset_size, + &t->prstatus.pr_reg, NULL); fill_note(&t->notes[0], "CORE", NT_PRSTATUS, - PRSTATUS_SIZE(t->prstatus), &t->prstatus); + PRSTATUS_SIZE(t->prstatus, regset_size), &t->prstatus); *total += notesize(&t->notes[0]); do_thread_regset_writeback(t->task, &view->regsets[0]); @@ -1688,7 +1680,8 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, regset->core_note_type, size, data); else { - SET_PR_FPVALID(&t->prstatus, 1); + SET_PR_FPVALID(&t->prstatus, + 1, regset_size); fill_note(&t->notes[i], "CORE", NT_PRFPREG, size, data); } -- 2.9.0 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-f72.google.com (mail-it0-f72.google.com [209.85.214.72]) by kanga.kvack.org (Postfix) with ESMTP id 33A606B0263 for ; Mon, 5 Sep 2016 09:35:32 -0400 (EDT) Received: by mail-it0-f72.google.com with SMTP id c198so189274100ith.2 for ; Mon, 05 Sep 2016 06:35:32 -0700 (PDT) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0128.outbound.protection.outlook.com. [104.47.2.128]) by mx.google.com with ESMTPS id g84si21904502oia.290.2016.09.05.06.35.26 for (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 05 Sep 2016 06:35:26 -0700 (PDT) From: Dmitry Safonov Subject: [PATCHv5 4/6] x86/coredump: use pr_reg size, rather that TIF_IA32 flag Date: Mon, 5 Sep 2016 16:33:06 +0300 Message-ID: <20160905133308.28234-5-dsafonov@virtuozzo.com> In-Reply-To: <20160905133308.28234-1-dsafonov@virtuozzo.com> References: <20160905133308.28234-1-dsafonov@virtuozzo.com> MIME-Version: 1.0 Content-Type: text/plain Sender: owner-linux-mm@kvack.org List-ID: To: linux-kernel@vger.kernel.org Cc: 0x7f454c46@gmail.com, luto@kernel.org, oleg@redhat.com, tglx@linutronix.de, hpa@zytor.com, mingo@redhat.com, linux-mm@kvack.org, x86@kernel.org, gorcunov@openvz.org, xemul@virtuozzo.com, Dmitry Safonov Killed PR_REG_SIZE and PR_REG_PTR macro as we can get regset size from regset view. I wish I could also kill PRSTATUS_SIZE nicely. Cc: Andy Lutomirski Cc: Oleg Nesterov Cc: Thomas Gleixner Cc: "H. Peter Anvin" Cc: Ingo Molnar Cc: linux-mm@kvack.org Cc: x86@kernel.org Cc: Cyrill Gorcunov Cc: Pavel Emelyanov Suggested-by: Oleg Nesterov Signed-off-by: Dmitry Safonov --- arch/x86/include/asm/compat.h | 8 ++++---- fs/binfmt_elf.c | 23 ++++++++--------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h index a18806165fe4..03d269bed941 100644 --- a/arch/x86/include/asm/compat.h +++ b/arch/x86/include/asm/compat.h @@ -275,10 +275,10 @@ struct compat_shmid64_ds { #ifdef CONFIG_X86_X32_ABI typedef struct user_regs_struct compat_elf_gregset_t; -#define PR_REG_SIZE(S) (test_thread_flag(TIF_IA32) ? 68 : 216) -#define PRSTATUS_SIZE(S) (test_thread_flag(TIF_IA32) ? 144 : 296) -#define SET_PR_FPVALID(S,V) \ - do { *(int *) (((void *) &((S)->pr_reg)) + PR_REG_SIZE(0)) = (V); } \ +/* Full regset -- prstatus on x32, otherwise on ia32 */ +#define PRSTATUS_SIZE(S, R) (R != sizeof(S.pr_reg) ? 144 : 296) +#define SET_PR_FPVALID(S, V, R) \ + do { *(int *) (((void *) &((S)->pr_reg)) + R) = (V); } \ while (0) #define COMPAT_USE_64BIT_TIME \ diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index e5495f37c6ed..2472af2798c7 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1624,20 +1624,12 @@ static void do_thread_regset_writeback(struct task_struct *task, regset->writeback(task, regset, 1); } -#ifndef PR_REG_SIZE -#define PR_REG_SIZE(S) sizeof(S) -#endif - #ifndef PRSTATUS_SIZE -#define PRSTATUS_SIZE(S) sizeof(S) -#endif - -#ifndef PR_REG_PTR -#define PR_REG_PTR(S) (&((S)->pr_reg)) +#define PRSTATUS_SIZE(S, R) sizeof(S) #endif #ifndef SET_PR_FPVALID -#define SET_PR_FPVALID(S, V) ((S)->pr_fpvalid = (V)) +#define SET_PR_FPVALID(S, V, R) ((S)->pr_fpvalid = (V)) #endif static int fill_thread_core_info(struct elf_thread_core_info *t, @@ -1645,6 +1637,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, long signr, size_t *total) { unsigned int i; + unsigned int regset_size = view->regsets[0].n * view->regsets[0].size; /* * NT_PRSTATUS is the one special case, because the regset data @@ -1653,12 +1646,11 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, * We assume that regset 0 is NT_PRSTATUS. */ fill_prstatus(&t->prstatus, t->task, signr); - (void) view->regsets[0].get(t->task, &view->regsets[0], - 0, PR_REG_SIZE(t->prstatus.pr_reg), - PR_REG_PTR(&t->prstatus), NULL); + (void) view->regsets[0].get(t->task, &view->regsets[0], 0, regset_size, + &t->prstatus.pr_reg, NULL); fill_note(&t->notes[0], "CORE", NT_PRSTATUS, - PRSTATUS_SIZE(t->prstatus), &t->prstatus); + PRSTATUS_SIZE(t->prstatus, regset_size), &t->prstatus); *total += notesize(&t->notes[0]); do_thread_regset_writeback(t->task, &view->regsets[0]); @@ -1688,7 +1680,8 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, regset->core_note_type, size, data); else { - SET_PR_FPVALID(&t->prstatus, 1); + SET_PR_FPVALID(&t->prstatus, + 1, regset_size); fill_note(&t->notes[i], "CORE", NT_PRFPREG, size, data); } -- 2.9.0 -- 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