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

Commit 98b8cd7f authored by Michal Suchanek's avatar Michal Suchanek Committed by Michael Ellerman
Browse files

powerpc/fadump: Return error when fadump registration fails



 - log an error message when registration fails and no error code listed
   in the switch is returned
 - translate the hv error code to posix error code and return it from
   fw_register
 - return the posix error code from fw_register to the process writing
   to sysfs
 - return EEXIST on re-registration
 - return success on deregistration when fadump is not registered
 - return ENODEV when no memory is reserved for fadump

Signed-off-by: default avatarMichal Suchanek <msuchanek@suse.de>
Tested-by: default avatarHari Bathini <hbathini@linux.vnet.ibm.com>
[mpe: Use pr_err() to shrink the error print]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent f782ddf2
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -377,9 +377,9 @@ static int __init early_fadump_param(char *p)
}
early_param("fadump", early_fadump_param);

static void register_fw_dump(struct fadump_mem_struct *fdm)
static int register_fw_dump(struct fadump_mem_struct *fdm)
{
	int rc;
	int rc, err;
	unsigned int wait_time;

	pr_debug("Registering for firmware-assisted kernel dump...\n");
@@ -396,7 +396,11 @@ static void register_fw_dump(struct fadump_mem_struct *fdm)

	} while (wait_time);

	err = -EIO;
	switch (rc) {
	default:
		pr_err("Failed to register. Unknown Error(%d).\n", rc);
		break;
	case -1:
		printk(KERN_ERR "Failed to register firmware-assisted kernel"
			" dump. Hardware Error(%d).\n", rc);
@@ -404,18 +408,22 @@ static void register_fw_dump(struct fadump_mem_struct *fdm)
	case -3:
		printk(KERN_ERR "Failed to register firmware-assisted kernel"
			" dump. Parameter Error(%d).\n", rc);
		err = -EINVAL;
		break;
	case -9:
		printk(KERN_ERR "firmware-assisted kernel dump is already "
			" registered.");
		fw_dump.dump_registered = 1;
		err = -EEXIST;
		break;
	case 0:
		printk(KERN_INFO "firmware-assisted kernel dump registration"
			" is successful\n");
		fw_dump.dump_registered = 1;
		err = 0;
		break;
	}
	return err;
}

void crash_fadump(struct pt_regs *regs, const char *str)
@@ -956,7 +964,7 @@ static unsigned long init_fadump_header(unsigned long addr)
	return addr;
}

static void register_fadump(void)
static int register_fadump(void)
{
	unsigned long addr;
	void *vaddr;
@@ -966,7 +974,7 @@ static void register_fadump(void)
	 * assisted dump.
	 */
	if (!fw_dump.reserve_dump_area_size)
		return;
		return -ENODEV;

	fadump_setup_crash_memory_ranges();

@@ -979,7 +987,7 @@ static void register_fadump(void)
	fadump_create_elfcore_headers(vaddr);

	/* register the future kernel dump with firmware. */
	register_fw_dump(&fdm);
	return register_fw_dump(&fdm);
}

static int fadump_unregister_dump(struct fadump_mem_struct *fdm)
@@ -1161,7 +1169,6 @@ static ssize_t fadump_register_store(struct kobject *kobj,
	switch (buf[0]) {
	case '0':
		if (fw_dump.dump_registered == 0) {
			ret = -EINVAL;
			goto unlock_out;
		}
		/* Un-register Firmware-assisted dump */
@@ -1169,11 +1176,11 @@ static ssize_t fadump_register_store(struct kobject *kobj,
		break;
	case '1':
		if (fw_dump.dump_registered == 1) {
			ret = -EINVAL;
			ret = -EEXIST;
			goto unlock_out;
		}
		/* Register Firmware-assisted dump */
		register_fadump();
		ret = register_fadump();
		break;
	default:
		ret = -EINVAL;