From 405116dbf34de8592ff3e9f2a5d3c630f6ddcdc8 Mon Sep 17 00:00:00 2001 From: Li Lei Date: Tue, 3 Jul 2018 00:50:45 -0700 Subject: [PATCH] Add a manifest option sgx.disable_avx to support running graphene-sgx on the platform which doesn't have avx feature --- Pal/regression/06_AvxDisable.py | 25 +++++++++++++++++++++ Pal/regression/AvxDisable.c | 23 +++++++++++++++++++ Pal/regression/AvxDisable.manifest.template | 2 ++ Pal/regression/Makefile | 2 +- Pal/src/host/Linux-SGX/db_exception.c | 2 ++ Pal/src/host/Linux-SGX/signer/pal-sgx-sign | 3 +++ 6 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 Pal/regression/06_AvxDisable.py create mode 100644 Pal/regression/AvxDisable.c create mode 100644 Pal/regression/AvxDisable.manifest.template diff --git a/Pal/regression/06_AvxDisable.py b/Pal/regression/06_AvxDisable.py new file mode 100644 index 00000000..3f8b4cfb --- /dev/null +++ b/Pal/regression/06_AvxDisable.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python2 + +import os, sys, mmap +from regression import Regression + +loader = os.environ['PAL_LOADER'] + +sgx = os.environ.get('SGX_RUN', False) + +def manifest_file(file): + if sgx: + return file + '.manifest.sgx' + else: + return file + '.manifest' + +if not sgx: + sys.exit(0) +# Running AvxDisable +regression = Regression(loader, "AvxDisable") + +regression.add_check(name="Disable AVX bit in XFRM", + check=lambda res: "Illegal instruction executed in enclave" in res[0].log) + +rv = regression.run_checks() +if rv: sys.exit(rv) diff --git a/Pal/regression/AvxDisable.c b/Pal/regression/AvxDisable.c new file mode 100644 index 00000000..504c3bfe --- /dev/null +++ b/Pal/regression/AvxDisable.c @@ -0,0 +1,23 @@ +#include "pal.h" +#include "pal_debug.h" +#include +#include + +int main(){ + /* Initialize the two argument vectors */ + __m256 evens = _mm256_set_ps(2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0); + __m256 odds = _mm256_set_ps(1.0, 3.0, 5.0, 7.0, 9.0, 11.0, 13.0, 15.0); + + /* Compute the difference between the two vectors */ + __m256 result = _mm256_sub_ps(evens, odds); + + /* Display the elements of the result vector */ + float f = result[0]; + + PAL_HANDLE file1 = DkStreamOpen("file:avxRes", PAL_ACCESS_RDWR, 0, 0, 0); + if (file1) { + DkStreamWrite(file1, 0, sizeof(f), &f, NULL); + DkObjectClose(file1); + } + return 1; +} diff --git a/Pal/regression/AvxDisable.manifest.template b/Pal/regression/AvxDisable.manifest.template new file mode 100644 index 00000000..27554718 --- /dev/null +++ b/Pal/regression/AvxDisable.manifest.template @@ -0,0 +1,2 @@ +sgx.disable_avx = 1 +sgx.allowed_files.res = file:avxRes diff --git a/Pal/regression/Makefile b/Pal/regression/Makefile index 523b8da0..3e8deb1e 100644 --- a/Pal/regression/Makefile +++ b/Pal/regression/Makefile @@ -1,7 +1,7 @@ include ../src/Makefile.Host CC = gcc -CFLAGS = -Wall -O2 -std=gnu99 -fgnu89-inline -fno-builtin -nostdlib \ +CFLAGS = -Wall -O2 -std=gnu99 -fgnu89-inline -fno-builtin -nostdlib -mavx\ -I../include/pal -I../lib preloads = $(patsubst %.c,%,$(wildcard *.so.c)) diff --git a/Pal/src/host/Linux-SGX/db_exception.c b/Pal/src/host/Linux-SGX/db_exception.c index 8f1092eb..c3a4a129 100644 --- a/Pal/src/host/Linux-SGX/db_exception.c +++ b/Pal/src/host/Linux-SGX/db_exception.c @@ -241,6 +241,8 @@ void _DkExceptionHandler (unsigned int exit_info, sgx_context_t * uc) restore_sgx_context(uc); return; } + SGX_DBG(DBG_E, "Illegal instruction executed in enclave\n"); + ocall_exit(1); } switch (ei.info.vector) { diff --git a/Pal/src/host/Linux-SGX/signer/pal-sgx-sign b/Pal/src/host/Linux-SGX/signer/pal-sgx-sign index c5301d05..b2564108 100755 --- a/Pal/src/host/Linux-SGX/signer/pal-sgx-sign +++ b/Pal/src/host/Linux-SGX/signer/pal-sgx-sign @@ -176,6 +176,9 @@ def get_enclave_attributes(manifest): if manifest_options[opt] in attributes: attributes.pop(manifest_options[opt]) + if manifest.get('sgx.disable_avx') == '1': + attributes.remove('XFRM_AVX') + flags_raw = struct.pack("