Browse Source

Merge git://git.denx.de/u-boot-x86

Tom Rini 6 years ago
parent
commit
9d24b01ce0

+ 4 - 3
arch/x86/cpu/coreboot/sdram.c

@@ -12,12 +12,13 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
+unsigned int install_e820_map(unsigned int max_entries,
+			      struct e820_entry *entries)
 {
-	unsigned num_entries;
+	unsigned int num_entries;
 	int i;
 
-	num_entries = min((unsigned)lib_sysinfo.n_memranges, max_entries);
+	num_entries = min((unsigned int)lib_sysinfo.n_memranges, max_entries);
 	if (num_entries < lib_sysinfo.n_memranges) {
 		printf("Warning: Limiting e820 map to %d entries.\n",
 			num_entries);

+ 2 - 1
arch/x86/cpu/qemu/e820.c

@@ -9,7 +9,8 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
+unsigned int install_e820_map(unsigned int max_entries,
+			      struct e820_entry *entries)
 {
 	entries[0].addr = 0;
 	entries[0].size = ISA_START_ADDRESS;

+ 4 - 2
arch/x86/cpu/tangier/sdram.c

@@ -99,7 +99,8 @@ static struct sfi_table_simple *sfi_search_mmap(void)
 	     i < SFI_GET_NUM_ENTRIES(sb, struct sfi_mem_entry);		\
 	     i++, mentry++)						\
 
-static unsigned sfi_setup_e820(unsigned max_entries, struct e820entry *entries)
+static unsigned int sfi_setup_e820(unsigned int max_entries,
+				   struct e820_entry *entries)
 {
 	struct sfi_table_simple *sb;
 	struct sfi_mem_entry *mentry;
@@ -188,7 +189,8 @@ static phys_size_t sfi_get_ram_size(void)
 	return ram;
 }
 
-unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
+unsigned int install_e820_map(unsigned int max_entries,
+			      struct e820_entry *entries)
 {
 	return sfi_setup_e820(max_entries, entries);
 }

+ 1 - 1
arch/x86/include/asm/bootparam.h

@@ -111,7 +111,7 @@ struct boot_params {
 	struct setup_header hdr;    /* setup header */	/* 0x1f1 */
 	__u8  _pad7[0x290-0x1f1-sizeof(struct setup_header)];
 	__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];	/* 0x290 */
-	struct e820entry e820_map[E820MAX];		/* 0x2d0 */
+	struct e820_entry e820_map[E820MAX];		/* 0x2d0 */
 	__u8  _pad8[48];				/* 0xcd0 */
 	struct edd_info eddbuf[EDDMAXNR];		/* 0xd00 */
 	__u8  _pad9[276];				/* 0xeec */

+ 3 - 2
arch/x86/include/asm/e820.h

@@ -12,7 +12,7 @@
 #ifndef __ASSEMBLY__
 #include <linux/types.h>
 
-struct e820entry {
+struct e820_entry {
 	__u64 addr;	/* start of memory segment */
 	__u64 size;	/* size of memory segment */
 	__u32 type;	/* type of memory segment */
@@ -24,6 +24,7 @@ struct e820entry {
 #endif /* __ASSEMBLY__ */
 
 /* Implementation defined function to install an e820 map */
-unsigned install_e820_map(unsigned max_entries, struct e820entry *);
+unsigned int install_e820_map(unsigned int max_entries,
+			      struct e820_entry *);
 
 #endif /* _ASM_X86_E820_H */

+ 21 - 17
arch/x86/include/asm/io.h

@@ -61,49 +61,53 @@
 #define readb(addr) (*(volatile unsigned char *) (addr))
 #define readw(addr) (*(volatile unsigned short *) (addr))
 #define readl(addr) (*(volatile unsigned int *) (addr))
+#define readq(addr) (*(volatile unsigned long long *) (addr))
 #define __raw_readb readb
 #define __raw_readw readw
 #define __raw_readl readl
+#define __raw_readq readq
 
 #define writeb(b,addr) (*(volatile unsigned char *) (addr) = (b))
 #define writew(b,addr) (*(volatile unsigned short *) (addr) = (b))
 #define writel(b,addr) (*(volatile unsigned int *) (addr) = (b))
+#define writeq(b,addr) (*(volatile unsigned long long *) (addr) = (b))
 #define __raw_writeb writeb
 #define __raw_writew writew
 #define __raw_writel writel
+#define __raw_writeq writeq
 
 #define memset_io(a,b,c)	memset((a),(b),(c))
 #define memcpy_fromio(a,b,c)	memcpy((a),(b),(c))
 #define memcpy_toio(a,b,c)	memcpy((a),(b),(c))
 
-#define write_arch(type, endian, a, v) __raw_write##type(cpu_to_##endian(v), a)
-#define read_arch(type, endian, a) endian##_to_cpu(__raw_read##type(a))
+#define out_arch(type, endian, a, v)	__raw_write##type(cpu_to_##endian(v), a)
+#define in_arch(type, endian, a)	endian##_to_cpu(__raw_read##type(a))
 
-#define write_le64(a, v)	write_arch(q, le64, a, v)
-#define write_le32(a, v)	write_arch(l, le32, a, v)
-#define write_le16(a, v)	write_arch(w, le16, a, v)
+#define out_le64(a, v)	out_arch(q, le64, a, v)
+#define out_le32(a, v)	out_arch(l, le32, a, v)
+#define out_le16(a, v)	out_arch(w, le16, a, v)
 
-#define read_le64(a)	read_arch(q, le64, a)
-#define read_le32(a)	read_arch(l, le32, a)
-#define read_le16(a)	read_arch(w, le16, a)
+#define in_le64(a)	in_arch(q, le64, a)
+#define in_le32(a)	in_arch(l, le32, a)
+#define in_le16(a)	in_arch(w, le16, a)
 
-#define write_be32(a, v)	write_arch(l, be32, a, v)
-#define write_be16(a, v)	write_arch(w, be16, a, v)
+#define out_be32(a, v)	out_arch(l, be32, a, v)
+#define out_be16(a, v)	out_arch(w, be16, a, v)
 
-#define read_be32(a)	read_arch(l, be32, a)
-#define read_be16(a)	read_arch(w, be16, a)
+#define in_be32(a)	in_arch(l, be32, a)
+#define in_be16(a)	in_arch(w, be16, a)
 
-#define write_8(a, v)	__raw_writeb(v, a)
-#define read_8(a)	__raw_readb(a)
+#define out_8(a, v)	__raw_writeb(v, a)
+#define in_8(a)		__raw_readb(a)
 
 #define clrbits(type, addr, clear) \
-	write_##type((addr), read_##type(addr) & ~(clear))
+	out_##type((addr), in_##type(addr) & ~(clear))
 
 #define setbits(type, addr, set) \
-	write_##type((addr), read_##type(addr) | (set))
+	out_##type((addr), in_##type(addr) | (set))
 
 #define clrsetbits(type, addr, clear, set) \
-	write_##type((addr), (read_##type(addr) & ~(clear)) | (set))
+	out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
 
 #define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
 #define setbits_be32(addr, set) setbits(be32, addr, set)

+ 4 - 0
arch/x86/lib/bios.c

@@ -185,6 +185,7 @@ static void setup_realmode_idt(void)
 	write_idt_stub((void *)0xffe6e, 0x1a);
 }
 
+#ifdef CONFIG_FRAMEBUFFER_SET_VESA_MODE
 static u8 vbe_get_mode_info(struct vbe_mode_info *mi)
 {
 	u16 buffer_seg;
@@ -241,6 +242,7 @@ static void vbe_set_graphics(int vesa_mode, struct vbe_mode_info *mode_info)
 	mode_info->video_mode &= 0x3ff;
 	vbe_set_mode(mode_info);
 }
+#endif /* CONFIG_FRAMEBUFFER_SET_VESA_MODE */
 
 void bios_run_on_x86(struct udevice *dev, unsigned long addr, int vesa_mode,
 		     struct vbe_mode_info *mode_info)
@@ -273,8 +275,10 @@ void bios_run_on_x86(struct udevice *dev, unsigned long addr, int vesa_mode,
 		      0x0);
 	debug("done\n");
 
+#ifdef CONFIG_FRAMEBUFFER_SET_VESA_MODE
 	if (vesa_mode != -1)
 		vbe_set_graphics(vesa_mode, mode_info);
+#endif
 }
 
 asmlinkage int interrupt_handler(u32 intnumber, u32 gsfs, u32 dses,

+ 1 - 1
arch/x86/lib/coreboot_table.c

@@ -100,7 +100,7 @@ void write_coreboot_table(u32 addr, struct memory_area *cfg_tables)
 	struct cb_record *cbr;
 	struct cb_memory *mem;
 	struct cb_memory_range *map;
-	struct e820entry e820[32];
+	struct e820_entry e820[32];
 	struct cb_framebuffer *fb;
 	struct vesa_mode_info *vesa;
 	int i, num;

+ 2 - 2
arch/x86/lib/e820.c

@@ -17,8 +17,8 @@ DECLARE_GLOBAL_DATA_PTR;
  *	0x100000-gd->ram_size	Useable RAM
  *	CONFIG_PCIE_ECAM_BASE	PCIe ECAM
  */
-__weak unsigned install_e820_map(unsigned max_entries,
-				 struct e820entry *entries)
+__weak unsigned int install_e820_map(unsigned int max_entries,
+				     struct e820_entry *entries)
 {
 	entries[0].addr = 0;
 	entries[0].size = ISA_START_ADDRESS;

+ 3 - 2
arch/x86/lib/fsp/fsp_dram.c

@@ -62,9 +62,10 @@ ulong board_get_usable_ram_top(ulong total_size)
 	return fsp_get_usable_lowmem_top(gd->arch.hob_list);
 }
 
-unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
+unsigned int install_e820_map(unsigned int max_entries,
+			      struct e820_entry *entries)
 {
-	unsigned num_entries = 0;
+	unsigned int num_entries = 0;
 	const struct hob_header *hdr;
 	struct hob_res_desc *res_desc;
 

+ 1 - 1
board/coreboot/coreboot/MAINTAINERS

@@ -3,4 +3,4 @@ M:	Simon Glass <sjg@chromium.org>
 S:	Maintained
 F:	board/coreboot/coreboot/
 F:	include/configs/chromebook_link.h
-F:	configs/coreboot-x86_defconfig
+F:	configs/coreboot_defconfig

+ 145 - 86
cmd/elf.c

@@ -20,13 +20,52 @@
 #include <net.h>
 #include <vxworks.h>
 #ifdef CONFIG_X86
+#include <vbe.h>
 #include <asm/e820.h>
 #include <linux/linkage.h>
 #endif
 
 /*
- * A very simple elf loader, assumes the image is valid, returns the
+ * A very simple ELF64 loader, assumes the image is valid, returns the
  * entry point address.
+ *
+ * Note if U-Boot is 32-bit, the loader assumes the to segment's
+ * physical address and size is within the lower 32-bit address space.
+ */
+static unsigned long load_elf64_image_phdr(unsigned long addr)
+{
+	Elf64_Ehdr *ehdr; /* Elf header structure pointer */
+	Elf64_Phdr *phdr; /* Program header structure pointer */
+	int i;
+
+	ehdr = (Elf64_Ehdr *)addr;
+	phdr = (Elf64_Phdr *)(addr + (ulong)ehdr->e_phoff);
+
+	/* Load each program header */
+	for (i = 0; i < ehdr->e_phnum; ++i) {
+		void *dst = (void *)(ulong)phdr->p_paddr;
+		void *src = (void *)addr + phdr->p_offset;
+
+		debug("Loading phdr %i to 0x%p (%lu bytes)\n",
+		      i, dst, (ulong)phdr->p_filesz);
+		if (phdr->p_filesz)
+			memcpy(dst, src, phdr->p_filesz);
+		if (phdr->p_filesz != phdr->p_memsz)
+			memset(dst + phdr->p_filesz, 0x00,
+			       phdr->p_memsz - phdr->p_filesz);
+		flush_cache((unsigned long)dst, phdr->p_filesz);
+		++phdr;
+	}
+
+	return ehdr->e_entry;
+}
+
+/*
+ * A very simple ELF loader, assumes the image is valid, returns the
+ * entry point address.
+ *
+ * The loader firstly reads the EFI class to see if it's a 64-bit image.
+ * If yes, call the ELF64 loader. Otherwise continue with the ELF32 loader.
  */
 static unsigned long load_elf_image_phdr(unsigned long addr)
 {
@@ -35,12 +74,16 @@ static unsigned long load_elf_image_phdr(unsigned long addr)
 	int i;
 
 	ehdr = (Elf32_Ehdr *)addr;
+	if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
+		return load_elf64_image_phdr(addr);
+
 	phdr = (Elf32_Phdr *)(addr + ehdr->e_phoff);
 
 	/* Load each program header */
 	for (i = 0; i < ehdr->e_phnum; ++i) {
 		void *dst = (void *)(uintptr_t)phdr->p_paddr;
 		void *src = (void *)addr + phdr->p_offset;
+
 		debug("Loading phdr %i to 0x%p (%i bytes)\n",
 		      i, dst, phdr->p_filesz);
 		if (phdr->p_filesz)
@@ -203,14 +246,17 @@ int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	unsigned long addr; /* Address of image */
-	unsigned long bootaddr; /* Address to put the bootline */
+	unsigned long bootaddr = 0; /* Address to put the bootline */
 	char *bootline; /* Text of the bootline */
 	char *tmp; /* Temporary char pointer */
 	char build_buf[128]; /* Buffer for building the bootline */
 	int ptr = 0;
 #ifdef CONFIG_X86
-	struct e820info *info;
-	struct e820entry *data;
+	ulong base;
+	struct e820_info *info;
+	struct e820_entry *data;
+	struct efi_gop_info *gop;
+	struct vesa_mode_info *vesa = &mode_info.vesa;
 #endif
 
 	/*
@@ -249,6 +295,45 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	puts("## Ethernet MAC address not copied to NV RAM\n");
 #endif
 
+#ifdef CONFIG_X86
+	/*
+	 * Get VxWorks's physical memory base address from environment,
+	 * if we don't specify it in the environment, use a default one.
+	 */
+	base = env_get_hex("vx_phys_mem_base", VXWORKS_PHYS_MEM_BASE);
+	data = (struct e820_entry *)(base + E820_DATA_OFFSET);
+	info = (struct e820_info *)(base + E820_INFO_OFFSET);
+
+	memset(info, 0, sizeof(struct e820_info));
+	info->sign = E820_SIGNATURE;
+	info->entries = install_e820_map(E820MAX, data);
+	info->addr = (info->entries - 1) * sizeof(struct e820_entry) +
+		     E820_DATA_OFFSET;
+
+	/*
+	 * Explicitly clear the bootloader image size otherwise if memory
+	 * at this offset happens to contain some garbage data, the final
+	 * available memory size for the kernel is insane.
+	 */
+	*(u32 *)(base + BOOT_IMAGE_SIZE_OFFSET) = 0;
+
+	/*
+	 * Prepare compatible framebuffer information block.
+	 * The VESA mode has to be 32-bit RGBA.
+	 */
+	if (vesa->x_resolution && vesa->y_resolution) {
+		gop = (struct efi_gop_info *)(base + EFI_GOP_INFO_OFFSET);
+		gop->magic = EFI_GOP_INFO_MAGIC;
+		gop->info.version = 0;
+		gop->info.width = vesa->x_resolution;
+		gop->info.height = vesa->y_resolution;
+		gop->info.pixel_format = EFI_GOT_RGBA8;
+		gop->info.pixels_per_scanline = vesa->bytes_per_scanline / 4;
+		gop->fb_base = vesa->phys_base_ptr;
+		gop->fb_size = vesa->bytes_per_scanline * vesa->y_resolution;
+	}
+#endif
+
 	/*
 	 * Use bootaddr to find the location in memory that VxWorks
 	 * will look for the bootline string. The default value is
@@ -257,104 +342,78 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	 */
 	tmp = env_get("bootaddr");
 	if (!tmp) {
+#ifdef CONFIG_X86
+		bootaddr = base + X86_BOOT_LINE_OFFSET;
+#else
 		printf("## VxWorks bootline address not specified\n");
-	} else {
+		return 1;
+#endif
+	}
+
+	if (!bootaddr)
 		bootaddr = simple_strtoul(tmp, NULL, 16);
 
-		/*
-		 * Check to see if the bootline is defined in the 'bootargs'
-		 * parameter. If it is not defined, we may be able to
-		 * construct the info.
-		 */
-		bootline = env_get("bootargs");
-		if (bootline) {
-			memcpy((void *)bootaddr, bootline,
-			       max(strlen(bootline), (size_t)255));
-			flush_cache(bootaddr, max(strlen(bootline),
-						  (size_t)255));
+	/*
+	 * Check to see if the bootline is defined in the 'bootargs' parameter.
+	 * If it is not defined, we may be able to construct the info.
+	 */
+	bootline = env_get("bootargs");
+	if (!bootline) {
+		tmp = env_get("bootdev");
+		if (tmp) {
+			strcpy(build_buf, tmp);
+			ptr = strlen(tmp);
 		} else {
-			tmp = env_get("bootdev");
-			if (tmp) {
-				strcpy(build_buf, tmp);
-				ptr = strlen(tmp);
-			} else
-				printf("## VxWorks boot device not specified\n");
+			printf("## VxWorks boot device not specified\n");
+		}
 
-			tmp = env_get("bootfile");
-			if (tmp)
-				ptr += sprintf(build_buf + ptr,
-					       "host:%s ", tmp);
-			else
-				ptr += sprintf(build_buf + ptr,
-					       "host:vxWorks ");
+		tmp = env_get("bootfile");
+		if (tmp)
+			ptr += sprintf(build_buf + ptr, "host:%s ", tmp);
+		else
+			ptr += sprintf(build_buf + ptr, "host:vxWorks ");
 
-			/*
-			 * The following parameters are only needed if 'bootdev'
-			 * is an ethernet device, otherwise they are optional.
-			 */
-			tmp = env_get("ipaddr");
+		/*
+		 * The following parameters are only needed if 'bootdev'
+		 * is an ethernet device, otherwise they are optional.
+		 */
+		tmp = env_get("ipaddr");
+		if (tmp) {
+			ptr += sprintf(build_buf + ptr, "e=%s", tmp);
+			tmp = env_get("netmask");
 			if (tmp) {
-				ptr += sprintf(build_buf + ptr, "e=%s", tmp);
-				tmp = env_get("netmask");
-				if (tmp) {
-					u32 mask = env_get_ip("netmask").s_addr;
-					ptr += sprintf(build_buf + ptr,
-						       ":%08x ", ntohl(mask));
-				} else {
-					ptr += sprintf(build_buf + ptr, " ");
-				}
+				u32 mask = env_get_ip("netmask").s_addr;
+				ptr += sprintf(build_buf + ptr,
+					       ":%08x ", ntohl(mask));
+			} else {
+				ptr += sprintf(build_buf + ptr, " ");
 			}
+		}
 
-			tmp = env_get("serverip");
-			if (tmp)
-				ptr += sprintf(build_buf + ptr, "h=%s ", tmp);
-
-			tmp = env_get("gatewayip");
-			if (tmp)
-				ptr += sprintf(build_buf + ptr, "g=%s ", tmp);
+		tmp = env_get("serverip");
+		if (tmp)
+			ptr += sprintf(build_buf + ptr, "h=%s ", tmp);
 
-			tmp = env_get("hostname");
-			if (tmp)
-				ptr += sprintf(build_buf + ptr, "tn=%s ", tmp);
+		tmp = env_get("gatewayip");
+		if (tmp)
+			ptr += sprintf(build_buf + ptr, "g=%s ", tmp);
 
-			tmp = env_get("othbootargs");
-			if (tmp) {
-				strcpy(build_buf + ptr, tmp);
-				ptr += strlen(tmp);
-			}
+		tmp = env_get("hostname");
+		if (tmp)
+			ptr += sprintf(build_buf + ptr, "tn=%s ", tmp);
 
-			memcpy((void *)bootaddr, build_buf,
-			       max(strlen(build_buf), (size_t)255));
-			flush_cache(bootaddr, max(strlen(build_buf),
-						  (size_t)255));
+		tmp = env_get("othbootargs");
+		if (tmp) {
+			strcpy(build_buf + ptr, tmp);
+			ptr += strlen(tmp);
 		}
 
-		printf("## Using bootline (@ 0x%lx): %s\n", bootaddr,
-		       (char *)bootaddr);
+		bootline = build_buf;
 	}
 
-#ifdef CONFIG_X86
-	/*
-	 * Since E820 information is critical to the kernel, if we don't
-	 * specify these in the environments, use a default one.
-	 */
-	tmp = env_get("e820data");
-	if (tmp)
-		data = (struct e820entry *)simple_strtoul(tmp, NULL, 16);
-	else
-		data = (struct e820entry *)VXWORKS_E820_DATA_ADDR;
-	tmp = env_get("e820info");
-	if (tmp)
-		info = (struct e820info *)simple_strtoul(tmp, NULL, 16);
-	else
-		info = (struct e820info *)VXWORKS_E820_INFO_ADDR;
-
-	memset(info, 0, sizeof(struct e820info));
-	info->sign = E820_SIGNATURE;
-	info->entries = install_e820_map(E820MAX, data);
-	info->addr = (info->entries - 1) * sizeof(struct e820entry) +
-		     VXWORKS_E820_DATA_ADDR;
-#endif
+	memcpy((void *)bootaddr, bootline, max(strlen(bootline), (size_t)255));
+	flush_cache(bootaddr, max(strlen(bootline), (size_t)255));
+	printf("## Using bootline (@ 0x%lx): %s\n", bootaddr, (char *)bootaddr);
 
 	/*
 	 * If the data at the load address is an elf image, then

+ 1 - 1
configs/bayleybay_defconfig

@@ -52,5 +52,5 @@ CONFIG_E1000=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
-CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
+CONFIG_FRAMEBUFFER_VESA_MODE_11B=y
 CONFIG_CONSOLE_SCROLL_LINES=5

+ 0 - 0
configs/coreboot-x86_defconfig → configs/coreboot_defconfig


+ 1 - 1
configs/minnowmax_defconfig

@@ -57,5 +57,5 @@ CONFIG_DEBUG_UART_CLOCK=1843200
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
-CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
+CONFIG_FRAMEBUFFER_VESA_MODE_11B=y
 CONFIG_CONSOLE_SCROLL_LINES=5

+ 1 - 1
configs/qemu-x86_64_defconfig

@@ -69,5 +69,5 @@ CONFIG_SPL_TIMER=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
-CONFIG_FRAMEBUFFER_VESA_MODE_111=y
+CONFIG_FRAMEBUFFER_VESA_MODE_112=y
 CONFIG_CONSOLE_SCROLL_LINES=5

+ 1 - 1
configs/qemu-x86_defconfig

@@ -49,5 +49,5 @@ CONFIG_NVME=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
-CONFIG_FRAMEBUFFER_VESA_MODE_111=y
+CONFIG_FRAMEBUFFER_VESA_MODE_112=y
 CONFIG_CONSOLE_SCROLL_LINES=5

+ 1 - 1
configs/qemu-x86_efi_payload32_defconfig

@@ -43,7 +43,7 @@ CONFIG_CPU=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
-CONFIG_FRAMEBUFFER_VESA_MODE_111=y
+CONFIG_FRAMEBUFFER_VESA_MODE_112=y
 CONFIG_CONSOLE_SCROLL_LINES=5
 CONFIG_EFI=y
 CONFIG_EFI_STUB=y

+ 1 - 1
configs/qemu-x86_efi_payload64_defconfig

@@ -43,7 +43,7 @@ CONFIG_CPU=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
 CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
-CONFIG_FRAMEBUFFER_VESA_MODE_111=y
+CONFIG_FRAMEBUFFER_VESA_MODE_112=y
 CONFIG_CONSOLE_SCROLL_LINES=5
 CONFIG_EFI=y
 CONFIG_EFI_STUB=y

+ 32 - 19
doc/README.vxworks

@@ -17,9 +17,7 @@ For booting old kernels (6.9.x) on PowerPC and ARM, and all kernel versions
 on other architectures, 'bootvx' shall be used. For booting VxWorks 7 kernels
 on PowerPC and ARM, 'bootm' shall be used.
 
-64-bit x86 kernel cannot be loaded as of today.
-
-VxWork 7 on PowerPC and ARM
+VxWorks 7 on PowerPC and ARM
 ---------------------------
 From VxWorks 7, VxWorks starts adopting device tree as its hardware decription
 mechansim (for PowerPC and ARM), thus requiring boot interface changes.
@@ -30,11 +28,11 @@ the ePAPR standard, which is shown below (see ePAPR for more details):
 
     void (*kernel_entry)(fdt_addr, 0, 0, EPAPR_MAGIC, boot_IMA, 0, 0)
 
-For ARM, the calling convention is show below:
+For ARM, the calling convention is shown below:
 
     void (*kernel_entry)(void *fdt_addr)
 
-When booting new VxWorks kernel (uImage format), the parameters passed to bootm
+When booting a VxWorks 7 kernel (uImage format), the parameters passed to bootm
 is like below:
 
     bootm <kernel image address> - <device tree address>
@@ -46,7 +44,7 @@ board-specific address before loading VxWorks. U-Boot supplies its address
 via "bootaddr" environment variable. To check where the bootline should be
 for a specific board, go to the VxWorks BSP for that board, and look for a
 parameter called BOOT_LINE_ADRS. Assign its value to "bootaddr". A typical
-value for "bootaddr" is 0x101200.
+value for "bootaddr" on an x86 board is 0x101200.
 
 If a "bootargs" variable is defined, its content will be copied to the memory
 location pointed by "bootaddr" as the kernel bootline. If "bootargs" is not
@@ -67,19 +65,34 @@ look like VxWorks hangs somewhere as nothing outputs on the serial console.
 
 x86-specific information
 ------------------------
-Before loading an x86 kernel, two additional environment variables need to be
-provided. They are "e820data" and "e820info", which represent the address of
-E820 table and E820 information (defined by VxWorks) in system memory.
-
-Check VxWorks kernel configuration to look for BIOS_E820_DATA_START and
-BIOS_E820_INFO_START, and assign their values to "e820data" and "e820info"
-accordingly. If neither of these two are supplied, U-Boot assumes a default
-location at 0x4000 for "e820data" and 0x4a00 for "e820info". Typical values
-for "e820data" and "e820info" are 0x104000 and 0x104a00. But there is one
-exception on Intel Galileo, where "e820data" and "e820info" should be left
-unset, which assume the default location for VxWorks.
-
-Note since currently U-Boot does not support ACPI yet, VxWorks kernel must
+Before loading an x86 kernel, one additional environment variable need to be
+provided. This is "vx_phys_mem_base", which represent the physical memory
+base address of VxWorks.
+
+Check VxWorks kernel configuration to look for LOCAL_MEM_LOCAL_ADRS. For
+VxWorks 7, this is normally a virtual address and you need find out its
+corresponding physical address and assign its value to "vx_phys_mem_base".
+
+For boards on which ACPI is not supported by U-Boot yet, VxWorks kernel must
 be configured to use MP table and virtual wire interrupt mode. This requires
 INCLUDE_MPTABLE_BOOT_OP and INCLUDE_VIRTUAL_WIRE_MODE to be included in a
 VxWorks kernel configuration.
+
+Both 32-bit x86 and 64-bit x64 kernels can be loaded.
+
+There are two types of graphics console drivers in VxWorks. One is the 80x25
+VGA text mode driver. The other one is the EFI console bitmapped graphics mode
+driver. To make these drivers function, U-Boot needs to load and run the VGA
+BIOS of the graphics card first.
+
+    - If the kernel is configured with 80x25 VGA text mode driver,
+      CONFIG_FRAMEBUFFER_SET_VESA_MODE must be unset in U-Boot.
+    - If the kernel is configured with bitmapped graphics mode driver,
+      CONFIG_FRAMEBUFFER_SET_VESA_MODE need remain set but care must be taken
+      at which VESA mode is to be set. The supported pixel format is 32-bit
+      RGBA, hence the available VESA mode can only be one of the following:
+        * FRAMEBUFFER_VESA_MODE_10F
+        * FRAMEBUFFER_VESA_MODE_112
+        * FRAMEBUFFER_VESA_MODE_115
+        * FRAMEBUFFER_VESA_MODE_118
+        * FRAMEBUFFER_VESA_MODE_11B

+ 1 - 1
doc/README.x86

@@ -46,7 +46,7 @@ Build Instructions for U-Boot as coreboot payload
 Building U-Boot as a coreboot payload is just like building U-Boot for targets
 on other architectures, like below:
 
-$ make coreboot-x86_defconfig
+$ make coreboot_defconfig
 $ make all
 
 Note this default configuration will build a U-Boot payload for the QEMU board.

+ 4 - 0
drivers/bios_emulator/atibios.c

@@ -65,6 +65,7 @@ static u32 saveBaseAddress20;
 /* Addres im memory of VBE region */
 const int vbe_offset = 0x2000;
 
+#ifdef CONFIG_FRAMEBUFFER_SET_VESA_MODE
 static const void *bios_ptr(const void *buf, BE_VGAInfo *vga_info,
 			    u32 x86_dword_ptr)
 {
@@ -215,6 +216,7 @@ static int atibios_set_vesa_mode(RMREGS *regs, int vesa_mode,
 
 	return 0;
 }
+#endif /* CONFIG_FRAMEBUFFER_SET_VESA_MODE */
 
 /****************************************************************************
 PARAMETERS:
@@ -263,11 +265,13 @@ static void PCI_doBIOSPOST(pci_dev_t pcidev, BE_VGAInfo *vga_info,
 	/*Cleanup and exit*/
 	BE_getVGA(vga_info);
 
+#ifdef CONFIG_FRAMEBUFFER_SET_VESA_MODE
 	/* Useful for debugging */
 	if (0)
 		atibios_debug_mode(vga_info, &regs, vesa_mode, mode_info);
 	if (vesa_mode != -1)
 		atibios_set_vesa_mode(&regs, vesa_mode, mode_info);
+#endif
 }
 
 /****************************************************************************

+ 1 - 3
drivers/pci/pci_rom.c

@@ -355,8 +355,6 @@ int vbe_setup_video(struct udevice *dev, int (*int15_handler)(void))
 	struct video_priv *uc_priv = dev_get_uclass_priv(dev);
 	int ret;
 
-	printf("Video: ");
-
 	/* If we are running from EFI or coreboot, this can't work */
 	if (!ll_boot_init()) {
 		printf("Not available (previous bootloader prevents it)\n");
@@ -377,7 +375,7 @@ int vbe_setup_video(struct udevice *dev, int (*int15_handler)(void))
 		return ret;
 	}
 
-	printf("%dx%dx%d\n", uc_priv->xsize, uc_priv->ysize,
+	printf("Video: %dx%dx%d\n", uc_priv->xsize, uc_priv->ysize,
 	       mode_info.vesa.bits_per_pixel);
 
 	return 0;

+ 1 - 1
drivers/video/Kconfig

@@ -174,7 +174,7 @@ config FRAMEBUFFER_SET_VESA_MODE
 
 choice
 	prompt "framebuffer graphics resolution"
-	default FRAMEBUFFER_VESA_MODE_117
+	default FRAMEBUFFER_VESA_MODE_118
 	depends on FRAMEBUFFER_SET_VESA_MODE
 	help
 	  This option sets the resolution used for the U-Boot framebuffer (and

+ 181 - 146
include/elf.h

@@ -5,10 +5,7 @@
  * SPDX-License-Identifier:	BSD-3-Clause
  */
 
-/*
- * This is the ELF ABI header file
- * formerly known as "elf_abi.h".
- */
+/* This is the ELF ABI header file formerly known as "elf_abi.h" */
 
 #ifndef _ELF_H
 #define _ELF_H
@@ -16,20 +13,16 @@
 #ifndef __ASSEMBLER__
 #include "compiler.h"
 
-/*
- *  This version doesn't work for 64-bit ABIs - Erik.
- */
+/* This version doesn't work for 64-bit ABIs - Erik */
 
-/*
- * These typedefs need to be handled better.
- */
+/* These typedefs need to be handled better */
 typedef uint32_t	Elf32_Addr;	/* Unsigned program address */
 typedef uint32_t	Elf32_Off;	/* Unsigned file offset */
 typedef int32_t		Elf32_Sword;	/* Signed large integer */
 typedef uint32_t	Elf32_Word;	/* Unsigned large integer */
 typedef uint16_t	Elf32_Half;	/* Unsigned medium integer */
 
-/* 64-bit ELF base types. */
+/* 64-bit ELF base types */
 typedef uint64_t	Elf64_Addr;
 typedef uint16_t	Elf64_Half;
 typedef int16_t		Elf64_SHalf;
@@ -96,7 +89,7 @@ typedef int64_t		Elf64_Sxword;
 		      (ehdr).e_ident[EI_MAG3] == ELFMAG3)
 
 /* ELF Header */
-typedef struct elfhdr{
+typedef struct {
 	unsigned char	e_ident[EI_NIDENT]; /* ELF Identification */
 	Elf32_Half	e_type;		/* object file type */
 	Elf32_Half	e_machine;	/* machine */
@@ -114,6 +107,24 @@ typedef struct elfhdr{
 					   header string table" entry offset */
 } Elf32_Ehdr;
 
+typedef struct {
+	unsigned char	e_ident[EI_NIDENT]; /* ELF Identification */
+	Elf64_Half	e_type;		/* object file type */
+	Elf64_Half	e_machine;	/* machine */
+	Elf64_Word	e_version;	/* object file version */
+	Elf64_Addr	e_entry;	/* virtual entry point */
+	Elf64_Off	e_phoff;	/* program header table offset */
+	Elf64_Off	e_shoff;	/* section header table offset */
+	Elf64_Word	e_flags;	/* processor-specific flags */
+	Elf64_Half	e_ehsize;	/* ELF header size */
+	Elf64_Half	e_phentsize;	/* program header entry size */
+	Elf64_Half	e_phnum;	/* number of program header entries */
+	Elf64_Half	e_shentsize;	/* section header entry size */
+	Elf64_Half	e_shnum;	/* number of section header entries */
+	Elf64_Half	e_shstrndx;	/* section header table's "section
+					   header string table" entry offset */
+} Elf64_Ehdr;
+
 /* e_type */
 #define ET_NONE		0		/* No file type */
 #define ET_REL		1		/* relocatable file */
@@ -122,9 +133,9 @@ typedef struct elfhdr{
 #define ET_CORE		4		/* core file */
 #define ET_NUM		5		/* number of types */
 #define ET_LOOS		0xfe00		/* reserved range for operating */
-#define ET_HIOS		0xfeff		/*  system specific e_type */
+#define ET_HIOS		0xfeff		/* system specific e_type */
 #define ET_LOPROC	0xff00		/* reserved range for processor */
-#define ET_HIPROC	0xffff		/*  specific e_type */
+#define ET_HIPROC	0xffff		/* specific e_type */
 
 /* e_machine */
 #define EM_NONE		0		/* No Machine */
@@ -231,13 +242,27 @@ typedef struct {
 	Elf32_Word	sh_entsize;	/* section entry size */
 } Elf32_Shdr;
 
+typedef struct {
+	Elf64_Word	sh_name;	/* name - index into section header
+					   string table section */
+	Elf64_Word	sh_type;	/* type */
+	Elf64_Xword	sh_flags;	/* flags */
+	Elf64_Addr	sh_addr;	/* address */
+	Elf64_Off	sh_offset;	/* file offset */
+	Elf64_Xword	sh_size;	/* section size */
+	Elf64_Word	sh_link;	/* section header table index link */
+	Elf64_Word	sh_info;	/* extra information */
+	Elf64_Xword	sh_addralign;	/* address alignment */
+	Elf64_Xword	sh_entsize;	/* section entry size */
+} Elf64_Shdr;
+
 /* Special Section Indexes */
 #define SHN_UNDEF	0		/* undefined */
 #define SHN_LORESERVE	0xff00		/* lower bounds of reserved indexes */
 #define SHN_LOPROC	0xff00		/* reserved range for processor */
-#define SHN_HIPROC	0xff1f		/*   specific section indexes */
+#define SHN_HIPROC	0xff1f		/* specific section indexes */
 #define SHN_LOOS	0xff20		/* reserved range for operating */
-#define SHN_HIOS	0xff3f		/*   specific semantics */
+#define SHN_HIOS	0xff3f		/* specific semantics */
 #define SHN_ABS		0xfff1		/* absolute value */
 #define SHN_COMMON	0xfff2		/* common symbol */
 #define SHN_XINDEX	0xffff		/* Index is an extra table */
@@ -265,46 +290,46 @@ typedef struct {
 #define SHT_LOOS	0x60000000	/* Start OS-specific */
 #define SHT_HIOS	0x6fffffff	/* End OS-specific */
 #define SHT_LOPROC	0x70000000	/* reserved range for processor */
-#define SHT_HIPROC	0x7fffffff	/*  specific section header types */
+#define SHT_HIPROC	0x7fffffff	/* specific section header types */
 #define SHT_LOUSER	0x80000000	/* reserved range for application */
-#define SHT_HIUSER	0xffffffff	/*  specific indexes */
+#define SHT_HIUSER	0xffffffff	/* specific indexes */
 
 /* Section names */
-#define ELF_BSS         ".bss"		/* uninitialized data */
+#define ELF_BSS		".bss"		/* uninitialized data */
 #define ELF_COMMENT	".comment"	/* version control information */
-#define ELF_DATA        ".data"		/* initialized data */
-#define ELF_DATA1       ".data1"	/* initialized data */
-#define ELF_DEBUG       ".debug"	/* debug */
-#define ELF_DYNAMIC     ".dynamic"	/* dynamic linking information */
-#define ELF_DYNSTR      ".dynstr"	/* dynamic string table */
-#define ELF_DYNSYM      ".dynsym"	/* dynamic symbol table */
-#define ELF_FINI        ".fini"		/* termination code */
+#define ELF_DATA	".data"		/* initialized data */
+#define ELF_DATA1	".data1"	/* initialized data */
+#define ELF_DEBUG	".debug"	/* debug */
+#define ELF_DYNAMIC	".dynamic"	/* dynamic linking information */
+#define ELF_DYNSTR	".dynstr"	/* dynamic string table */
+#define ELF_DYNSYM	".dynsym"	/* dynamic symbol table */
+#define ELF_FINI	".fini"		/* termination code */
 #define ELF_FINI_ARRAY	".fini_array"	/* Array of destructors */
-#define ELF_GOT         ".got"		/* global offset table */
-#define ELF_HASH        ".hash"		/* symbol hash table */
-#define ELF_INIT        ".init"		/* initialization code */
+#define ELF_GOT		".got"		/* global offset table */
+#define ELF_HASH	".hash"		/* symbol hash table */
+#define ELF_INIT	".init"		/* initialization code */
 #define ELF_INIT_ARRAY	".init_array"	/* Array of constuctors */
 #define ELF_INTERP	".interp"	/* Pathname of program interpreter */
 #define ELF_LINE	".line"		/* Symbolic line numnber information */
 #define ELF_NOTE	".note"		/* Contains note section */
 #define ELF_PLT		".plt"		/* Procedure linkage table */
 #define ELF_PREINIT_ARRAY ".preinit_array" /* Array of pre-constructors */
-#define ELF_REL_DATA    ".rel.data"	/* relocation data */
-#define ELF_REL_FINI    ".rel.fini"	/* relocation termination code */
-#define ELF_REL_INIT    ".rel.init"	/* relocation initialization code */
-#define ELF_REL_DYN     ".rel.dyn"	/* relocaltion dynamic link info */
-#define ELF_REL_RODATA  ".rel.rodata"	/* relocation read-only data */
-#define ELF_REL_TEXT    ".rel.text"	/* relocation code */
-#define ELF_RODATA      ".rodata"	/* read-only data */
-#define ELF_RODATA1     ".rodata1"	/* read-only data */
-#define ELF_SHSTRTAB    ".shstrtab"	/* section header string table */
-#define ELF_STRTAB      ".strtab"	/* string table */
-#define ELF_SYMTAB      ".symtab"	/* symbol table */
+#define ELF_REL_DATA	".rel.data"	/* relocation data */
+#define ELF_REL_FINI	".rel.fini"	/* relocation termination code */
+#define ELF_REL_INIT	".rel.init"	/* relocation initialization code */
+#define ELF_REL_DYN	".rel.dyn"	/* relocaltion dynamic link info */
+#define ELF_REL_RODATA	".rel.rodata"	/* relocation read-only data */
+#define ELF_REL_TEXT	".rel.text"	/* relocation code */
+#define ELF_RODATA	".rodata"	/* read-only data */
+#define ELF_RODATA1	".rodata1"	/* read-only data */
+#define ELF_SHSTRTAB	".shstrtab"	/* section header string table */
+#define ELF_STRTAB	".strtab"	/* string table */
+#define ELF_SYMTAB	".symtab"	/* symbol table */
 #define ELF_SYMTAB_SHNDX ".symtab_shndx"/* symbol table section index */
 #define ELF_TBSS	".tbss"		/* thread local uninit data */
 #define ELF_TDATA	".tdata"	/* thread local init data */
 #define ELF_TDATA1	".tdata1"	/* thread local init data */
-#define ELF_TEXT        ".text"		/* code */
+#define ELF_TEXT	".text"		/* code */
 
 /* Section Attribute Flags - sh_flags */
 #define SHF_WRITE	0x1		/* Writable */
@@ -319,7 +344,7 @@ typedef struct {
 #define SHF_TLS		0x400		/* Thread local storage */
 #define SHF_MASKOS	0x0ff00000	/* OS specific */
 #define SHF_MASKPROC	0xf0000000	/* reserved bits for processor */
-					/*  specific section attributes */
+					/* specific section attributes */
 
 /* Section Group Flags */
 #define GRP_COMDAT	0x1		/* COMDAT group */
@@ -327,7 +352,7 @@ typedef struct {
 #define GRP_MASKPROC	0xf0000000	/* Mask processor specific flags */
 
 /* Symbol Table Entry */
-typedef struct elf32_sym {
+typedef struct {
 	Elf32_Word	st_name;	/* name - index into string table */
 	Elf32_Addr	st_value;	/* symbol value */
 	Elf32_Word	st_size;	/* symbol size */
@@ -351,9 +376,9 @@ typedef struct elf32_sym {
 #define STB_WEAK	2		/* like global - lower precedence */
 #define STB_NUM		3		/* number of symbol bindings */
 #define STB_LOOS	10		/* reserved range for operating */
-#define STB_HIOS	12		/*   system specific symbol bindings */
+#define STB_HIOS	12		/* system specific symbol bindings */
 #define STB_LOPROC	13		/* reserved range for processor */
-#define STB_HIPROC	15		/*  specific symbol bindings */
+#define STB_HIPROC	15		/* specific symbol bindings */
 
 /* Symbol type - ELF32_ST_TYPE - st_info */
 #define STT_NOTYPE	0		/* not specified */
@@ -364,9 +389,9 @@ typedef struct elf32_sym {
 #define STT_NUM		5		/* number of symbol types */
 #define STT_TLS		6		/* Thread local storage symbol */
 #define STT_LOOS	10		/* reserved range for operating */
-#define STT_HIOS	12		/*  system specific symbol types */
+#define STT_HIOS	12		/* system specific symbol types */
 #define STT_LOPROC	13		/* reserved range for processor */
-#define STT_HIPROC	15		/*  specific symbol types */
+#define STT_HIPROC	15		/* specific symbol types */
 
 /* Symbol visibility - ELF32_ST_VISIBILITY - st_other */
 #define STV_DEFAULT	0		/* Normal visibility rules */
@@ -374,17 +399,14 @@ typedef struct elf32_sym {
 #define STV_HIDDEN	2		/* Symbol unavailable in other mods */
 #define STV_PROTECTED	3		/* Not preemptible, not exported */
 
-
 /* Relocation entry with implicit addend */
-typedef struct
-{
+typedef struct {
 	Elf32_Addr	r_offset;	/* offset of relocation */
 	Elf32_Word	r_info;		/* symbol table index and type */
 } Elf32_Rel;
 
 /* Relocation entry with explicit addend */
-typedef struct
-{
+typedef struct {
 	Elf32_Addr	r_offset;	/* offset of relocation */
 	Elf32_Word	r_info;		/* symbol table index and type */
 	Elf32_Sword	r_addend;
@@ -396,9 +418,9 @@ typedef struct {
 } Elf64_Rel;
 
 typedef struct {
-	Elf64_Addr r_offset;    /* Location at which to apply the action */
-	Elf64_Xword r_info;     /* index and type of relocation */
-	Elf64_Sxword r_addend;  /* Constant addend used to compute value */
+	Elf64_Addr r_offset;	/* Location at which to apply the action */
+	Elf64_Xword r_info;	/* index and type of relocation */
+	Elf64_Sxword r_addend;	/* Constant addend used to compute value */
 } Elf64_Rela;
 
 /* Extract relocation info - r_info */
@@ -411,13 +433,24 @@ typedef struct {
 	Elf32_Word	p_type;		/* segment type */
 	Elf32_Off	p_offset;	/* segment offset */
 	Elf32_Addr	p_vaddr;	/* virtual address of segment */
-	Elf32_Addr	p_paddr;	/* physical address - ignored? */
-	Elf32_Word	p_filesz;	/* number of bytes in file for seg. */
-	Elf32_Word	p_memsz;	/* number of bytes in mem. for seg. */
+	Elf32_Addr	p_paddr;	/* physical address of segment */
+	Elf32_Word	p_filesz;	/* number of bytes in file for seg */
+	Elf32_Word	p_memsz;	/* number of bytes in mem. for seg */
 	Elf32_Word	p_flags;	/* flags */
 	Elf32_Word	p_align;	/* memory alignment */
 } Elf32_Phdr;
 
+typedef struct {
+	Elf64_Word	p_type;		/* segment type */
+	Elf64_Word	p_flags;	/* flags */
+	Elf64_Off	p_offset;	/* segment offset */
+	Elf64_Addr	p_vaddr;	/* virtual address of segment */
+	Elf64_Addr	p_paddr;	/* physical address of segment */
+	Elf64_Xword	p_filesz;	/* number of bytes in file for seg */
+	Elf64_Xword	p_memsz;	/* number of bytes in mem. for seg */
+	Elf64_Xword	p_align;	/* memory alignment */
+} Elf64_Phdr;
+
 /* Segment types - p_type */
 #define PT_NULL		0		/* unused */
 #define PT_LOAD		1		/* loadable segment */
@@ -429,9 +462,9 @@ typedef struct {
 #define PT_TLS		7		/* Thread local storage template */
 #define PT_NUM		8		/* Number of segment types */
 #define PT_LOOS		0x60000000	/* reserved range for operating */
-#define PT_HIOS		0x6fffffff	/*   system specific segment types */
+#define PT_HIOS		0x6fffffff	/* system specific segment types */
 #define PT_LOPROC	0x70000000	/* reserved range for processor */
-#define PT_HIPROC	0x7fffffff	/*  specific segment types */
+#define PT_HIPROC	0x7fffffff	/* specific segment types */
 
 /* Segment flags - p_flags */
 #define PF_X		0x1		/* Executable */
@@ -439,13 +472,11 @@ typedef struct {
 #define PF_R		0x4		/* Readable */
 #define PF_MASKOS	0x0ff00000	/* OS specific segment flags */
 #define PF_MASKPROC	0xf0000000	/* reserved bits for processor */
-					/*  specific segment flags */
+					/* specific segment flags */
 /* Dynamic structure */
-typedef struct
-{
+typedef struct {
 	Elf32_Sword	d_tag;		/* controls meaning of d_val */
-	union
-	{
+	union {
 		Elf32_Word	d_val;	/* Multiple meanings - see d_tag */
 		Elf32_Addr	d_ptr;	/* program virtual address */
 	} d_un;
@@ -477,12 +508,12 @@ typedef struct {
 #define DT_RELAENT	9		/* size of relocation entry */
 #define DT_STRSZ	10		/* size of string table */
 #define DT_SYMENT	11		/* size of symbol table entry */
-#define DT_INIT		12		/* address of initialization func. */
+#define DT_INIT		12		/* address of initialization func */
 #define DT_FINI		13		/* address of termination function */
 #define DT_SONAME	14		/* string table offset of shared obj */
 #define DT_RPATH	15		/* string table offset of library
 					   search path */
-#define DT_SYMBOLIC	16		/* start sym search in shared obj. */
+#define DT_SYMBOLIC	16		/* start sym search in shared obj */
 #define DT_REL		17		/* address of rel. tbl. w addends */
 #define DT_RELSZ	18		/* size of DT_REL relocation table */
 #define DT_RELENT	19		/* size of DT_REL relocation entry */
@@ -500,11 +531,11 @@ typedef struct {
 #define DT_ENCODING	32		/* Start of encoded range */
 #define DT_PREINIT_ARRAY 32		/* Array with addresses of preinit fct*/
 #define DT_PREINIT_ARRAYSZ 33		/* size in bytes of DT_PREINIT_ARRAY */
-#define DT_NUM		34		/* Number used. */
+#define DT_NUM		34		/* Number used */
 #define DT_LOOS		0x60000000	/* reserved range for OS */
-#define DT_HIOS		0x6fffffff	/*   specific dynamic array tags */
+#define DT_HIOS		0x6fffffff	/* specific dynamic array tags */
 #define DT_LOPROC	0x70000000	/* reserved range for processor */
-#define DT_HIPROC	0x7fffffff	/*  specific dynamic array tags */
+#define DT_HIPROC	0x7fffffff	/* specific dynamic array tags */
 
 /* Dynamic Tag Flags - d_un.d_val */
 #define DF_ORIGIN	0x01		/* Object may use DF_ORIGIN */
@@ -525,93 +556,97 @@ unsigned long elf_hash(const unsigned char *name);
  * but we'll put them in for simplicity.
  */
 
-/* Values for Elf32/64_Ehdr.e_flags.  */
-#define EF_PPC_EMB              0x80000000      /* PowerPC embedded flag */
+/* Values for Elf32/64_Ehdr.e_flags */
+#define EF_PPC_EMB		0x80000000	/* PowerPC embedded flag */
 
 /* Cygnus local bits below */
-#define EF_PPC_RELOCATABLE      0x00010000      /* PowerPC -mrelocatable flag*/
-#define EF_PPC_RELOCATABLE_LIB  0x00008000      /* PowerPC -mrelocatable-lib
+#define EF_PPC_RELOCATABLE	0x00010000	/* PowerPC -mrelocatable flag*/
+#define EF_PPC_RELOCATABLE_LIB	0x00008000	/* PowerPC -mrelocatable-lib
 						   flag */
 
 /* PowerPC relocations defined by the ABIs */
-#define R_PPC_NONE              0
-#define R_PPC_ADDR32            1       /* 32bit absolute address */
-#define R_PPC_ADDR24            2       /* 26bit address, 2 bits ignored.  */
-#define R_PPC_ADDR16            3       /* 16bit absolute address */
-#define R_PPC_ADDR16_LO         4       /* lower 16bit of absolute address */
-#define R_PPC_ADDR16_HI         5       /* high 16bit of absolute address */
-#define R_PPC_ADDR16_HA         6       /* adjusted high 16bit */
-#define R_PPC_ADDR14            7       /* 16bit address, 2 bits ignored */
-#define R_PPC_ADDR14_BRTAKEN    8
-#define R_PPC_ADDR14_BRNTAKEN   9
-#define R_PPC_REL24             10      /* PC relative 26 bit */
-#define R_PPC_REL14             11      /* PC relative 16 bit */
-#define R_PPC_REL14_BRTAKEN     12
-#define R_PPC_REL14_BRNTAKEN    13
-#define R_PPC_GOT16             14
-#define R_PPC_GOT16_LO          15
-#define R_PPC_GOT16_HI          16
-#define R_PPC_GOT16_HA          17
-#define R_PPC_PLTREL24          18
-#define R_PPC_COPY              19
-#define R_PPC_GLOB_DAT          20
-#define R_PPC_JMP_SLOT          21
-#define R_PPC_RELATIVE          22
-#define R_PPC_LOCAL24PC         23
-#define R_PPC_UADDR32           24
-#define R_PPC_UADDR16           25
-#define R_PPC_REL32             26
-#define R_PPC_PLT32             27
-#define R_PPC_PLTREL32          28
-#define R_PPC_PLT16_LO          29
-#define R_PPC_PLT16_HI          30
-#define R_PPC_PLT16_HA          31
-#define R_PPC_SDAREL16          32
-#define R_PPC_SECTOFF           33
-#define R_PPC_SECTOFF_LO        34
-#define R_PPC_SECTOFF_HI        35
-#define R_PPC_SECTOFF_HA        36
-/* Keep this the last entry.  */
-#define R_PPC_NUM               37
-
-/* The remaining relocs are from the Embedded ELF ABI, and are not
-   in the SVR4 ELF ABI.  */
-#define R_PPC_EMB_NADDR32       101
-#define R_PPC_EMB_NADDR16       102
-#define R_PPC_EMB_NADDR16_LO    103
-#define R_PPC_EMB_NADDR16_HI    104
-#define R_PPC_EMB_NADDR16_HA    105
-#define R_PPC_EMB_SDAI16        106
-#define R_PPC_EMB_SDA2I16       107
-#define R_PPC_EMB_SDA2REL       108
-#define R_PPC_EMB_SDA21         109     /* 16 bit offset in SDA */
-#define R_PPC_EMB_MRKREF        110
-#define R_PPC_EMB_RELSEC16      111
-#define R_PPC_EMB_RELST_LO      112
-#define R_PPC_EMB_RELST_HI      113
-#define R_PPC_EMB_RELST_HA      114
-#define R_PPC_EMB_BIT_FLD       115
-#define R_PPC_EMB_RELSDA        116     /* 16 bit relative offset in SDA */
-
-/* Diab tool relocations.  */
-#define R_PPC_DIAB_SDA21_LO     180     /* like EMB_SDA21, but lower 16 bit */
-#define R_PPC_DIAB_SDA21_HI     181     /* like EMB_SDA21, but high 16 bit */
-#define R_PPC_DIAB_SDA21_HA     182     /* like EMB_SDA21, adjusted high 16 */
-#define R_PPC_DIAB_RELSDA_LO    183     /* like EMB_RELSDA, but lower 16 bit */
-#define R_PPC_DIAB_RELSDA_HI    184     /* like EMB_RELSDA, but high 16 bit */
-#define R_PPC_DIAB_RELSDA_HA    185     /* like EMB_RELSDA, adjusted high 16 */
-
-/* This is a phony reloc to handle any old fashioned TOC16 references
-   that may still be in object files.  */
-#define R_PPC_TOC16             255
+#define R_PPC_NONE		0
+#define R_PPC_ADDR32		1	/* 32bit absolute address */
+#define R_PPC_ADDR24		2	/* 26bit address, 2 bits ignored */
+#define R_PPC_ADDR16		3	/* 16bit absolute address */
+#define R_PPC_ADDR16_LO		4	/* lower 16bit of absolute address */
+#define R_PPC_ADDR16_HI		5	/* high 16bit of absolute address */
+#define R_PPC_ADDR16_HA		6	/* adjusted high 16bit */
+#define R_PPC_ADDR14		7	/* 16bit address, 2 bits ignored */
+#define R_PPC_ADDR14_BRTAKEN	8
+#define R_PPC_ADDR14_BRNTAKEN	9
+#define R_PPC_REL24		10	/* PC relative 26 bit */
+#define R_PPC_REL14		11	/* PC relative 16 bit */
+#define R_PPC_REL14_BRTAKEN	12
+#define R_PPC_REL14_BRNTAKEN	13
+#define R_PPC_GOT16		14
+#define R_PPC_GOT16_LO		15
+#define R_PPC_GOT16_HI		16
+#define R_PPC_GOT16_HA		17
+#define R_PPC_PLTREL24		18
+#define R_PPC_COPY		19
+#define R_PPC_GLOB_DAT		20
+#define R_PPC_JMP_SLOT		21
+#define R_PPC_RELATIVE		22
+#define R_PPC_LOCAL24PC		23
+#define R_PPC_UADDR32		24
+#define R_PPC_UADDR16		25
+#define R_PPC_REL32		26
+#define R_PPC_PLT32		27
+#define R_PPC_PLTREL32		28
+#define R_PPC_PLT16_LO		29
+#define R_PPC_PLT16_HI		30
+#define R_PPC_PLT16_HA		31
+#define R_PPC_SDAREL16		32
+#define R_PPC_SECTOFF		33
+#define R_PPC_SECTOFF_LO	34
+#define R_PPC_SECTOFF_HI	35
+#define R_PPC_SECTOFF_HA	36
+/* Keep this the last entry */
+#define R_PPC_NUM		37
+
+/*
+ * The remaining relocs are from the Embedded ELF ABI, and are not
+ * in the SVR4 ELF ABI.
+ */
+#define R_PPC_EMB_NADDR32	101
+#define R_PPC_EMB_NADDR16	102
+#define R_PPC_EMB_NADDR16_LO	103
+#define R_PPC_EMB_NADDR16_HI	104
+#define R_PPC_EMB_NADDR16_HA	105
+#define R_PPC_EMB_SDAI16	106
+#define R_PPC_EMB_SDA2I16	107
+#define R_PPC_EMB_SDA2REL	108
+#define R_PPC_EMB_SDA21		109	/* 16 bit offset in SDA */
+#define R_PPC_EMB_MRKREF	110
+#define R_PPC_EMB_RELSEC16	111
+#define R_PPC_EMB_RELST_LO	112
+#define R_PPC_EMB_RELST_HI	113
+#define R_PPC_EMB_RELST_HA	114
+#define R_PPC_EMB_BIT_FLD	115
+#define R_PPC_EMB_RELSDA	116	/* 16 bit relative offset in SDA */
+
+/* Diab tool relocations */
+#define R_PPC_DIAB_SDA21_LO	180	/* like EMB_SDA21, but lower 16 bit */
+#define R_PPC_DIAB_SDA21_HI	181	/* like EMB_SDA21, but high 16 bit */
+#define R_PPC_DIAB_SDA21_HA	182	/* like EMB_SDA21, adjusted high 16 */
+#define R_PPC_DIAB_RELSDA_LO	183	/* like EMB_RELSDA, but lower 16 bit */
+#define R_PPC_DIAB_RELSDA_HI	184	/* like EMB_RELSDA, but high 16 bit */
+#define R_PPC_DIAB_RELSDA_HA	185	/* like EMB_RELSDA, adjusted high 16 */
+
+/*
+ * This is a phony reloc to handle any old fashioned TOC16 references
+ * that may still be in object files.
+ */
+#define R_PPC_TOC16		255
 
  /* ARM relocs */
 #define R_ARM_NONE		0	/* No reloc */
 #define R_ARM_RELATIVE		23	/* Adjust by program base */
 
 /* AArch64 relocs */
-#define R_AARCH64_NONE		0	/* No relocation.  */
-#define R_AARCH64_RELATIVE	1027	/* Adjust by program base.  */
+#define R_AARCH64_NONE		0	/* No relocation */
+#define R_AARCH64_RELATIVE	1027	/* Adjust by program base */
 
 /* RISC-V relocations */
 #define R_RISCV_32		1

+ 48 - 4
include/vxworks.h

@@ -8,10 +8,21 @@
 #ifndef _VXWORKS_H_
 #define _VXWORKS_H_
 
+#include <efi_api.h>
+
+/*
+ * Physical address of memory base for VxWorks x86
+ * This is LOCAL_MEM_LOCAL_ADRS in the VxWorks kernel configuration.
+ */
+#define VXWORKS_PHYS_MEM_BASE	0x100000
+
+/* x86 bootline offset relative to LOCAL_MEM_LOCAL_ADRS in VxWorks */
+#define X86_BOOT_LINE_OFFSET	0x1200
+
 /*
  * VxWorks x86 E820 related stuff
  *
- * VxWorks on x86 gets E820 information from pre-defined address @
+ * VxWorks on x86 gets E820 information from pre-defined offset @
  * 0x4a00 and 0x4000. At 0x4a00 it's an information table defined
  * by VxWorks and the actual E820 table entries starts from 0x4000.
  * As defined by the BIOS E820 spec, the maximum number of E820 table
@@ -20,13 +31,13 @@
  * information that is retrieved from the BIOS E820 call and saved
  * later for sanity test during the kernel boot-up.
  */
-#define VXWORKS_E820_DATA_ADDR	0x4000
-#define VXWORKS_E820_INFO_ADDR	0x4a00
+#define E820_DATA_OFFSET	0x4000
+#define E820_INFO_OFFSET	0x4a00
 
 /* E820 info signatiure "SMAP" - System MAP */
 #define E820_SIGNATURE	0x534d4150
 
-struct e820info {
+struct e820_info {
 	u32 sign;	/* "SMAP" signature */
 	u32 x0;		/* don't care, used by VxWorks */
 	u32 x1;		/* don't care, used by VxWorks */
@@ -37,6 +48,39 @@ struct e820info {
 	u32 error;	/* must be zero */
 };
 
+/*
+ * VxWorks bootloader stores its size at a pre-defined offset @ 0x5004.
+ * Later when VxWorks kernel boots up and system memory information is
+ * retrieved from the E820 table, the bootloader size will be subtracted
+ * from the total system memory size to calculate the size of available
+ * memory for the OS.
+ */
+#define BOOT_IMAGE_SIZE_OFFSET	0x5004
+
+/*
+ * When booting from EFI BIOS, VxWorks bootloader stores the EFI GOP
+ * framebuffer info at a pre-defined offset @ 0x6100. When VxWorks kernel
+ * boots up, its EFI console driver tries to find such a block and if
+ * the signature matches, the framebuffer information will be used to
+ * initialize the driver.
+ *
+ * However it is not necessary to prepare an EFI environment for VxWorks's
+ * EFI console driver to function (eg: EFI loader in U-Boot). If U-Boot has
+ * already initialized the graphics card and set it to a VESA mode that is
+ * compatible with EFI GOP, we can simply prepare such a block for VxWorks.
+ */
+#define EFI_GOP_INFO_OFFSET	0x6100
+
+/* EFI GOP info signatiure */
+#define EFI_GOP_INFO_MAGIC	0xfeedface
+
+struct efi_gop_info {
+	u32 magic;			/* signature */
+	struct efi_gop_mode_info info;	/* EFI GOP mode info structure */
+	phys_addr_t fb_base;		/* framebuffer base address */
+	u32 fb_size;			/* framebuffer size */
+};
+
 int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 void boot_prep_vxworks(bootm_headers_t *images);
 void boot_jump_vxworks(bootm_headers_t *images);