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

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

Merge "Merge android-4.9.126 (a8c1ea6c) into msm-4.9"

parents ac218459 bdeb1590
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 125
SUBLEVEL = 126
EXTRAVERSION =
NAME = Roaring Lionus

+28 −36
Original line number Diff line number Diff line
@@ -526,24 +526,19 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, const char __user *, path,
SYSCALL_DEFINE1(osf_utsname, char __user *, name)
{
	int error;
	char tmp[5 * 32];

	down_read(&uts_sem);
	error = -EFAULT;
	if (copy_to_user(name + 0, utsname()->sysname, 32))
		goto out;
	if (copy_to_user(name + 32, utsname()->nodename, 32))
		goto out;
	if (copy_to_user(name + 64, utsname()->release, 32))
		goto out;
	if (copy_to_user(name + 96, utsname()->version, 32))
		goto out;
	if (copy_to_user(name + 128, utsname()->machine, 32))
		goto out;

	error = 0;
 out:
	memcpy(tmp + 0 * 32, utsname()->sysname, 32);
	memcpy(tmp + 1 * 32, utsname()->nodename, 32);
	memcpy(tmp + 2 * 32, utsname()->release, 32);
	memcpy(tmp + 3 * 32, utsname()->version, 32);
	memcpy(tmp + 4 * 32, utsname()->machine, 32);
	up_read(&uts_sem);
	return error;

	if (copy_to_user(name, tmp, sizeof(tmp)))
		return -EFAULT;
	return 0;
}

SYSCALL_DEFINE0(getpagesize)
@@ -561,24 +556,22 @@ SYSCALL_DEFINE0(getdtablesize)
 */
SYSCALL_DEFINE2(osf_getdomainname, char __user *, name, int, namelen)
{
	unsigned len;
	int i;

	if (!access_ok(VERIFY_WRITE, name, namelen))
		return -EFAULT;
	int len, err = 0;
	char *kname;
	char tmp[32];

	len = namelen;
	if (len > 32)
		len = 32;
	if (namelen < 0 || namelen > 32)
		namelen = 32;

	down_read(&uts_sem);
	for (i = 0; i < len; ++i) {
		__put_user(utsname()->domainname[i], name + i);
		if (utsname()->domainname[i] == '\0')
			break;
	}
	kname = utsname()->domainname;
	len = strnlen(kname, namelen);
	len = min(len + 1, namelen);
	memcpy(tmp, kname, len);
	up_read(&uts_sem);

	if (copy_to_user(name, tmp, len))
		return -EFAULT;
	return 0;
}

@@ -741,13 +734,14 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
	};
	unsigned long offset;
	const char *res;
	long len, err = -EINVAL;
	long len;
	char tmp[__NEW_UTS_LEN + 1];

	offset = command-1;
	if (offset >= ARRAY_SIZE(sysinfo_table)) {
		/* Digital UNIX has a few unpublished interfaces here */
		printk("sysinfo(%d)", command);
		goto out;
		return -EINVAL;
	}

	down_read(&uts_sem);
@@ -755,13 +749,11 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
	len = strlen(res)+1;
	if ((unsigned long)len > (unsigned long)count)
		len = count;
	if (copy_to_user(buf, res, len))
		err = -EFAULT;
	else
		err = 0;
	memcpy(tmp, res, len);
	up_read(&uts_sem);
 out:
	return err;
	if (copy_to_user(buf, tmp, len))
		return -EFAULT;
	return 0;
}

SYSCALL_DEFINE5(osf_getsysinfo, unsigned long, op, void __user *, buffer,
+1 −0
Original line number Diff line number Diff line
@@ -205,6 +205,7 @@
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <0x70>;
			reset-gpio = <&gpio TEGRA_GPIO(BB, 0) GPIO_ACTIVE_LOW>;
		};
	};

+0 −3
Original line number Diff line number Diff line
@@ -190,9 +190,6 @@ struct fadump_crash_info_header {
	struct cpumask	online_mask;
};

/* Crash memory ranges */
#define INIT_CRASHMEM_RANGES	(INIT_MEMBLOCK_REGIONS + 2)

struct fad_crash_memory_ranges {
	unsigned long long	base;
	unsigned long long	size;
+78 −14
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#include <linux/crash_dump.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/slab.h>

#include <asm/page.h>
#include <asm/prom.h>
@@ -48,8 +49,10 @@ static struct fadump_mem_struct fdm;
static const struct fadump_mem_struct *fdm_active;

static DEFINE_MUTEX(fadump_mutex);
struct fad_crash_memory_ranges crash_memory_ranges[INIT_CRASHMEM_RANGES];
struct fad_crash_memory_ranges *crash_memory_ranges;
int crash_memory_ranges_size;
int crash_mem_ranges;
int max_crash_mem_ranges;

/* Scan the Firmware Assisted dump configuration details. */
int __init early_init_dt_scan_fw_dump(unsigned long node,
@@ -731,38 +734,88 @@ static int __init process_fadump(const struct fadump_mem_struct *fdm_active)
	return 0;
}

static inline void fadump_add_crash_memory(unsigned long long base,
static void free_crash_memory_ranges(void)
{
	kfree(crash_memory_ranges);
	crash_memory_ranges = NULL;
	crash_memory_ranges_size = 0;
	max_crash_mem_ranges = 0;
}

/*
 * Allocate or reallocate crash memory ranges array in incremental units
 * of PAGE_SIZE.
 */
static int allocate_crash_memory_ranges(void)
{
	struct fad_crash_memory_ranges *new_array;
	u64 new_size;

	new_size = crash_memory_ranges_size + PAGE_SIZE;
	pr_debug("Allocating %llu bytes of memory for crash memory ranges\n",
		 new_size);

	new_array = krealloc(crash_memory_ranges, new_size, GFP_KERNEL);
	if (new_array == NULL) {
		pr_err("Insufficient memory for setting up crash memory ranges\n");
		free_crash_memory_ranges();
		return -ENOMEM;
	}

	crash_memory_ranges = new_array;
	crash_memory_ranges_size = new_size;
	max_crash_mem_ranges = (new_size /
				sizeof(struct fad_crash_memory_ranges));
	return 0;
}

static inline int fadump_add_crash_memory(unsigned long long base,
					  unsigned long long end)
{
	if (base == end)
		return;
		return 0;

	if (crash_mem_ranges == max_crash_mem_ranges) {
		int ret;

		ret = allocate_crash_memory_ranges();
		if (ret)
			return ret;
	}

	pr_debug("crash_memory_range[%d] [%#016llx-%#016llx], %#llx bytes\n",
		crash_mem_ranges, base, end - 1, (end - base));
	crash_memory_ranges[crash_mem_ranges].base = base;
	crash_memory_ranges[crash_mem_ranges].size = end - base;
	crash_mem_ranges++;
	return 0;
}

static void fadump_exclude_reserved_area(unsigned long long start,
static int fadump_exclude_reserved_area(unsigned long long start,
					unsigned long long end)
{
	unsigned long long ra_start, ra_end;
	int ret = 0;

	ra_start = fw_dump.reserve_dump_area_start;
	ra_end = ra_start + fw_dump.reserve_dump_area_size;

	if ((ra_start < end) && (ra_end > start)) {
		if ((start < ra_start) && (end > ra_end)) {
			fadump_add_crash_memory(start, ra_start);
			fadump_add_crash_memory(ra_end, end);
			ret = fadump_add_crash_memory(start, ra_start);
			if (ret)
				return ret;

			ret = fadump_add_crash_memory(ra_end, end);
		} else if (start < ra_start) {
			fadump_add_crash_memory(start, ra_start);
			ret = fadump_add_crash_memory(start, ra_start);
		} else if (ra_end < end) {
			fadump_add_crash_memory(ra_end, end);
			ret = fadump_add_crash_memory(ra_end, end);
		}
	} else
		fadump_add_crash_memory(start, end);
		ret = fadump_add_crash_memory(start, end);

	return ret;
}

static int fadump_init_elfcore_header(char *bufp)
@@ -802,10 +855,11 @@ static int fadump_init_elfcore_header(char *bufp)
 * Traverse through memblock structure and setup crash memory ranges. These
 * ranges will be used create PT_LOAD program headers in elfcore header.
 */
static void fadump_setup_crash_memory_ranges(void)
static int fadump_setup_crash_memory_ranges(void)
{
	struct memblock_region *reg;
	unsigned long long start, end;
	int ret;

	pr_debug("Setup crash memory ranges.\n");
	crash_mem_ranges = 0;
@@ -816,7 +870,9 @@ static void fadump_setup_crash_memory_ranges(void)
	 * specified during fadump registration. We need to create a separate
	 * program header for this chunk with the correct offset.
	 */
	fadump_add_crash_memory(RMA_START, fw_dump.boot_memory_size);
	ret = fadump_add_crash_memory(RMA_START, fw_dump.boot_memory_size);
	if (ret)
		return ret;

	for_each_memblock(memory, reg) {
		start = (unsigned long long)reg->base;
@@ -825,8 +881,12 @@ static void fadump_setup_crash_memory_ranges(void)
			start = fw_dump.boot_memory_size;

		/* add this range excluding the reserved dump area. */
		fadump_exclude_reserved_area(start, end);
		ret = fadump_exclude_reserved_area(start, end);
		if (ret)
			return ret;
	}

	return 0;
}

/*
@@ -950,6 +1010,7 @@ static void register_fadump(void)
{
	unsigned long addr;
	void *vaddr;
	int ret;

	/*
	 * If no memory is reserved then we can not register for firmware-
@@ -958,7 +1019,9 @@ static void register_fadump(void)
	if (!fw_dump.reserve_dump_area_size)
		return;

	fadump_setup_crash_memory_ranges();
	ret = fadump_setup_crash_memory_ranges();
	if (ret)
		return ret;

	addr = be64_to_cpu(fdm.rmr_region.destination_address) + be64_to_cpu(fdm.rmr_region.source_len);
	/* Initialize fadump crash info header. */
@@ -1036,6 +1099,7 @@ void fadump_cleanup(void)
	} else if (fw_dump.dump_registered) {
		/* Un-register Firmware-assisted dump if it was registered. */
		fadump_unregister_dump(&fdm);
		free_crash_memory_ranges();
	}
}

Loading