Kexec Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] kexec/ppc64: leverage kexec_file_load support
@ 2018-03-03 19:00 Hari Bathini
  2018-03-19 18:57 ` Thiago Jung Bauermann
  0 siblings, 1 reply; 4+ messages in thread
From: Hari Bathini @ 2018-03-03 19:00 UTC (permalink / raw)
  To: Simon Horman; +Cc: bauerman, Michael Ellerman, Kexec-ml, Geoff Levand

PPC64 kernel now supports kexec_file_load system call. Leverage it by
enabling that support here. Note that loading crash kernel with this
system call is not yet supported in the kernel and trying to load one
will fail with '-ENOTSUPP' error.

Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
---
 kexec/arch/ppc64/kexec-elf-ppc64.c |   84 ++++++++++++++++++++++++++++++++++++
 kexec/kexec-syscall.h              |    3 +
 2 files changed, 87 insertions(+)

diff --git a/kexec/arch/ppc64/kexec-elf-ppc64.c b/kexec/arch/ppc64/kexec-elf-ppc64.c
index ddd3de8..2742cd6 100644
--- a/kexec/arch/ppc64/kexec-elf-ppc64.c
+++ b/kexec/arch/ppc64/kexec-elf-ppc64.c
@@ -93,6 +93,85 @@ static int read_prop(char *name, void *value, size_t len)
 	return 0;
 }
 
+static int elf_ppc64_load_file(int argc, char **argv, struct kexec_info *info)
+{
+	int ret = 0;
+	char *cmdline, *dtb;
+	int opt, cmdline_len = 0;
+
+	/* See options.h -- add any more there, too. */
+	static const struct option options[] = {
+		KEXEC_ARCH_OPTIONS
+		{ "command-line",       1, NULL, OPT_APPEND },
+		{ "append",             1, NULL, OPT_APPEND },
+		{ "ramdisk",            1, NULL, OPT_RAMDISK },
+		{ "initrd",             1, NULL, OPT_RAMDISK },
+		{ "devicetreeblob",     1, NULL, OPT_DEVICETREEBLOB },
+		{ "dtb",                1, NULL, OPT_DEVICETREEBLOB },
+		{ "args-linux",		0, NULL, OPT_ARGS_IGNORE },
+		{ 0,                    0, NULL, 0 },
+	};
+
+	static const char short_options[] = KEXEC_OPT_STR "";
+
+	/* Parse command line arguments */
+	cmdline = 0;
+	dtb = 0;
+	ramdisk = 0;
+
+	while ((opt = getopt_long(argc, argv, short_options,
+					options, 0)) != -1) {
+		switch (opt) {
+		default:
+			/* Ignore core options */
+			if (opt < OPT_ARCH_MAX)
+				break;
+		case OPT_APPEND:
+			cmdline = optarg;
+			break;
+		case OPT_RAMDISK:
+			ramdisk = optarg;
+			break;
+		case OPT_DEVICETREEBLOB:
+			dtb = optarg;
+			break;
+		case OPT_ARGS_IGNORE:
+			break;
+		}
+	}
+
+	if (dtb)
+		die("--dtb not supported while using --kexec-file-syscall.\n");
+
+	if (reuse_initrd)
+		die("--reuseinitrd not supported with --kexec-file-syscall.\n");
+
+	if (cmdline) {
+		cmdline_len = strlen(cmdline) + 1;
+	} else {
+		cmdline = strdup("\0");
+		cmdline_len = 1;
+	}
+
+	if (ramdisk) {
+		info->initrd_fd = open(ramdisk, O_RDONLY);
+		if (info->initrd_fd == -1) {
+			fprintf(stderr, "Could not open initrd file %s:%s\n",
+					ramdisk, strerror(errno));
+			ret = -1;
+			goto out;
+		}
+	}
+
+	info->command_line = cmdline;
+	info->command_line_len = cmdline_len;
+	return ret;
+out:
+	if (cmdline_len == 1)
+		free(cmdline);
+	return ret;
+}
+
 int elf_ppc64_load(int argc, char **argv, const char *buf, off_t len,
 			struct kexec_info *info)
 {
@@ -117,6 +196,9 @@ int elf_ppc64_load(int argc, char **argv, const char *buf, off_t len,
 	uint32_t my_run_at_load;
 	unsigned int slave_code[256/sizeof (unsigned int)], master_entry;
 
+	if (info->file_mode)
+		return elf_ppc64_load_file(argc, argv, info);
+
 	/* See options.h -- add any more there, too. */
 	static const struct option options[] = {
 		KEXEC_ARCH_OPTIONS
@@ -387,6 +469,8 @@ void elf_ppc64_usage(void)
 	fprintf(stderr, "     --ramdisk=<filename> Initial RAM disk.\n");
 	fprintf(stderr, "     --initrd=<filename> same as --ramdisk.\n");
 	fprintf(stderr, "     --devicetreeblob=<filename> Specify device tree blob file.\n");
+	fprintf(stderr, "                                 ");
+	fprintf(stderr, "Not applicable while using --kexec-file-syscall.\n");
 	fprintf(stderr, "     --dtb=<filename> same as --devicetreeblob.\n");
 
 	fprintf(stderr, "elf support is still broken\n");
diff --git a/kexec/kexec-syscall.h b/kexec/kexec-syscall.h
index 3b5c528..33638c2 100644
--- a/kexec/kexec-syscall.h
+++ b/kexec/kexec-syscall.h
@@ -61,6 +61,9 @@
 #ifdef __x86_64__
 #define __NR_kexec_file_load	320
 #endif
+#ifdef __powerpc64__
+#define __NR_kexec_file_load	382
+#endif
 
 #ifndef __NR_kexec_file_load
 /* system call not available for the arch */


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] kexec/ppc64: leverage kexec_file_load support
  2018-03-03 19:00 [PATCH] kexec/ppc64: leverage kexec_file_load support Hari Bathini
@ 2018-03-19 18:57 ` Thiago Jung Bauermann
  2018-03-26  7:19   ` Simon Horman
  0 siblings, 1 reply; 4+ messages in thread
From: Thiago Jung Bauermann @ 2018-03-19 18:57 UTC (permalink / raw)
  To: Hari Bathini; +Cc: Geoff Levand, Michael Ellerman, Simon Horman, Kexec-ml


Hello Hari,

Hari Bathini <hbathini@linux.vnet.ibm.com> writes:

> PPC64 kernel now supports kexec_file_load system call. Leverage it by
> enabling that support here. Note that loading crash kernel with this
> system call is not yet supported in the kernel and trying to load one
> will fail with '-ENOTSUPP' error.
>
> Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
> ---
>  kexec/arch/ppc64/kexec-elf-ppc64.c |   84 ++++++++++++++++++++++++++++++++++++
>  kexec/kexec-syscall.h              |    3 +
>  2 files changed, 87 insertions(+)

Thanks for implementing this! Looks good to me, just one nit below.
Regardless of that:

Reviewed-by: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>

> diff --git a/kexec/arch/ppc64/kexec-elf-ppc64.c b/kexec/arch/ppc64/kexec-elf-ppc64.c
> index ddd3de8..2742cd6 100644
> --- a/kexec/arch/ppc64/kexec-elf-ppc64.c
> +++ b/kexec/arch/ppc64/kexec-elf-ppc64.c

<snip>

> @@ -117,6 +196,9 @@ int elf_ppc64_load(int argc, char **argv, const char *buf, off_t len,
>  	uint32_t my_run_at_load;
>  	unsigned int slave_code[256/sizeof (unsigned int)], master_entry;
>
> +	if (info->file_mode)
> +		return elf_ppc64_load_file(argc, argv, info);
> +
>  	/* See options.h -- add any more there, too. */
>  	static const struct option options[] = {
>  		KEXEC_ARCH_OPTIONS

This is placing executable code between variable declarations. It may be
fine for gcc but it's more idiomatic C to put it after all variable
declarations. But perhaps the kexec-tools style is fine with it?

--
Thiago Jung Bauermann
IBM Linux Technology Center


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] kexec/ppc64: leverage kexec_file_load support
  2018-03-19 18:57 ` Thiago Jung Bauermann
@ 2018-03-26  7:19   ` Simon Horman
  2018-03-26  8:49     ` Hari Bathini
  0 siblings, 1 reply; 4+ messages in thread
From: Simon Horman @ 2018-03-26  7:19 UTC (permalink / raw)
  To: Thiago Jung Bauermann
  Cc: Hari Bathini, Geoff Levand, Kexec-ml, Michael Ellerman

On Mon, Mar 19, 2018 at 03:57:11PM -0300, Thiago Jung Bauermann wrote:
> 
> Hello Hari,
> 
> Hari Bathini <hbathini@linux.vnet.ibm.com> writes:
> 
> > PPC64 kernel now supports kexec_file_load system call. Leverage it by
> > enabling that support here. Note that loading crash kernel with this
> > system call is not yet supported in the kernel and trying to load one
> > will fail with '-ENOTSUPP' error.
> >
> > Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
> > ---
> >  kexec/arch/ppc64/kexec-elf-ppc64.c |   84 ++++++++++++++++++++++++++++++++++++
> >  kexec/kexec-syscall.h              |    3 +
> >  2 files changed, 87 insertions(+)
> 
> Thanks for implementing this! Looks good to me, just one nit below.
> Regardless of that:
> 
> Reviewed-by: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
> 
> > diff --git a/kexec/arch/ppc64/kexec-elf-ppc64.c b/kexec/arch/ppc64/kexec-elf-ppc64.c
> > index ddd3de8..2742cd6 100644
> > --- a/kexec/arch/ppc64/kexec-elf-ppc64.c
> > +++ b/kexec/arch/ppc64/kexec-elf-ppc64.c
> 
> <snip>
> 
> > @@ -117,6 +196,9 @@ int elf_ppc64_load(int argc, char **argv, const char *buf, off_t len,
> >  	uint32_t my_run_at_load;
> >  	unsigned int slave_code[256/sizeof (unsigned int)], master_entry;
> >
> > +	if (info->file_mode)
> > +		return elf_ppc64_load_file(argc, argv, info);
> > +
> >  	/* See options.h -- add any more there, too. */
> >  	static const struct option options[] = {
> >  		KEXEC_ARCH_OPTIONS
> 
> This is placing executable code between variable declarations. It may be
> fine for gcc but it's more idiomatic C to put it after all variable
> declarations. But perhaps the kexec-tools style is fine with it?

I'd rather we avoid proliferating this style in the kexec code.
Hari, could you respin this patch?

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] kexec/ppc64: leverage kexec_file_load support
  2018-03-26  7:19   ` Simon Horman
@ 2018-03-26  8:49     ` Hari Bathini
  0 siblings, 0 replies; 4+ messages in thread
From: Hari Bathini @ 2018-03-26  8:49 UTC (permalink / raw)
  To: Simon Horman, Thiago Jung Bauermann
  Cc: Geoff Levand, Michael Ellerman, Kexec-ml



On Monday 26 March 2018 12:49 PM, Simon Horman wrote:
> On Mon, Mar 19, 2018 at 03:57:11PM -0300, Thiago Jung Bauermann wrote:
>> Hello Hari,
>>
>> Hari Bathini <hbathini@linux.vnet.ibm.com> writes:
>>
>>> PPC64 kernel now supports kexec_file_load system call. Leverage it by
>>> enabling that support here. Note that loading crash kernel with this
>>> system call is not yet supported in the kernel and trying to load one
>>> will fail with '-ENOTSUPP' error.
>>>
>>> Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
>>> ---
>>>   kexec/arch/ppc64/kexec-elf-ppc64.c |   84 ++++++++++++++++++++++++++++++++++++
>>>   kexec/kexec-syscall.h              |    3 +
>>>   2 files changed, 87 insertions(+)
>> Thanks for implementing this! Looks good to me, just one nit below.
>> Regardless of that:
>>
>> Reviewed-by: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>

Thanks for reviewing..

>>> diff --git a/kexec/arch/ppc64/kexec-elf-ppc64.c b/kexec/arch/ppc64/kexec-elf-ppc64.c
>>> index ddd3de8..2742cd6 100644
>>> --- a/kexec/arch/ppc64/kexec-elf-ppc64.c
>>> +++ b/kexec/arch/ppc64/kexec-elf-ppc64.c
>> <snip>
>>
>>> @@ -117,6 +196,9 @@ int elf_ppc64_load(int argc, char **argv, const char *buf, off_t len,
>>>   	uint32_t my_run_at_load;
>>>   	unsigned int slave_code[256/sizeof (unsigned int)], master_entry;
>>>
>>> +	if (info->file_mode)
>>> +		return elf_ppc64_load_file(argc, argv, info);
>>> +
>>>   	/* See options.h -- add any more there, too. */
>>>   	static const struct option options[] = {
>>>   		KEXEC_ARCH_OPTIONS
>> This is placing executable code between variable declarations. It may be
>> fine for gcc but it's more idiomatic C to put it after all variable
>> declarations. But perhaps the kexec-tools style is fine with it?
> I'd rather we avoid proliferating this style in the kexec code.
> Hari, could you respin this patch?
>

Posted v2 with the necessary change...

Thanks
Hari


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-03-26  8:49 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-03-03 19:00 [PATCH] kexec/ppc64: leverage kexec_file_load support Hari Bathini
2018-03-19 18:57 ` Thiago Jung Bauermann
2018-03-26  7:19   ` Simon Horman
2018-03-26  8:49     ` Hari Bathini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox