diff mbox series

[for_v23,2/5] selftests/x86/sgx: Add check to verify exit handler stack alignment

Message ID 20191011004059.28581-3-sean.j.christopherson@intel.com (mailing list archive)
State New, archived
Headers show
Series x86/vdso: sgx: Bug fixes | expand

Commit Message

Sean Christopherson Oct. 11, 2019, 12:40 a.m. UTC
Add an assembly trampoline to the basic exit handler to snapshot the
pre-CALL %rsp in order to verify that the stack is 16-byte aligned as
required by the x86_64 ABI.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
---
 tools/testing/selftests/x86/sgx/defines.h |  1 +
 tools/testing/selftests/x86/sgx/main.c    | 20 +++++++++++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

Comments

Jarkko Sakkinen Oct. 14, 2019, 9:09 p.m. UTC | #1
On Thu, Oct 10, 2019 at 05:40:56PM -0700, Sean Christopherson wrote:
> Add an assembly trampoline to the basic exit handler to snapshot the
> pre-CALL %rsp in order to verify that the stack is 16-byte aligned as
> required by the x86_64 ABI.
> 
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>

I'll rework the existing selftest commit in my tree to use the
"non-VDSO" (aka plain EENTER) call path. Please then provide me commits
for vDSO selftests. These commits will be their own commits in the patch
set. I'll move my selftest commit earlier in the patch set before the
vDSO commits.

Should be more than obvious why this makes sene, so I skip explaining
it but can provide rationale on demand basis.

I'll work this change out tomorrow.

/Jarkko
Jarkko Sakkinen Oct. 14, 2019, 9:14 p.m. UTC | #2
On Tue, Oct 15, 2019 at 12:09:40AM +0300, Jarkko Sakkinen wrote:
> On Thu, Oct 10, 2019 at 05:40:56PM -0700, Sean Christopherson wrote:
> > Add an assembly trampoline to the basic exit handler to snapshot the
> > pre-CALL %rsp in order to verify that the stack is 16-byte aligned as
> > required by the x86_64 ABI.
> > 
> > Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> 
> I'll rework the existing selftest commit in my tree to use the
> "non-VDSO" (aka plain EENTER) call path. Please then provide me commits
> for vDSO selftests. These commits will be their own commits in the patch
> set. I'll move my selftest commit earlier in the patch set before the
> vDSO commits.
> 
> Should be more than obvious why this makes sene, so I skip explaining
> it but can provide rationale on demand basis.
> 
> I'll work this change out tomorrow.

I'd be also happy to get more clean commit messages for the vDSO
commits. It is more important than refining documentation because commit
log is immutable. I've already stated what is wrong ATM but I'll explain
it once more shortly.

When writing a commit message you should always go below your
expectations what reviewers already know. You want to make them easily
accessible for maintainers who have to deal with dozens of patches
on a daily basis.

/Jarkko
diff mbox series

Patch

diff --git a/tools/testing/selftests/x86/sgx/defines.h b/tools/testing/selftests/x86/sgx/defines.h
index 199a830e198a..8ddd3cfd1070 100644
--- a/tools/testing/selftests/x86/sgx/defines.h
+++ b/tools/testing/selftests/x86/sgx/defines.h
@@ -15,6 +15,7 @@  typedef uint64_t u64;
 
 #define __aligned(x) __attribute__((__aligned__(x)))
 #define __packed __attribute__((packed))
+#define __used __attribute__((__used__))
 
 /* Derived from asm-generic/bitsperlong.h. */
 #if __x86_64__
diff --git a/tools/testing/selftests/x86/sgx/main.c b/tools/testing/selftests/x86/sgx/main.c
index 029502d81ac9..f46e5c8fdac4 100644
--- a/tools/testing/selftests/x86/sgx/main.c
+++ b/tools/testing/selftests/x86/sgx/main.c
@@ -331,14 +331,28 @@  static void test_vdso_no_exit_handler(struct sgx_secs *secs)
 	ASSERT_EQ(exception.leaf, ENCLU_EENTER);
 }
 
-static int basic_exit_handler(long rdi, long rsi, long rdx, int ret,
-			      long r8, long r9, void *tcs, long ursp,
-			      struct sgx_enclave_exception *e)
+static int __used __basic_exit_handler(long rdi, long rsi, long rdx, int ret,
+				       long r8, long r9, void *tcs, long ursp,
+				       struct sgx_enclave_exception *e)
 {
+	TEST_ASSERT(!(r9 & 0xf), "Pre-CALL RSP not 16-byte aligned: %lx\n", r9);
 	ASSERT_EQ(ret, 0);
 	return 0;
 }
 
+extern void *basic_exit_handler;
+
+static void __used basic_exit_handler_trampoline(void)
+{
+	/* Load the pre-CALL %rsp into %r9 to verify correct alignment. */
+	asm volatile("1:\n\t"
+		     "lea 0x8(%%rsp), %%r9\n\t"
+		     "jmp __basic_exit_handler\n\t"
+		     "basic_exit_handler: .quad 1b\n\t"
+		     ".global basic_exit_handler"
+		     ::: "memory");
+}
+
 static int nr_page_faults;
 
 static int mprotect_exit_handler(long rdi, long rsi, long rdx, int ret,