All of lore.kernel.org
 help / color / mirror / Atom feed
From: Borislav Petkov <bp@alien8.de>
To: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
	linux-sgx@vger.kernel.org, akpm@linux-foundation.org,
	dave.hansen@intel.com, sean.j.christopherson@intel.com,
	nhorman@redhat.com, npmccallum@redhat.com,
	haitao.huang@intel.com, andriy.shevchenko@linux.intel.com,
	tglx@linutronix.de, kai.svahn@intel.com, josh@joshtriplett.org,
	luto@kernel.org, kai.huang@intel.com, rientjes@google.com,
	cedric.xing@intel.com, puiterwijk@redhat.com,
	Serge Ayoun <serge.ayoun@intel.com>,
	Jethro Beekman <jethro@fortanix.com>
Subject: Re: [PATCH v30 07/20] x86/sgx: Enumerate and track EPC sections
Date: Mon, 25 May 2020 11:23:04 +0200	[thread overview]
Message-ID: <20200525092304.GD25636@zn.tnic> (raw)
In-Reply-To: <20200515004410.723949-8-jarkko.sakkinen@linux.intel.com>

On Fri, May 15, 2020 at 03:43:57AM +0300, Jarkko Sakkinen wrote:
> +config INTEL_SGX
> +	bool "Intel SGX"
> +	depends on X86_64 && CPU_SUP_INTEL
> +	select SRCU
> +	select MMU_NOTIFIER
> +	help
> +	  Intel(R) SGX is a set of CPU instructions that can be used by
> +	  applications to set aside private regions of code and data, referred
> +	  to as enclaves. An enclave's private memory can only be accessed by
> +	  code running within the enclave. Accesses from outside the enclave,
> +	  including other enclaves, are disallowed by hardware.
> +
> +	  If unsure, say N.
> +

Enabling this gives:

In file included from arch/x86/kernel/cpu/sgx/main.c:11:
arch/x86/kernel/cpu/sgx/encls.h:189:51: warning: ‘struct sgx_einittoken’ declared inside parameter list will not be visible outside of this definition or declaration
  189 | static inline int __einit(void *sigstruct, struct sgx_einittoken *einittoken,
      |                                                   ^~~~~~~~~~~~~~
In file included from arch/x86/kernel/cpu/sgx/reclaim.c:12:
arch/x86/kernel/cpu/sgx/encls.h:189:51: warning: ‘struct sgx_einittoken’ declared inside parameter list will not be visible outside of this definition or declaration
  189 | static inline int __einit(void *sigstruct, struct sgx_einittoken *einittoken,
      |

You need a forward declaration somewhere.

>  config EFI
>  	bool "EFI runtime service support"
>  	depends on ACPI
> diff --git a/arch/x86/kernel/cpu/Makefile b/arch/x86/kernel/cpu/Makefile
> index 7dc4ad68eb41..45534fb81007 100644
> --- a/arch/x86/kernel/cpu/Makefile
> +++ b/arch/x86/kernel/cpu/Makefile
> @@ -46,6 +46,7 @@ obj-$(CONFIG_X86_MCE)			+= mce/
>  obj-$(CONFIG_MTRR)			+= mtrr/
>  obj-$(CONFIG_MICROCODE)			+= microcode/
>  obj-$(CONFIG_X86_CPU_RESCTRL)		+= resctrl/
> +obj-$(CONFIG_INTEL_SGX)			+= sgx/
>  
>  obj-$(CONFIG_X86_LOCAL_APIC)		+= perfctr-watchdog.o
>  
> diff --git a/arch/x86/kernel/cpu/sgx/Makefile b/arch/x86/kernel/cpu/sgx/Makefile
> new file mode 100644
> index 000000000000..2dec75916a5e
> --- /dev/null
> +++ b/arch/x86/kernel/cpu/sgx/Makefile
> @@ -0,0 +1,3 @@
> +obj-y += \
> +	main.o \
> +	reclaim.o
> diff --git a/arch/x86/kernel/cpu/sgx/main.c b/arch/x86/kernel/cpu/sgx/main.c
> new file mode 100644
> index 000000000000..38424c1e8341
> --- /dev/null
> +++ b/arch/x86/kernel/cpu/sgx/main.c
> @@ -0,0 +1,151 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
> +// Copyright(c) 2016-17 Intel Corporation.
> +
> +#include <linux/freezer.h>
> +#include <linux/highmem.h>
> +#include <linux/kthread.h>
> +#include <linux/pagemap.h>
> +#include <linux/ratelimit.h>
> +#include <linux/sched/signal.h>
> +#include <linux/slab.h>
> +#include "encls.h"
> +
> +struct sgx_epc_section sgx_epc_sections[SGX_MAX_EPC_SECTIONS];
> +int sgx_nr_epc_sections;

We have become very averse against global stuff. What is going to use
those, only sgx code I assume...?

> +static bool __init sgx_page_cache_init(void)
> +{
> +	u32 eax, ebx, ecx, edx, type;
> +	u64 pa, size;
> +	int i;
> +
> +	for (i = 0; i <= ARRAY_SIZE(sgx_epc_sections); i++) {
> +		cpuid_count(SGX_CPUID, i + SGX_CPUID_FIRST_VARIABLE_SUB_LEAF,
> +			    &eax, &ebx, &ecx, &edx);
> +
> +		type = eax & SGX_CPUID_SUB_LEAF_TYPE_MASK;
> +		if (type == SGX_CPUID_SUB_LEAF_INVALID)
> +			break;
> +
> +		if (type != SGX_CPUID_SUB_LEAF_EPC_SECTION) {
> +			pr_err_once("Unknown EPC section type: %u\n", type);
> +			break;
> +		}
> +
> +		if (i == ARRAY_SIZE(sgx_epc_sections)) {
> +			pr_warn("No free slot for an EPC section\n");
> +			break;
> +		}

This is also the loop termination: do we really need this warn or can
the loop simply do "i < ARRAY_SIZE" ?

If the warn is needed, it can be after the loop too.

> +
> +		pa = sgx_calc_section_metric(eax, ebx);
> +		size = sgx_calc_section_metric(ecx, edx);
> +
> +		pr_info("EPC section 0x%llx-0x%llx\n", pa, pa + size - 1);

I'm assuming that's useful information to issue in dmesg?

> diff --git a/arch/x86/kernel/cpu/sgx/reclaim.c b/arch/x86/kernel/cpu/sgx/reclaim.c
> new file mode 100644
> index 000000000000..215371588a25
> --- /dev/null
> +++ b/arch/x86/kernel/cpu/sgx/reclaim.c
> @@ -0,0 +1,82 @@
> +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
> +// Copyright(c) 2016-19 Intel Corporation.
> +
> +#include <linux/freezer.h>
> +#include <linux/highmem.h>
> +#include <linux/kthread.h>
> +#include <linux/pagemap.h>
> +#include <linux/ratelimit.h>
> +#include <linux/slab.h>
> +#include <linux/sched/mm.h>
> +#include <linux/sched/signal.h>
> +#include "encls.h"
> +
> +struct task_struct *ksgxswapd_tsk;

Same for this one: also shared only among sgx code?

> +/**
> + * enum sgx_epc_page_desc - bits and masks for an EPC page's descriptor
> + * %SGX_EPC_SECTION_MASK:	SGX allows to have multiple EPC sections in the
> + *				physical memory. The existing and near-future
> + *				hardware defines at most eight sections, hence
> + *				three bits to hold a section.
> + */
> +enum sgx_epc_page_desc {
> +	SGX_EPC_SECTION_MASK			= GENMASK_ULL(3, 0),

If that should be three bits, then it should be (2, 0). Because now you
have 4 bits:

# arch/x86/kernel/cpu/sgx/sgx.h:56:     return &sgx_epc_sections[page->desc & SGX_EPC_SECTION_MASK];
        andl    $15, %edx       #, _22
		^^^

> +	/* bits 12-63 are reserved for the physical page address of the page */
> +};
> +
> +#define SGX_MAX_EPC_SECTIONS (SGX_EPC_SECTION_MASK + 1)
> +
> +extern struct sgx_epc_section sgx_epc_sections[SGX_MAX_EPC_SECTIONS];
> +
> +static inline struct sgx_epc_section *sgx_epc_section(struct sgx_epc_page *page)

This function name needs a verb. "get" sounds fitting. :)

> +{
> +	return &sgx_epc_sections[page->desc & SGX_EPC_SECTION_MASK];
> +}
> +
> +static inline void *sgx_epc_addr(struct sgx_epc_page *page)

Ditto.

-- 
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette

  reply	other threads:[~2020-05-25  9:23 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-15  0:43 [PATCH v30 00/20] Intel SGX foundations Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 01/20] x86/cpufeatures: x86/msr: Add Intel SGX hardware bits Jarkko Sakkinen
2020-05-20 12:16   ` Borislav Petkov
2020-05-20 14:00     ` Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 02/20] x86/cpufeatures: x86/msr: Intel SGX Launch Control " Jarkko Sakkinen
2020-05-20 12:23   ` Borislav Petkov
2020-05-20 14:04     ` Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 03/20] x86/mm: x86/sgx: Signal SIGSEGV with PF_SGX Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 04/20] x86/sgx: Add SGX microarchitectural data structures Jarkko Sakkinen
2020-05-20 18:47   ` Borislav Petkov
2020-05-20 21:04     ` Sean Christopherson
2020-05-22 15:54     ` Jarkko Sakkinen
2020-05-22 16:13       ` Sean Christopherson
2020-05-22 19:50         ` Jarkko Sakkinen
2020-05-25  8:20           ` Borislav Petkov
2020-05-27 19:43             ` Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 05/20] x86/sgx: Add wrappers for ENCLS leaf functions Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 06/20] x86/cpu/intel: Detect SGX support Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 07/20] x86/sgx: Enumerate and track EPC sections Jarkko Sakkinen
2020-05-25  9:23   ` Borislav Petkov [this message]
2020-05-27  3:56     ` Sean Christopherson
2020-05-27 20:35       ` Borislav Petkov
2020-05-28  7:36         ` Jarkko Sakkinen
2020-05-28  5:25       ` Jarkko Sakkinen
2020-05-28  5:35         ` Jarkko Sakkinen
2020-05-28  6:14           ` Jarkko Sakkinen
2020-05-28  6:16             ` Jarkko Sakkinen
2020-05-28  5:13     ` Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 08/20] x86/sgx: Add functions to allocate and free EPC pages Jarkko Sakkinen
2020-05-26 12:52   ` Borislav Petkov
2020-05-27  4:21     ` Sean Christopherson
2020-05-27 20:46       ` Borislav Petkov
2020-05-28  0:52         ` Sean Christopherson
2020-05-28  6:51           ` Jarkko Sakkinen
2020-05-28  1:23         ` Jarkko Sakkinen
2020-05-28  1:36           ` Sean Christopherson
2020-05-28  6:52             ` Jarkko Sakkinen
2020-05-28 17:16               ` Borislav Petkov
2020-05-28 17:19                 ` Sean Christopherson
2020-05-28 17:27                   ` Borislav Petkov
2020-05-28 17:34                     ` Sean Christopherson
2020-05-28 19:07                 ` Jarkko Sakkinen
2020-05-28 19:59                   ` Sean Christopherson
2020-05-29  3:28                     ` Jarkko Sakkinen
2020-05-29  3:37                       ` Sean Christopherson
2020-05-29  5:07                         ` Jarkko Sakkinen
2020-05-29  8:12                         ` Jarkko Sakkinen
2020-05-29  8:13                           ` Jarkko Sakkinen
2020-05-29  3:38                       ` Jarkko Sakkinen
2020-05-15  0:43 ` [PATCH v30 09/20] mm: Introduce vm_ops->may_mprotect() Jarkko Sakkinen
2020-05-29 12:10   ` Borislav Petkov
2020-05-29 18:18     ` Jarkko Sakkinen
2020-05-29 18:28   ` Dave Hansen
2020-05-31 23:12     ` Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 10/20] x86/sgx: Linux Enclave Driver Jarkko Sakkinen
2020-05-21 19:12   ` Sean Christopherson
2020-05-22 19:26     ` Jarkko Sakkinen
2020-05-22 19:39     ` Jarkko Sakkinen
2020-05-22  3:33   ` Sean Christopherson
2020-05-15  0:44 ` [PATCH v30 11/20] x86/sgx: Add provisioning Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 12/20] x86/sgx: Add a page reclaimer Jarkko Sakkinen
2020-05-22  6:58   ` Sean Christopherson
2020-05-22 19:57     ` Jarkko Sakkinen
2020-05-22 21:52       ` Sean Christopherson
2020-05-22  7:15   ` Sean Christopherson
2020-05-22 19:47     ` Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 13/20] x86/sgx: ptrace() support for the SGX driver Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 14/20] x86/vdso: Add support for exception fixup in vDSO functions Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 15/20] x86/fault: Add helper function to sanitize error code Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 16/20] x86/traps: Attempt to fixup exceptions in vDSO before signaling Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 17/20] x86/vdso: Implement a vDSO for Intel SGX enclave call Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 18/20] selftests/x86: Add a selftest for SGX Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 19/20] docs: x86/sgx: Document SGX micro architecture and kernel internals Jarkko Sakkinen
2020-05-15  0:44 ` [PATCH v30 20/20] x86/sgx: Update MAINTAINERS Jarkko Sakkinen
2020-05-16  8:57 ` [PATCH] x86/cpu/intel: Add nosgx kernel parameter 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=20200525092304.GD25636@zn.tnic \
    --to=bp@alien8.de \
    --cc=akpm@linux-foundation.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=cedric.xing@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=haitao.huang@intel.com \
    --cc=jarkko.sakkinen@linux.intel.com \
    --cc=jethro@fortanix.com \
    --cc=josh@joshtriplett.org \
    --cc=kai.huang@intel.com \
    --cc=kai.svahn@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-sgx@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=nhorman@redhat.com \
    --cc=npmccallum@redhat.com \
    --cc=puiterwijk@redhat.com \
    --cc=rientjes@google.com \
    --cc=sean.j.christopherson@intel.com \
    --cc=serge.ayoun@intel.com \
    --cc=tglx@linutronix.de \
    --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: link
Be 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.