changeset 14:8b2ce241f5f1 default tip

add files
author one
date Mon, 30 Jun 2014 00:38:55 +0900
parents f21ccddc12cb
children
files boot/Makefile boot/bootx64.c boot/registers.h include/elf.h kernel/kernel.c
diffstat 5 files changed, 943 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boot/Makefile	Mon Jun 30 00:38:55 2014 +0900
@@ -0,0 +1,44 @@
+ARCH            = $(shell uname -m | sed s,i[3456789]86,ia32,)
+EFI_INCLUDE     = /usr/include/efi
+EFI_INCLUDES    = -I$(EFI_INCLUDE) -I$(EFI_INCLUDE)/$(ARCH) -I$(EFI_INCLUDE)/protocol
+EFI_PATH        = /usr/lib64/gnuefi
+EFI_LIB_PATH    = /usr/lib64
+LIB_GCC         = $(shell $(CC) -print-libgcc-file-name)
+EFI_LIBS        = -lefi -lgnuefi $(LIB_GCC)
+EFI_CRT_OBJS    = $(EFI_PATH)/crt0-efi-$(ARCH).o
+EFI_LDS         = $(EFI_PATH)/elf_$(ARCH)_efi.lds
+CFLAGS          = -O2 -g -mno-red-zone -fno-stack-protector -fno-strict-aliasing -fpic -fshort-wchar -fno-merge-constants -Wall -Werror $(EFI_INCLUDES)
+
+ifeq ($(ARCH),x86_64)
+	CFLAGS  += -DEFI_FUNCTION_WRAPPER
+endif
+
+LDFLAGS         = -nostdlib -znocombreloc -T $(EFI_LDS) -shared -Bsymbolic -L$(EFI_LIB_PATH) $(EFI_CRT_OBJS)
+TARGET          = bootx64.efi
+OBJS            = bootx64.o
+
+all: $(TARGET)
+
+bootx64.efi: $(OBJS)
+
+exec:
+	qemu-kvm -s -L ../ovmf -bios ../ovmf/OVMF.fd -hdb ../disk/disk.qcow2
+
+%.efi: %.o 
+	$(LD) $(LDFLAGS) $^ -o $@ $(EFI_LIBS)
+	objcopy -j .text -j .sdata -j .data \
+	-j .dynamic -j .dynsym  -j .rel \
+	-j .rela -j .reloc \
+	--target=efi-app-$(ARCH) $@ 
+	strip $@
+	modprobe nbd
+	qemu-nbd -c /dev/nbd0 ../disk/disk.qcow2
+	mount /dev/nbd0 /mnt/nbd
+	cp bootx64.efi /mnt/nbd/EFI/BOOT/
+	cp ../kernel/kernel /mnt/nbd/EFI/BOOT/
+
+clean:
+	rm -f $(TARGET) $(OBJS)
+	umount /mnt/nbd
+	qemu-nbd -d /dev/nbd0
+	rmmod nbd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boot/bootx64.c	Mon Jun 30 00:38:55 2014 +0900
@@ -0,0 +1,200 @@
+#include <efi.h>
+#include <elf.h>
+#include <efilib.h>
+
+#include <elf.h>
+
+#include "registers.h"
+
+CHAR16 *DEFAULT_KERNEL_NAME = L"kernel";
+
+EFI_STATUS
+check_header(SIMPLE_READ_FILE file)
+{
+    return EFI_SUCCESS;    
+}
+
+EFI_STATUS
+load_image(SIMPLE_READ_FILE file)
+{
+    Print(L"Start load image.\n");
+
+    UINTN size = sizeof(Elf64_Ehdr);
+    Print(L"File size is %d\n", size);
+    CHAR16 *buffer = L"NULL";
+
+    Print(L"ReadSimpleLoadKernel. size %d\n", size);
+    EFI_STATUS status = ReadSimpleReadFile(file ,0 , &size, (VOID *)buffer);
+
+    Print(L"ReadSimpleReadFile :%r\n", status);
+    if (EFI_ERROR(status)) {
+        Print(L"ReadSimpleReadFile :%r\n", status);
+        return status;
+    }
+
+    Print(L"buffer %s\n", buffer);
+
+    return EFI_SUCCESS;
+}
+
+UINTN
+is_space(CHAR16 c)
+{
+    return  c == L' ' || c == L'\t' || c == L'\r' || c == L'\n';
+}
+
+CHAR16*
+get_kernel_name(CHAR16 *options, UINT32 options_size)
+{
+    /* 
+     * skip first option,
+     * first option is file name of this efi executable.
+     */ 
+
+    UINT32 count = options_size;
+
+    while(count && !is_space(*options)) {
+        options++;
+        count--;
+    }
+
+    while (is_space(*options)) {
+        options++;
+    }
+
+    CHAR16 *start_ptr = options;
+
+    while(!is_space(*options)) {
+        options++;
+    }
+
+    CHAR16 *kernel_name = (CHAR16 *)AllocatePool((options - start_ptr + 1) * sizeof(CHAR16));
+
+    RtCopyMem(kernel_name, start_ptr, (options - start_ptr) * sizeof(CHAR16));
+    
+    // delete last 0
+    kernel_name[options - start_ptr] = 0;
+
+    Print(L"kernel name: -%s- name size: %d\n", kernel_name, (options - start_ptr));
+
+    return kernel_name;
+    
+}
+
+EFI_STATUS
+load_kernel(CHAR16 *kernel_name)
+{
+    Print(L"Start load kernel: %s\n", kernel_name);
+
+    EFI_STATUS status = EFI_SUCCESS;
+    UINTN handle_count;
+    EFI_HANDLE *handle_buffer;
+
+    status = uefi_call_wrapper(BS->LocateHandleBuffer,
+                5,
+                ByProtocol,
+                &FileSystemProtocol,
+                NULL,
+                &handle_count,
+                &handle_buffer);
+
+    if (EFI_ERROR(status)) {
+        Print(L"LocateHandleBuffer is %r\n", status);
+        return status;
+    }
+
+    EFI_DEVICE_PATH *path = NULL;
+    UINTN handle_idx = 0;
+    SIMPLE_READ_FILE read_handle;
+
+    for (handle_idx = 0; handle_idx < handle_count; handle_idx++) {
+        EFI_HANDLE device_handle;
+
+        path = FileDevicePath(handle_buffer[handle_idx], kernel_name);
+
+        if (!path) {
+            status = EFI_NOT_FOUND;
+            break;
+        }
+
+        status = OpenSimpleReadFile(TRUE, NULL, 0, &path, &device_handle, &read_handle);
+
+        if (!EFI_ERROR(status)) {
+            break;
+        }
+
+        FreePool(path);
+        path = NULL;
+    }
+
+    if (!EFI_ERROR(status)) {
+        status = load_image(read_handle);
+    }
+
+    if (read_handle) {
+        CloseSimpleReadFile(read_handle);
+    }
+
+    if (path) {
+        FreePool(path);
+    }
+
+    FreePool(handle_buffer);
+
+    return status;
+}
+
+EFI_STATUS
+efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
+{
+    EFI_LOADED_IMAGE *loaded_image;
+
+    InitializeLib(image, systab);
+
+    uefi_call_wrapper(systab->ConOut->Reset, 2, systab->ConOut, FALSE);
+
+    Print(L"---- start ----\n");
+
+    EFI_STATUS status;
+    
+    Print(L"Open LoadedImage Protocol\n");
+    status = uefi_call_wrapper(
+        BS->OpenProtocol,
+        6,
+        image,
+        &LoadedImageProtocol,
+        (void **)&loaded_image,
+        image,
+        NULL,
+        EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
+
+    if (EFI_ERROR(status)) {
+        Print(L"OpenProtocol is %r\n", status);
+    }
+
+    Print(L"%s\n", loaded_image->LoadOptions);
+
+    CHAR16 *kernel_name = get_kernel_name(loaded_image->LoadOptions, loaded_image->LoadOptionsSize);
+
+    Print(L"%s\n", kernel_name);
+
+    load_kernel(kernel_name);
+
+    Print(L"Close LoadedImage Protocol\n");
+    status = uefi_call_wrapper(
+        BS->CloseProtocol,
+        4,
+        image,
+        &LoadedImageProtocol,
+        image,
+        NULL);
+
+    if (EFI_ERROR(status)) {
+        Print(L"CloseProtocol is %r\n", status);
+    }
+
+    Print(L"---- Faild start kernel ----\n");
+
+    return EFI_SUCCESS;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/boot/registers.h	Mon Jun 30 00:38:55 2014 +0900
@@ -0,0 +1,66 @@
+#ifndef REGISTERS
+#define REGISTERS
+
+typedef struct _cr3_t {
+    UINT64 ignored1:3;
+    UINT64 pwt:1; /* page-level write through */
+    UINT64 pcd:1; /* page-level cache disable */
+    UINT64 ignored2:7; 
+    UINT64 pdb:40; /* page directory base */
+    UINT64 reserved :12;
+} cr3_t;
+#define PHYADDR_WIDTH 127
+
+typedef struct _cr4_t {
+    UINT64 vme:1;
+    UINT64 pvi:1;
+    UINT64 tsd:1;
+    UINT64 de:1;
+    UINT64 pse:1; // page size extensions
+    UINT64 pae:1; // physical address extension
+    UINT64 mce:1;
+    UINT64 pge:1;
+    UINT64 pce:1;
+    UINT64 osfxsr:1;
+    UINT64 osxmmexcept:1;
+    UINT64 ignored2 :2;
+    UINT64 vmxe: 1;
+    UINT64 smxe: 1;
+    UINT64 ignored3: 1;
+    UINT64 fsgsbase: 1;
+    UINT64 pcide: 1;
+    UINT64 osxsave: 1;
+    UINT64 ignored4: 1;
+    UINT64 smep: 1;
+    UINT64 reserved:43;
+} cr4_t;
+
+typedef struct _cr0_t {
+    UINT64 pe :1;
+    UINT64 mp :1;
+    UINT64 em :1;
+    UINT64 ts :1;
+    UINT64 et :1;
+    UINT64 ne :1;
+    UINT64 ignored1 :10;
+    UINT64 wp :1;
+    UINT64 ignored2 :1;
+    UINT64 am :1;
+    UINT64 ignored3 :10;
+    UINT64 nw :1;
+    UINT64 cd :1;
+    UINT64 pg :1; /* pageing */
+} cr0_t;
+
+typedef struct _efer_t {
+    UINT64 syscall_enable :1;
+    UINT64 reserved1:7;
+    UINT64 ia32e_enable :1;
+    UINT64 reserved2 :1;
+    UINT64 ia32e_active :1;
+    UINT64 edb_enable :1;
+    UINT64 reserved3 :52;
+} efer_t;
+
+
+#endif /* REGISTERS */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/elf.h	Mon Jun 30 00:38:55 2014 +0900
@@ -0,0 +1,633 @@
+/*
+ *  Copyright (C) 2001-2003 Hewlett-Packard Co.
+ *	Contributed by Stephane Eranian <eranian@hpl.hp.com>
+ *
+ * This file is part of the ELILO, the EFI Linux boot loader.
+ *
+ *  GNU EFI 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, or (at your option)
+ *  any later version.
+ *
+ *  GNU EFI 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 GNU EFI; see the file COPYING.  If not, write to the Free
+ *  Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+ *  02111-1307, USA.
+ *
+ * Please check out the elilo.txt for complete documentation on how
+ * to use this program.
+ *
+ * Portions of this file are derived from the  LILO/x86
+ * Copyright 1992-1997 Werner Almesberger. 
+ */
+
+#ifndef __LINUX_ELF_H__
+#define __LINUX_ELF_H__
+
+/*
+ * This file was derived from <linux/elf.h>.
+ */
+
+#include <efi.h>
+
+/* 32-bit ELF base types. */
+typedef UINT32	Elf32_Addr;
+typedef UINT16	Elf32_Half;
+typedef UINT32	Elf32_Off;
+typedef INT32	Elf32_Sword;
+typedef UINT32	Elf32_Word;
+
+/* 64-bit ELF base types. */
+typedef UINT64	Elf64_Addr;
+typedef UINT16	Elf64_Half;
+typedef INT16	Elf64_SHalf;
+typedef UINT64	Elf64_Off;
+typedef INT64	Elf64_Sword;
+typedef UINT64	Elf64_Word;
+
+/* These constants are for the segment types stored in the image headers */
+#define PT_NULL    0
+#define PT_LOAD    1
+#define PT_DYNAMIC 2
+#define PT_INTERP  3
+#define PT_NOTE    4
+#define PT_SHLIB   5
+#define PT_PHDR    6
+#define PT_LOPROC  0x70000000
+#define PT_HIPROC  0x7fffffff
+#define PT_MIPS_REGINFO		0x70000000
+
+/* Flags in the e_flags field of the header */
+#define EF_MIPS_NOREORDER 0x00000001
+#define EF_MIPS_PIC       0x00000002
+#define EF_MIPS_CPIC      0x00000004
+#define EF_MIPS_ARCH      0xf0000000
+
+/* These constants define the different elf file types */
+#define ET_NONE   0
+#define ET_REL    1
+#define ET_EXEC   2
+#define ET_DYN    3
+#define ET_CORE   4
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
+
+/* These constants define the various ELF target machines */
+#define EM_NONE  0
+#define EM_M32   1
+#define EM_SPARC 2
+#define EM_386   3
+#define EM_68K   4
+#define EM_88K   5
+#define EM_486   6   /* Perhaps disused */
+#define EM_860   7
+
+#define EM_MIPS		8	/* MIPS R3000 (officially, big-endian only) */
+
+#define EM_MIPS_RS4_BE 10	/* MIPS R4000 big-endian */
+
+#define EM_PARISC      15	/* HPPA */
+
+#define EM_SPARC32PLUS 18	/* Sun's "v8plus" */
+
+#define EM_PPC	       20	/* PowerPC */
+
+#define EM_SH	       42	/* SuperH */
+
+#define EM_SPARCV9     43	/* SPARC v9 64-bit */
+
+#define EM_IA_64	50	/* HP/Intel IA-64 */
+
+#define EM_X86_64       62      /* Intel/AMD x86-64 */
+/*
+ * This is an interim value that we will use until the committee comes
+ * up with a final number.
+ */
+#define EM_ALPHA	0x9026
+
+
+/* This is the info that is needed to parse the dynamic section of the file */
+#define DT_NULL		0
+#define DT_NEEDED	1
+#define DT_PLTRELSZ	2
+#define DT_PLTGOT	3
+#define DT_HASH		4
+#define DT_STRTAB	5
+#define DT_SYMTAB	6
+#define DT_RELA		7
+#define DT_RELASZ	8
+#define DT_RELAENT	9
+#define DT_STRSZ	10
+#define DT_SYMENT	11
+#define DT_INIT		12
+#define DT_FINI		13
+#define DT_SONAME	14
+#define DT_RPATH 	15
+#define DT_SYMBOLIC	16
+#define DT_REL	        17
+#define DT_RELSZ	18
+#define DT_RELENT	19
+#define DT_PLTREL	20
+#define DT_DEBUG	21
+#define DT_TEXTREL	22
+#define DT_JMPREL	23
+#define DT_LOPROC	0x70000000
+#define DT_HIPROC	0x7fffffff
+#define DT_MIPS_RLD_VERSION	0x70000001
+#define DT_MIPS_TIME_STAMP	0x70000002
+#define DT_MIPS_ICHECKSUM	0x70000003
+#define DT_MIPS_IVERSION	0x70000004
+#define DT_MIPS_FLAGS		0x70000005
+#  define RHF_NONE		  0
+#  define RHF_HARDWAY		  1
+#  define RHF_NOTPOT		  2
+#define DT_MIPS_BASE_ADDRESS	0x70000006
+#define DT_MIPS_CONFLICT	0x70000008
+#define DT_MIPS_LIBLIST		0x70000009
+#define DT_MIPS_LOCAL_GOTNO	0x7000000a
+#define DT_MIPS_CONFLICTNO	0x7000000b
+#define DT_MIPS_LIBLISTNO	0x70000010
+#define DT_MIPS_SYMTABNO	0x70000011
+#define DT_MIPS_UNREFEXTNO	0x70000012
+#define DT_MIPS_GOTSYM		0x70000013
+#define DT_MIPS_HIPAGENO	0x70000014
+#define DT_MIPS_RLD_MAP		0x70000016
+
+/* This info is needed when parsing the symbol table */
+#define STB_LOCAL  0
+#define STB_GLOBAL 1
+#define STB_WEAK   2
+
+#define STT_NOTYPE  0
+#define STT_OBJECT  1
+#define STT_FUNC    2
+#define STT_SECTION 3
+#define STT_FILE    4
+
+#define ELF32_ST_BIND(x) ((x) >> 4)
+#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
+
+/* Symbolic values for the entries in the auxiliary table
+   put on the initial stack */
+#define AT_NULL   0	/* end of vector */
+#define AT_IGNORE 1	/* entry should be ignored */
+#define AT_EXECFD 2	/* file descriptor of program */
+#define AT_PHDR   3	/* program headers for program */
+#define AT_PHENT  4	/* size of program header entry */
+#define AT_PHNUM  5	/* number of program headers */
+#define AT_PAGESZ 6	/* system page size */
+#define AT_BASE   7	/* base address of interpreter */
+#define AT_FLAGS  8	/* flags */
+#define AT_ENTRY  9	/* entry point of program */
+#define AT_NOTELF 10	/* program is not ELF */
+#define AT_UID    11	/* real uid */
+#define AT_EUID   12	/* effective uid */
+#define AT_GID    13	/* real gid */
+#define AT_EGID   14	/* effective gid */
+#define AT_PLATFORM 15  /* string identifying CPU for optimizations */
+#define AT_HWCAP  16    /* arch dependent hints at CPU capabilities */
+
+typedef struct dynamic{
+  Elf32_Sword d_tag;
+  union{
+    Elf32_Sword	d_val;
+    Elf32_Addr	d_ptr;
+  } d_un;
+} Elf32_Dyn;
+
+typedef struct {
+  Elf64_Word d_tag;		/* entry tag value */
+  union {
+    Elf64_Word d_val;
+    Elf64_Word d_ptr;
+  } d_un;
+} Elf64_Dyn;
+
+/* The following are used with relocations */
+#define ELF32_R_SYM(x) ((x) >> 8)
+#define ELF32_R_TYPE(x) ((x) & 0xff)
+
+#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
+
+#define R_MIPS_NONE		0
+#define R_MIPS_16		1
+#define R_MIPS_32		2
+#define R_MIPS_REL32		3
+#define R_MIPS_26		4
+#define R_MIPS_HI16		5
+#define R_MIPS_LO16		6
+#define R_MIPS_GPREL16		7
+#define R_MIPS_LITERAL		8
+#define R_MIPS_GOT16		9
+#define R_MIPS_PC16		10
+#define R_MIPS_CALL16		11
+#define R_MIPS_GPREL32		12
+/* The remaining relocs are defined on Irix, although they are not
+   in the MIPS ELF ABI.  */
+#define R_MIPS_UNUSED1		13
+#define R_MIPS_UNUSED2		14
+#define R_MIPS_UNUSED3		15
+#define R_MIPS_SHIFT5		16
+#define R_MIPS_SHIFT6		17
+#define R_MIPS_64		18
+#define R_MIPS_GOT_DISP		19
+#define R_MIPS_GOT_PAGE		20
+#define R_MIPS_GOT_OFST		21
+/*
+ * The following two relocation types are specified in the the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_GOTHI16		22
+#define R_MIPS_GOTLO16		23
+#define R_MIPS_SUB		24
+#define R_MIPS_INSERT_A		25
+#define R_MIPS_INSERT_B		26
+#define R_MIPS_DELETE		27
+#define R_MIPS_HIGHER		28
+#define R_MIPS_HIGHEST		29
+/*
+ * The following two relocation types are specified in the the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_CALLHI16		30
+#define R_MIPS_CALLLO16		31
+/*
+ * This range is reserved for vendor specific relocations.
+ */
+#define R_MIPS_LOVENDOR		100
+#define R_MIPS_HIVENDOR		127
+
+
+/*
+ * Sparc ELF relocation types
+ */
+#define	R_SPARC_NONE		0
+#define	R_SPARC_8		1
+#define	R_SPARC_16		2
+#define	R_SPARC_32		3
+#define	R_SPARC_DISP8		4
+#define	R_SPARC_DISP16		5
+#define	R_SPARC_DISP32		6
+#define	R_SPARC_WDISP30		7
+#define	R_SPARC_WDISP22		8
+#define	R_SPARC_HI22		9
+#define	R_SPARC_22		10
+#define	R_SPARC_13		11
+#define	R_SPARC_LO10		12
+#define	R_SPARC_GOT10		13
+#define	R_SPARC_GOT13		14
+#define	R_SPARC_GOT22		15
+#define	R_SPARC_PC10		16
+#define	R_SPARC_PC22		17
+#define	R_SPARC_WPLT30		18
+#define	R_SPARC_COPY		19
+#define	R_SPARC_GLOB_DAT	20
+#define	R_SPARC_JMP_SLOT	21
+#define	R_SPARC_RELATIVE	22
+#define	R_SPARC_UA32		23
+#define R_SPARC_PLT32		24
+#define R_SPARC_HIPLT22		25
+#define R_SPARC_LOPLT10		26
+#define R_SPARC_PCPLT32		27
+#define R_SPARC_PCPLT22		28
+#define R_SPARC_PCPLT10		29
+#define R_SPARC_10		30
+#define R_SPARC_11		31
+#define R_SPARC_WDISP16		40
+#define R_SPARC_WDISP19		41
+#define R_SPARC_7		43
+#define R_SPARC_5		44
+#define R_SPARC_6		45
+
+/* Bits present in AT_HWCAP, primarily for Sparc32.  */
+
+#define HWCAP_SPARC_FLUSH       1    /* CPU supports flush instruction. */
+#define HWCAP_SPARC_STBAR       2
+#define HWCAP_SPARC_SWAP        4
+#define HWCAP_SPARC_MULDIV      8
+#define HWCAP_SPARC_V9		16
+
+
+/*
+ * 68k ELF relocation types
+ */
+#define R_68K_NONE	0
+#define R_68K_32	1
+#define R_68K_16	2
+#define R_68K_8		3
+#define R_68K_PC32	4
+#define R_68K_PC16	5
+#define R_68K_PC8	6
+#define R_68K_GOT32	7
+#define R_68K_GOT16	8
+#define R_68K_GOT8	9
+#define R_68K_GOT32O	10
+#define R_68K_GOT16O	11
+#define R_68K_GOT8O	12
+#define R_68K_PLT32	13
+#define R_68K_PLT16	14
+#define R_68K_PLT8	15
+#define R_68K_PLT32O	16
+#define R_68K_PLT16O	17
+#define R_68K_PLT8O	18
+#define R_68K_COPY	19
+#define R_68K_GLOB_DAT	20
+#define R_68K_JMP_SLOT	21
+#define R_68K_RELATIVE	22
+
+/*
+ * Alpha ELF relocation types
+ */
+#define R_ALPHA_NONE            0       /* No reloc */
+#define R_ALPHA_REFLONG         1       /* Direct 32 bit */
+#define R_ALPHA_REFQUAD         2       /* Direct 64 bit */
+#define R_ALPHA_GPREL32         3       /* GP relative 32 bit */
+#define R_ALPHA_LITERAL         4       /* GP relative 16 bit w/optimization */
+#define R_ALPHA_LITUSE          5       /* Optimization hint for LITERAL */
+#define R_ALPHA_GPDISP          6       /* Add displacement to GP */
+#define R_ALPHA_BRADDR          7       /* PC+4 relative 23 bit shifted */
+#define R_ALPHA_HINT            8       /* PC+4 relative 16 bit shifted */
+#define R_ALPHA_SREL16          9       /* PC relative 16 bit */
+#define R_ALPHA_SREL32          10      /* PC relative 32 bit */
+#define R_ALPHA_SREL64          11      /* PC relative 64 bit */
+#define R_ALPHA_OP_PUSH         12      /* OP stack push */
+#define R_ALPHA_OP_STORE        13      /* OP stack pop and store */
+#define R_ALPHA_OP_PSUB         14      /* OP stack subtract */
+#define R_ALPHA_OP_PRSHIFT      15      /* OP stack right shift */
+#define R_ALPHA_GPVALUE         16
+#define R_ALPHA_GPRELHIGH       17
+#define R_ALPHA_GPRELLOW        18
+#define R_ALPHA_IMMED_GP_16     19
+#define R_ALPHA_IMMED_GP_HI32   20
+#define R_ALPHA_IMMED_SCN_HI32  21
+#define R_ALPHA_IMMED_BR_HI32   22
+#define R_ALPHA_IMMED_LO32      23
+#define R_ALPHA_COPY            24      /* Copy symbol at runtime */
+#define R_ALPHA_GLOB_DAT        25      /* Create GOT entry */
+#define R_ALPHA_JMP_SLOT        26      /* Create PLT entry */
+#define R_ALPHA_RELATIVE        27      /* Adjust by program base */
+
+/* Legal values for e_flags field of Elf64_Ehdr.  */
+
+#define EF_ALPHA_32BIT		1	/* All addresses are below 2GB */
+
+
+typedef struct elf32_rel {
+  Elf32_Addr	r_offset;
+  Elf32_Word	r_info;
+} Elf32_Rel;
+
+typedef struct elf64_rel {
+  Elf64_Addr r_offset;	/* Location at which to apply the action */
+  Elf64_Word r_info;	/* index and type of relocation */
+} Elf64_Rel;
+
+typedef struct elf32_rela{
+  Elf32_Addr	r_offset;
+  Elf32_Word	r_info;
+  Elf32_Sword	r_addend;
+} Elf32_Rela;
+
+typedef struct elf64_rela {
+  Elf64_Addr r_offset;	/* Location at which to apply the action */
+  Elf64_Word r_info;	/* index and type of relocation */
+  Elf64_Word r_addend;	/* Constant addend used to compute value */
+} Elf64_Rela;
+
+typedef struct elf32_sym{
+  Elf32_Word	st_name;
+  Elf32_Addr	st_value;
+  Elf32_Word	st_size;
+  unsigned char	st_info;
+  unsigned char	st_other;
+  Elf32_Half	st_shndx;
+} Elf32_Sym;
+
+typedef struct elf64_sym {
+  Elf32_Word st_name;		/* Symbol name, index in string tbl (yes, Elf32) */
+  unsigned char	st_info;	/* Type and binding attributes */
+  unsigned char	st_other;	/* No defined meaning, 0 */
+  Elf64_Half st_shndx;		/* Associated section index */
+  Elf64_Addr st_value;		/* Value of the symbol */
+  Elf64_Word st_size;		/* Associated symbol size */
+} Elf64_Sym;
+
+
+#define EI_NIDENT	16
+
+typedef struct elf32_hdr{
+  unsigned char	e_ident[EI_NIDENT];
+  Elf32_Half	e_type;
+  Elf32_Half	e_machine;
+  Elf32_Word	e_version;
+  Elf32_Addr	e_entry;  /* Entry point */
+  Elf32_Off	e_phoff;
+  Elf32_Off	e_shoff;
+  Elf32_Word	e_flags;
+  Elf32_Half	e_ehsize;
+  Elf32_Half	e_phentsize;
+  Elf32_Half	e_phnum;
+  Elf32_Half	e_shentsize;
+  Elf32_Half	e_shnum;
+  Elf32_Half	e_shstrndx;
+} Elf32_Ehdr;
+
+typedef struct elf64_hdr {
+  unsigned char	e_ident[16];		/* ELF "magic number" */
+  Elf64_SHalf e_type;
+  Elf64_Half e_machine;
+  INT32 e_version;
+  Elf64_Addr e_entry;		/* Entry point virtual address */
+  Elf64_Off e_phoff;		/* Program header table file offset */
+  Elf64_Off e_shoff;		/* Section header table file offset */
+  INT32 e_flags;
+  Elf64_SHalf e_ehsize;
+  Elf64_SHalf e_phentsize;
+  Elf64_SHalf e_phnum;
+  Elf64_SHalf e_shentsize;
+  Elf64_SHalf e_shnum;
+  Elf64_SHalf e_shstrndx;
+} Elf64_Ehdr;
+
+/* These constants define the permissions on sections in the program
+   header, p_flags. */
+#define PF_R		0x4
+#define PF_W		0x2
+#define PF_X		0x1
+
+typedef struct elf32_phdr{
+  Elf32_Word	p_type;
+  Elf32_Off	p_offset;
+  Elf32_Addr	p_vaddr;
+  Elf32_Addr	p_paddr;
+  Elf32_Word	p_filesz;
+  Elf32_Word	p_memsz;
+  Elf32_Word	p_flags;
+  Elf32_Word	p_align;
+} Elf32_Phdr;
+
+typedef struct elf64_phdr {
+  INT32 p_type;
+  INT32 p_flags;
+  Elf64_Off p_offset;		/* Segment file offset */
+  Elf64_Addr p_vaddr;		/* Segment virtual address */
+  Elf64_Addr p_paddr;		/* Segment physical address */
+  Elf64_Word p_filesz;		/* Segment size in file */
+  Elf64_Word p_memsz;		/* Segment size in memory */
+  Elf64_Word p_align;		/* Segment alignment, file & memory */
+} Elf64_Phdr;
+
+/* sh_type */
+#define SHT_NULL	0
+#define SHT_PROGBITS	1
+#define SHT_SYMTAB	2
+#define SHT_STRTAB	3
+#define SHT_RELA	4
+#define SHT_HASH	5
+#define SHT_DYNAMIC	6
+#define SHT_NOTE	7
+#define SHT_NOBITS	8
+#define SHT_REL		9
+#define SHT_SHLIB	10
+#define SHT_DYNSYM	11
+#define SHT_NUM		12
+#define SHT_LOPROC	0x70000000
+#define SHT_HIPROC	0x7fffffff
+#define SHT_LOUSER	0x80000000
+#define SHT_HIUSER	0xffffffff
+#define SHT_MIPS_LIST		0x70000000
+#define SHT_MIPS_CONFLICT	0x70000002
+#define SHT_MIPS_GPTAB		0x70000003
+#define SHT_MIPS_UCODE		0x70000004
+
+/* sh_flags */
+#define SHF_WRITE	0x1
+#define SHF_ALLOC	0x2
+#define SHF_EXECINSTR	0x4
+#define SHF_MASKPROC	0xf0000000
+#define SHF_MIPS_GPREL	0x10000000
+
+/* special section indexes */
+#define SHN_UNDEF	0
+#define SHN_LORESERVE	0xff00
+#define SHN_LOPROC	0xff00
+#define SHN_HIPROC	0xff1f
+#define SHN_ABS		0xfff1
+#define SHN_COMMON	0xfff2
+#define SHN_HIRESERVE	0xffff
+#define SHN_MIPS_ACCOMON	0xff00
+ 
+typedef struct {
+  Elf32_Word	sh_name;
+  Elf32_Word	sh_type;
+  Elf32_Word	sh_flags;
+  Elf32_Addr	sh_addr;
+  Elf32_Off	sh_offset;
+  Elf32_Word	sh_size;
+  Elf32_Word	sh_link;
+  Elf32_Word	sh_info;
+  Elf32_Word	sh_addralign;
+  Elf32_Word	sh_entsize;
+} Elf32_Shdr;
+
+typedef struct elf64_shdr {
+  Elf32_Word sh_name;		/* Section name, index in string tbl (yes Elf32) */
+  Elf32_Word sh_type;		/* Type of section (yes Elf32) */
+  Elf64_Word sh_flags;		/* Miscellaneous section attributes */
+  Elf64_Addr sh_addr;		/* Section virtual addr at execution */
+  Elf64_Off sh_offset;		/* Section file offset */
+  Elf64_Word sh_size;		/* Size of section in bytes */
+  Elf32_Word sh_link;		/* Index of another section (yes Elf32) */
+  Elf32_Word sh_info;		/* Additional section information (yes Elf32) */
+  Elf64_Word sh_addralign;	/* Section alignment */
+  Elf64_Word sh_entsize;	/* Entry size if section holds table */
+} Elf64_Shdr;
+
+#define	EI_MAG0		0		/* e_ident[] indexes */
+#define	EI_MAG1		1
+#define	EI_MAG2		2
+#define	EI_MAG3		3
+#define	EI_CLASS	4
+#define	EI_DATA		5
+#define	EI_VERSION	6
+#define	EI_PAD		7
+
+#define	ELFMAG0		0x7f		/* EI_MAG */
+#define	ELFMAG1		'E'
+#define	ELFMAG2		'L'
+#define	ELFMAG3		'F'
+#define	ELFMAG		"\177ELF"
+#define	SELFMAG		4
+
+#define	ELFCLASSNONE	0		/* EI_CLASS */
+#define	ELFCLASS32	1
+#define	ELFCLASS64	2
+#define	ELFCLASSNUM	3
+
+#define ELFDATANONE	0		/* e_ident[EI_DATA] */
+#define ELFDATA2LSB	1
+#define ELFDATA2MSB	2
+
+#define EV_NONE		0		/* e_version, EI_VERSION */
+#define EV_CURRENT	1
+#define EV_NUM		2
+
+/* Notes used in ET_CORE */
+#define NT_PRSTATUS	1
+#define NT_PRFPREG	2
+#define NT_PRPSINFO	3
+#define NT_TASKSTRUCT	4
+
+/* Note header in a PT_NOTE section */
+typedef struct elf32_note {
+  Elf32_Word	n_namesz;	/* Name size */
+  Elf32_Word	n_descsz;	/* Content size */
+  Elf32_Word	n_type;		/* Content type */
+} Elf32_Nhdr;
+
+/* Note header in a PT_NOTE section */
+/*
+ * For now we use the 32 bit version of the structure until we figure
+ * out whether we need anything better.  Note - on the Alpha, "unsigned int"
+ * is only 32 bits.
+ */
+typedef struct elf64_note {
+  Elf32_Word n_namesz;	/* Name size */
+  Elf32_Word n_descsz;	/* Content size */
+  Elf32_Word n_type;	/* Content type */
+} Elf64_Nhdr;
+
+#if ELF_CLASS == ELFCLASS32
+
+extern Elf32_Dyn _DYNAMIC [];
+#define elfhdr		elf32_hdr
+#define elf_phdr	elf32_phdr
+#define elf_note	elf32_note
+
+#else
+
+extern Elf64_Dyn _DYNAMIC [];
+#define elfhdr		elf64_hdr
+#define elf_phdr	elf64_phdr
+#define elf_note	elf64_note
+
+#endif
+
+
+#endif /* __LINUX_ELF_H__ */
--- a/kernel/kernel.c	Tue Apr 01 08:35:34 2014 +0900
+++ b/kernel/kernel.c	Mon Jun 30 00:38:55 2014 +0900
@@ -1,4 +1,3 @@
-
 int
 main()
 {