Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef233d8b authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ion: Set the page private bit for secure CMA buffers"

parents 23dd8e89 2b6084f1
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -241,11 +241,13 @@ void ion_cma_heap_destroy(struct ion_heap *heap)

static void ion_secure_cma_free(struct ion_buffer *buffer)
{
	int ret = 0;
	int i, ret = 0;
	int *source_vm_list;
	int source_nelems;
	int dest_vmid;
	int dest_perms;
	struct sg_table *sgt;
	struct scatterlist *sg;
	struct ion_cma_buffer_info *info = buffer->priv_virt;

	source_nelems = count_set_bits(buffer->flags & ION_FLAGS_CP_MASK);
@@ -264,7 +266,8 @@ static void ion_secure_cma_free(struct ion_buffer *buffer)
	dest_vmid = VMID_HLOS;
	dest_perms = PERM_READ | PERM_WRITE | PERM_EXEC;

	ret = hyp_assign_table(info->table, source_vm_list, source_nelems,
	sgt = info->table;
	ret = hyp_assign_table(sgt, source_vm_list, source_nelems,
			       &dest_vmid, &dest_perms, 1);
	if (ret) {
		pr_err("%s: Not freeing memory since assign failed\n",
@@ -272,6 +275,9 @@ static void ion_secure_cma_free(struct ion_buffer *buffer)
		goto out_free_source;
	}

	for_each_sg(sgt->sgl, sg, sgt->nents, i)
		ClearPagePrivate(sg_page(sgt->sgl));

	ion_cma_free(buffer);
out_free_source:
	kfree(source_vm_list);
@@ -282,13 +288,15 @@ static int ion_secure_cma_allocate(
			struct ion_buffer *buffer, unsigned long len,
			unsigned long align, unsigned long flags)
{
	int ret = 0;
	int i, ret = 0;
	int count;
	int source_vm;
	int *dest_vm_list = NULL;
	int *dest_perms = NULL;
	int dest_nelems;
	struct ion_cma_buffer_info *info;
	struct sg_table *sgt;
	struct scatterlist *sg;

	source_vm = VMID_HLOS;

@@ -327,13 +335,18 @@ static int ion_secure_cma_allocate(
	}

	info = buffer->priv_virt;
	ret = hyp_assign_table(info->table, &source_vm, 1,
			dest_vm_list, dest_perms, dest_nelems);
	sgt = info->table;
	ret = hyp_assign_table(sgt, &source_vm, 1, dest_vm_list, dest_perms,
			       dest_nelems);
	if (ret) {
		pr_err("%s: Assign call failed\n", __func__);
		goto err;
	}

	/* Set the private bit to indicate that we've secured this */
	for_each_sg(sgt->sgl, sg, sgt->nents, i)
		SetPagePrivate(sg_page(sgt->sgl));

	kfree(dest_vm_list);
	kfree(dest_perms);
	return ret;