diff options
Diffstat (limited to 'tools/testing/selftests/sgx/test_encl.c')
| -rw-r--r-- | tools/testing/selftests/sgx/test_encl.c | 60 | 
1 files changed, 48 insertions, 12 deletions
| diff --git a/tools/testing/selftests/sgx/test_encl.c b/tools/testing/selftests/sgx/test_encl.c index 734ea52f9924..4fca01cfd898 100644 --- a/tools/testing/selftests/sgx/test_encl.c +++ b/tools/testing/selftests/sgx/test_encl.c @@ -4,6 +4,11 @@  #include <stddef.h>  #include "defines.h" +/* + * Data buffer spanning two pages that will be placed first in .data + * segment. Even if not used internally the second page is needed by + * external test manipulating page permissions. + */  static uint8_t encl_buffer[8192] = { 1 };  static void *memcpy(void *dest, const void *src, size_t n) @@ -16,20 +21,51 @@ static void *memcpy(void *dest, const void *src, size_t n)  	return dest;  } -void encl_body(void *rdi,  void *rsi) +static void do_encl_op_put_to_buf(void *op) +{ +	struct encl_op_put_to_buf *op2 = op; + +	memcpy(&encl_buffer[0], &op2->value, 8); +} + +static void do_encl_op_get_from_buf(void *op)  { -	struct encl_op *op = (struct encl_op *)rdi; +	struct encl_op_get_from_buf *op2 = op; + +	memcpy(&op2->value, &encl_buffer[0], 8); +} + +static void do_encl_op_put_to_addr(void *_op) +{ +	struct encl_op_put_to_addr *op = _op; + +	memcpy((void *)op->addr, &op->value, 8); +} -	switch (op->type) { -	case ENCL_OP_PUT: -		memcpy(&encl_buffer[0], &op->buffer, 8); -		break; +static void do_encl_op_get_from_addr(void *_op) +{ +	struct encl_op_get_from_addr *op = _op; + +	memcpy(&op->value, (void *)op->addr, 8); +} + +static void do_encl_op_nop(void *_op) +{ + +} + +void encl_body(void *rdi,  void *rsi) +{ +	const void (*encl_op_array[ENCL_OP_MAX])(void *) = { +		do_encl_op_put_to_buf, +		do_encl_op_get_from_buf, +		do_encl_op_put_to_addr, +		do_encl_op_get_from_addr, +		do_encl_op_nop, +	}; -	case ENCL_OP_GET: -		memcpy(&op->buffer, &encl_buffer[0], 8); -		break; +	struct encl_op_header *op = (struct encl_op_header *)rdi; -	default: -		break; -	} +	if (op->type < ENCL_OP_MAX) +		(*encl_op_array[op->type])(op);  } |