On Wed, Feb 15, 2017 at 08:34:15PM +0100, Jean-Christophe PLAGNIOL-VILLARD 
wrote:
> prepare to drop the efi arch as efi boot up is not arch sepecific
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagn...@jcrosoft.com>
> ---
>  Documentation/boards/efi.rst                 |   2 +-
>  arch/x86/Kconfig                             |  53 ++++++++++++--
>  arch/x86/Makefile                            |  74 +++++++++++++++++--
>  arch/x86/configs/efi_defconfig               |  78 ++++++++++++++++++++
>  arch/x86/configs/generic_defconfig           |   1 +
>  arch/x86/include/asm/elf.h                   |  86 +++++++++++++++-------
>  arch/x86/include/asm/io.h                    |  71 +++++++++---------
>  arch/x86/include/asm/types.h                 |  51 ++++++++-----
>  arch/x86/include/asm/unaligned.h             |   5 ++
>  arch/x86/lib/Makefile                        |   2 +
>  arch/x86/lib/asm-offsets.c                   |   7 ++
>  arch/x86/mach-efi/.gitignore                 |   2 +
>  arch/x86/mach-efi/Makefile                   |   4 +
>  arch/x86/mach-efi/crt0-efi-ia32.S            |  76 +++++++++++++++++++
>  arch/x86/mach-efi/crt0-efi-x86_64.S          |  75 +++++++++++++++++++
>  arch/x86/mach-efi/elf_ia32_efi.lds.S         | 106 
> +++++++++++++++++++++++++++
>  arch/x86/mach-efi/elf_x86_64_efi.lds.S       |  99 +++++++++++++++++++++++++
>  arch/x86/mach-efi/include/mach/barebox.lds.h |   0

I think this should be done instead of adding an empty file:

diff --git a/include/asm-generic/barebox.lds.h 
b/include/asm-generic/barebox.lds.h
index c8a919b928c9..dd2d286d32ec 100644
--- a/include/asm-generic/barebox.lds.h
+++ b/include/asm-generic/barebox.lds.h
@@ -6,7 +6,7 @@
 #define STRUCT_ALIGNMENT 32
 #define STRUCT_ALIGN() . = ALIGN(STRUCT_ALIGNMENT)
 
-#if defined CONFIG_X86 || \
+#if defined CONFIG_X86_32 || \
        defined CONFIG_ARCH_EP93XX || \
        defined CONFIG_ARCH_ZYNQ
 #include <mach/barebox.lds.h>

>  arch/x86/mach-efi/include/mach/debug_ll.h    |   1 +
>  arch/x86/mach-efi/reloc_ia32.c               |  97 ++++++++++++++++++++++++
>  arch/x86/mach-efi/reloc_x86_64.c             |  96 ++++++++++++++++++++++++
>  commands/Kconfig                             |   2 +-
>  commands/edit.c                              |   2 +-
>  common/memory.c                              |   2 +-
>  drivers/clocksource/Kconfig                  |   2 +-
>  drivers/net/Kconfig                          |   2 +-
>  drivers/of/Kconfig                           |   2 +-
>  drivers/serial/Kconfig                       |   2 +-
>  fs/Kconfig                                   |   4 +-
>  include/efi.h                                |   2 +-
>  30 files changed, 899 insertions(+), 107 deletions(-)
>  create mode 100644 arch/x86/configs/efi_defconfig
>  rewrite arch/x86/include/asm/elf.h (97%)
>  create mode 100644 arch/x86/mach-efi/.gitignore
>  create mode 100644 arch/x86/mach-efi/Makefile
>  create mode 100644 arch/x86/mach-efi/crt0-efi-ia32.S
>  create mode 100644 arch/x86/mach-efi/crt0-efi-x86_64.S
>  create mode 100644 arch/x86/mach-efi/elf_ia32_efi.lds.S
>  create mode 100644 arch/x86/mach-efi/elf_x86_64_efi.lds.S
>  create mode 100644 arch/x86/mach-efi/include/mach/barebox.lds.h
>  create mode 100644 arch/x86/mach-efi/include/mach/debug_ll.h
>  create mode 100644 arch/x86/mach-efi/reloc_ia32.c
>  create mode 100644 arch/x86/mach-efi/reloc_x86_64.c
> 
> diff --git a/Documentation/boards/efi.rst b/Documentation/boards/efi.rst
> index b7ad40e47..ecadb3ebb 100644
> --- a/Documentation/boards/efi.rst
> +++ b/Documentation/boards/efi.rst
> @@ -25,7 +25,7 @@ Use the following to build barebox for EFI:
>  
>  .. code-block:: sh
>  
> -  export ARCH=efi
> +  export ARCH=x86
>    make efi_defconfig
>    make
>  
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 346640dcd..9803f3f95 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -1,9 +1,16 @@
>  #
>  #
>  #
> +config X86
> +     bool
> +     select HAS_KALLSYMS
> +     select GENERIC_FIND_NEXT_BIT
> +     default y
> +
>  config ARCH_TEXT_BASE
>       hex
>       default 0x00007c00 if MACH_X86_GENERIC
> +     default 0x0 if MACH_EFI_GENERIC
>  
>  config BOARD_LINKER_SCRIPT
>       bool
> @@ -14,17 +21,33 @@ config GENERIC_LINKER_SCRIPT
>       default y
>       depends on !BOARD_LINKER_SCRIPT
>  
> -config X86
> +menu "ARCH specific settings"
> +
> +config 64BIT
> +     def_bool y if X86_EFI
> +     help
> +       Say yes to build a 64-bit binary - formerly known as x86_64
> +       Say no to build a 32-bit binary - formerly known as i386.
> +
> +       32-bit support currently does not compile and is not tested
> +       due to the lack of hardware.
> +
> +config X86_32
> +     def_bool y
> +     depends on !64BIT
> +
> +config X86_64
> +     def_bool y
> +     depends on 64BIT
> +
> +endmenu
> +
> +config X86_BOOTLOADER
>       bool
> -     select HAS_KALLSYMS
> +     select X86_32
>       select HAS_MODULES
>       select HAVE_CONFIGURABLE_MEMORY_LAYOUT
>       select HAVE_CONFIGURABLE_TEXT_BASE
> -     select GENERIC_FIND_NEXT_BIT
> -     default y
> -
> -config X86_BOOTLOADER
> -     bool
>  
>  choice
>       prompt "Select your board"
> @@ -32,14 +55,30 @@ choice
>  config MACH_X86_GENERIC
>       bool "Generic x86"
>       select X86_BOOTLOADER
> +     depends on !X86_EFI 
>       help
>         Say Y here if you want barebox to be your BIOS based bootloader
>  
> +config MACH_EFI_GENERIC
> +     bool "Generic EFI"
> +     depends on X86_EFI 
> +     select HAS_DEBUG_LL
> +     help
> +       Say Y here if you want barebox to be your EFI based bootloader
> +
>  endchoice
>  
>  choice
>       prompt "Bring up type"
>  
> +     config X86_EFI
> +             bool "EFI"
> +             select EFI_BOOTUP
> +             select EFI_GUID
> +             select EFI_DEVICEPATH
> +             select PRINTF_UUID
> +             select CLOCKSOURCE_EFI
> +
>       config X86_BIOS_BRINGUP
>               bool "16 bit BIOS"
>               help
> diff --git a/arch/x86/Makefile b/arch/x86/Makefile
> index 640c24b62..e837a2df9 100644
> --- a/arch/x86/Makefile
> +++ b/arch/x86/Makefile
> @@ -1,20 +1,47 @@
>  KBUILD_DEFCONFIG := generic_defconfig
>  
> -CPPFLAGS += -D__X86__ -fno-strict-aliasing
> +CPPFLAGS += -D__X86__
>  
> -board-y := x86_generic
> -machine-y := i386
> +board-$(CONFIG_MACH_X86_GENERIC) := x86_generic
>  
>  TEXT_BASE = $(CONFIG_TEXT_BASE)
>  
> -CPPFLAGS += -march=i386 -m32 -DTEXT_BASE=$(TEXT_BASE) \
> +ifeq ($(CONFIG_X86_EFI),y)
> +machine-y := efi
> +CFLAGS += -fpic -fshort-wchar -mno-sse -mno-mmx
> +ifeq ($(CONFIG_X86_32),y)
> +     TARGET = efi-app-ia32
> +else
> +     TARGET = efi-app-x86_64
> +endif
> +else
> +CPPFLAGS += -fno-strict-aliasing
> +CPPFLAGS += -march=i386 -DTEXT_BASE=$(TEXT_BASE) \
>       -fno-unwind-tables -fno-asynchronous-unwind-tables
> -LDFLAGS += -m elf_i386
> +
> +machine-y := i386
> +endif
> +
> +ifeq ($(CONFIG_X86_32),y)
> +     UTS_MACHINE := i386
> +     biarch := $(call cc-option,-m32)
> +     AFLAGS += $(biarch)
> +     CFLAGS += $(biarch)
> +     CPPFLAGS += $(biarch)
> +else
> +     UTS_MACHINE := x86_64
> +     AFLAGS += -m64
> +     CFLAGS += -m64 -mno-red-zone
> +     CPPFLAGS += -m64
> +endif
> +
>  
>  ifndef CONFIG_MODULES
>  # Add cleanup flags
> +ifneq ($(CONFIG_X86_EFI),y)
>  CPPFLAGS += -fdata-sections -ffunction-sections
> -LDFLAGS_uboot += -static --gc-sections
> +LDFLAGS_barebox += -static --gc-sections
> +endif
>  endif
>  
>  machdirs := $(patsubst %,arch/x86/mach-%/,$(machine-y))
> @@ -39,13 +66,46 @@ endif
>  
>  common-y += $(BOARD) $(MACH)
>  common-y += arch/x86/lib/
> -common-y += arch/x86/boot/
>  common-$(CONFIG_X86_BIOS_BRINGUP) += arch/x86/bios/
>  
>  # arch/x86/cpu/
>  
> +ifeq ($(CONFIG_X86_EFI),y)
> +lds-$(CONFIG_X86_32)   := arch/x86/mach-efi/elf_ia32_efi.lds
> +lds-$(CONFIG_X86_64)   := arch/x86/mach-efi/elf_x86_64_efi.lds
> +
> +cmd_barebox__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_barebox) -o $@   \
> +             -T $(lds-y)                                     \
> +             -shared -Bsymbolic -nostdlib -znocombreloc      \
> +             --start-group $(barebox-common)                 \
> +             --end-group                                     \
> +             $(filter-out $(barebox-lds) $(barebox-common) FORCE ,$^)
> +
> +quiet_cmd_efi_image = EFI-IMG $@
> +      cmd_efi_image = $(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic \
> +                   -j .dynsym -j .rel -j .rela -j .reloc -j 
> __barebox_initcalls \
I think you created this from ther version before
71f0587f2049397d86e9eee7983bce623de5fb5e ("efi: include and execute exit
calls"). So this is missing:

                      -j __barebox_exitcalls \

and below...

> +                   -j __barebox_cmd -j .barebox_magicvar -j .bbenv.* \
> +                   --target=$(TARGET) $< $@
> +
> +KBUILD_BINARY := barebox
> +
> +LDFLAGS := --no-undefined
> +
> +barebox.efi: $(KBUILD_BINARY) FORCE
> +     $(call if_changed,efi_image)
> +
> +KBUILD_IMAGE := barebox.efi
> +
> +else
> +common-y += arch/x86/boot/
> +
>  lds-$(CONFIG_GENERIC_LINKER_SCRIPT)   := arch/x86/lib/barebox.lds
>  lds-$(CONFIG_BOARD_LINKER_SCRIPT)     := $(BOARD)/barebox.lds
>  
> +endif
> +
> +LDFLAGS += -m elf_$(UTS_MACHINE)
> +
> +CLEAN_FILES += $(lds-y)
>  CLEAN_FILES    += arch/x86/lib/barebox.lds barebox.map barebox.S
>  
> diff --git a/arch/x86/configs/efi_defconfig b/arch/x86/configs/efi_defconfig
> new file mode 100644
> index 000000000..3f7332258
> --- /dev/null
> +++ b/arch/x86/configs/efi_defconfig
> @@ -0,0 +1,78 @@
> +CONFIG_MMU=y
> +CONFIG_MALLOC_SIZE=0x0
> +CONFIG_MALLOC_TLSF=y
> +CONFIG_HUSH_FANCY_PROMPT=y
> +CONFIG_CMDLINE_EDITING=y
> +CONFIG_AUTO_COMPLETE=y
> +CONFIG_MENU=y
> +# CONFIG_TIMESTAMP is not set
> +CONFIG_BOOTM_SHOW_TYPE=y
> +CONFIG_BOOTM_VERBOSE=y
> +CONFIG_BOOTM_INITRD=y
> +CONFIG_BOOTM_OFTREE=y
> +CONFIG_BLSPEC=y
> +CONFIG_CONSOLE_ACTIVATE_ALL=y
> +CONFIG_PARTITION_DISK_EFI=y
> +CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y
> +CONFIG_POLLER=y
> +CONFIG_DEBUG_INFO=y
> +CONFIG_DEBUG_LL=y
> +CONFIG_LONGHELP=y
> +CONFIG_CMD_IOMEM=y
> +CONFIG_CMD_MEMINFO=y
> +CONFIG_CMD_GO=y
> +CONFIG_CMD_LOADB=y
> +CONFIG_CMD_RESET=y
> +CONFIG_CMD_UIMAGE=y
> +CONFIG_CMD_PARTITION=y
> +CONFIG_CMD_EXPORT=y
> +CONFIG_CMD_LOADENV=y
> +CONFIG_CMD_PRINTENV=y
> +CONFIG_CMD_MAGICVAR=y
> +CONFIG_CMD_MAGICVAR_HELP=y
> +CONFIG_CMD_SAVEENV=y
> +CONFIG_CMD_FILETYPE=y
> +CONFIG_CMD_LN=y
> +CONFIG_CMD_MD5SUM=y
> +CONFIG_CMD_UNCOMPRESS=y
> +CONFIG_CMD_LET=y
> +CONFIG_CMD_MSLEEP=y
> +CONFIG_CMD_READF=y
> +CONFIG_CMD_SLEEP=y
> +CONFIG_CMD_DHCP=y
> +CONFIG_CMD_HOST=y
> +CONFIG_CMD_PING=y
> +CONFIG_CMD_TFTP=y
> +CONFIG_CMD_ECHO_E=y
> +CONFIG_CMD_EDIT=y
> +CONFIG_CMD_MENU=y
> +CONFIG_CMD_MENUTREE=y
> +CONFIG_CMD_READLINE=y
> +CONFIG_CMD_TIMEOUT=y
> +CONFIG_CMD_CRC=y
> +CONFIG_CMD_CRC_CMP=y
> +CONFIG_CMD_MM=y
> +CONFIG_CMD_DETECT=y
> +CONFIG_CMD_FLASH=y
> +CONFIG_CMD_2048=y
> +CONFIG_CMD_BAREBOX_UPDATE=y
> +CONFIG_CMD_OF_NODE=y
> +CONFIG_CMD_OF_PROPERTY=y
> +CONFIG_CMD_OFTREE=y
> +CONFIG_CMD_TIME=y
> +CONFIG_NET=y
> +CONFIG_NET_NFS=y
> +CONFIG_NET_NETCONSOLE=y
> +CONFIG_DRIVER_SERIAL_EFI_STDIO=y
> +CONFIG_DRIVER_SERIAL_NS16550=y
> +CONFIG_DRIVER_NET_EFI_SNP=y
> +# CONFIG_SPI is not set
> +CONFIG_DISK=y
> +CONFIG_FS_EXT4=y
> +CONFIG_FS_TFTP=y
> +CONFIG_FS_NFS=y
> +CONFIG_FS_EFI=y
> +CONFIG_FS_EFIVARFS=y
> +CONFIG_FS_FAT=y
> +CONFIG_FS_FAT_WRITE=y
> +CONFIG_FS_FAT_LFN=y
> diff --git a/arch/x86/configs/generic_defconfig 
> b/arch/x86/configs/generic_defconfig
> index 5ff7f531e..3b94e02a7 100644
> --- a/arch/x86/configs/generic_defconfig
> +++ b/arch/x86/configs/generic_defconfig
> @@ -1,3 +1,4 @@
> +CONFIG_X86_BIOS_BRINGUP=y
>  CONFIG_X86_HDBOOT=y
>  CONFIG_STACK_SIZE=0x7000
>  CONFIG_EXPERIMENTAL=y
> diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
> dissimilarity index 97%
> index 94a40c624..ddde03518 100644
> --- a/arch/x86/include/asm/elf.h
> +++ b/arch/x86/include/asm/elf.h
> @@ -1,26 +1,60 @@
> -/*
> - * 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; either version 2 of
> - * the License, or (at your option) any later version.
> - *
> - * 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.
> - *
> - *
> - */
> -
> -/**
> - * @file
> - * @brief x86 specific elf information
> - *
> - */
> -
> -#ifndef _ASM_X86_ELF_H
> -#define _ASM_X86_ELF_H
> -
> -#define ELF_CLASS ELFCLASS32
> -
> -#endif /* _ASM_X86_ELF_H */
> +#ifndef __ASM_SANDBOX_ELF_H__
> +#define __ASM_SANDBOX_ELF_H__
> +
> +#ifdef __i386__
> +
> +typedef struct user_fxsr_struct elf_fpxregset_t;
> +
> +#define R_386_NONE   0
> +#define R_386_32     1
> +#define R_386_PC32   2
> +#define R_386_GOT32  3
> +#define R_386_PLT32  4
> +#define R_386_COPY   5
> +#define R_386_GLOB_DAT       6
> +#define R_386_JMP_SLOT       7
> +#define R_386_RELATIVE       8
> +#define R_386_GOTOFF 9
> +#define R_386_GOTPC  10
> +#define R_386_NUM    11
> +
> +/*
> + * These are used to set parameters in the core dumps.
> + */
> +#define ELF_CLASS    ELFCLASS32
> +#define ELF_DATA     ELFDATA2LSB
> +#define ELF_ARCH     EM_386
> +
> +#else
> +
> +/* x86-64 relocation types */
> +#define R_X86_64_NONE                0       /* No reloc */
> +#define R_X86_64_64          1       /* Direct 64 bit  */
> +#define R_X86_64_PC32                2       /* PC relative 32 bit signed */
> +#define R_X86_64_GOT32               3       /* 32 bit GOT entry */
> +#define R_X86_64_PLT32               4       /* 32 bit PLT address */
> +#define R_X86_64_COPY                5       /* Copy symbol at runtime */
> +#define R_X86_64_GLOB_DAT    6       /* Create GOT entry */
> +#define R_X86_64_JUMP_SLOT   7       /* Create PLT entry */
> +#define R_X86_64_RELATIVE    8       /* Adjust by program base */
> +#define R_X86_64_GOTPCREL    9       /* 32 bit signed pc relative
> +                                        offset to GOT */
> +#define R_X86_64_32          10      /* Direct 32 bit zero extended */
> +#define R_X86_64_32S         11      /* Direct 32 bit sign extended */
> +#define R_X86_64_16          12      /* Direct 16 bit zero extended */
> +#define R_X86_64_PC16                13      /* 16 bit sign extended pc 
> relative */
> +#define R_X86_64_8           14      /* Direct 8 bit sign extended  */
> +#define R_X86_64_PC8         15      /* 8 bit sign extended pc relative */
> +
> +#define R_X86_64_NUM         16
> +
> +/*
> + * These are used to set parameters in the core dumps.
> + */
> +#define ELF_CLASS    ELFCLASS64
> +#define ELF_DATA     ELFDATA2LSB
> +#define ELF_ARCH     EM_X86_64
> +
> +#endif
> +
> +#endif /* __ASM_SANDBOX_ELF_H__ */
> diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h
> index f02051056..df4bc99ec 100644
> --- a/arch/x86/include/asm/io.h
> +++ b/arch/x86/include/asm/io.h
> @@ -12,44 +12,6 @@
>  
>  #include <asm/byteorder.h>
>  
> -#define      IO_SPACE_LIMIT  0xffff
> -
> -static inline void outb(unsigned char value, int port)
> -{
> -     asm volatile("outb %b0, %w1" : : "a"(value), "Nd"(port));
> -}
> -
> -static inline void outw(unsigned short value, int port)
> -{
> -     asm volatile("outw %w0, %w1" : : "a"(value), "Nd"(port));
> -}
> -
> -static inline void outl(unsigned long value, int port)
> -{
> -     asm volatile("outl %0, %w1" : : "a"(value), "Nd"(port));
> -}
> -
> -static inline unsigned char inb(int port)
> -{
> -     unsigned char value;
> -     asm volatile("inb %w1, %b0" : "=a"(value) : "Nd"(port));
> -     return value;
> -}
> -
> -static inline unsigned short inw(int port)
> -{
> -     unsigned short value;
> -     asm volatile("inw %w1, %w0" : "=a"(value) : "Nd"(port));
> -     return value;
> -}
> -
> -static inline unsigned long inl(int port)
> -{
> -     unsigned long value;
> -     asm volatile("inl %w1, %0" : "=a"(value) : "Nd"(port));
> -     return value;
> -}
> -
>  #define build_mmio_read(name, size, type, reg, barrier) \
>   static inline type name(const volatile void *addr) \
>   { type ret; asm volatile("mov" size " %1,%0":reg (ret) \
> @@ -68,6 +30,39 @@ build_mmio_write(writeb, "b", unsigned char, "q", 
> :"memory")
>  build_mmio_write(writew, "w", unsigned short, "r", :"memory")
>  build_mmio_write(writel, "l", unsigned int, "r", :"memory")
>  
> +#define BUILDIO(bwl, bw, type)                                               
> \
> +static inline void out##bwl(unsigned type value, int port)           \
> +{                                                                    \
> +     asm volatile("out" #bwl " %" #bw "0, %w1"                       \
> +                  : : "a"(value), "Nd"(port));                       \
> +}                                                                    \
> +                                                                     \
> +static inline unsigned type in##bwl(int port)                                
> \
> +{                                                                    \
> +     unsigned type value;                                            \
> +     asm volatile("in" #bwl " %w1, %" #bw "0"                        \
> +                  : "=a"(value) : "Nd"(port));                       \
> +     return value;                                                   \
> +}                                                                    \
> +                                                                     \
> +static inline void outs##bwl(int port, const void *addr, unsigned long 
> count) \
> +{                                                                    \
> +     asm volatile("rep; outs" #bwl                                   \
> +                  : "+S"(addr), "+c"(count) : "d"(port));            \
> +}                                                                    \
> +                                                                     \
> +static inline void ins##bwl(int port, void *addr, unsigned long count)       
> \
> +{                                                                    \
> +     asm volatile("rep; ins" #bwl                                    \
> +                  : "+D"(addr), "+c"(count) : "d"(port));            \
> +}
> +
> +BUILDIO(b, b, char)
> +BUILDIO(w, w, short)
> +BUILDIO(l, , int)
> +
> +#define  IO_SPACE_LIMIT  0xffff
> +
>  /* do a tiny io delay */
>  static inline void io_delay(void)
>  {
> diff --git a/arch/x86/include/asm/types.h b/arch/x86/include/asm/types.h
> index 7349ba03c..3caac398d 100644
> --- a/arch/x86/include/asm/types.h
> +++ b/arch/x86/include/asm/types.h
> @@ -1,21 +1,29 @@
> +#ifndef __ASM_I386_TYPES_H
> +#define __ASM_I386_TYPES_H
> +
> +#ifndef __ASSEMBLY__
> +
> +#ifdef __x86_64__
> +/*
> + * This is used in dlmalloc. On X86_64 we need it to be
> + * 64 bit
> + */
> +#define INTERNAL_SIZE_T unsigned long
> +
>  /*
> - * 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; either version 2 of
> - * the License, or (at your option) any later version.
> - *
> - * 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.
> - *
> - *
> + * This is a Kconfig variable in the Kernel, but we want to detect
> + * this during compile time, so we set it here.
>   */
> +#define CONFIG_PHYS_ADDR_T_64BIT
>  
> -#ifndef __ASM_X86_TYPES_H
> -#define __ASM_X86_TYPES_H
> +#endif
>  
> -#ifndef __ASSEMBLY__
> +typedef unsigned short umode_t;
> +
> +/*
> + * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
> + * header files exported to user space
> + */
>  
>  typedef __signed__ char __s8;
>  typedef unsigned char __u8;
> @@ -26,8 +34,15 @@ typedef unsigned short __u16;
>  typedef __signed__ int __s32;
>  typedef unsigned int __u32;
>  
> +#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
>  typedef __signed__ long long __s64;
>  typedef unsigned long long __u64;
> +#endif
> +
> +/*
> + * These aren't exported outside the kernel to avoid name space clashes
> + */
> +#ifdef __KERNEL__
>  
>  typedef signed char s8;
>  typedef unsigned char u8;
> @@ -41,10 +56,10 @@ typedef unsigned int u32;
>  typedef signed long long s64;
>  typedef unsigned long long u64;
>  
> -typedef unsigned short umode_t;
> +#include <asm/bitsperlong.h>
>  
> -#include <asm-generic/bitsperlong.h>
> +#endif /* __KERNEL__ */
>  
> -#endif /* __ASSEMBLY__ */
> +#endif
>  
> -#endif /* __ASM_X86_TYPES_H */
> +#endif
> diff --git a/arch/x86/include/asm/unaligned.h 
> b/arch/x86/include/asm/unaligned.h
> index a7bd416b4..7e38706c5 100644
> --- a/arch/x86/include/asm/unaligned.h
> +++ b/arch/x86/include/asm/unaligned.h
> @@ -8,7 +8,12 @@
>  #include <linux/unaligned/access_ok.h>
>  #include <linux/unaligned/generic.h>
>  
> +#if __BYTE_ORDER == __LITTLE_ENDIAN
>  #define get_unaligned __get_unaligned_le
>  #define put_unaligned __put_unaligned_le
> +#else
> +#define get_unaligned __get_unaligned_be
> +#define put_unaligned __put_unaligned_be
> +#endif
>  
>  #endif /* _ASM_X86_UNALIGNED_H */
> diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
> index 6054b9e3f..05e43f0f2 100644
> --- a/arch/x86/lib/Makefile
> +++ b/arch/x86/lib/Makefile
> @@ -1,6 +1,8 @@
>  extra-$(CONFIG_GENERIC_LINKER_SCRIPT) += barebox.lds
> +ifneq ($(CONFIG_X86_EFI),y)
>  obj-y += memory.o
>  obj-y += gdt.o
> +endif
>  
>  # needed, when running via a 16 bit BIOS
>  obj-$(CONFIG_CMD_LINUX16) += linux_start.o
> diff --git a/arch/x86/lib/asm-offsets.c b/arch/x86/lib/asm-offsets.c
> index b1be3e539..0f9c47eaa 100644
> --- a/arch/x86/lib/asm-offsets.c
> +++ b/arch/x86/lib/asm-offsets.c
> @@ -6,6 +6,13 @@
>  
>  #include <linux/kbuild.h>
>  
> +#ifdef CONFIG_EFI_BOOTUP
> +int main(void)
> +{
> +     return 0;
> +}
> +#else
>  void common(void)
>  {
>  }
> +#endif
> diff --git a/arch/x86/mach-efi/.gitignore b/arch/x86/mach-efi/.gitignore
> new file mode 100644
> index 000000000..847e31770
> --- /dev/null
> +++ b/arch/x86/mach-efi/.gitignore
> @@ -0,0 +1,2 @@
> +elf_x86_64_efi.lds
> +elf_ia32_efi.lds
> diff --git a/arch/x86/mach-efi/Makefile b/arch/x86/mach-efi/Makefile
> new file mode 100644
> index 000000000..c8a97bae0
> --- /dev/null
> +++ b/arch/x86/mach-efi/Makefile
> @@ -0,0 +1,4 @@
> +obj-$(CONFIG_X86_64) += reloc_x86_64.o crt0-efi-x86_64.o
> +obj-$(CONFIG_X86_32) += reloc_ia32.o crt0-efi-ia32.o
> +extra-$(CONFIG_X86_32) += elf_ia32_efi.lds
> +extra-$(CONFIG_X86_64) += elf_x86_64_efi.lds
> diff --git a/arch/x86/mach-efi/crt0-efi-ia32.S 
> b/arch/x86/mach-efi/crt0-efi-ia32.S
> new file mode 100644
> index 000000000..6f0f2e872
> --- /dev/null
> +++ b/arch/x86/mach-efi/crt0-efi-ia32.S
> @@ -0,0 +1,76 @@
> +/* crt0-efi-ia32.S - x86 EFI startup code.
> +   Copyright (C) 1999 Hewlett-Packard Co.
> +     Contributed by David Mosberger <dav...@hpl.hp.com>.
> +
> +    All rights reserved.
> +
> +    Redistribution and use in source and binary forms, with or without
> +    modification, are permitted provided that the following conditions
> +    are met:
> +
> +    * Redistributions of source code must retain the above copyright
> +      notice, this list of conditions and the following disclaimer.
> +    * Redistributions in binary form must reproduce the above
> +      copyright notice, this list of conditions and the following
> +      disclaimer in the documentation and/or other materials
> +      provided with the distribution.
> +    * Neither the name of Hewlett-Packard Co. nor the names of its
> +      contributors may be used to endorse or promote products derived
> +      from this software without specific prior written permission.
> +
> +    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> +    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
> +    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> +    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
> +    BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
> +    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> +    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
> +    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> +    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> +    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> +    SUCH DAMAGE.
> +*/
> +
> +     .text
> +     .align 4
> +
> +     .globl _start
> +_start:
> +     pushl %ebp
> +     movl %esp,%ebp
> +
> +     pushl 12(%ebp)                  # copy "image" argument
> +     pushl  8(%ebp)                  # copy "systab" argument
> +
> +     call 0f
> +0:   popl %eax
> +     movl %eax,%ebx
> +
> +     addl $image_base-0b,%eax                # %eax = ldbase
> +     addl $_DYNAMIC-0b,%ebx          # %ebx = _DYNAMIC
> +
> +     pushl %ebx                      # pass _DYNAMIC as second argument
> +     pushl %eax                      # pass ldbase as first argument
> +     call _relocate
> +     popl %ebx
> +     popl %ebx
> +     testl %eax,%eax
> +     jne .exit
> +
> +     call efi_main                   # call app with "image" and "systab" 
> argument
> +
> +.exit:       leave
> +     ret
> +
> +     /* hand-craft a dummy .reloc section so EFI knows it's a relocatable 
> executable: */
> +
> +     .data
> +dummy:       .long   0
> +
> +#define IMAGE_REL_ABSOLUTE   0
> +     .section .reloc
> +     .long   dummy                                   /* Page RVA */
> +     .long   10                                      /* Block Size (2*4+2) */
> +     .word   (IMAGE_REL_ABSOLUTE<<12) +  0           /* reloc for dummy */
> diff --git a/arch/x86/mach-efi/crt0-efi-x86_64.S 
> b/arch/x86/mach-efi/crt0-efi-x86_64.S
> new file mode 100644
> index 000000000..aa03106e9
> --- /dev/null
> +++ b/arch/x86/mach-efi/crt0-efi-x86_64.S
> @@ -0,0 +1,75 @@
> +/* crt0-efi-x86_64.S - x86_64 EFI startup code.
> +   Copyright (C) 1999 Hewlett-Packard Co.
> +     Contributed by David Mosberger <dav...@hpl.hp.com>.
> +   Copyright (C) 2005 Intel Co.
> +     Contributed by Fenghua Yu <fenghua...@intel.com>.
> +
> +    All rights reserved.
> +
> +    Redistribution and use in source and binary forms, with or without
> +    modification, are permitted provided that the following conditions
> +    are met:
> +
> +    * Redistributions of source code must retain the above copyright
> +      notice, this list of conditions and the following disclaimer.
> +    * Redistributions in binary form must reproduce the above
> +      copyright notice, this list of conditions and the following
> +      disclaimer in the documentation and/or other materials
> +      provided with the distribution.
> +    * Neither the name of Hewlett-Packard Co. nor the names of its
> +      contributors may be used to endorse or promote products derived
> +      from this software without specific prior written permission.
> +
> +    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> +    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
> +    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> +    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
> +    BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
> +    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> +    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
> +    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> +    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> +    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> +    SUCH DAMAGE.
> +*/
> +     .text
> +     .align 4
> +
> +     .globl _start
> +_start:
> +     subq $8, %rsp
> +     pushq %rcx
> +     pushq %rdx
> +
> +0:
> +     lea image_base(%rip), %rdi
> +     lea _DYNAMIC(%rip), %rsi
> +
> +     popq %rcx
> +     popq %rdx
> +     pushq %rcx
> +     pushq %rdx
> +     call _relocate
> +
> +     popq %rdi
> +     popq %rsi
> +
> +     call efi_main
> +     addq $8, %rsp
> +
> +.exit:
> +     ret
> +
> +     /* hand-craft a dummy .reloc section so EFI knows it's a relocatable 
> executable: */
> +
> +     .data
> +dummy:       .long   0
> +
> +#define IMAGE_REL_ABSOLUTE   0
> +     .section .reloc, "a"
> +label1:
> +     .long   dummy-label1                            /* Page RVA */
> +     .long   10                                      /* Block Size (2*4+2) */
> +     .word   (IMAGE_REL_ABSOLUTE<<12) +  0           /* reloc for dummy */
> diff --git a/arch/x86/mach-efi/elf_ia32_efi.lds.S 
> b/arch/x86/mach-efi/elf_ia32_efi.lds.S
> new file mode 100644
> index 000000000..69f43f554
> --- /dev/null
> +++ b/arch/x86/mach-efi/elf_ia32_efi.lds.S
> @@ -0,0 +1,106 @@
> +#include <asm-generic/barebox.lds.h>
> +
> +OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
> +OUTPUT_ARCH(i386)
> +ENTRY(_start)
> +SECTIONS
> +{
> +     . = 0;
> +     image_base = .;
> +     .hash : { *(.hash) }    /* this MUST come first! */
> +     . = ALIGN(4096);
> +     .text :
> +     {
> +             _stext = .;
> +             _text = .;
> +             *(.text)
> +             *(.text.*)
> +             *(.gnu.linkonce.t.*)
> +     }
> +
> +     _etext = .;
> +
> +     . = ALIGN(4096);
> +     .sdata : {
> +             *(.got.plt)
> +             *(.got)
> +             *(.srodata)
> +             *(.sdata)
> +             *(.sbss)
> +             *(.scommon)
> +     }
> +
> +     . = ALIGN(4096);
> +     _sdata = .;
> +
> +     .data : {
> +             *(.rodata*)
> +             *(.data)
> +             *(.data1)
> +             *(.data.*)
> +             *(.sdata)
> +             *(.got.plt)
> +             *(.got)
> +             /* the EFI loader doesn't seem to like a .bss section, so we 
> stick
> +              * it all into .data: */
> +             *(.sbss)
> +             *(.scommon)
> +             *(.dynbss)
> +             *(.bss)
> +             *(COMMON)
> +     }
> +
> +     . = ALIGN(64);
> +
> +     __barebox_initcalls_start = .;
> +     __barebox_initcalls : { INITCALLS }
> +     __barebox_initcalls_end = .;
> +
> +     __barebox_exitcalls_start = .;
> +     __barebox_exitcalls : { EXITCALLS }
> +     __barebox_exitcalls_end = .;
> +
> +     . = ALIGN(64);
> +     __barebox_magicvar_start = .;
> +     .barebox_magicvar : { BAREBOX_MAGICVARS }
> +     __barebox_magicvar_end = .;
> +
> +     . = ALIGN(64);
> +     __barebox_cmd_start = .;
> +     __barebox_cmd : { BAREBOX_CMDS }
> +     __barebox_cmd_end = .;
> +
> +     . = ALIGN(4096);
> +     .dynamic : { *(.dynamic) }
> +     . = ALIGN(4096);
> +     .rel : {
> +             *(.rel.data)
> +             *(.rel.data.*)
> +             *(.rel.got)
> +             *(.rel.stab)
> +             *(.data.rel.ro.local)
> +             *(.data.rel.local)
> +             *(.data.rel.ro)
> +             *(.data.rel*)
> +     }
> +
> +     . = ALIGN(4096);
> +     .reloc :                /* This is the PECOFF .reloc section! */
> +     {
> +             *(.reloc)
> +     }
> +
> +     . = ALIGN(4096);
> +     .dynsym : { *(.dynsym) }
> +     . = ALIGN(4096);
> +     .dynstr : { *(.dynstr) }
> +     . = ALIGN(4096);
> +     /DISCARD/ :
> +     {
> +             *(.rel.reloc)
> +             *(.eh_frame)
> +             *(.note.GNU-stack)
> +     }
> +
> +     .comment 0 : { *(.comment) }
> +}
> diff --git a/arch/x86/mach-efi/elf_x86_64_efi.lds.S 
> b/arch/x86/mach-efi/elf_x86_64_efi.lds.S
> new file mode 100644
> index 000000000..e1bc2120f
> --- /dev/null
> +++ b/arch/x86/mach-efi/elf_x86_64_efi.lds.S
> @@ -0,0 +1,99 @@
> +#include <asm-generic/barebox.lds.h>
> +
> +/* Same as elf_x86_64_fbsd_efi.lds, except for OUTPUT_FORMAT below - KEEP IN 
> SYNC */
> +
> +OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
> +OUTPUT_ARCH(i386:x86-64)
> +ENTRY(_start)
> +SECTIONS
> +{
> +     . = 0;
> +     image_base = .;
> +     .hash : { *(.hash) }    /* this MUST come first! */
> +     . = ALIGN(4096);
> +     .eh_frame : {
> +             *(.eh_frame)
> +     }
> +
> +     . = ALIGN(4096);
> +
> +     .text : {
> +             _stext = .;
> +             _text = .;
> +             *(.text)
> +             *(.text.*)
> +             *(.gnu.linkonce.t.*)
> +     }
> +
> +     _etext = .;
> +
> +     . = ALIGN(4096);
> +
> +     .reloc : {
> +             *(.reloc)
> +     }
> +
> +     . = ALIGN(4096);
> +     _sdata = .;
> +
> +     .data : {
> +             *(.rodata*)
> +             *(.got.plt)
> +             *(.got)
> +             *(.data*)
> +             *(.sdata)
> +             /* the EFI loader doesn't seem to like a .bss section, so we 
> stick
> +              * it all into .data: */
> +             *(.sbss)
> +             *(.scommon)
> +             *(.dynbss)
> +             *(.bss)
> +             *(COMMON)
> +             *(.rel.local)
> +     }
> +
> +     . = ALIGN(64);
> +
> +     __barebox_initcalls_start = .;
> +     __barebox_initcalls : { INITCALLS }
> +     __barebox_initcalls_end = .;
> +
> +     __barebox_exitcalls_start = .;
> +     __barebox_exitcalls : { EXITCALLS }
> +     __barebox_exitcalls_end = .;
> +
> +     . = ALIGN(64);
> +     __barebox_magicvar_start = .;
> +     .barebox_magicvar : { BAREBOX_MAGICVARS }
> +     __barebox_magicvar_end = .;
> +
> +     . = ALIGN(64);
> +     __barebox_cmd_start = .;
> +     __barebox_cmd : { BAREBOX_CMDS }
> +     __barebox_cmd_end = .;
> +
> +     . = ALIGN(4096);
> +     .dynamic : { *(.dynamic) }
> +     . = ALIGN(4096);
> +
> +     .rela : {
> +             *(.rela.data*)
> +             *(.rela.barebox*)
> +             *(.rela.initcall*)

... and here:

                *(.rela.exitcall*)

Regards,
Michael

> +             *(.rela.got)
> +             *(.rela.stab)
> +     }
> +
> +     . = ALIGN(4096);
> +     .dynsym : { *(.dynsym) }
> +     . = ALIGN(4096);
> +     .dynstr : { *(.dynstr) }
> +     . = ALIGN(4096);
> +     .ignored.reloc : {
> +             *(.rela.reloc)
> +             *(.eh_frame)
> +             *(.note.GNU-stack)
> +     }
> +
> +     .comment 0 : { *(.comment) }
> +}
> diff --git a/arch/x86/mach-efi/include/mach/barebox.lds.h 
> b/arch/x86/mach-efi/include/mach/barebox.lds.h
> new file mode 100644
> index 000000000..e69de29bb
> diff --git a/arch/x86/mach-efi/include/mach/debug_ll.h 
> b/arch/x86/mach-efi/include/mach/debug_ll.h
> new file mode 100644
> index 000000000..e144d86e0
> --- /dev/null
> +++ b/arch/x86/mach-efi/include/mach/debug_ll.h
> @@ -0,0 +1 @@
> +#include <efi/debug_ll.h>
> diff --git a/arch/x86/mach-efi/reloc_ia32.c b/arch/x86/mach-efi/reloc_ia32.c
> new file mode 100644
> index 000000000..46929631e
> --- /dev/null
> +++ b/arch/x86/mach-efi/reloc_ia32.c
> @@ -0,0 +1,97 @@
> +/* reloc_ia32.c - position independent x86 ELF shared object relocator
> +   Copyright (C) 1999 Hewlett-Packard Co.
> +     Contributed by David Mosberger <dav...@hpl.hp.com>.
> +
> +    All rights reserved.
> +
> +    Redistribution and use in source and binary forms, with or without
> +    modification, are permitted provided that the following conditions
> +    are met:
> +
> +    * Redistributions of source code must retain the above copyright
> +      notice, this list of conditions and the following disclaimer.
> +    * Redistributions in binary form must reproduce the above
> +      copyright notice, this list of conditions and the following
> +      disclaimer in the documentation and/or other materials
> +      provided with the distribution.
> +    * Neither the name of Hewlett-Packard Co. nor the names of its
> +      contributors may be used to endorse or promote products derived
> +      from this software without specific prior written permission.
> +
> +    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> +    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
> +    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> +    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
> +    BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
> +    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> +    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
> +    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> +    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> +    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> +    SUCH DAMAGE.
> +*/
> +
> +#include <common.h>
> +#include <efi.h>
> +
> +#include <elf.h>
> +
> +efi_status_t _relocate(long ldbase, Elf32_Dyn *dyn, efi_handle_t image, 
> efi_system_table_t *systab)
> +{
> +     long relsz = 0, relent = 0;
> +     Elf32_Rel *rel = 0;
> +     unsigned long *addr;
> +     int i;
> +
> +     for (i = 0; dyn[i].d_tag != DT_NULL; ++i) {
> +             switch (dyn[i].d_tag) {
> +                     case DT_REL:
> +                             rel = (Elf32_Rel*)
> +                                     ((unsigned long)dyn[i].d_un.d_ptr
> +                                      + ldbase);
> +                             break;
> +
> +                     case DT_RELSZ:
> +                             relsz = dyn[i].d_un.d_val;
> +                             break;
> +
> +                     case DT_RELENT:
> +                             relent = dyn[i].d_un.d_val;
> +                             break;
> +
> +                     case DT_RELA:
> +                             break;
> +
> +                     default:
> +                             break;
> +             }
> +     }
> +
> +        if (!rel && relent == 0)
> +                return EFI_SUCCESS;
> +
> +     if (!rel || relent == 0)
> +             return EFI_LOAD_ERROR;
> +
> +     while (relsz > 0) {
> +             /* apply the relocs */
> +             switch (ELF32_R_TYPE (rel->r_info)) {
> +                     case R_386_NONE:
> +                             break;
> +
> +                     case R_386_RELATIVE:
> +                             addr = (unsigned long *)
> +                                     (ldbase + rel->r_offset);
> +                             *addr += ldbase;
> +                             break;
> +
> +                     default:
> +                             break;
> +             }
> +             rel = (Elf32_Rel*) ((char *) rel + relent);
> +             relsz -= relent;
> +     }
> +     return EFI_SUCCESS;
> +}
> diff --git a/arch/x86/mach-efi/reloc_x86_64.c 
> b/arch/x86/mach-efi/reloc_x86_64.c
> new file mode 100644
> index 000000000..1db72f5db
> --- /dev/null
> +++ b/arch/x86/mach-efi/reloc_x86_64.c
> @@ -0,0 +1,96 @@
> +/* reloc_x86_64.c - position independent x86_64 ELF shared object relocator
> +   Copyright (C) 1999 Hewlett-Packard Co.
> +     Contributed by David Mosberger <dav...@hpl.hp.com>.
> +   Copyright (C) 2005 Intel Co.
> +     Contributed by Fenghua Yu <fenghua...@intel.com>.
> +
> +    All rights reserved.
> +
> +    Redistribution and use in source and binary forms, with or without
> +    modification, are permitted provided that the following conditions
> +    are met:
> +
> +    * Redistributions of source code must retain the above copyright
> +      notice, this list of conditions and the following disclaimer.
> +    * Redistributions in binary form must reproduce the above
> +      copyright notice, this list of conditions and the following
> +      disclaimer in the documentation and/or other materials
> +      provided with the distribution.
> +    * Neither the name of Hewlett-Packard Co. nor the names of its
> +      contributors may be used to endorse or promote products derived
> +      from this software without specific prior written permission.
> +
> +    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> +    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
> +    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> +    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> +    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
> +    BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
> +    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> +    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
> +    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> +    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
> +    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
> +    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> +    SUCH DAMAGE.
> +*/
> +
> +#include <common.h>
> +#include <efi.h>
> +
> +#include <elf.h>
> +
> +efi_status_t _relocate (long ldbase, Elf64_Dyn *dyn, efi_handle_t image, 
> efi_system_table_t *systab)
> +{
> +     long relsz = 0, relent = 0;
> +     Elf64_Rel *rel = 0;
> +     unsigned long *addr;
> +     int i;
> +
> +     for (i = 0; dyn[i].d_tag != DT_NULL; ++i) {
> +             switch (dyn[i].d_tag) {
> +                     case DT_RELA:
> +                             rel = (Elf64_Rel*)
> +                                     ((unsigned long)dyn[i].d_un.d_ptr
> +                                      + ldbase);
> +                             break;
> +
> +                     case DT_RELASZ:
> +                             relsz = dyn[i].d_un.d_val;
> +                             break;
> +
> +                     case DT_RELAENT:
> +                             relent = dyn[i].d_un.d_val;
> +                             break;
> +
> +                     default:
> +                             break;
> +             }
> +     }
> +
> +        if (!rel && relent == 0)
> +                return EFI_SUCCESS;
> +
> +     if (!rel || relent == 0)
> +             return EFI_LOAD_ERROR;
> +
> +     while (relsz > 0) {
> +             /* apply the relocs */
> +             switch (ELF64_R_TYPE (rel->r_info)) {
> +                     case R_X86_64_NONE:
> +                             break;
> +
> +                     case R_X86_64_RELATIVE:
> +                             addr = (unsigned long *)
> +                                     (ldbase + rel->r_offset);
> +                             *addr += ldbase;
> +                             break;
> +
> +                     default:
> +                             break;
> +             }
> +             rel = (Elf64_Rel*) ((char *) rel + relent);
> +             relsz -= relent;
> +     }
> +     return EFI_SUCCESS;
> +}
> diff --git a/commands/Kconfig b/commands/Kconfig
> index 21d921268..bc0885c69 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -370,7 +370,7 @@ config CMD_BOOTZ
>  
>  config CMD_LINUX16
>       tristate
> -     depends on X86
> +     depends on X86 && !X86_EFI
>       default y if X86
>       prompt "linux16"
>       help
> diff --git a/commands/edit.c b/commands/edit.c
> index a5415a6e5..696a818d9 100644
> --- a/commands/edit.c
> +++ b/commands/edit.c
> @@ -396,7 +396,7 @@ static int do_edit(int argc, char *argv[])
>        * down when we write to the right bottom screen position. Reduce the 
> number
>        * of rows by one to work around this.
>        */
> -     if (IS_ENABLED(CONFIG_ARCH_EFI))
> +     if (IS_ENABLED(CONFIG_EFI_BOOTUP))
>               screenheight = 24;
>       else
>               screenheight = 25;
> diff --git a/common/memory.c b/common/memory.c
> index 4725f6e38..ad38b00ec 100644
> --- a/common/memory.c
> +++ b/common/memory.c
> @@ -67,7 +67,7 @@ void mem_malloc_init(void *start, void *end)
>       mem_malloc_initialized = 1;
>  }
>  
> -#if !defined __SANDBOX__ && !defined CONFIG_ARCH_EFI
> +#if !defined __SANDBOX__ && !defined CONFIG_EFI_BOOTUP
>  static int mem_malloc_resource(void)
>  {
>       /*
> diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
> index ae1f10eae..54b05bbf3 100644
> --- a/drivers/clocksource/Kconfig
> +++ b/drivers/clocksource/Kconfig
> @@ -36,7 +36,7 @@ config CLOCKSOURCE_DUMMY_RATE
>  
>  config CLOCKSOURCE_EFI
>       bool
> -     depends on ARCH_EFI
> +     depends on EFI_BOOTUP
>  
>  config CLOCKSOURCE_MVEBU
>       bool
> diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
> index b723a127f..c3980e78f 100644
> --- a/drivers/net/Kconfig
> +++ b/drivers/net/Kconfig
> @@ -202,7 +202,7 @@ config DRIVER_NET_TAP
>  
>  config DRIVER_NET_EFI_SNP
>       bool "EFI SNP ethernet driver"
> -     depends on ARCH_EFI
> +     depends on EFI_BOOTUP
>  
>  config DRIVER_NET_TSE
>       depends on NIOS2
> diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
> index d0a62bda9..a1fac0e61 100644
> --- a/drivers/of/Kconfig
> +++ b/drivers/of/Kconfig
> @@ -4,7 +4,7 @@ config OFTREE
>  
>  config OFTREE_MEM_GENERIC
>       depends on OFTREE
> -     depends on PPC || ARM || ARCH_EFI || OPENRISC || SANDBOX
> +     depends on PPC || ARM || EFI_BOOTUP || OPENRISC || SANDBOX
>       def_bool y
>  
>  config DTC
> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
> index 4eab437ea..ced30530a 100644
> --- a/drivers/serial/Kconfig
> +++ b/drivers/serial/Kconfig
> @@ -46,7 +46,7 @@ config DRIVER_SERIAL_LINUX_CONSOLE
>       bool "linux console driver"
>  
>  config DRIVER_SERIAL_EFI_STDIO
> -     depends on ARCH_EFI
> +     depends on EFI_BOOTUP
>       bool "EFI stdio driver"
>  
>  config DRIVER_SERIAL_MPC5XXX
> diff --git a/fs/Kconfig b/fs/Kconfig
> index c7c42acd7..57f2676f4 100644
> --- a/fs/Kconfig
> +++ b/fs/Kconfig
> @@ -42,7 +42,7 @@ config FS_NFS
>       prompt "nfs support"
>  
>  config FS_EFI
> -     depends on ARCH_EFI
> +     depends on EFI_BOOTUP
>       bool
>       prompt "EFI filesystem support"
>       help
> @@ -50,7 +50,7 @@ config FS_EFI
>         by the EFI Firmware via the EFI Simple File System Protocol.
>  
>  config FS_EFIVARFS
> -     depends on ARCH_EFI
> +     depends on EFI_BOOTUP
>       bool
>       prompt "EFI variable filesystem support (efivarfs)"
>       help
> diff --git a/include/efi.h b/include/efi.h
> index b2e965bae..fa6fb2782 100644
> --- a/include/efi.h
> +++ b/include/efi.h
> @@ -14,7 +14,7 @@
>  #include <linux/string.h>
>  #include <linux/types.h>
>  
> -#ifdef CONFIG_ARCH_EFI
> +#ifdef CONFIG_EFI_BOOTUP
>  #define EFIAPI __attribute__((ms_abi))
>  #else
>  #define EFIAPI
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

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

Reply via email to