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

Commit 14deab07 authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Merge b917daed on remote branch

Change-Id: I5714dc8010a1c9043005a760ec3b8a250ec4a10f
parents 63714bce b917daed
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2014-2017,2021, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -407,7 +407,8 @@ unsigned int a5xx_preemption_pre_ibsubmit(

	/* Enable CP_CONTEXT_SWITCH_YIELD packets in the IB2s */
	*cmds++ = cp_type7_packet(CP_YIELD_ENABLE, 1);
	*cmds++ = 2;
	*cmds++ = ((preempt_style == KGSL_CONTEXT_PREEMPT_STYLE_RINGBUFFER)
				? 0 : 2);

	return (unsigned int) (cmds - cmds_orig);
}
+10 −3
Original line number Diff line number Diff line
@@ -265,8 +265,9 @@ kgsl_mem_entry_create(void)

		/* put this ref in the caller functions after init */
		kref_get(&entry->refcount);
	}
		atomic_set(&entry->map_count, 0);
	}

	return entry;
}
#ifdef CONFIG_DMA_SHARED_BUFFER
@@ -2200,6 +2201,8 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable,
{
	/* Map an anonymous memory chunk */

	int ret;

	if (size == 0 || offset != 0 ||
		!IS_ALIGNED(size, PAGE_SIZE))
		return -EINVAL;
@@ -2209,7 +2212,6 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable,
	entry->memdesc.flags |= KGSL_MEMFLAGS_USERMEM_ADDR;

	if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) {
		int ret;

		/* Register the address in the database */
		ret = kgsl_mmu_set_svm_region(pagetable,
@@ -2221,7 +2223,12 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable,
		entry->memdesc.gpuaddr = (uint64_t) hostptr;
	}

	return memdesc_sg_virt(&entry->memdesc, hostptr);
	ret = memdesc_sg_virt(&entry->memdesc, hostptr);

	if (ret && kgsl_memdesc_use_cpu_map(&entry->memdesc))
		kgsl_mmu_put_gpuaddr(&entry->memdesc);

	return ret;
}

static int match_file(const void *p, struct file *file, unsigned int fd)
+2 −1
Original line number Diff line number Diff line
@@ -432,7 +432,8 @@ void kgsl_mmu_put_gpuaddr(struct kgsl_memdesc *memdesc)
	if (memdesc->size == 0 || memdesc->gpuaddr == 0)
		return;

	if (!kgsl_memdesc_is_global(memdesc))
	if (!kgsl_memdesc_is_global(memdesc) &&
			 (KGSL_MEMDESC_MAPPED & memdesc->priv))
		unmap_fail = kgsl_mmu_unmap(pagetable, memdesc);

	/*
+10 −1
Original line number Diff line number Diff line
@@ -63,6 +63,14 @@ struct dm_verity_prefetch_work {
struct buffer_aux {
	int hash_verified;
};
/*
 * While system shutdown, skip verity work for I/O error.
 */
static inline bool verity_is_system_shutting_down(void)
{
	return system_state == SYSTEM_HALT || system_state == SYSTEM_POWER_OFF
		|| system_state == SYSTEM_RESTART;
}

/*
 * Initialize struct buffer_aux for a freshly created buffer.
@@ -509,7 +517,8 @@ static void verity_end_io(struct bio *bio)
{
	struct dm_verity_io *io = bio->bi_private;

	if (bio->bi_error && !verity_fec_is_enabled(io->v)) {
	if (bio->bi_error &&
		(!verity_fec_is_enabled(io->v) || verity_is_system_shutting_down())) {
		verity_finish_io(io, bio->bi_error);
		return;
	}
+49 −80
Original line number Diff line number Diff line
/*
 * QTI Secure Execution Environment Communicator (QSEECOM) driver
 *
 * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -3542,53 +3542,60 @@ static int qseecom_send_cmd(struct qseecom_dev_handle *data, void __user *argp)

int __boundary_checks_offset(struct qseecom_send_modfd_cmd_req *req,
			struct qseecom_send_modfd_listener_resp *lstnr_resp,
			struct qseecom_dev_handle *data, int i) {
			struct qseecom_dev_handle *data, int i, size_t size)
{
	char *curr_field = NULL;
	char *temp_field = NULL;
	int j = 0;

	if ((data->type != QSEECOM_LISTENER_SERVICE) &&
						(req->ifd_data[i].fd > 0)) {
		if ((req->cmd_req_len < sizeof(uint32_t)) ||
		if ((req->cmd_req_len < size) ||
			(req->ifd_data[i].cmd_buf_offset >
			req->cmd_req_len - sizeof(uint32_t))) {
			req->cmd_req_len - size)) {
			pr_err("Invalid offset (req len) 0x%x\n",
				req->ifd_data[i].cmd_buf_offset);
			return -EINVAL;
		}
	} else if ((data->type == QSEECOM_LISTENER_SERVICE) &&
					(lstnr_resp->ifd_data[i].fd > 0)) {
		if ((lstnr_resp->resp_len < sizeof(uint32_t)) ||
			(lstnr_resp->ifd_data[i].cmd_buf_offset >
			lstnr_resp->resp_len - sizeof(uint32_t))) {
			pr_err("Invalid offset (lstnr resp len) 0x%x\n",
				lstnr_resp->ifd_data[i].cmd_buf_offset);
			return -EINVAL;
		}
	}
	return 0;
}

static int __boundary_checks_offset_64(struct qseecom_send_modfd_cmd_req *req,
			struct qseecom_send_modfd_listener_resp *lstnr_resp,
			struct qseecom_dev_handle *data, int i)
{

	if ((data->type != QSEECOM_LISTENER_SERVICE) &&
						(req->ifd_data[i].fd > 0)) {
		if ((req->cmd_req_len < sizeof(uint64_t)) ||
			(req->ifd_data[i].cmd_buf_offset >
			req->cmd_req_len - sizeof(uint64_t))) {
			pr_err("Invalid offset (req len) 0x%x\n",
		curr_field = (char *) (req->cmd_req_buf +
				req->ifd_data[i].cmd_buf_offset);
		for (j = 0; j < MAX_ION_FD; j++) {
			if ((req->ifd_data[j].fd > 0) && i != j) {
				temp_field = (char *) (req->cmd_req_buf +
					req->ifd_data[j].cmd_buf_offset);
				if (temp_field >= curr_field && temp_field <
					(curr_field + size)) {
					pr_err("Invalid field offset 0x%x\n",
					req->ifd_data[i].cmd_buf_offset);
					return -EINVAL;
				}
			}
		}
	} else if ((data->type == QSEECOM_LISTENER_SERVICE) &&
					(lstnr_resp->ifd_data[i].fd > 0)) {
		if ((lstnr_resp->resp_len < sizeof(uint64_t)) ||
		if ((lstnr_resp->resp_len < size) ||
			(lstnr_resp->ifd_data[i].cmd_buf_offset >
			lstnr_resp->resp_len - sizeof(uint64_t))) {
			lstnr_resp->resp_len - size)) {
			pr_err("Invalid offset (lstnr resp len) 0x%x\n",
				lstnr_resp->ifd_data[i].cmd_buf_offset);
			return -EINVAL;
		}

		curr_field = (char *) (lstnr_resp->resp_buf_ptr +
				lstnr_resp->ifd_data[i].cmd_buf_offset);
		for (j = 0; j < MAX_ION_FD; j++) {
			if ((lstnr_resp->ifd_data[j].fd > 0) && i != j) {
				temp_field = (char *) lstnr_resp->resp_buf_ptr +
					lstnr_resp->ifd_data[j].cmd_buf_offset;
				if (temp_field >= curr_field && temp_field <
					(curr_field + size)) {
					pr_err("Invalid lstnr field offset 0x%x\n",
					lstnr_resp->ifd_data[i].cmd_buf_offset);
					return -EINVAL;
				}
			}
		}
	}
	return 0;
}
@@ -3671,8 +3678,10 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup,
		if (sg_ptr->nents == 1) {
			uint32_t *update;

			if (__boundary_checks_offset(req, lstnr_resp, data, i))
			if (__boundary_checks_offset(req, lstnr_resp, data, i,
				sizeof(uint32_t)))
				goto err;

			if ((data->type == QSEECOM_CLIENT_APP &&
				(data->client.app_arch == ELFCLASS32 ||
				data->client.app_arch == ELFCLASS64)) ||
@@ -3703,30 +3712,10 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup,
			struct qseecom_sg_entry *update;
			int j = 0;

			if ((data->type != QSEECOM_LISTENER_SERVICE) &&
					(req->ifd_data[i].fd > 0)) {

				if ((req->cmd_req_len <
					 SG_ENTRY_SZ * sg_ptr->nents) ||
					(req->ifd_data[i].cmd_buf_offset >
						(req->cmd_req_len -
						SG_ENTRY_SZ * sg_ptr->nents))) {
					pr_err("Invalid offset = 0x%x\n",
					req->ifd_data[i].cmd_buf_offset);
			if (__boundary_checks_offset(req, lstnr_resp, data, i,
				(SG_ENTRY_SZ * sg_ptr->nents)))
				goto err;
				}

			} else if ((data->type == QSEECOM_LISTENER_SERVICE) &&
					(lstnr_resp->ifd_data[i].fd > 0)) {

				if ((lstnr_resp->resp_len <
						SG_ENTRY_SZ * sg_ptr->nents) ||
				(lstnr_resp->ifd_data[i].cmd_buf_offset >
						(lstnr_resp->resp_len -
						SG_ENTRY_SZ * sg_ptr->nents))) {
					goto err;
				}
			}
			if ((data->type == QSEECOM_CLIENT_APP &&
				(data->client.app_arch == ELFCLASS32 ||
				data->client.app_arch == ELFCLASS64)) ||
@@ -3952,9 +3941,10 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup,
		if (sg_ptr->nents == 1) {
			uint64_t *update_64bit;

			if (__boundary_checks_offset_64(req, lstnr_resp,
							data, i))
			if (__boundary_checks_offset(req, lstnr_resp, data, i,
				sizeof(uint64_t)))
				goto err;

				/* 64bit app uses 64bit address */
			update_64bit = (uint64_t *) field;
			*update_64bit = cleanup ? 0 :
@@ -3964,30 +3954,9 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup,
			struct qseecom_sg_entry_64bit *update_64bit;
			int j = 0;

			if ((data->type != QSEECOM_LISTENER_SERVICE) &&
					(req->ifd_data[i].fd > 0)) {

				if ((req->cmd_req_len <
					 SG_ENTRY_SZ_64BIT * sg_ptr->nents) ||
					(req->ifd_data[i].cmd_buf_offset >
					(req->cmd_req_len -
					SG_ENTRY_SZ_64BIT * sg_ptr->nents))) {
					pr_err("Invalid offset = 0x%x\n",
					req->ifd_data[i].cmd_buf_offset);
					goto err;
				}

			} else if ((data->type == QSEECOM_LISTENER_SERVICE) &&
					(lstnr_resp->ifd_data[i].fd > 0)) {

				if ((lstnr_resp->resp_len <
					SG_ENTRY_SZ_64BIT * sg_ptr->nents) ||
				(lstnr_resp->ifd_data[i].cmd_buf_offset >
						(lstnr_resp->resp_len -
					SG_ENTRY_SZ_64BIT * sg_ptr->nents))) {
			if (__boundary_checks_offset(req, lstnr_resp, data, i,
				(SG_ENTRY_SZ_64BIT * sg_ptr->nents)))
				goto err;
				}
			}
			/* 64bit app uses 64bit address */
			update_64bit = (struct qseecom_sg_entry_64bit *)field;
			for (j = 0; j < sg_ptr->nents; j++) {
Loading