From: Jarkko Sakkinen <jarkko@kernel.org>
To: vijay.dhanraj@intel.com
Cc: linux-sgx@vger.kernel.org, reinette.chatre@intel.com,
dave.hansen@linux.intel.com, haitao.huang@intel.com
Subject: Re: [PATCH] Add SGX selftest `augment_via_eaccept_long`
Date: Sat, 6 Aug 2022 21:18:34 +0300 [thread overview]
Message-ID: <Yu6wess0J/vKnWTb@kernel.org> (raw)
In-Reply-To: <20220804201456.33418-1-vijay.dhanraj@intel.com>
On Thu, Aug 04, 2022 at 01:14:56PM -0700, vijay.dhanraj@intel.com wrote:
> From: Vijay Dhanraj <vijay.dhanraj@intel.com>
>
> This commit adds a new test case which is same as `augment_via_eaccept`
> but adds more number of EPC pages to stress test `EAUG` via `EACCEPT`.
>
> Signed-off-by: Vijay Dhanraj <vijay.dhanraj@intel.com>
> Signed-off-by: Haitao Huang <haitao.huang@linux.intel.com>
Thank you. I'll run this with Icelake system.
> ---
> tools/testing/selftests/sgx/load.c | 5 +-
> tools/testing/selftests/sgx/main.c | 120 +++++++++++++++++++++++-
> tools/testing/selftests/sgx/main.h | 3 +-
> tools/testing/selftests/sgx/sigstruct.c | 2 +-
> 4 files changed, 125 insertions(+), 5 deletions(-)
>
> diff --git a/tools/testing/selftests/sgx/load.c b/tools/testing/selftests/sgx/load.c
> index 94bdeac1cf04..7de1b15c90b1 100644
> --- a/tools/testing/selftests/sgx/load.c
> +++ b/tools/testing/selftests/sgx/load.c
> @@ -171,7 +171,8 @@ uint64_t encl_get_entry(struct encl *encl, const char *symbol)
> return 0;
> }
>
> -bool encl_load(const char *path, struct encl *encl, unsigned long heap_size)
> +bool encl_load(const char *path, struct encl *encl, unsigned long heap_size,
> + unsigned long edmm_size)
> {
> const char device_path[] = "/dev/sgx_enclave";
> struct encl_segment *seg;
> @@ -300,7 +301,7 @@ bool encl_load(const char *path, struct encl *encl, unsigned long heap_size)
>
> encl->src_size = encl->segment_tbl[j].offset + encl->segment_tbl[j].size;
>
> - for (encl->encl_size = 4096; encl->encl_size < encl->src_size; )
> + for (encl->encl_size = 4096; encl->encl_size < encl->src_size + edmm_size;)
> encl->encl_size <<= 1;
>
> return true;
> diff --git a/tools/testing/selftests/sgx/main.c b/tools/testing/selftests/sgx/main.c
> index 9820b3809c69..65e79682f75e 100644
> --- a/tools/testing/selftests/sgx/main.c
> +++ b/tools/testing/selftests/sgx/main.c
> @@ -25,6 +25,8 @@ static const uint64_t MAGIC = 0x1122334455667788ULL;
> static const uint64_t MAGIC2 = 0x8877665544332211ULL;
> vdso_sgx_enter_enclave_t vdso_sgx_enter_enclave;
>
> +static const unsigned long edmm_size = 8589934592; //8G
> +
> /*
> * Security Information (SECINFO) data structure needed by a few SGX
> * instructions (eg. ENCLU[EACCEPT] and ENCLU[EMODPE]) holds meta-data
> @@ -183,7 +185,7 @@ static bool setup_test_encl(unsigned long heap_size, struct encl *encl,
> unsigned int i;
> void *addr;
>
> - if (!encl_load("test_encl.elf", encl, heap_size)) {
> + if (!encl_load("test_encl.elf", encl, heap_size, edmm_size)) {
> encl_delete(encl);
> TH_LOG("Failed to load the test enclave.");
> return false;
> @@ -1210,6 +1212,122 @@ TEST_F(enclave, augment_via_eaccept)
> munmap(addr, PAGE_SIZE);
> }
>
> +/*
> + * Test for the addition of large number of pages to an initialized enclave via
> + * a pre-emptive run of EACCEPT on page to be added.
> + */
> +#define TIMEOUT_LONG 900 /* seconds */
> +TEST_F_TIMEOUT(enclave, augment_via_eaccept_long, TIMEOUT_LONG)
> +{
> + struct encl_op_get_from_addr get_addr_op;
> + struct encl_op_put_to_addr put_addr_op;
> + struct encl_op_eaccept eaccept_op;
> + size_t total_size = 0;
> + void *addr;
> + unsigned long i;
> +
> + if (!sgx2_supported())
> + SKIP(return, "SGX2 not supported");
> +
> + ASSERT_TRUE(setup_test_encl(ENCL_HEAP_SIZE_DEFAULT, &self->encl, _metadata));
> +
> + memset(&self->run, 0, sizeof(self->run));
> + self->run.tcs = self->encl.encl_base;
> +
> + for (i = 0; i < self->encl.nr_segments; i++) {
> + struct encl_segment *seg = &self->encl.segment_tbl[i];
> +
> + total_size += seg->size;
> + TH_LOG("test enclave: total_size = %ld, seg->size = %ld", total_size, seg->size);
> + }
> +
> + /*
> + * Actual enclave size is expected to be larger than the loaded
> + * test enclave since enclave size must be a power of 2 in bytes while
> + * test_encl does not consume it all.
> + */
> + EXPECT_LT(total_size + edmm_size, self->encl.encl_size);
> +
> + /*
> + * mmap() a page at end of existing enclave to be used for dynamic
> + * EPC page.
> + *
> + * Kernel will allow new mapping using any permissions if it
> + * falls into the enclave's address range but not backed
> + * by existing enclave pages.
> + */
> + TH_LOG("mmaping pages at end of enclave...");
> + addr = mmap((void *)self->encl.encl_base + total_size, edmm_size,
> + PROT_READ | PROT_WRITE | PROT_EXEC, MAP_SHARED | MAP_FIXED,
> + self->encl.fd, 0);
> + EXPECT_NE(addr, MAP_FAILED);
> +
> + self->run.exception_vector = 0;
> + self->run.exception_error_code = 0;
> + self->run.exception_addr = 0;
> +
> + /*
> + * Run EACCEPT on new page to trigger the #PF->EAUG->EACCEPT(again
> + * without a #PF). All should be transparent to userspace.
> + */
> + TH_LOG("Entering enclave to run EACCEPT for each page of %zd bytes may take a while ...",
> + edmm_size);
> + eaccept_op.flags = SGX_SECINFO_R | SGX_SECINFO_W | SGX_SECINFO_REG | SGX_SECINFO_PENDING;
> + eaccept_op.ret = 0;
> + eaccept_op.header.type = ENCL_OP_EACCEPT;
> +
> + for (i = 0; i < edmm_size; i += 4096) {
> + eaccept_op.epc_addr = (uint64_t)(addr + i);
> +
> + EXPECT_EQ(ENCL_CALL(&eaccept_op, &self->run, true), 0);
> + if (self->run.exception_vector == 14 &&
> + self->run.exception_error_code == 4 &&
> + self->run.exception_addr == self->encl.encl_base) {
> + munmap(addr, edmm_size);
> + SKIP(return, "Kernel does not support adding pages to initialized enclave");
> + }
> +
> + EXPECT_EQ(self->run.exception_vector, 0);
> + EXPECT_EQ(self->run.exception_error_code, 0);
> + EXPECT_EQ(self->run.exception_addr, 0);
> + ASSERT_EQ(eaccept_op.ret, 0);
> + ASSERT_EQ(self->run.function, EEXIT);
> + }
> +
> + /*
> + * New page should be accessible from within enclave - attempt to
> + * write to it.
> + */
> + put_addr_op.value = MAGIC;
> + put_addr_op.addr = (unsigned long)addr;
> + put_addr_op.header.type = ENCL_OP_PUT_TO_ADDRESS;
> +
> + EXPECT_EQ(ENCL_CALL(&put_addr_op, &self->run, true), 0);
> +
> + EXPECT_EEXIT(&self->run);
> + EXPECT_EQ(self->run.exception_vector, 0);
> + EXPECT_EQ(self->run.exception_error_code, 0);
> + EXPECT_EQ(self->run.exception_addr, 0);
> +
> + /*
> + * Read memory from newly added page that was just written to,
> + * confirming that data previously written (MAGIC) is present.
> + */
> + get_addr_op.value = 0;
> + get_addr_op.addr = (unsigned long)addr;
> + get_addr_op.header.type = ENCL_OP_GET_FROM_ADDRESS;
> +
> + EXPECT_EQ(ENCL_CALL(&get_addr_op, &self->run, true), 0);
> +
> + EXPECT_EQ(get_addr_op.value, MAGIC);
> + EXPECT_EEXIT(&self->run);
> + EXPECT_EQ(self->run.exception_vector, 0);
> + EXPECT_EQ(self->run.exception_error_code, 0);
> + EXPECT_EQ(self->run.exception_addr, 0);
> +
> + munmap(addr, edmm_size);
> +}
> +
> /*
> * SGX2 page type modification test in two phases:
> * Phase 1:
> diff --git a/tools/testing/selftests/sgx/main.h b/tools/testing/selftests/sgx/main.h
> index fc585be97e2f..fe5d39ac0e1e 100644
> --- a/tools/testing/selftests/sgx/main.h
> +++ b/tools/testing/selftests/sgx/main.h
> @@ -35,7 +35,8 @@ extern unsigned char sign_key[];
> extern unsigned char sign_key_end[];
>
> void encl_delete(struct encl *ctx);
> -bool encl_load(const char *path, struct encl *encl, unsigned long heap_size);
> +bool encl_load(const char *path, struct encl *encl, unsigned long heap_size,
> + unsigned long edmm_size);
> bool encl_measure(struct encl *encl);
> bool encl_build(struct encl *encl);
> uint64_t encl_get_entry(struct encl *encl, const char *symbol);
> diff --git a/tools/testing/selftests/sgx/sigstruct.c b/tools/testing/selftests/sgx/sigstruct.c
> index 50c5ab1aa6fa..6000cf0e4975 100644
> --- a/tools/testing/selftests/sgx/sigstruct.c
> +++ b/tools/testing/selftests/sgx/sigstruct.c
> @@ -343,7 +343,7 @@ bool encl_measure(struct encl *encl)
> if (!ctx)
> goto err;
>
> - if (!mrenclave_ecreate(ctx, encl->src_size))
> + if (!mrenclave_ecreate(ctx, encl->encl_size))
> goto err;
>
> for (i = 0; i < encl->nr_segments; i++) {
> --
> 2.17.1
>
BR, Jarkko
next prev parent reply other threads:[~2022-08-06 18:18 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-04 20:14 [PATCH] Add SGX selftest `augment_via_eaccept_long` vijay.dhanraj
2022-08-06 18:18 ` Jarkko Sakkinen [this message]
2022-08-08 12:18 ` Jarkko Sakkinen
2022-08-08 13:00 ` Dhanraj, Vijay
2022-08-08 15:29 ` Jarkko Sakkinen
2022-08-09 10:45 ` Jarkko Sakkinen
2022-08-09 16:09 ` Jarkko Sakkinen
2022-08-09 17:08 ` Dhanraj, Vijay
2022-08-09 18:53 ` Jarkko Sakkinen
2022-08-09 18:57 ` Jarkko Sakkinen
2022-08-10 0:09 ` Dhanraj, Vijay
2022-08-11 1:01 ` Jarkko Sakkinen
2022-08-11 1:36 ` Jarkko Sakkinen
2022-08-11 1:50 ` Jarkko Sakkinen
2022-08-11 2:01 ` Dhanraj, Vijay
2022-08-12 2:29 ` Haitao Huang
2022-08-12 3:23 ` Dhanraj, Vijay
2022-08-14 18:08 ` Jarkko Sakkinen
2022-08-15 16:16 ` Dhanraj, Vijay
2022-08-12 5:47 ` Haitao Huang
2022-08-14 18:11 ` Jarkko Sakkinen
2022-08-14 18:05 ` Jarkko Sakkinen
2022-08-15 4:58 ` Haitao Huang
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=Yu6wess0J/vKnWTb@kernel.org \
--to=jarkko@kernel.org \
--cc=dave.hansen@linux.intel.com \
--cc=haitao.huang@intel.com \
--cc=linux-sgx@vger.kernel.org \
--cc=reinette.chatre@intel.com \
--cc=vijay.dhanraj@intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox