Message ID | 20170614162811.28716-1-jarkko.sakkinen@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
squashed /Jarkko On Wed, Jun 14, 2017 at 06:28:11PM +0200, Jarkko Sakkinen wrote: > Removed redundant probing code and cleaned up style issues in code for > multiple EPC banks. > > Reported-by: Dmitrii Kuvaiskii <Dmitrii.Kuvaiskii@tu-dresden.de> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > --- > drivers/platform/x86/intel_sgx/sgx.h | 6 +- > drivers/platform/x86/intel_sgx/sgx_main.c | 112 ++++++------------------ > drivers/platform/x86/intel_sgx/sgx_page_cache.c | 13 +-- > 3 files changed, 37 insertions(+), 94 deletions(-) > > diff --git a/drivers/platform/x86/intel_sgx/sgx.h b/drivers/platform/x86/intel_sgx/sgx.h > index d5cdf962219d..3ccbc0ffbabc 100644 > --- a/drivers/platform/x86/intel_sgx/sgx.h > +++ b/drivers/platform/x86/intel_sgx/sgx.h > @@ -149,11 +149,11 @@ struct sgx_encl { > }; > > struct sgx_epc_bank { > + unsigned long pa; > #ifdef CONFIG_X86_64 > - void *mem; > + unsigned long va; > #endif > - unsigned long start; > - unsigned long end; > + unsigned long size; > }; > > extern struct workqueue_struct *sgx_add_page_wq; > diff --git a/drivers/platform/x86/intel_sgx/sgx_main.c b/drivers/platform/x86/intel_sgx/sgx_main.c > index 98ee05de8db8..cf1e6ec2cd7e 100644 > --- a/drivers/platform/x86/intel_sgx/sgx_main.c > +++ b/drivers/platform/x86/intel_sgx/sgx_main.c > @@ -161,78 +161,6 @@ static struct miscdevice sgx_dev = { > .mode = 0666, > }; > > -static int sgx_init_platform(void) > -{ > - unsigned int eax, ebx, ecx, edx; > - unsigned long size; > - int i; > - > - cpuid(0, &eax, &ebx, &ecx, &edx); > - if (eax < SGX_CPUID) { > - pr_err("intel_sgx: CPUID is missing the SGX leaf instruction\n"); > - return -ENODEV; > - } > - > - if (!boot_cpu_has(X86_FEATURE_SGX)) { > - pr_err("intel_sgx: CPU is missing the SGX feature\n"); > - return -ENODEV; > - } > - > - cpuid_count(SGX_CPUID, 0x0, &eax, &ebx, &ecx, &edx); > - if (!(eax & 1)) { > - pr_err("intel_sgx: CPU does not support the SGX 1.0 instruction set\n"); > - return -ENODEV; > - } > - > - if (boot_cpu_has(X86_FEATURE_OSXSAVE)) { > - cpuid_count(SGX_CPUID, 0x1, &eax, &ebx, &ecx, &edx); > - sgx_xfrm_mask = (((u64)edx) << 32) + (u64)ecx; > - for (i = 2; i < 64; i++) { > - cpuid_count(0x0D, i, &eax, &ebx, &ecx, &edx); > - if ((1 << i) & sgx_xfrm_mask) > - sgx_ssaframesize_tbl[i] = > - (168 + eax + ebx + PAGE_SIZE - 1) / > - PAGE_SIZE; > - } > - } > - > - cpuid_count(SGX_CPUID, 0x0, &eax, &ebx, &ecx, &edx); > - if (edx & 0xFFFF) { > -#ifdef CONFIG_X86_64 > - sgx_encl_size_max_64 = 1ULL << (edx & 0xFF); > -#endif > - sgx_encl_size_max_32 = 1ULL << ((edx >> 8) & 0xFF); > - } > - > - sgx_nr_epc_banks = 0; > - do { > - cpuid_count(SGX_CPUID, sgx_nr_epc_banks + 2, > - &eax, &ebx, &ecx, &edx); > - if (eax & 0xf) { > - sgx_epc_banks[sgx_nr_epc_banks].start = > - (((u64) (ebx & 0xfffff)) << 32) + > - (u64) (eax & 0xfffff000); > - size = (((u64) (edx & 0xfffff)) << 32) + > - (u64) (ecx & 0xfffff000); > - sgx_epc_banks[sgx_nr_epc_banks].end = > - sgx_epc_banks[sgx_nr_epc_banks].start + size; > - if (!sgx_epc_banks[sgx_nr_epc_banks].start) > - return -ENODEV; > - sgx_nr_epc_banks++; > - } else { > - break; > - } > - } while (sgx_nr_epc_banks < SGX_MAX_EPC_BANKS); > - > - /* There should be at least one EPC area or something is wrong. */ > - if (!sgx_nr_epc_banks) { > - WARN_ON(1); > - return 1; > - } > - > - return 0; > -} > - > static int sgx_pm_suspend(struct device *dev) > { > struct sgx_tgid_ctx *ctx; > @@ -262,6 +190,9 @@ static SIMPLE_DEV_PM_OPS(sgx_drv_pm, sgx_pm_suspend, sgx_pm_resume); > > static int sgx_dev_init(struct device *dev) > { > + unsigned int eax, ebx, ecx, edx; > + unsigned long pa; > + unsigned long size; > unsigned int wq_flags; > int ret; > int i; > @@ -271,28 +202,37 @@ static int sgx_dev_init(struct device *dev) > if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) > return -ENODEV; > > - ret = sgx_init_platform(); > - if (ret) > - return ret; > + for (i = 0; i < SGX_MAX_EPC_BANKS; i++) { > + cpuid_count(SGX_CPUID, i + 2, &eax, &ebx, &ecx, &edx); > + if (!(eax & 0xf)) > + break; > + > + pa = ((u64)(ebx & 0xfffff) << 32) + (u64)(eax & 0xfffff000); > + size = ((u64)(edx & 0xfffff) << 32) + (u64)(ecx & 0xfffff000); > + > + dev_info(dev, "EPC bank 0x%lx-0x%lx\n", pa, pa + size); > + > + sgx_epc_banks[i].pa = pa; > + sgx_epc_banks[i].size = size; > + } > > - pr_info("intel_sgx: Number of EPCs %d\n", sgx_nr_epc_banks); > + sgx_nr_epc_banks = i; > > for (i = 0; i < sgx_nr_epc_banks; i++) { > - pr_info("intel_sgx: EPC memory range 0x%lx-0x%lx\n", > - sgx_epc_banks[i].start, sgx_epc_banks[i].end); > #ifdef CONFIG_X86_64 > - sgx_epc_banks[i].mem = ioremap_cache(sgx_epc_banks[i].start, > - sgx_epc_banks[i].end - sgx_epc_banks[i].start); > - if (!sgx_epc_banks[i].mem) { > + sgx_epc_banks[i].va = (unsigned long) > + ioremap_cache(sgx_epc_banks[i].pa, > + sgx_epc_banks[i].size); > + if (!sgx_epc_banks[i].va) { > sgx_nr_epc_banks = i; > ret = -ENOMEM; > goto out_iounmap; > } > #endif > - ret = sgx_add_epc_bank(sgx_epc_banks[i].start, > - sgx_epc_banks[i].end - sgx_epc_banks[i].start); > + ret = sgx_add_epc_bank(sgx_epc_banks[i].pa, > + sgx_epc_banks[i].size); > if (ret) { > - sgx_nr_epc_banks = i+1; > + sgx_nr_epc_banks = i + 1; > goto out_iounmap; > } > } > @@ -325,7 +265,7 @@ static int sgx_dev_init(struct device *dev) > out_iounmap: > #ifdef CONFIG_X86_64 > for (i = 0; i < sgx_nr_epc_banks; i++) > - iounmap(sgx_epc_banks[i].mem); > + iounmap((void *)sgx_epc_banks[i].va); > #endif > return ret; > } > @@ -388,7 +328,7 @@ static int sgx_drv_remove(struct platform_device *pdev) > destroy_workqueue(sgx_add_page_wq); > #ifdef CONFIG_X86_64 > for (i = 0; i < sgx_nr_epc_banks; i++) > - iounmap(sgx_epc_banks[i].mem); > + iounmap((void *)sgx_epc_banks[i].va); > #endif > sgx_page_cache_teardown(); > > diff --git a/drivers/platform/x86/intel_sgx/sgx_page_cache.c b/drivers/platform/x86/intel_sgx/sgx_page_cache.c > index 8e01427eea39..3ace84724273 100644 > --- a/drivers/platform/x86/intel_sgx/sgx_page_cache.c > +++ b/drivers/platform/x86/intel_sgx/sgx_page_cache.c > @@ -546,14 +546,17 @@ void *sgx_get_page(struct sgx_epc_page *entry) > #ifdef CONFIG_X86_32 > return kmap_atomic_pfn(PFN_DOWN(entry->pa)); > #else > + unsigned long offset; > int i; > > for (i = 0; i < sgx_nr_epc_banks; i++) { > - if (entry->pa < sgx_epc_banks[i].end && > - entry->pa >= sgx_epc_banks[i].start) { > - return sgx_epc_banks[i].mem + > - (entry->pa - sgx_epc_banks[i].start); > - } > + if (entry->pa < sgx_epc_banks[i].pa) > + continue; > + > + offset = entry->pa - sgx_epc_banks[i].pa; > + > + if (offset < sgx_epc_banks[i].size) > + return (void *)(sgx_epc_banks[i].va + offset); > } > > return NULL; > -- > 2.11.0 >
diff --git a/drivers/platform/x86/intel_sgx/sgx.h b/drivers/platform/x86/intel_sgx/sgx.h index d5cdf962219d..3ccbc0ffbabc 100644 --- a/drivers/platform/x86/intel_sgx/sgx.h +++ b/drivers/platform/x86/intel_sgx/sgx.h @@ -149,11 +149,11 @@ struct sgx_encl { }; struct sgx_epc_bank { + unsigned long pa; #ifdef CONFIG_X86_64 - void *mem; + unsigned long va; #endif - unsigned long start; - unsigned long end; + unsigned long size; }; extern struct workqueue_struct *sgx_add_page_wq; diff --git a/drivers/platform/x86/intel_sgx/sgx_main.c b/drivers/platform/x86/intel_sgx/sgx_main.c index 98ee05de8db8..cf1e6ec2cd7e 100644 --- a/drivers/platform/x86/intel_sgx/sgx_main.c +++ b/drivers/platform/x86/intel_sgx/sgx_main.c @@ -161,78 +161,6 @@ static struct miscdevice sgx_dev = { .mode = 0666, }; -static int sgx_init_platform(void) -{ - unsigned int eax, ebx, ecx, edx; - unsigned long size; - int i; - - cpuid(0, &eax, &ebx, &ecx, &edx); - if (eax < SGX_CPUID) { - pr_err("intel_sgx: CPUID is missing the SGX leaf instruction\n"); - return -ENODEV; - } - - if (!boot_cpu_has(X86_FEATURE_SGX)) { - pr_err("intel_sgx: CPU is missing the SGX feature\n"); - return -ENODEV; - } - - cpuid_count(SGX_CPUID, 0x0, &eax, &ebx, &ecx, &edx); - if (!(eax & 1)) { - pr_err("intel_sgx: CPU does not support the SGX 1.0 instruction set\n"); - return -ENODEV; - } - - if (boot_cpu_has(X86_FEATURE_OSXSAVE)) { - cpuid_count(SGX_CPUID, 0x1, &eax, &ebx, &ecx, &edx); - sgx_xfrm_mask = (((u64)edx) << 32) + (u64)ecx; - for (i = 2; i < 64; i++) { - cpuid_count(0x0D, i, &eax, &ebx, &ecx, &edx); - if ((1 << i) & sgx_xfrm_mask) - sgx_ssaframesize_tbl[i] = - (168 + eax + ebx + PAGE_SIZE - 1) / - PAGE_SIZE; - } - } - - cpuid_count(SGX_CPUID, 0x0, &eax, &ebx, &ecx, &edx); - if (edx & 0xFFFF) { -#ifdef CONFIG_X86_64 - sgx_encl_size_max_64 = 1ULL << (edx & 0xFF); -#endif - sgx_encl_size_max_32 = 1ULL << ((edx >> 8) & 0xFF); - } - - sgx_nr_epc_banks = 0; - do { - cpuid_count(SGX_CPUID, sgx_nr_epc_banks + 2, - &eax, &ebx, &ecx, &edx); - if (eax & 0xf) { - sgx_epc_banks[sgx_nr_epc_banks].start = - (((u64) (ebx & 0xfffff)) << 32) + - (u64) (eax & 0xfffff000); - size = (((u64) (edx & 0xfffff)) << 32) + - (u64) (ecx & 0xfffff000); - sgx_epc_banks[sgx_nr_epc_banks].end = - sgx_epc_banks[sgx_nr_epc_banks].start + size; - if (!sgx_epc_banks[sgx_nr_epc_banks].start) - return -ENODEV; - sgx_nr_epc_banks++; - } else { - break; - } - } while (sgx_nr_epc_banks < SGX_MAX_EPC_BANKS); - - /* There should be at least one EPC area or something is wrong. */ - if (!sgx_nr_epc_banks) { - WARN_ON(1); - return 1; - } - - return 0; -} - static int sgx_pm_suspend(struct device *dev) { struct sgx_tgid_ctx *ctx; @@ -262,6 +190,9 @@ static SIMPLE_DEV_PM_OPS(sgx_drv_pm, sgx_pm_suspend, sgx_pm_resume); static int sgx_dev_init(struct device *dev) { + unsigned int eax, ebx, ecx, edx; + unsigned long pa; + unsigned long size; unsigned int wq_flags; int ret; int i; @@ -271,28 +202,37 @@ static int sgx_dev_init(struct device *dev) if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) return -ENODEV; - ret = sgx_init_platform(); - if (ret) - return ret; + for (i = 0; i < SGX_MAX_EPC_BANKS; i++) { + cpuid_count(SGX_CPUID, i + 2, &eax, &ebx, &ecx, &edx); + if (!(eax & 0xf)) + break; + + pa = ((u64)(ebx & 0xfffff) << 32) + (u64)(eax & 0xfffff000); + size = ((u64)(edx & 0xfffff) << 32) + (u64)(ecx & 0xfffff000); + + dev_info(dev, "EPC bank 0x%lx-0x%lx\n", pa, pa + size); + + sgx_epc_banks[i].pa = pa; + sgx_epc_banks[i].size = size; + } - pr_info("intel_sgx: Number of EPCs %d\n", sgx_nr_epc_banks); + sgx_nr_epc_banks = i; for (i = 0; i < sgx_nr_epc_banks; i++) { - pr_info("intel_sgx: EPC memory range 0x%lx-0x%lx\n", - sgx_epc_banks[i].start, sgx_epc_banks[i].end); #ifdef CONFIG_X86_64 - sgx_epc_banks[i].mem = ioremap_cache(sgx_epc_banks[i].start, - sgx_epc_banks[i].end - sgx_epc_banks[i].start); - if (!sgx_epc_banks[i].mem) { + sgx_epc_banks[i].va = (unsigned long) + ioremap_cache(sgx_epc_banks[i].pa, + sgx_epc_banks[i].size); + if (!sgx_epc_banks[i].va) { sgx_nr_epc_banks = i; ret = -ENOMEM; goto out_iounmap; } #endif - ret = sgx_add_epc_bank(sgx_epc_banks[i].start, - sgx_epc_banks[i].end - sgx_epc_banks[i].start); + ret = sgx_add_epc_bank(sgx_epc_banks[i].pa, + sgx_epc_banks[i].size); if (ret) { - sgx_nr_epc_banks = i+1; + sgx_nr_epc_banks = i + 1; goto out_iounmap; } } @@ -325,7 +265,7 @@ static int sgx_dev_init(struct device *dev) out_iounmap: #ifdef CONFIG_X86_64 for (i = 0; i < sgx_nr_epc_banks; i++) - iounmap(sgx_epc_banks[i].mem); + iounmap((void *)sgx_epc_banks[i].va); #endif return ret; } @@ -388,7 +328,7 @@ static int sgx_drv_remove(struct platform_device *pdev) destroy_workqueue(sgx_add_page_wq); #ifdef CONFIG_X86_64 for (i = 0; i < sgx_nr_epc_banks; i++) - iounmap(sgx_epc_banks[i].mem); + iounmap((void *)sgx_epc_banks[i].va); #endif sgx_page_cache_teardown(); diff --git a/drivers/platform/x86/intel_sgx/sgx_page_cache.c b/drivers/platform/x86/intel_sgx/sgx_page_cache.c index 8e01427eea39..3ace84724273 100644 --- a/drivers/platform/x86/intel_sgx/sgx_page_cache.c +++ b/drivers/platform/x86/intel_sgx/sgx_page_cache.c @@ -546,14 +546,17 @@ void *sgx_get_page(struct sgx_epc_page *entry) #ifdef CONFIG_X86_32 return kmap_atomic_pfn(PFN_DOWN(entry->pa)); #else + unsigned long offset; int i; for (i = 0; i < sgx_nr_epc_banks; i++) { - if (entry->pa < sgx_epc_banks[i].end && - entry->pa >= sgx_epc_banks[i].start) { - return sgx_epc_banks[i].mem + - (entry->pa - sgx_epc_banks[i].start); - } + if (entry->pa < sgx_epc_banks[i].pa) + continue; + + offset = entry->pa - sgx_epc_banks[i].pa; + + if (offset < sgx_epc_banks[i].size) + return (void *)(sgx_epc_banks[i].va + offset); } return NULL;
Removed redundant probing code and cleaned up style issues in code for multiple EPC banks. Reported-by: Dmitrii Kuvaiskii <Dmitrii.Kuvaiskii@tu-dresden.de> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> --- drivers/platform/x86/intel_sgx/sgx.h | 6 +- drivers/platform/x86/intel_sgx/sgx_main.c | 112 ++++++------------------ drivers/platform/x86/intel_sgx/sgx_page_cache.c | 13 +-- 3 files changed, 37 insertions(+), 94 deletions(-)