diff --git a/arch/x86/cpu/coreboot/sdram.c b/arch/x86/cpu/coreboot/sdram.c index 82407affaf1..885fc6f5f2c 100644 --- a/arch/x86/cpu/coreboot/sdram.c +++ b/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); diff --git a/arch/x86/cpu/qemu/e820.c b/arch/x86/cpu/qemu/e820.c index c1c9b89def7..ec733cb0383 100644 --- a/arch/x86/cpu/qemu/e820.c +++ b/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; diff --git a/arch/x86/cpu/tangier/sdram.c b/arch/x86/cpu/tangier/sdram.c index eae8d785df9..f5f412a1e57 100644 --- a/arch/x86/cpu/tangier/sdram.c +++ b/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); } diff --git a/arch/x86/include/asm/bootparam.h b/arch/x86/include/asm/bootparam.h index 6aba6143612..0386cbeca50 100644 --- a/arch/x86/include/asm/bootparam.h +++ b/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 */ diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h index 351f02107eb..9d29f82f972 100644 --- a/arch/x86/include/asm/e820.h +++ b/arch/x86/include/asm/e820.h @@ -12,7 +12,7 @@ #ifndef __ASSEMBLY__ #include -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 */ diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index 263dd8fd170..d1aaa5fc783 100644 --- a/arch/x86/include/asm/io.h +++ b/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) diff --git a/arch/x86/lib/bios.c b/arch/x86/lib/bios.c index 66d7629a6dd..f9092fdc651 100644 --- a/arch/x86/lib/bios.c +++ b/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, diff --git a/arch/x86/lib/coreboot_table.c b/arch/x86/lib/coreboot_table.c index b1b4cd96131..5e0edd32149 100644 --- a/arch/x86/lib/coreboot_table.c +++ b/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; diff --git a/arch/x86/lib/e820.c b/arch/x86/lib/e820.c index 5babfde2685..84c8fab189b 100644 --- a/arch/x86/lib/e820.c +++ b/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; diff --git a/arch/x86/lib/fsp/fsp_dram.c b/arch/x86/lib/fsp/fsp_dram.c index 1a7af576d54..662d4ace216 100644 --- a/arch/x86/lib/fsp/fsp_dram.c +++ b/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; diff --git a/board/coreboot/coreboot/MAINTAINERS b/board/coreboot/coreboot/MAINTAINERS index 2736aa02826..188906b0803 100644 --- a/board/coreboot/coreboot/MAINTAINERS +++ b/board/coreboot/coreboot/MAINTAINERS @@ -3,4 +3,4 @@ M: Simon Glass S: Maintained F: board/coreboot/coreboot/ F: include/configs/chromebook_link.h -F: configs/coreboot-x86_defconfig +F: configs/coreboot_defconfig diff --git a/cmd/elf.c b/cmd/elf.c index 19479bb706e..eafea38aed1 100644 --- a/cmd/elf.c +++ b/cmd/elf.c @@ -20,13 +20,52 @@ #include #include #ifdef CONFIG_X86 +#include #include #include #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 { - 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)); - } else { - tmp = env_get("bootdev"); - if (tmp) { - strcpy(build_buf, tmp); - ptr = strlen(tmp); - } else - 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 "); - - /* - * 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) { - 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("hostname"); - if (tmp) - ptr += sprintf(build_buf + ptr, "tn=%s ", tmp); - - tmp = env_get("othbootargs"); - if (tmp) { - strcpy(build_buf + ptr, tmp); - ptr += strlen(tmp); - } - - memcpy((void *)bootaddr, build_buf, - max(strlen(build_buf), (size_t)255)); - flush_cache(bootaddr, max(strlen(build_buf), - (size_t)255)); - } - - printf("## Using bootline (@ 0x%lx): %s\n", bootaddr, - (char *)bootaddr); + return 1; +#endif } -#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; + if (!bootaddr) + bootaddr = simple_strtoul(tmp, NULL, 16); - 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 + /* + * 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 { + 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 "); + + /* + * 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) { + 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("hostname"); + if (tmp) + ptr += sprintf(build_buf + ptr, "tn=%s ", tmp); + + tmp = env_get("othbootargs"); + if (tmp) { + strcpy(build_buf + ptr, tmp); + ptr += strlen(tmp); + } + + bootline = build_buf; + } + + 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 diff --git a/configs/bayleybay_defconfig b/configs/bayleybay_defconfig index 5f7a09dffd2..c78a70db1a7 100644 --- a/configs/bayleybay_defconfig +++ b/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 diff --git a/configs/coreboot-x86_defconfig b/configs/coreboot_defconfig similarity index 100% rename from configs/coreboot-x86_defconfig rename to configs/coreboot_defconfig diff --git a/configs/minnowmax_defconfig b/configs/minnowmax_defconfig index 35477131a60..627f1d8ee2b 100644 --- a/configs/minnowmax_defconfig +++ b/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 diff --git a/configs/qemu-x86_64_defconfig b/configs/qemu-x86_64_defconfig index 10bbc76a536..3aae96f92ea 100644 --- a/configs/qemu-x86_64_defconfig +++ b/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 diff --git a/configs/qemu-x86_defconfig b/configs/qemu-x86_defconfig index 311fae33608..28ee4aa963a 100644 --- a/configs/qemu-x86_defconfig +++ b/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 diff --git a/configs/qemu-x86_efi_payload32_defconfig b/configs/qemu-x86_efi_payload32_defconfig index d2fc5462c82..b8476092cf7 100644 --- a/configs/qemu-x86_efi_payload32_defconfig +++ b/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 diff --git a/configs/qemu-x86_efi_payload64_defconfig b/configs/qemu-x86_efi_payload64_defconfig index 9fd563ed342..59ff2a07616 100644 --- a/configs/qemu-x86_efi_payload64_defconfig +++ b/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 diff --git a/doc/README.vxworks b/doc/README.vxworks index 3433e4f3aea..3239c5bb11f 100644 --- a/doc/README.vxworks +++ b/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 - @@ -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. +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 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. +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". -Note since currently U-Boot does not support ACPI yet, VxWorks kernel must +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 diff --git a/doc/README.x86 b/doc/README.x86 index 772e8d2a869..b1663a4111b 100644 --- a/doc/README.x86 +++ b/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. diff --git a/drivers/bios_emulator/atibios.c b/drivers/bios_emulator/atibios.c index 2d5b5dc562e..4a16fc7e1c2 100644 --- a/drivers/bios_emulator/atibios.c +++ b/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, ®s, vesa_mode, mode_info); if (vesa_mode != -1) atibios_set_vesa_mode(®s, vesa_mode, mode_info); +#endif } /**************************************************************************** diff --git a/drivers/pci/pci_rom.c b/drivers/pci/pci_rom.c index 46fe5e62471..7f461943f88 100644 --- a/drivers/pci/pci_rom.c +++ b/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; diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 45a105db06a..4c4d2861fe7 100644 --- a/drivers/video/Kconfig +++ b/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 diff --git a/include/elf.h b/include/elf.h index fe2128f3788..248ba59cd6a 100644 --- a/include/elf.h +++ b/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 +#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 */ +/* + * 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 */ +/* 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 +/* + * 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 diff --git a/include/vxworks.h b/include/vxworks.h index f69b0084ff9..39f0a444a22 100644 --- a/include/vxworks.h +++ b/include/vxworks.h @@ -8,10 +8,21 @@ #ifndef _VXWORKS_H_ #define _VXWORKS_H_ +#include + +/* + * 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);