@@ -360,16 +360,16 @@ static int __sgx_encl_extend(struct sgx_encl *encl,
return 0;
}
-static int sgx_encl_add_page(struct sgx_encl *encl,
- struct sgx_enclave_add_pages *addp,
- struct sgx_secinfo *secinfo)
+static int sgx_encl_add_page(struct sgx_encl *encl, unsigned long src,
+ unsigned long offset, unsigned long length,
+ struct sgx_secinfo *secinfo, unsigned long flags)
{
struct sgx_encl_page *encl_page;
struct sgx_epc_page *epc_page;
struct sgx_va_page *va_page;
int ret;
- encl_page = sgx_encl_page_alloc(encl, addp->offset, secinfo->flags);
+ encl_page = sgx_encl_page_alloc(encl, offset, secinfo->flags);
if (IS_ERR(encl_page))
return PTR_ERR(encl_page);
@@ -412,7 +412,7 @@ static int sgx_encl_add_page(struct sgx_encl *encl,
goto err_out_unlock;
ret = __sgx_encl_add_page(encl, encl_page, epc_page, secinfo,
- addp->src);
+ src);
if (ret) {
/* ENCLS failure. */
if (ret == -EIO)
@@ -430,7 +430,7 @@ static int sgx_encl_add_page(struct sgx_encl *encl,
encl_page->epc_page = epc_page;
encl->secs_child_cnt++;
- if (addp->flags & SGX_PAGE_MEASURE) {
+ if (flags & SGX_PAGE_MEASURE) {
ret = __sgx_encl_extend(encl, epc_page);
/* ENCLS failure. */
@@ -547,7 +547,8 @@ static long sgx_ioc_enclave_add_pages(struct sgx_encl *encl, void __user *arg)
if (need_resched())
cond_resched();
- ret = sgx_encl_add_page(encl, &addp, &secinfo);
+ ret = sgx_encl_add_page(encl, addp.src, addp.offset,
+ addp.length, &secinfo, addp.flags);
if (ret)
break;
Internals should not have direct bindings to the ioctl API. Therefore, unpack &sgx_enclave_add_pages and pass its fields as separate parameters to sgx_enclave_add_page(). This will also remove an inconsistency: secinfo is already passed as a separate parameter whereas other fields are read from the struct. Cc: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> --- arch/x86/kernel/cpu/sgx/ioctl.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)