Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/sgx: Refine the test enclave to have storage

Extend the enclave to have two operations: ENCL_OP_PUT and ENCL_OP_GET.
ENCL_OP_PUT stores value inside the enclave address space and
ENCL_OP_GET reads it. The internal buffer can be later extended to be
variable size, and allow reclaimer tests.

Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>

authored by

Jarkko Sakkinen and committed by
Shuah Khan
22118ce1 b334fb6f

+74 -15
+10
tools/testing/selftests/sgx/defines.h
··· 18 18 #include "../../../../arch/x86/include/asm/enclu.h" 19 19 #include "../../../../arch/x86/include/uapi/asm/sgx.h" 20 20 21 + enum encl_op_type { 22 + ENCL_OP_PUT, 23 + ENCL_OP_GET, 24 + }; 25 + 26 + struct encl_op { 27 + uint64_t type; 28 + uint64_t buffer; 29 + }; 30 + 21 31 #endif /* DEFINES_H */
+45 -12
tools/testing/selftests/sgx/main.c
··· 193 193 encl_delete(&self->encl); 194 194 } 195 195 196 - #define ENCL_CALL(in, out, run, clobbered) \ 196 + #define ENCL_CALL(op, run, clobbered) \ 197 197 ({ \ 198 198 int ret; \ 199 199 if ((clobbered)) \ 200 - ret = vdso_sgx_enter_enclave((unsigned long)(in), (unsigned long)(out), 0, \ 200 + ret = vdso_sgx_enter_enclave((unsigned long)(op), 0, 0, \ 201 201 EENTER, 0, 0, (run)); \ 202 202 else \ 203 - ret = sgx_enter_enclave((void *)(in), (void *)(out), 0, EENTER, NULL, NULL, \ 203 + ret = sgx_enter_enclave((void *)(op), NULL, 0, EENTER, NULL, NULL, \ 204 204 (run)); \ 205 205 ret; \ 206 206 }) ··· 215 215 216 216 TEST_F(enclave, unclobbered_vdso) 217 217 { 218 - uint64_t result = 0; 218 + struct encl_op op; 219 219 220 - EXPECT_EQ(ENCL_CALL(&MAGIC, &result, &self->run, false), 0); 220 + op.type = ENCL_OP_PUT; 221 + op.buffer = MAGIC; 221 222 222 - EXPECT_EQ(result, MAGIC); 223 + EXPECT_EQ(ENCL_CALL(&op, &self->run, false), 0); 224 + 225 + EXPECT_EEXIT(&self->run); 226 + EXPECT_EQ(self->run.user_data, 0); 227 + 228 + op.type = ENCL_OP_GET; 229 + op.buffer = 0; 230 + 231 + EXPECT_EQ(ENCL_CALL(&op, &self->run, false), 0); 232 + 233 + EXPECT_EQ(op.buffer, MAGIC); 223 234 EXPECT_EEXIT(&self->run); 224 235 EXPECT_EQ(self->run.user_data, 0); 225 236 } 226 237 227 238 TEST_F(enclave, clobbered_vdso) 228 239 { 229 - uint64_t result = 0; 240 + struct encl_op op; 230 241 231 - EXPECT_EQ(ENCL_CALL(&MAGIC, &result, &self->run, true), 0); 242 + op.type = ENCL_OP_PUT; 243 + op.buffer = MAGIC; 232 244 233 - EXPECT_EQ(result, MAGIC); 245 + EXPECT_EQ(ENCL_CALL(&op, &self->run, true), 0); 246 + 247 + EXPECT_EEXIT(&self->run); 248 + EXPECT_EQ(self->run.user_data, 0); 249 + 250 + op.type = ENCL_OP_GET; 251 + op.buffer = 0; 252 + 253 + EXPECT_EQ(ENCL_CALL(&op, &self->run, true), 0); 254 + 255 + EXPECT_EQ(op.buffer, MAGIC); 234 256 EXPECT_EEXIT(&self->run); 235 257 EXPECT_EQ(self->run.user_data, 0); 236 258 } ··· 267 245 268 246 TEST_F(enclave, clobbered_vdso_and_user_function) 269 247 { 270 - uint64_t result = 0; 248 + struct encl_op op; 271 249 272 250 self->run.user_handler = (__u64)test_handler; 273 251 self->run.user_data = 0xdeadbeef; 274 252 275 - EXPECT_EQ(ENCL_CALL(&MAGIC, &result, &self->run, true), 0); 253 + op.type = ENCL_OP_PUT; 254 + op.buffer = MAGIC; 276 255 277 - EXPECT_EQ(result, MAGIC); 256 + EXPECT_EQ(ENCL_CALL(&op, &self->run, true), 0); 257 + 258 + EXPECT_EEXIT(&self->run); 259 + EXPECT_EQ(self->run.user_data, 0); 260 + 261 + op.type = ENCL_OP_GET; 262 + op.buffer = 0; 263 + 264 + EXPECT_EQ(ENCL_CALL(&op, &self->run, true), 0); 265 + 266 + EXPECT_EQ(op.buffer, MAGIC); 278 267 EXPECT_EEXIT(&self->run); 279 268 EXPECT_EQ(self->run.user_data, 0); 280 269 }
+17 -2
tools/testing/selftests/sgx/test_encl.c
··· 4 4 #include <stddef.h> 5 5 #include "defines.h" 6 6 7 + static uint8_t encl_buffer[8192] = { 1 }; 8 + 7 9 static void *memcpy(void *dest, const void *src, size_t n) 8 10 { 9 11 size_t i; ··· 16 14 return dest; 17 15 } 18 16 19 - void encl_body(void *rdi, void *rsi) 17 + void encl_body(void *rdi, void *rsi) 20 18 { 21 - memcpy(rsi, rdi, 8); 19 + struct encl_op *op = (struct encl_op *)rdi; 20 + 21 + switch (op->type) { 22 + case ENCL_OP_PUT: 23 + memcpy(&encl_buffer[0], &op->buffer, 8); 24 + break; 25 + 26 + case ENCL_OP_GET: 27 + memcpy(&op->buffer, &encl_buffer[0], 8); 28 + break; 29 + 30 + default: 31 + break; 32 + } 22 33 }
+2 -1
tools/testing/selftests/sgx/test_encl.lds
··· 18 18 .text : { 19 19 *(.text*) 20 20 *(.rodata*) 21 + FILL(0xDEADBEEF); 22 + . = ALIGN(4096); 21 23 } : text 22 24 23 - . = ALIGN(4096); 24 25 .data : { 25 26 *(.data*) 26 27 } : data