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

Commit 17877252 authored by Mao Jinlong's avatar Mao Jinlong Committed by Gerrit - the friendly Code Review server
Browse files

coresight-tmc: Fix span multiple pages error during tmc_read



The length from tmc_sg_table_get_data can't be more than one page
size. Otherwise issue will happen when do user_copy.

Change-Id: I23a98f79c3b299deada22fbd12d3e9ffd91fd309
Signed-off-by: default avatarMao Jinlong <jinlmao@codeaurora.org>
parent db92782e
Loading
Loading
Loading
Loading
+3 −18
Original line number Diff line number Diff line
@@ -343,11 +343,10 @@ void tmc_sg_table_sync_table(struct tmc_sg_table *sg_table)
ssize_t tmc_sg_table_get_data(struct tmc_sg_table *sg_table,
			      u64 offset, size_t len, char **bufpp)
{
	size_t size, tmp_len;
	size_t size;
	int pg_idx = offset >> PAGE_SHIFT;
	int pg_offset = offset & (PAGE_SIZE - 1);
	struct tmc_pages *data_pages = &sg_table->data_pages;
	int i;

	size = tmc_sg_table_buf_size(sg_table);
	if (offset >= size)
@@ -356,24 +355,10 @@ ssize_t tmc_sg_table_get_data(struct tmc_sg_table *sg_table,
	/* Make sure we don't go beyond the end */
	len = (len < (size - offset)) ? len : size - offset;
	/* Respect the page boundaries */
	if (len > (PAGE_SIZE - pg_offset)) {
		tmp_len = PAGE_SIZE - pg_offset;
		for (i = 0; i < (data_pages->nr_pages - pg_idx); i++) {
			if (i < (data_pages->nr_pages - pg_idx - 1)
			&& (page_address(data_pages->pages[pg_idx + i + 1])
			- page_address(data_pages->pages[pg_idx + i]))
					== PAGE_SIZE) {
				if ((len - tmp_len) < PAGE_SIZE)
					break;
				tmp_len += PAGE_SIZE;
			} else {
				len = tmp_len;
				break;
			}
		}
	}
	len = (len < (PAGE_SIZE - pg_offset)) ? len : (PAGE_SIZE - pg_offset);
	if (len > 0)
		*bufpp = page_address(data_pages->pages[pg_idx]) + pg_offset;

	return len;
}