[PATCH 06/06] sh: Add vmlinux support

Simon Horman horms at verge.net.au
Tue Aug 26 22:39:08 EDT 2008


On Tue, Aug 26, 2008 at 08:12:32PM +0900, Magnus Damm wrote:
> From: Magnus Damm <damm at igel.co.jp>
> 
> Add SuperH vmlinux support through a zero-page aware elf loader. Only for
> kexec at this point, in the future kdump support will be added.

Hi Magnus,

If these series of patches are fine by you then they are fine by me.
I just have a few minor issues with this last patch.

> 
> Signed-off-by: Magnus Damm <damm at igel.co.jp>
> ---
> 
>  kexec/arch/sh/Makefile       |    1 
>  kexec/arch/sh/kexec-elf-sh.c |  114 ++++++++++++++++++++++++++++++++++++++++++
>  kexec/arch/sh/kexec-sh.c     |    1 
>  kexec/arch/sh/kexec-sh.h     |    5 +
>  4 files changed, 121 insertions(+)
> 
> --- 0004/kexec/arch/sh/Makefile
> +++ work/kexec/arch/sh/Makefile	2008-08-22 13:17:18.000000000 +0900
> @@ -4,6 +4,7 @@
>  sh_KEXEC_SRCS += kexec/arch/sh/kexec-sh.c
>  sh_KEXEC_SRCS += kexec/arch/sh/kexec-zImage-sh.c
>  sh_KEXEC_SRCS += kexec/arch/sh/kexec-netbsd-sh.c
> +sh_KEXEC_SRCS += kexec/arch/sh/kexec-elf-sh.c
>  sh_KEXEC_SRCS += kexec/arch/sh/kexec-elf-rel-sh.c
>  sh_KEXEC_SRCS += kexec/arch/sh/netbsd_booter.S
>  
> --- /dev/null
> +++ work/kexec/arch/sh/kexec-elf-sh.c	2008-08-22 14:24:31.000000000 +0900
> @@ -0,0 +1,114 @@
> +/*
> + * kexec: Linux boots Linux
> + *
> + * Copyright (C) 2008  Magnus Damm
> + *
> + * Based on x86 implementation,
> + * Copyright (C) 2003-2005  Eric Biederman (ebiederm at xmission.com)
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation (version 2 of the License).
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> + */
> +
> +#define _GNU_SOURCE
> +#include <stdio.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <errno.h>
> +#include <limits.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +#include <getopt.h>
> +#include <elf.h>
> +#include "../../kexec.h"
> +#include "../../kexec-syscall.h"
> +#include "../../kexec-elf.h"
> +#include "../../kexec-elf-boot.h"
> +#include <arch/options.h>
> +#include "kexec-sh.h"
> +
> +int elf_sh_probe(const char *buf, off_t len)
> +{
> +	struct mem_ehdr ehdr;
> +	int result;
> +	result = build_elf_exec_info(buf, len, &ehdr, 0);
> +	if (result < 0)
> +		goto out;
> +
> +	/* Verify the architecuture specific bits */
> +	if (ehdr.e_machine != EM_SH) {
> +		result = -1;
> +		goto out;
> +	}
> +
> +	result = 0;
> + out:
> +	free_elf_info(&ehdr);
> +	return result;
> +}
> +
> +void elf_sh_usage(void)
> +{
> +	printf("  --append=STRING       Set the kernel command line to STRING\n"
> +		);
> +}
> +
> +int elf_sh_load(int argc, char **argv, const char *buf, off_t len, 

The line above has trailing whitespace.

> +	struct kexec_info *info)
> +{
> +	struct mem_ehdr ehdr;
> +	const char *command_line;
> +	struct mem_sym sym;
> +	int opt;
> +	static const struct option options[] = {
> +		KEXEC_ARCH_OPTIONS
> +		{ 0, 			0, NULL, 0 },

The line above has a stray space after 0 (and before a tab).

> +	};
> +
> +	static const char short_options[] = KEXEC_OPT_STR "";
> +
> +	/*
> +	 * Parse the command line arguments
> +	 */
> +	command_line = 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 '?':
> +			usage();
> +			return -1;
> +		case OPT_APPEND:
> +			command_line = optarg;
> +			break;
> +		}
> +	}
> +
> +	/* Load the ELF executable */
> +	elf_exec_build_load(info, &ehdr, buf, len, 0);
> +	info->entry = (void *)ehdr.e_entry;
> +
> +	/* If we're booting a vmlinux then fill in empty_zero_page */
> +	if (elf_rel_find_symbol(&ehdr, "empty_zero_page", &sym) == 0) {
> +		unsigned char *zp = (void *)ehdr.e_shdr[sym.st_shndx].sh_data;
> +
> +		kexec_sh_setup_zero_page(zp, 4096, command_line);

kexec_sh_setup_zero_page() seems to want a signed char * as the first
argument. Does it make sense to just change zp accordingly?


> +	}
> +
> +	return 0;
> +}
> --- 0005/kexec/arch/sh/kexec-sh.c
> +++ work/kexec/arch/sh/kexec-sh.c	2008-08-22 13:17:18.000000000 +0900
> @@ -53,6 +53,7 @@ int get_memory_ranges(struct memory_rang
>  /* Supported file types and callbacks */
>  struct file_type file_type[] = {
>         {"zImage-sh", zImage_sh_probe, zImage_sh_load, zImage_sh_usage},
> +       {"elf-sh", elf_sh_probe, elf_sh_load, elf_sh_usage},
>         {"netbsd-sh", netbsd_sh_probe, netbsd_sh_load, netbsd_sh_usage},
>  };
>  int file_types = sizeof(file_type) / sizeof(file_type[0]);
> --- 0005/kexec/arch/sh/kexec-sh.h
> +++ work/kexec/arch/sh/kexec-sh.h	2008-08-22 13:17:18.000000000 +0900
> @@ -6,6 +6,11 @@ int zImage_sh_load(int argc, char **argv
>  	struct kexec_info *info);
>  void zImage_sh_usage(void);
>  
> +int elf_sh_probe(const char *buf, off_t len);
> +int elf_sh_load(int argc, char **argv, const char *buf, off_t len,
> +	struct kexec_info *info);
> +void elf_sh_usage(void);
> +
>  int netbsd_sh_probe(const char *buf, off_t len);
>  int netbsd_sh_load(int argc, char **argv, const char *buf, off_t len,
>  	struct kexec_info *info);



More information about the kexec mailing list