From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> To: x86@kernel.org, platform-driver-x86@vger.kernel.org Cc: dave.hansen@intel.com, sean.j.christopherson@intel.com, nhorman@redhat.com, npmccallum@redhat.com, Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>, Darren Hart <dvhart@infradead.org>, Andy Shevchenko <andy@infradead.org>, intel-sgx-kernel-dev@lists.01.org (open list:INTEL SGX), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v11 11/13] intel_sgx: ptrace() support Date: Fri, 8 Jun 2018 19:09:46 +0200 [thread overview] Message-ID: <20180608171216.26521-12-jarkko.sakkinen@linux.intel.com> (raw) In-Reply-To: <20180608171216.26521-1-jarkko.sakkinen@linux.intel.com> Implemented VMA callbacks in order to ptrace() debug enclaves. With debug enclaves data can be read and write the memory word at a time by using ENCLS(EDBGRD) and ENCLS(EDBGWR) leaf instructions. Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Tested-by: Serge Ayoun <serge.ayoun@intel.com> --- drivers/platform/x86/intel_sgx/sgx_encl.c | 2 +- drivers/platform/x86/intel_sgx/sgx_vma.c | 116 ++++++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/intel_sgx/sgx_encl.c b/drivers/platform/x86/intel_sgx/sgx_encl.c index 562d4ce412d4..35436497530b 100644 --- a/drivers/platform/x86/intel_sgx/sgx_encl.c +++ b/drivers/platform/x86/intel_sgx/sgx_encl.c @@ -945,7 +945,7 @@ int sgx_encl_load_page(struct sgx_encl_page *encl_page, ret = __eldu(&pginfo, epc_ptr, va_ptr + va_offset); if (ret) { sgx_err(encl, "ELDU returned %d\n", ret); - ret = -EFAULT; + ret = ENCLS_TO_ERR(ret); } kunmap_atomic((void *)(unsigned long)(pginfo.pcmd - pcmd_offset)); diff --git a/drivers/platform/x86/intel_sgx/sgx_vma.c b/drivers/platform/x86/intel_sgx/sgx_vma.c index ad47383ea7f5..afc02d70c618 100644 --- a/drivers/platform/x86/intel_sgx/sgx_vma.c +++ b/drivers/platform/x86/intel_sgx/sgx_vma.c @@ -59,8 +59,124 @@ static int sgx_vma_fault(struct vm_fault *vmf) return VM_FAULT_SIGBUS; } +static int sgx_edbgrd(struct sgx_encl *encl, struct sgx_encl_page *page, + unsigned long addr, void *data) +{ + unsigned long offset; + void *ptr; + int ret; + + offset = addr & ~PAGE_MASK; + + if ((page->desc & SGX_ENCL_PAGE_TCS) && + offset > offsetof(struct sgx_tcs, gslimit)) + return -ECANCELED; + + ptr = sgx_get_page(page->epc_page); + ret = __edbgrd((unsigned long)ptr + offset, data); + sgx_put_page(ptr); + if (ret) { + sgx_dbg(encl, "EDBGRD returned %d\n", ret); + return ENCLS_TO_ERR(ret); + } + + return 0; +} + +static int sgx_edbgwr(struct sgx_encl *encl, struct sgx_encl_page *page, + unsigned long addr, void *data) +{ + unsigned long offset; + void *ptr; + int ret; + + offset = addr & ~PAGE_MASK; + + /* Writing anything else than flags will cause #GP */ + if ((page->desc & SGX_ENCL_PAGE_TCS) && + offset != offsetof(struct sgx_tcs, flags)) + return -ECANCELED; + + ptr = sgx_get_page(page->epc_page); + ret = __edbgwr((unsigned long)ptr + offset, data); + sgx_put_page(ptr); + if (ret) { + sgx_dbg(encl, "EDBGWR returned %d\n", ret); + return ENCLS_TO_ERR(ret); + } + + return 0; +} + +static int sgx_vma_access(struct vm_area_struct *vma, unsigned long addr, + void *buf, int len, int write) +{ + struct sgx_encl *encl = vma->vm_private_data; + struct sgx_encl_page *entry = NULL; + unsigned long align; + char data[sizeof(unsigned long)]; + int offset; + int cnt; + int ret = 0; + int i; + + /* If process was forked, VMA is still there but vm_private_data is set + * to NULL. + */ + if (!encl) + return -EFAULT; + + if (!(encl->flags & SGX_ENCL_DEBUG) || + !(encl->flags & SGX_ENCL_INITIALIZED) || + (encl->flags & SGX_ENCL_DEAD)) + return -EFAULT; + + for (i = 0; i < len; i += cnt) { + if (!entry || !((addr + i) & (PAGE_SIZE - 1))) { + if (entry) + entry->desc &= ~SGX_ENCL_PAGE_RESERVED; + + entry = sgx_fault_page(vma, (addr + i) & PAGE_MASK, + true); + if (IS_ERR(entry)) { + ret = PTR_ERR(entry); + entry = NULL; + break; + } + } + + /* Locking is not needed because only immutable fields of the + * page are accessed and page itself is reserved so that it + * cannot be swapped out in the middle. + */ + + align = ALIGN_DOWN(addr + i, sizeof(unsigned long)); + offset = (addr + i) & (sizeof(unsigned long) - 1); + cnt = sizeof(unsigned long) - offset; + cnt = min(cnt, len - i); + + ret = sgx_edbgrd(encl, entry, align, data); + if (ret) + break; + if (write) { + memcpy(data + offset, buf + i, cnt); + ret = sgx_edbgwr(encl, entry, align, data); + if (ret) + break; + } + else + memcpy(buf + i,data + offset, cnt); + } + + if (entry) + entry->desc &= ~SGX_ENCL_PAGE_RESERVED; + + return (ret < 0 && ret != -ECANCELED) ? ret : i; +} + const struct vm_operations_struct sgx_vm_ops = { .close = sgx_vma_close, .open = sgx_vma_open, .fault = sgx_vma_fault, + .access = sgx_vma_access, }; -- 2.17.0
WARNING: multiple messages have this Message-ID (diff)
From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> To: x86@kernel.org, platform-driver-x86@vger.kernel.org Cc: dave.hansen@intel.com, sean.j.christopherson@intel.com, nhorman@redhat.com, npmccallum@redhat.com, Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>, Darren Hart <dvhart@infradead.org>, Andy Shevchenko <andy@infradead.org>, "open list:INTEL SGX" <intel-sgx-kernel-dev@lists.01.org>, open list <linux-kernel@vger.kernel.org> Subject: [PATCH v11 11/13] intel_sgx: ptrace() support Date: Fri, 8 Jun 2018 19:09:46 +0200 [thread overview] Message-ID: <20180608171216.26521-12-jarkko.sakkinen@linux.intel.com> (raw) In-Reply-To: <20180608171216.26521-1-jarkko.sakkinen@linux.intel.com> Implemented VMA callbacks in order to ptrace() debug enclaves. With debug enclaves data can be read and write the memory word at a time by using ENCLS(EDBGRD) and ENCLS(EDBGWR) leaf instructions. Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Tested-by: Serge Ayoun <serge.ayoun@intel.com> --- drivers/platform/x86/intel_sgx/sgx_encl.c | 2 +- drivers/platform/x86/intel_sgx/sgx_vma.c | 116 ++++++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/intel_sgx/sgx_encl.c b/drivers/platform/x86/intel_sgx/sgx_encl.c index 562d4ce412d4..35436497530b 100644 --- a/drivers/platform/x86/intel_sgx/sgx_encl.c +++ b/drivers/platform/x86/intel_sgx/sgx_encl.c @@ -945,7 +945,7 @@ int sgx_encl_load_page(struct sgx_encl_page *encl_page, ret = __eldu(&pginfo, epc_ptr, va_ptr + va_offset); if (ret) { sgx_err(encl, "ELDU returned %d\n", ret); - ret = -EFAULT; + ret = ENCLS_TO_ERR(ret); } kunmap_atomic((void *)(unsigned long)(pginfo.pcmd - pcmd_offset)); diff --git a/drivers/platform/x86/intel_sgx/sgx_vma.c b/drivers/platform/x86/intel_sgx/sgx_vma.c index ad47383ea7f5..afc02d70c618 100644 --- a/drivers/platform/x86/intel_sgx/sgx_vma.c +++ b/drivers/platform/x86/intel_sgx/sgx_vma.c @@ -59,8 +59,124 @@ static int sgx_vma_fault(struct vm_fault *vmf) return VM_FAULT_SIGBUS; } +static int sgx_edbgrd(struct sgx_encl *encl, struct sgx_encl_page *page, + unsigned long addr, void *data) +{ + unsigned long offset; + void *ptr; + int ret; + + offset = addr & ~PAGE_MASK; + + if ((page->desc & SGX_ENCL_PAGE_TCS) && + offset > offsetof(struct sgx_tcs, gslimit)) + return -ECANCELED; + + ptr = sgx_get_page(page->epc_page); + ret = __edbgrd((unsigned long)ptr + offset, data); + sgx_put_page(ptr); + if (ret) { + sgx_dbg(encl, "EDBGRD returned %d\n", ret); + return ENCLS_TO_ERR(ret); + } + + return 0; +} + +static int sgx_edbgwr(struct sgx_encl *encl, struct sgx_encl_page *page, + unsigned long addr, void *data) +{ + unsigned long offset; + void *ptr; + int ret; + + offset = addr & ~PAGE_MASK; + + /* Writing anything else than flags will cause #GP */ + if ((page->desc & SGX_ENCL_PAGE_TCS) && + offset != offsetof(struct sgx_tcs, flags)) + return -ECANCELED; + + ptr = sgx_get_page(page->epc_page); + ret = __edbgwr((unsigned long)ptr + offset, data); + sgx_put_page(ptr); + if (ret) { + sgx_dbg(encl, "EDBGWR returned %d\n", ret); + return ENCLS_TO_ERR(ret); + } + + return 0; +} + +static int sgx_vma_access(struct vm_area_struct *vma, unsigned long addr, + void *buf, int len, int write) +{ + struct sgx_encl *encl = vma->vm_private_data; + struct sgx_encl_page *entry = NULL; + unsigned long align; + char data[sizeof(unsigned long)]; + int offset; + int cnt; + int ret = 0; + int i; + + /* If process was forked, VMA is still there but vm_private_data is set + * to NULL. + */ + if (!encl) + return -EFAULT; + + if (!(encl->flags & SGX_ENCL_DEBUG) || + !(encl->flags & SGX_ENCL_INITIALIZED) || + (encl->flags & SGX_ENCL_DEAD)) + return -EFAULT; + + for (i = 0; i < len; i += cnt) { + if (!entry || !((addr + i) & (PAGE_SIZE - 1))) { + if (entry) + entry->desc &= ~SGX_ENCL_PAGE_RESERVED; + + entry = sgx_fault_page(vma, (addr + i) & PAGE_MASK, + true); + if (IS_ERR(entry)) { + ret = PTR_ERR(entry); + entry = NULL; + break; + } + } + + /* Locking is not needed because only immutable fields of the + * page are accessed and page itself is reserved so that it + * cannot be swapped out in the middle. + */ + + align = ALIGN_DOWN(addr + i, sizeof(unsigned long)); + offset = (addr + i) & (sizeof(unsigned long) - 1); + cnt = sizeof(unsigned long) - offset; + cnt = min(cnt, len - i); + + ret = sgx_edbgrd(encl, entry, align, data); + if (ret) + break; + if (write) { + memcpy(data + offset, buf + i, cnt); + ret = sgx_edbgwr(encl, entry, align, data); + if (ret) + break; + } + else + memcpy(buf + i,data + offset, cnt); + } + + if (entry) + entry->desc &= ~SGX_ENCL_PAGE_RESERVED; + + return (ret < 0 && ret != -ECANCELED) ? ret : i; +} + const struct vm_operations_struct sgx_vm_ops = { .close = sgx_vma_close, .open = sgx_vma_open, .fault = sgx_vma_fault, + .access = sgx_vma_access, }; -- 2.17.0
next prev parent reply other threads:[~2018-06-08 17:22 UTC|newest] Thread overview: 181+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-06-08 17:09 [PATCH v11 00/13] Intel SGX1 support Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 01/13] compiler.h, kasan: add __SANITIZE_ADDRESS__ check for __no_kasan_or_inline Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 02/13] x86, sgx: updated MAINTAINERS Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 03/13] x86, sgx: add SGX definitions to cpufeature Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 04/13] x86, sgx: add SGX definitions to msr-index.h Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:25 ` Dave Hansen 2018-06-19 13:18 ` Jarkko Sakkinen 2018-06-19 13:18 ` Jarkko Sakkinen 2018-06-19 14:01 ` Dave Hansen 2018-06-19 14:01 ` Dave Hansen 2018-06-21 17:22 ` Jarkko Sakkinen 2018-06-21 17:22 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 05/13] x86, cpufeatures: add Intel-defined SGX leaf CPUID_12_EAX Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 06/13] crypto: aesni: add minimal build option for SGX LE Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:27 ` Dave Hansen 2018-06-11 15:24 ` Sean Christopherson 2018-06-08 17:09 ` [PATCH v11 07/13] x86, sgx: detect Intel SGX Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:36 ` Dave Hansen 2018-06-18 21:36 ` [intel-sgx-kernel-dev] " Andy Lutomirski 2018-06-25 7:39 ` Jarkko Sakkinen 2018-06-19 13:33 ` Jarkko Sakkinen 2018-06-19 13:33 ` Jarkko Sakkinen 2018-06-11 11:35 ` Neil Horman 2018-06-19 13:34 ` Jarkko Sakkinen 2018-06-19 13:34 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 08/13] x86, sgx: added ENCLS wrappers Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:43 ` Dave Hansen 2018-06-19 13:25 ` Jarkko Sakkinen 2018-06-19 13:25 ` Jarkko Sakkinen 2018-06-20 13:12 ` Sean Christopherson 2018-06-20 13:12 ` Sean Christopherson 2018-06-25 9:16 ` Jarkko Sakkinen 2018-06-25 9:16 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 09/13] x86, sgx: basic routines for enclave page cache Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 18:21 ` Jethro Beekman 2018-06-18 21:33 ` [intel-sgx-kernel-dev] " Andy Lutomirski 2018-06-25 7:36 ` Jarkko Sakkinen 2018-06-19 14:08 ` Jarkko Sakkinen 2018-06-19 14:08 ` Jarkko Sakkinen 2018-06-19 15:44 ` Jethro Beekman 2018-06-19 15:44 ` Jethro Beekman 2018-06-08 18:24 ` Dave Hansen 2018-06-19 14:57 ` Jarkko Sakkinen 2018-06-19 14:57 ` Jarkko Sakkinen 2018-06-19 15:19 ` Neil Horman 2018-06-19 15:19 ` Neil Horman 2018-06-19 15:32 ` Dave Hansen 2018-06-19 15:32 ` Dave Hansen 2018-06-25 9:01 ` Jarkko Sakkinen 2018-06-25 9:01 ` Jarkko Sakkinen 2018-06-19 15:59 ` Sean Christopherson 2018-06-19 15:59 ` Sean Christopherson 2018-06-25 9:14 ` Jarkko Sakkinen 2018-06-25 9:14 ` Jarkko Sakkinen 2018-06-10 5:32 ` [intel-sgx-kernel-dev] " Andy Lutomirski 2018-06-11 15:12 ` Sean Christopherson 2018-06-20 13:21 ` Sean Christopherson 2018-06-20 13:21 ` Sean Christopherson 2018-06-25 9:21 ` Jarkko Sakkinen 2018-06-25 9:21 ` Jarkko Sakkinen 2018-06-25 16:14 ` Neil Horman 2018-06-25 16:14 ` Neil Horman 2018-06-20 15:26 ` Sean Christopherson 2018-06-20 15:26 ` Sean Christopherson 2018-06-25 9:21 ` Jarkko Sakkinen 2018-06-25 9:21 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 10/13] intel_sgx: driver for Intel Software Guard Extensions Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 19:35 ` Dave Hansen 2018-06-19 13:29 ` Jarkko Sakkinen 2018-06-19 13:29 ` Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen [this message] 2018-06-08 17:09 ` [PATCH v11 11/13] intel_sgx: ptrace() support Jarkko Sakkinen 2018-06-08 18:34 ` Dave Hansen 2018-06-11 15:02 ` Sean Christopherson 2018-06-19 13:38 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 12/13] intel_sgx: driver documentation Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 18:32 ` Jethro Beekman 2018-06-19 13:30 ` Jarkko Sakkinen 2018-06-19 13:30 ` Jarkko Sakkinen 2018-06-08 21:41 ` Randy Dunlap 2018-06-08 21:41 ` Randy Dunlap 2018-06-19 13:31 ` Jarkko Sakkinen 2018-06-19 13:31 ` Jarkko Sakkinen 2018-06-08 17:09 ` [PATCH v11 13/13] intel_sgx: in-kernel launch enclave Jarkko Sakkinen 2018-06-08 17:09 ` Jarkko Sakkinen 2018-06-08 18:50 ` [intel-sgx-kernel-dev] " Andy Lutomirski 2018-06-19 15:05 ` Jarkko Sakkinen 2018-06-10 5:39 ` Andy Lutomirski 2018-06-11 5:17 ` Andy Lutomirski 2018-06-11 11:52 ` Neil Horman 2018-06-12 4:55 ` Andy Lutomirski 2018-06-12 17:45 ` Neil Horman 2018-06-18 21:58 ` Andy Lutomirski 2018-06-19 13:17 ` Neil Horman 2018-06-20 16:28 ` Nathaniel McCallum 2018-06-20 18:16 ` Jethro Beekman 2018-06-20 18:39 ` Jethro Beekman 2018-06-20 21:01 ` Sean Christopherson 2018-06-21 12:32 ` Nathaniel McCallum 2018-06-21 15:29 ` Neil Horman 2018-06-21 19:11 ` Nathaniel McCallum 2018-06-21 21:20 ` Sean Christopherson 2018-06-25 21:00 ` Nathaniel McCallum 2018-06-25 22:35 ` Sean Christopherson 2018-06-21 22:48 ` Andy Lutomirski 2018-06-25 21:06 ` Nathaniel McCallum 2018-06-25 23:40 ` Andy Lutomirski 2018-06-25 9:41 ` Jarkko Sakkinen 2018-06-25 15:45 ` Andy Lutomirski 2018-06-25 21:28 ` Nathaniel McCallum 2018-06-26 8:43 ` Jarkko Sakkinen 2018-06-26 15:01 ` Nathaniel McCallum 2018-06-27 15:31 ` Jarkko Sakkinen 2018-06-21 12:12 ` Nathaniel McCallum 2018-06-25 9:27 ` Jarkko Sakkinen 2018-06-25 21:26 ` Nathaniel McCallum 2018-06-20 7:23 ` Jarkko Sakkinen 2018-06-12 10:50 ` [PATCH v11 00/13] Intel SGX1 support Pavel Machek 2018-06-12 10:50 ` Pavel Machek 2018-06-19 14:59 ` Jarkko Sakkinen 2018-06-19 14:59 ` Jarkko Sakkinen 2018-06-19 14:59 ` Jarkko Sakkinen 2018-06-19 20:04 ` Pavel Machek 2018-06-19 20:04 ` Pavel Machek 2018-06-19 20:23 ` Peter Zijlstra 2018-06-19 20:23 ` Peter Zijlstra 2018-06-19 20:23 ` Peter Zijlstra 2018-06-19 20:23 ` Peter Zijlstra 2018-06-19 21:48 ` Josh Triplett 2018-06-19 21:48 ` Josh Triplett 2018-06-19 21:48 ` Josh Triplett 2018-06-19 21:48 ` Josh Triplett 2018-12-09 20:06 ` Pavel Machek 2018-12-09 20:06 ` Pavel Machek 2018-12-09 20:06 ` Pavel Machek 2018-12-09 20:06 ` Pavel Machek 2018-12-10 7:47 ` Josh Triplett 2018-12-10 7:47 ` Josh Triplett 2018-12-10 7:47 ` Josh Triplett 2018-12-10 7:47 ` Josh Triplett 2018-12-10 8:27 ` Pavel Machek 2018-12-10 8:27 ` Pavel Machek 2018-12-10 8:27 ` Pavel Machek 2018-12-10 8:27 ` Pavel Machek 2018-12-10 23:12 ` Josh Triplett 2018-12-10 23:12 ` Josh Triplett 2018-12-10 23:12 ` Josh Triplett 2018-12-10 23:12 ` Josh Triplett 2018-12-11 18:10 ` Dave Hansen 2018-12-11 18:10 ` Dave Hansen 2018-12-11 18:10 ` Dave Hansen 2018-12-11 18:10 ` Dave Hansen 2018-12-11 18:31 ` Sean Christopherson 2018-12-11 18:31 ` Sean Christopherson 2018-12-11 18:31 ` Sean Christopherson 2018-12-11 18:31 ` Sean Christopherson 2018-06-19 20:36 ` Peter Zijlstra 2018-06-19 20:36 ` Peter Zijlstra 2018-06-19 20:36 ` Peter Zijlstra 2018-06-19 20:36 ` Peter Zijlstra 2018-06-21 12:55 ` Ingo Molnar 2018-06-21 12:55 ` Ingo Molnar 2018-06-21 12:55 ` Ingo Molnar 2018-06-25 9:44 ` Jarkko Sakkinen 2018-06-25 9:44 ` Jarkko Sakkinen 2018-06-25 9:44 ` Jarkko Sakkinen
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=20180608171216.26521-12-jarkko.sakkinen@linux.intel.com \ --to=jarkko.sakkinen@linux.intel.com \ --cc=andy@infradead.org \ --cc=dave.hansen@intel.com \ --cc=dvhart@infradead.org \ --cc=intel-sgx-kernel-dev@lists.01.org \ --cc=linux-kernel@vger.kernel.org \ --cc=nhorman@redhat.com \ --cc=npmccallum@redhat.com \ --cc=platform-driver-x86@vger.kernel.org \ --cc=sean.j.christopherson@intel.com \ --cc=x86@kernel.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: 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.