* [PATCH 4/7] Support for ARM/U-Boot platforms
@ 2013-03-24 17:01 Leif Lindholm
2013-04-01 2:15 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-04-09 0:15 ` Vladimir 'φ-coder/phcoder' Serbinenko
0 siblings, 2 replies; 14+ messages in thread
From: Leif Lindholm @ 2013-03-24 17:01 UTC (permalink / raw)
To: grub-devel
[-- Attachment #1: Type: text/plain, Size: 1 bytes --]
[-- Attachment #2: 0004-arm-uboot-support.patch --]
[-- Type: application/octet-stream, Size: 12265 bytes --]
=== modified file 'Makefile.util.def'
--- Makefile.util.def 2013-03-24 13:03:12 +0000
+++ Makefile.util.def 2013-03-24 13:03:31 +0000
@@ -467,6 +467,7 @@
enable = mips_loongson;
enable = ia64_efi;
enable = powerpc_ieee1275;
+ enable = arm_uboot;
};
script = {
=== modified file 'grub-core/Makefile.am'
--- grub-core/Makefile.am 2013-03-20 16:13:31 +0000
+++ grub-core/Makefile.am 2013-03-24 13:03:31 +0000
@@ -211,6 +211,13 @@
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
endif
+if COND_arm_uboot
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/uboot.h
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/disk.h
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
+endif
+
if COND_emu
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/datetime.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/misc.h
=== modified file 'grub-core/Makefile.core.def'
--- grub-core/Makefile.core.def 2013-03-24 13:03:12 +0000
+++ grub-core/Makefile.core.def 2013-03-24 13:03:31 +0000
@@ -79,6 +79,7 @@
mips_startup = kern/mips/startup.S;
sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S;
powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S;
+ arm_uboot_startup = kern/arm/uboot/startup.S;
common = kern/command.c;
common = kern/corecmd.c;
=== added directory 'grub-core/kern/arm/uboot'
=== added file 'grub-core/kern/arm/uboot/startup.S'
--- grub-core/kern/arm/uboot/startup.S 1970-01-01 00:00:00 +0000
+++ grub-core/kern/arm/uboot/startup.S 2013-03-24 13:03:31 +0000
@@ -0,0 +1,176 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/offsets.h>
+#include <grub/symbol.h>
+#include <grub/machine/kernel.h>
+
+/*
+ * GRUB is called from U-Boot as a Linux Kernel type image, which
+ * means among other things that it always enters in ARM state.
+ *
+ *
+ * Overview of GRUB image layout:
+ *
+ * _start:
+ * Entry point (1 ARM branch instruction, to "codestart")
+ * grub_total_module_size:
+ * Data field: Size of included module blob
+ * (when generated by grub-mkimage)
+ * codestart:
+ * Remainder of statically-linked executable code and data.
+ * __bss_start:
+ * Start of included module blob.
+ * Also where global/static variables are located.
+ * _end:
+ * End of bss region (but not necessarily module blob).
+ * <overflow>:
+ * Any part of the module blob that extends beyond _end.
+ * <modules>:
+ * Loadable modules, post relocation.
+ * <stack>:
+ * <heap>:
+ */
+
+ .text
+ .arm
+FUNCTION(_start)
+ b codestart
+
+ @ Size of final image integrated module blob - set by grub-mkimage
+ . = _start + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
+VARIABLE(grub_total_module_size)
+ .long 0
+
+FUNCTION(codestart)
+ @ Store context: Machine ID, atags/dtb, ...
+ @ U-Boot API signature is stored on the U-Boot heap
+ @ Stack pointer used as start address for signature probing
+ mov r12, sp
+ ldr sp, =entry_state
+ push {r4-r12,lr} @ store U-Boot context (sp in r12)
+
+ @ Put kernel parameters aside until we can store them (further down)
+ mov r4, r1 @ machine type
+ mov r5, r2 @ boot data
+
+ @ Modules have been stored as a blob in BSS,
+ @ they need to be manually relocated to _end or
+ @ (__bss_start + grub_total_module_size), whichever greater.
+ bl uboot_get_real_bss_start @ r0 = src
+ ldr r1, =EXT_C(_end) @ dst = End of BSS
+ ldr r2, grub_total_module_size @ blob size
+ add r3, r0, r2 @ blob end
+ cmp r1, r3 @ _end < blob end?
+ movlt r1, r3 @ dst = blob end + blob size
+
+1: ldr r3, [r0], #4 @ r3 = *src++
+ str r3, [r1], #4 @ *dst++ = r3
+ subs r2, #4 @ remaining -= 4
+ bne 1b @ while remaining != 0
+
+ @ Set up a new stack, beyond the end of copied modules.
+ ldr r3, =GRUB_KERNEL_MACHINE_STACK_SIZE
+ add r3, r1, r3 @ Place stack beyond end of modules
+ and sp, r3, #~0x7 @ Ensure 8-byte alignment
+
+ @ Since we _are_ the C run-time, we need to manually zero the BSS
+ @ region before continuing
+ bl uboot_get_real_bss_start @ zero from here
+ ldr r1, =EXT_C(_end) @ to here
+ mov r2, #0
+1: str r2, [r0], #4
+ cmp r0, r1
+ bne 1b
+
+ @ Global variables now accessible - store kernel parameters in memory
+ ldr r12, =EXT_C(uboot_machine_type)
+ str r4, [r12]
+ ldr r12, =EXT_C(uboot_boot_data)
+ str r5, [r12]
+
+ b EXT_C(grub_main)
+
+ /*
+ * __bss_start does not actually point to the start of the runtime
+ * BSS, but rather to the next byte following the preceding data.
+ */
+FUNCTION (uboot_get_real_bss_start)
+ ldr r0, =EXT_C(__bss_start) @ src
+ tst r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
+ beq 1f
+ mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
+ and r0, r0, r1
+ add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN)
+1: bx lr
+
+ /*
+ * uboot_syscall():
+ * This function is effectively a veneer, so it cannot
+ * modify the stack or corrupt any registers other than
+ * r12 (ip). Furthermore it needs to restore r8 for
+ * U-Boot (Global Data Pointer) and preserve it for Grub.
+ */
+FUNCTION(uboot_syscall)
+ ldr ip, =transition_space
+ stm ip, {r8, lr}
+ ldr ip, =gd_backup
+ ldr r8, [ip]
+ ldr ip, =uboot_syscall_ptr
+ mov lr, pc
+ ldr pc, [ip]
+ ldr ip, =gd_backup
+ str r8, [ip]
+ ldr ip, =transition_space
+ ldm ip, {r8, lr}
+ bx lr
+
+FUNCTION(uboot_return)
+ ldr sp, =entry_state_end
+ pop {r4-r12, lr}
+ mov sp, r12
+ bx lr
+
+
+ .data
+ .align 3 @ 8-byte alignment for stack
+@ U-boot context stack space
+entry_state_end:
+ .long 0 @ r4
+ .long 0 @ r5
+ .long 0 @ r6
+ .long 0 @ r7
+gd_backup:
+ .long 0 @ r8 - U-Boot global data pointer
+ .long 0 @ r9
+ .long 0 @ r10
+ .long 0 @ r11
+VARIABLE(uboot_search_hint)@ U-Boot stack pointer -
+ .long 0 @ also API signature address hint.
+ .long 0 @ lr
+entry_state: @ backup for U-Boot context
+
+@ GRUB context stack space
+transition_space:
+ .long 0 @ r8
+ .long 0 @ lr
+
+VARIABLE(uboot_syscall_ptr)
+ .long 0 @
+
+ .end
=== added directory 'include/grub/arm/uboot'
=== added file 'include/grub/arm/uboot/kernel.h'
--- include/grub/arm/uboot/kernel.h 1970-01-01 00:00:00 +0000
+++ include/grub/arm/uboot/kernel.h 2013-03-24 13:03:31 +0000
@@ -0,0 +1,32 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2013 Free Software Foundation, Inc.
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_KERNEL_MACHINE_HEADER
+#define GRUB_KERNEL_MACHINE_HEADER 1
+
+#ifndef ASM_FILE
+
+#include <grub/symbol.h>
+#include <grub/types.h>
+
+#endif /* ! ASM_FILE */
+
+#define GRUB_KERNEL_MACHINE_STACK_SIZE 0x40000
+#define GRUB_KERNEL_MACHINE_HEAP_SIZE (grub_size_t) (2 * 1024 * 1024)
+
+#endif /* ! GRUB_KERNEL_MACHINE_HEADER */
=== modified file 'include/grub/offsets.h'
--- include/grub/offsets.h 2013-03-07 07:17:24 +0000
+++ include/grub/offsets.h 2013-03-24 13:03:31 +0000
@@ -103,6 +103,7 @@
#define GRUB_KERNEL_I386_IEEE1275_MOD_GAP 0x0
#define GRUB_KERNEL_I386_COREBOOT_MOD_GAP 0x0
#define GRUB_KERNEL_SPARC64_IEEE1275_MOD_GAP 0x0
+#define GRUB_KERNEL_ARM_UBOOT_MOD_GAP 0x0
#define GRUB_KERNEL_POWERPC_IEEE1275_MOD_ALIGN 0x1000
#define GRUB_KERNEL_SPARC64_IEEE1275_MOD_ALIGN 0x1
@@ -111,6 +112,10 @@
#define GRUB_KERNEL_MIPS_ARC_MOD_ALIGN 0x1
#define GRUB_KERNEL_MIPS_QEMU_MIPS_MOD_ALIGN 0x1
+#define GRUB_KERNEL_ARM_UBOOT_MOD_ALIGN 0x8
+#define GRUB_KERNEL_ARM_UBOOT_TOTAL_MODULE_SIZE 0x4
+#define GRUB_KERNEL_ARM_UBOOT_LINK_ADDR 0x08000000
+
/* Minimal gap between _end and the start of the modules. It's a hack
for PowerMac to prevent "CLAIM failed" error. The real fix is to
rewrite grub-mkimage to generate valid ELF files. */
=== modified file 'util/grub-install.in'
--- util/grub-install.in 2013-01-27 15:17:21 +0000
+++ util/grub-install.in 2013-03-24 13:03:31 +0000
@@ -319,6 +319,8 @@
target=i386-pc
fi
;;
+ x"arm"*)
+ target="arm-uboot";;
*)
gettext "Unable to determine your platform. Use --target." ;
echo ;;
@@ -338,7 +340,7 @@
if [ x$disk_module = xunspecified ]; then
disk_module=biosdisk
fi
-elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] ; then
+elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] || [ "${grub_modinfo_platform}" = "uboot" ] ; then
disk_module=
else
disk_module=native
@@ -854,6 +856,14 @@
-L "$bootloader_id" -l "\\EFI\\$efi_distributor\\$efi_file"
fi
fi
+elif [ x"${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = xarm-uboot ]; then
+ grub_imgname="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}"
+ raw_imgname="${uboot_imgname}.raw"
+ mv "$grub_imgname" "$raw_imgname"
+ mkimage -T kernel -A ARM -O Linux -a 0x08000000 -e 0x08000000 -C none -d "$raw_imgname" "$grub_imgname"
+ if [ $? -eq 0 ]; then
+ rm -f "$raw_imgname"
+ fi
else
gettext "WARNING: no platform-specific install was performed" 1>&2
echo 1>&2
=== modified file 'util/grub-mkimage.c'
--- util/grub-mkimage.c 2013-03-07 07:17:24 +0000
+++ util/grub-mkimage.c 2013-03-24 13:03:31 +0000
@@ -69,7 +69,7 @@
IMAGE_SPARC64_AOUT, IMAGE_SPARC64_RAW, IMAGE_I386_IEEE1275,
IMAGE_LOONGSON_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH,
IMAGE_FULOONG2F_FLASH, IMAGE_I386_PC_PXE, IMAGE_MIPS_ARC,
- IMAGE_QEMU_MIPS_FLASH
+ IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT
} id;
enum
{
@@ -453,6 +453,25 @@
.link_align = GRUB_KERNEL_MIPS_QEMU_MIPS_LINK_ALIGN,
.default_compression = COMPRESSION_NONE
},
+ {
+ .dirname = "arm-uboot",
+ .names = { "arm-uboot", NULL },
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_UBOOT,
+ .flags = PLATFORM_FLAGS_NONE,
+ .total_module_size = GRUB_KERNEL_ARM_UBOOT_TOTAL_MODULE_SIZE,
+ .decompressor_compressed_size = TARGET_NO_FIELD,
+ .decompressor_uncompressed_size = TARGET_NO_FIELD,
+ .decompressor_uncompressed_addr = TARGET_NO_FIELD,
+ .section_align = GRUB_KERNEL_ARM_UBOOT_MOD_ALIGN,
+ .vaddr_offset = 0,
+ .link_addr = GRUB_KERNEL_ARM_UBOOT_LINK_ADDR,
+ .elf_target = EM_ARM,
+ .mod_gap = GRUB_KERNEL_ARM_UBOOT_MOD_GAP,
+ .mod_align = GRUB_KERNEL_ARM_UBOOT_MOD_ALIGN,
+ .link_align = 4
+ },
};
#define grub_target_to_host32(x) (grub_target_to_host32_real (image_target, (x)))
@@ -1020,6 +1039,7 @@
case IMAGE_SPARC64_RAW:
case IMAGE_I386_IEEE1275:
case IMAGE_PPC:
+ case IMAGE_UBOOT:
break;
}
@@ -1687,6 +1707,9 @@
core_size = program_size + header_size + footer_size;
}
break;
+ case IMAGE_UBOOT:
+ /* Raw image, header added by grub-install */
+ break;
}
grub_util_write_image (core_img, core_size, out, outname);
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-03-24 17:01 [PATCH 4/7] Support for ARM/U-Boot platforms Leif Lindholm @ 2013-04-01 2:15 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-01 9:53 ` Francesco Lavra 2013-04-03 16:32 ` Leif Lindholm 2013-04-09 0:15 ` Vladimir 'φ-coder/phcoder' Serbinenko 1 sibling, 2 replies; 14+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-01 2:15 UTC (permalink / raw) To: The development of GNU GRUB [-- Attachment #1: Type: text/plain, Size: 1992 bytes --] Which architecture is raspberry pie? I have one here and it would be good if I could use it for testing. > +#define GRUB_KERNEL_MACHINE_STACK_SIZE 0x40000 > +#define GRUB_KERNEL_MACHINE_HEAP_SIZE (grub_size_t) (2 * 1024 * 1024) Why so small heap? > === modified file 'util/grub-install.in' > --- util/grub-install.in 2013-01-27 15:17:21 +0000 > +++ util/grub-install.in 2013-03-24 13:03:31 +0000 > @@ -319,6 +319,8 @@ > target=i386-pc > fi > ;; > + x"arm"*) > + target="arm-uboot";; > *) > gettext "Unable to determine your platform. Use --target." ; > echo ;; > @@ -338,7 +340,7 @@ > if [ x$disk_module = xunspecified ]; then > disk_module=biosdisk > fi > -elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] ; then > +elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] || [ "${grub_modinfo_platform}" = "uboot" ] ; then > disk_module= > else > disk_module=native > @@ -854,6 +856,14 @@ > -L "$bootloader_id" -l "\\EFI\\$efi_distributor\\$efi_file" > fi > fi > +elif [ x"${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = xarm-uboot ]; then > + grub_imgname="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" > + raw_imgname="${uboot_imgname}.raw" Where is uboot_imgname set? > + mv "$grub_imgname" "$raw_imgname" > + mkimage -T kernel -A ARM -O Linux -a 0x08000000 -e 0x08000000 -C none -d "$raw_imgname" "$grub_imgname" Is it from uboot? You need to check for its availability > @@ -1687,6 +1707,9 @@ > core_size = program_size + header_size + footer_size; > } > break; > + case IMAGE_UBOOT: > + /* Raw image, header added by grub-install */ > + break; What is this additional header? Is it just ELF? Why not use ELF codepath? [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 294 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-01 2:15 ` Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-01 9:53 ` Francesco Lavra 2013-04-01 11:24 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-03 16:32 ` Leif Lindholm 1 sibling, 1 reply; 14+ messages in thread From: Francesco Lavra @ 2013-04-01 9:53 UTC (permalink / raw) To: grub-devel On 04/01/2013 04:15 AM, Vladimir 'φ-coder/phcoder' Serbinenko wrote: > Which architecture is raspberry pie? I have one here and it would be > good if I could use it for testing. It's ARMv6, so unfortunately it's not supported by this port, which works only on ARMv7. > >> +#define GRUB_KERNEL_MACHINE_STACK_SIZE 0x40000 >> +#define GRUB_KERNEL_MACHINE_HEAP_SIZE (grub_size_t) (2 * 1024 * 1024) > > Why so small heap? > >> === modified file 'util/grub-install.in' >> --- util/grub-install.in 2013-01-27 15:17:21 +0000 >> +++ util/grub-install.in 2013-03-24 13:03:31 +0000 >> @@ -319,6 +319,8 @@ >> target=i386-pc >> fi >> ;; >> + x"arm"*) >> + target="arm-uboot";; >> *) >> gettext "Unable to determine your platform. Use --target." ; >> echo ;; >> @@ -338,7 +340,7 @@ >> if [ x$disk_module = xunspecified ]; then >> disk_module=biosdisk >> fi >> -elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] ; then >> +elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] || [ "${grub_modinfo_platform}" = "uboot" ] ; then >> disk_module= >> else >> disk_module=native >> @@ -854,6 +856,14 @@ >> -L "$bootloader_id" -l "\\EFI\\$efi_distributor\\$efi_file" >> fi >> fi >> +elif [ x"${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = xarm-uboot ]; then >> + grub_imgname="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" >> + raw_imgname="${uboot_imgname}.raw" > > Where is uboot_imgname set? > >> + mv "$grub_imgname" "$raw_imgname" >> + mkimage -T kernel -A ARM -O Linux -a 0x08000000 -e 0x08000000 -C none -d "$raw_imgname" "$grub_imgname" > > Is it from uboot? You need to check for its availability > >> @@ -1687,6 +1707,9 @@ >> core_size = program_size + header_size + footer_size; >> } >> break; >> + case IMAGE_UBOOT: >> + /* Raw image, header added by grub-install */ >> + break; > > What is this additional header? Is it just ELF? Why not use ELF codepath? No, it's not an ELF header, it's a U-Boot-specific header added by the mkimage utility launched by grub-install. -- Francesco ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-01 9:53 ` Francesco Lavra @ 2013-04-01 11:24 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-01 14:29 ` Francesco Lavra 0 siblings, 1 reply; 14+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-01 11:24 UTC (permalink / raw) To: The development of GNU GRUB [-- Attachment #1: Type: text/plain, Size: 387 bytes --] On 01.04.2013 11:53, Francesco Lavra wrote: > On 04/01/2013 04:15 AM, Vladimir 'φ-coder/phcoder' Serbinenko wrote: >> > Which architecture is raspberry pie? I have one here and it would be >> > good if I could use it for testing. > It's ARMv6, so unfortunately it's not supported by this port, which > works only on ARMv7. > Which parts prevent it from working on ARMv6? [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 294 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-01 11:24 ` Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-01 14:29 ` Francesco Lavra 2013-04-03 10:29 ` Leif Lindholm 0 siblings, 1 reply; 14+ messages in thread From: Francesco Lavra @ 2013-04-01 14:29 UTC (permalink / raw) To: grub-devel On 04/01/2013 01:24 PM, Vladimir 'φ-coder/phcoder' Serbinenko wrote: > On 01.04.2013 11:53, Francesco Lavra wrote: > >> On 04/01/2013 04:15 AM, Vladimir 'φ-coder/phcoder' Serbinenko wrote: >>>> Which architecture is raspberry pie? I have one here and it would be >>>> good if I could use it for testing. >> It's ARMv6, so unfortunately it's not supported by this port, which >> works only on ARMv7. >> > > Which parts prevent it from working on ARMv6? I haven't studied ARMv6, but I can say that at least some assembly instructions used by the cache maintenance code in kern/arm/cache.S (such as DMB, DSB and ISB) have been introduced in ARMv7, as well as some coprocessor operations (specifically, I'm looking at those used in the clean_invalidate_dcache routine in the same file). ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-01 14:29 ` Francesco Lavra @ 2013-04-03 10:29 ` Leif Lindholm 0 siblings, 0 replies; 14+ messages in thread From: Leif Lindholm @ 2013-04-03 10:29 UTC (permalink / raw) To: The development of GNU GRUB On Mon, Apr 01, 2013 at 04:29:02PM +0200, Francesco Lavra wrote: > >> On 04/01/2013 04:15 AM, Vladimir '??-coder/phcoder' Serbinenko wrote: > >>>> Which architecture is raspberry pie? I have one here and it would be > >>>> good if I could use it for testing. > >> It's ARMv6, so unfortunately it's not supported by this port, which > >> works only on ARMv7. > > > > Which parts prevent it from working on ARMv6? > > I haven't studied ARMv6, but I can say that at least some assembly > instructions used by the cache maintenance code in kern/arm/cache.S > (such as DMB, DSB and ISB) have been introduced in ARMv7, as well as > some coprocessor operations (specifically, I'm looking at those used in > the clean_invalidate_dcache routine in the same file). That pretty much sums it up. Plus, with the ARM1176 not supporting Thumb-2 extensions of Thumb instruction set, you would also need to ensure all of the ASM could build as ARM, and that all relocations required for an ARM build were implemented. / Leif ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-01 2:15 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-01 9:53 ` Francesco Lavra @ 2013-04-03 16:32 ` Leif Lindholm 2013-04-08 10:47 ` Vladimir 'φ-coder/phcoder' Serbinenko 1 sibling, 1 reply; 14+ messages in thread From: Leif Lindholm @ 2013-04-03 16:32 UTC (permalink / raw) To: The development of GNU GRUB; +Cc: phcoder On Mon, Apr 01, 2013 at 04:15:03AM +0200, Vladimir '??-coder/phcoder' Serbinenko wrote: > > +#define GRUB_KERNEL_MACHINE_STACK_SIZE 0x40000 > > +#define GRUB_KERNEL_MACHINE_HEAP_SIZE (grub_size_t) (2 * 1024 * 1024) > > Why so small heap? I copied ieee1275 HEAP_MIN_SIZE to begin with, and it was always enough. (Since U-Boot doesn't provide any memory mapping service, kernel and initrd are not going on the heap.) I could increase it? > > === modified file 'util/grub-install.in' > > --- util/grub-install.in 2013-01-27 15:17:21 +0000 > > +++ util/grub-install.in 2013-03-24 13:03:31 +0000 > > @@ -319,6 +319,8 @@ > > target=i386-pc > > fi > > ;; > > + x"arm"*) > > + target="arm-uboot";; > > *) > > gettext "Unable to determine your platform. Use --target." ; > > echo ;; > > @@ -338,7 +340,7 @@ > > if [ x$disk_module = xunspecified ]; then > > disk_module=biosdisk > > fi > > -elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] ; then > > +elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] || [ "${grub_modinfo_platform}" = "uboot" ] ; then > > disk_module= > > else > > disk_module=native > > @@ -854,6 +856,14 @@ > > -L "$bootloader_id" -l "\\EFI\\$efi_distributor\\$efi_file" > > fi > > fi > > +elif [ x"${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = xarm-uboot ]; then > > + grub_imgname="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" > > + raw_imgname="${uboot_imgname}.raw" > > Where is uboot_imgname set? *cough* that would be a typo then - should be grub_imgname. > > + mv "$grub_imgname" "$raw_imgname" > > + mkimage -T kernel -A ARM -O Linux -a 0x08000000 -e 0x08000000 -C none -d "$raw_imgname" "$grub_imgname" > > Is it from uboot? You need to check for its availability Yes. / Leif ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-03 16:32 ` Leif Lindholm @ 2013-04-08 10:47 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-09 10:26 ` Leif Lindholm 0 siblings, 1 reply; 14+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-08 10:47 UTC (permalink / raw) To: Leif Lindholm; +Cc: The development of GNU GRUB [-- Attachment #1: Type: text/plain, Size: 5599 bytes --] On 03.04.2013 18:32, Leif Lindholm wrote: > On Mon, Apr 01, 2013 at 04:15:03AM +0200, Vladimir '??-coder/phcoder' Serbinenko wrote: >>> +#define GRUB_KERNEL_MACHINE_STACK_SIZE 0x40000 >>> +#define GRUB_KERNEL_MACHINE_HEAP_SIZE (grub_size_t) (2 * 1024 * 1024) >> >> Why so small heap? > > I copied ieee1275 HEAP_MIN_SIZE to begin with, and it was always enough. > (Since U-Boot doesn't provide any memory mapping service, kernel and > initrd are not going on the heap.) On x86 we reuse heap for kernels as well > I could increase it? > If we want to support any kind of graphics (gfxterm, gfxmenu) on arm as well, we'll need more heap >>> === modified file 'util/grub-install.in' >>> --- util/grub-install.in 2013-01-27 15:17:21 +0000 >>> +++ util/grub-install.in 2013-03-24 13:03:31 +0000 >>> @@ -319,6 +319,8 @@ >>> target=i386-pc >>> fi >>> ;; >>> + x"arm"*) >>> + target="arm-uboot";; >>> *) >>> gettext "Unable to determine your platform. Use --target." ; >>> echo ;; >>> @@ -338,7 +340,7 @@ >>> if [ x$disk_module = xunspecified ]; then >>> disk_module=biosdisk >>> fi >>> -elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] ; then >>> +elif [ "${grub_modinfo_platform}" = "ieee1275" ] || [ "${grub_modinfo_platform}" = "efi" ] || [ "${grub_modinfo_platform}" = "arc" ] || [ "${grub_modinfo_platform}" = "uboot" ] ; then >>> disk_module= >>> else >>> disk_module=native >>> @@ -854,6 +856,14 @@ >>> -L "$bootloader_id" -l "\\EFI\\$efi_distributor\\$efi_file" >>> fi >>> fi >>> +elif [ x"${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = xarm-uboot ]; then >>> + grub_imgname="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" >>> + raw_imgname="${uboot_imgname}.raw" >> >> Where is uboot_imgname set? > > *cough* that would be a typo then - should be grub_imgname. > >>> + mv "$grub_imgname" "$raw_imgname" >>> + mkimage -T kernel -A ARM -O Linux -a 0x08000000 -e 0x08000000 -C none -d "$raw_imgname" "$grub_imgname" >> >> Is it from uboot? You need to check for its availability > > Yes. > the header is trivial. I added it to grub-mkimage (patch at the bottom). Trouble is that grub-install now rightfully warns about the lack of platform-specific install. What do we have to do to register the image at u-boot? Put it in specific location? Also you spoke about relocatable image but AFAICT header always specifies load address. Do you have a way around it? === modified file 'util/grub-install.in' --- util/grub-install.in 2013-04-07 00:41:07 +0000 +++ util/grub-install.in 2013-04-08 10:42:46 +0000 @@ -833,14 +833,6 @@ -L "$bootloader_id" -l "\\EFI\\$efi_distributor\\$efi_file" fi fi -elif [ x"${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = xarm-uboot ]; then - grub_imgname="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" - raw_imgname="${uboot_imgname}.raw" - mv "$grub_imgname" "$raw_imgname" - mkimage -T kernel -A ARM -O Linux -a 0x08000000 -e 0x08000000 -C none -d "$raw_imgname" "$grub_imgname" - if [ $? -eq 0 ]; then - rm -f "$raw_imgname" - fi else gettext "WARNING: no platform-specific install was performed" 1>&2 echo 1>&2 === modified file 'util/grub-mkimage.c' --- util/grub-mkimage.c 2013-04-07 00:41:07 +0000 +++ util/grub-mkimage.c 2013-04-08 09:40:18 +0000 @@ -40,6 +40,7 @@ #include <stdlib.h> #include <assert.h> #include <grub/efi/pe32.h> +#include <grub/uboot/image.h> #define _GNU_SOURCE 1 #include <argp.h> @@ -1499,6 +1500,42 @@ core_size = rom_size; } break; + + case IMAGE_UBOOT: + { + struct grub_uboot_image_header *hdr; + GRUB_PROPERLY_ALIGNED_ARRAY (crc32_context, GRUB_MD_CRC32->contextsize); + + hdr = xmalloc (core_size + sizeof (struct grub_uboot_image_header)); + memcpy (hdr + 1, core_img, core_size); + + memset (hdr, 0, sizeof (*hdr)); + hdr->ih_magic = grub_cpu_to_be32_compile_time (GRUB_UBOOT_IH_MAGIC); + hdr->ih_time = grub_cpu_to_be32 (time (0)); + hdr->ih_size = grub_cpu_to_be32 (core_size); + hdr->ih_load = grub_cpu_to_be32 (image_target->link_addr); + hdr->ih_ep = grub_cpu_to_be32 (image_target->link_addr); + hdr->ih_os = GRUB_UBOOT_IH_OS_LINUX; + hdr->ih_arch = GRUB_UBOOT_IH_ARCH_ARM; + hdr->ih_type = GRUB_UBOOT_IH_TYPE_KERNEL; + hdr->ih_comp = GRUB_UBOOT_IH_COMP_NONE; + + GRUB_MD_CRC32->init(crc32_context); + GRUB_MD_CRC32->write(crc32_context, hdr + 1, core_size); + GRUB_MD_CRC32->final(crc32_context); + hdr->ih_dcrc = grub_get_unaligned32 (GRUB_MD_CRC32->read (crc32_context)); + + GRUB_MD_CRC32->init(crc32_context); + GRUB_MD_CRC32->write(crc32_context, hdr, sizeof (*hdr)); + GRUB_MD_CRC32->final(crc32_context); + hdr->ih_hcrc = grub_get_unaligned32 (GRUB_MD_CRC32->read (crc32_context)); + + free (core_img); + core_img = (char *) hdr; + core_size += sizeof (struct grub_uboot_image_header); + } + break; + case IMAGE_MIPS_ARC: { char *ecoff_img; @@ -1725,9 +1762,6 @@ core_size = program_size + header_size + footer_size; } break; - case IMAGE_UBOOT: - /* Raw image, header added by grub-install */ - break; } grub_util_write_image (core_img, core_size, out, outname); [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 294 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-08 10:47 ` Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-09 10:26 ` Leif Lindholm 2013-04-09 17:26 ` Vladimir 'φ-coder/phcoder' Serbinenko 0 siblings, 1 reply; 14+ messages in thread From: Leif Lindholm @ 2013-04-09 10:26 UTC (permalink / raw) To: Vladimir '??-coder/phcoder' Serbinenko Cc: The development of GNU GRUB On Mon, Apr 08, 2013 at 12:47:48PM +0200, Vladimir '??-coder/phcoder' Serbinenko wrote: > >> Why so small heap? > > > > I copied ieee1275 HEAP_MIN_SIZE to begin with, and it was always enough. > > (Since U-Boot doesn't provide any memory mapping service, kernel and > > initrd are not going on the heap.) > > On x86 we reuse heap for kernels as well This might be difficult to combine with the intersection of U-Boot and the defined ARM Linux boot process. > > I could increase it? > > If we want to support any kind of graphics (gfxterm, gfxmenu) on arm as well, we'll need more heap OK. > >> Is it from uboot? You need to check for its availability > > > > Yes. > > the header is trivial. I added it to grub-mkimage (patch at the bottom). Neat, thanks :) > Trouble is that grub-install now rightfully warns about the lack of > platform-specific install. > What do we have to do to register the image at u-boot? > Put it in specific location? EFI provides three very nice things: - Standardised partition and filesystem type for bootloaders. - Standardised runtime services for updating selected boot image. - Standardised "removable media" bootloader path. U-Boot has neither, and different platforms use different mechanisms to affect boot images - some "prime" the enviroment with a uEnv.txt, some search around a predefined set of filesystems for boot scripts, some require you to manually "setenv" from within U-Boot. Debian use a special package called flash-kernel to abstract these things away. So in short, I think the only sane thing grub-install can do for arm-uboot, is what I already have it do - generate an image with the required modules embedded. Now, maybe it shouldn't be grub/arm-uboot/core.img, but that was what I ended up using. > Also you spoke about relocatable image but AFAICT header always > specifies load address. Do you have a way around it? Well, it's not so much a way around it as somthing that almost ampounts to a new port (certainly a new image type). The proper fix would be to generate it as an ELF image _instead_, and use U-Boot's ELF loader support to load it properly. / Leif ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-09 10:26 ` Leif Lindholm @ 2013-04-09 17:26 ` Vladimir 'φ-coder/phcoder' Serbinenko 0 siblings, 0 replies; 14+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-09 17:26 UTC (permalink / raw) To: Leif Lindholm; +Cc: The development of GNU GRUB [-- Attachment #1: Type: text/plain, Size: 1946 bytes --] >> Trouble is that grub-install now rightfully warns about the lack of >> platform-specific install. >> What do we have to do to register the image at u-boot? >> Put it in specific location? > > EFI provides three very nice things: > - Standardised partition and filesystem type for bootloaders. > - Standardised runtime services for updating selected boot image. > - Standardised "removable media" bootloader path. > > U-Boot has neither, and different platforms use different mechanisms to > affect boot images - some "prime" the enviroment with a uEnv.txt, some > search around a predefined set of filesystems for boot scripts, some > require you to manually "setenv" from within U-Boot. Is environment stored in flash? > > Debian use a special package called flash-kernel to abstract these things > away. > Can we use it? > So in short, I think the only sane thing grub-install can do for arm-uboot, > is what I already have it do - generate an image with the required modules > embedded. If that's the only thing we do, then the warning should be kept. > Now, maybe it shouldn't be grub/arm-uboot/core.img, but that was > what I ended up using. > I'd prefer to keep this file and make a copy if necessarry. >> Also you spoke about relocatable image but AFAICT header always >> specifies load address. Do you have a way around it? > > Well, it's not so much a way around it as somthing that almost ampounts > to a new port (certainly a new image type). > The proper fix would be to generate it as an ELF image _instead_, and use > U-Boot's ELF loader support to load it properly. > It's not really a new port. We already have ports using several image formats, e.g. i386-pc, sparc64-ieee1275, mips-loongson. Doesn't U-boot terminate services if it loads an ELF? How good is its ELF support? Does it handle relocations correctly? If it doesn't we can use -fPIC for kernel. [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 294 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-03-24 17:01 [PATCH 4/7] Support for ARM/U-Boot platforms Leif Lindholm 2013-04-01 2:15 ` Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-09 0:15 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-09 11:39 ` Leif Lindholm 1 sibling, 1 reply; 14+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-09 0:15 UTC (permalink / raw) To: The development of GNU GRUB [-- Attachment #1: Type: text/plain, Size: 7021 bytes --] On 24.03.2013 18:01, Leif Lindholm wrote: > > 0004-arm-uboot-support.patch > > > === modified file 'Makefile.util.def' > --- Makefile.util.def 2013-03-24 13:03:12 +0000 > +++ Makefile.util.def 2013-03-24 13:03:31 +0000 > @@ -467,6 +467,7 @@ > enable = mips_loongson; > enable = ia64_efi; > enable = powerpc_ieee1275; > + enable = arm_uboot; > }; > > script = { > > === modified file 'grub-core/Makefile.am' > --- grub-core/Makefile.am 2013-03-20 16:13:31 +0000 > +++ grub-core/Makefile.am 2013-03-24 13:03:31 +0000 > @@ -211,6 +211,13 @@ > KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h > endif > > +if COND_arm_uboot > +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/uboot.h > +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/disk.h > +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h > +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h > +endif > + > if COND_emu > KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/datetime.h > KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/misc.h > > === modified file 'grub-core/Makefile.core.def' > --- grub-core/Makefile.core.def 2013-03-24 13:03:12 +0000 > +++ grub-core/Makefile.core.def 2013-03-24 13:03:31 +0000 > @@ -79,6 +79,7 @@ > mips_startup = kern/mips/startup.S; > sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S; > powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S; > + arm_uboot_startup = kern/arm/uboot/startup.S; > > common = kern/command.c; > common = kern/corecmd.c; > > === added directory 'grub-core/kern/arm/uboot' > === added file 'grub-core/kern/arm/uboot/startup.S' > --- grub-core/kern/arm/uboot/startup.S 1970-01-01 00:00:00 +0000 > +++ grub-core/kern/arm/uboot/startup.S 2013-03-24 13:03:31 +0000 > @@ -0,0 +1,176 @@ > +/* > + * GRUB -- GRand Unified Bootloader > + * Copyright (C) 2013 Free Software Foundation, Inc. > + * > + * GRUB is free software: you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation, either version 3 of the License, or > + * (at your option) any later version. > + * > + * GRUB is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <grub/offsets.h> > +#include <grub/symbol.h> > +#include <grub/machine/kernel.h> > + > +/* > + * GRUB is called from U-Boot as a Linux Kernel type image, which > + * means among other things that it always enters in ARM state. > + * > + * > + * Overview of GRUB image layout: > + * > + * _start: > + * Entry point (1 ARM branch instruction, to "codestart") > + * grub_total_module_size: > + * Data field: Size of included module blob > + * (when generated by grub-mkimage) > + * codestart: > + * Remainder of statically-linked executable code and data. > + * __bss_start: > + * Start of included module blob. > + * Also where global/static variables are located. > + * _end: > + * End of bss region (but not necessarily module blob). > + * <overflow>: > + * Any part of the module blob that extends beyond _end. > + * <modules>: > + * Loadable modules, post relocation. > + * <stack>: > + * <heap>: > + */ > + > + .text > + .arm > +FUNCTION(_start) > + b codestart > + > + @ Size of final image integrated module blob - set by grub-mkimage > + . = _start + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE > +VARIABLE(grub_total_module_size) > + .long 0 > + > +FUNCTION(codestart) > + @ Store context: Machine ID, atags/dtb, ... > + @ U-Boot API signature is stored on the U-Boot heap > + @ Stack pointer used as start address for signature probing > + mov r12, sp > + ldr sp, =entry_state > + push {r4-r12,lr} @ store U-Boot context (sp in r12) > + > + @ Put kernel parameters aside until we can store them (further down) > + mov r4, r1 @ machine type > + mov r5, r2 @ boot data > + > + @ Modules have been stored as a blob in BSS, > + @ they need to be manually relocated to _end or > + @ (__bss_start + grub_total_module_size), whichever greater. > + bl uboot_get_real_bss_start @ r0 = src > + ldr r1, =EXT_C(_end) @ dst = End of BSS > + ldr r2, grub_total_module_size @ blob size > + add r3, r0, r2 @ blob end > + cmp r1, r3 @ _end < blob end? > + movlt r1, r3 @ dst = blob end + blob size > + > +1: ldr r3, [r0], #4 @ r3 = *src++ > + str r3, [r1], #4 @ *dst++ = r3 > + subs r2, #4 @ remaining -= 4 > + bne 1b @ while remaining != 0 > + > + @ Set up a new stack, beyond the end of copied modules. > + ldr r3, =GRUB_KERNEL_MACHINE_STACK_SIZE > + add r3, r1, r3 @ Place stack beyond end of modules > + and sp, r3, #~0x7 @ Ensure 8-byte alignment > + > + @ Since we _are_ the C run-time, we need to manually zero the BSS > + @ region before continuing > + bl uboot_get_real_bss_start @ zero from here This start is wrong. Even if modules start later due to alignment, BSS starts at __bss_start. Additional problem is that both __bss_start and _end may be unaligned unless special care is taken (like putting a dummy uint32_t at the beginning of BSS by putting it at the end of startup.S or using ld options) > + ldr r1, =EXT_C(_end) @ to here > + mov r2, #0 > +1: str r2, [r0], #4 > + cmp r0, r1 > + bne 1b > + > + @ Global variables now accessible - store kernel parameters in memory > + ldr r12, =EXT_C(uboot_machine_type) > + str r4, [r12] > + ldr r12, =EXT_C(uboot_boot_data) > + str r5, [r12] > + Instead of temporary stashing the values to registers you can just init those values in C code to e.g. 0x55aa55aa so they'll be in .data and so accessible from the very beginning. > + b EXT_C(grub_main) > + > + /* > + * __bss_start does not actually point to the start of the runtime > + * BSS, but rather to the next byte following the preceding data. > + */ Only modules are aligned. BSS itself is still at _bss. > +FUNCTION (uboot_get_real_bss_start) > + ldr r0, =EXT_C(__bss_start) @ src > + tst r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) > + beq 1f > + mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) > + and r0, r0, r1 > + add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN) Can be trivially simplified to: mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) add r0, r0, r1 and r0, r0, r1 which can be then inlined. Also it's more reliable to save grub_modbase as soon as we computed it in asm part (and use 0x55aa55aa trick to make it accessible early) [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 294 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-09 0:15 ` Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-09 11:39 ` Leif Lindholm 2013-04-09 11:55 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-09 12:45 ` Vladimir 'φ-coder/phcoder' Serbinenko 0 siblings, 2 replies; 14+ messages in thread From: Leif Lindholm @ 2013-04-09 11:39 UTC (permalink / raw) To: The development of GNU GRUB; +Cc: phcoder On Tue, Apr 09, 2013 at 02:15:20AM +0200, Vladimir '??-coder/phcoder' Serbinenko wrote: > > === added directory 'grub-core/kern/arm/uboot' > > === added file 'grub-core/kern/arm/uboot/startup.S' > > --- grub-core/kern/arm/uboot/startup.S 1970-01-01 00:00:00 +0000 > > +++ grub-core/kern/arm/uboot/startup.S 2013-03-24 13:03:31 +0000 [...] > > + @ Set up a new stack, beyond the end of copied modules. > > + ldr r3, =GRUB_KERNEL_MACHINE_STACK_SIZE > > + add r3, r1, r3 @ Place stack beyond end of modules > > + and sp, r3, #~0x7 @ Ensure 8-byte alignment > > + > > + @ Since we _are_ the C run-time, we need to manually zero the BSS > > + @ region before continuing > > + bl uboot_get_real_bss_start @ zero from here > > This start is wrong. Even if modules start later due to alignment, BSS > starts at __bss_start. Additional problem is that both __bss_start and > _end may be unaligned unless special care is taken (like putting a dummy > uint32_t at the beginning of BSS by putting it at the end of startup.S > or using ld options) My main concern here is getting the module start address right. But see below. > > + ldr r1, =EXT_C(_end) @ to here > > + mov r2, #0 > > +1: str r2, [r0], #4 > > + cmp r0, r1 > > + bne 1b > > + > > + @ Global variables now accessible - store kernel parameters in memory > > + ldr r12, =EXT_C(uboot_machine_type) > > + str r4, [r12] > > + ldr r12, =EXT_C(uboot_boot_data) > > + str r5, [r12] > > + > > Instead of temporary stashing the values to registers you can just init > those values in C code to e.g. 0x55aa55aa so they'll be in .data and so > accessible from the very beginning. Neat :) I'll do that. > > + b EXT_C(grub_main) > > + > > + /* > > + * __bss_start does not actually point to the start of the runtime > > + * BSS, but rather to the next byte following the preceding data. > > + */ > > Only modules are aligned. BSS itself is still at _bss. My issue with this statement is that this definition of BSS can include padding before the first symbol inside the BSS. I accept that it can also contain less-aligned symbols, which is a problem that I need to handle in the code above. > > +FUNCTION (uboot_get_real_bss_start) > > + ldr r0, =EXT_C(__bss_start) @ src > > + tst r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) > > + beq 1f > > + mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) > > + and r0, r0, r1 > > + add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN) > > Can be trivially simplified to: > mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) > add r0, r0, r1 > and r0, r0, r1 Yes, I may have been a bit silly when writing the above (and now), but I don't follow (0xfffffff8 + __bss_start) & 0xfffffff8 ? Do you mean: mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN) add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) and r0, r0, r1 > which can be then inlined. Also it's more reliable to save grub_modbase > as soon as we computed it in asm part (and use 0x55aa55aa trick to make > it accessible early) OK, that makes sense. And having done that, it can be inlined, since I no longer need it from within uboot/init.c. / Leif ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-09 11:39 ` Leif Lindholm @ 2013-04-09 11:55 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-09 12:45 ` Vladimir 'φ-coder/phcoder' Serbinenko 1 sibling, 0 replies; 14+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-09 11:55 UTC (permalink / raw) To: Leif Lindholm, The development of GRUB 2 [-- Attachment #1: Type: text/plain, Size: 3672 bytes --] On 09.04.2013 13:39, Leif Lindholm wrote: > On Tue, Apr 09, 2013 at 02:15:20AM +0200, Vladimir '??-coder/phcoder' Serbinenko wrote: >>> === added directory 'grub-core/kern/arm/uboot' >>> === added file 'grub-core/kern/arm/uboot/startup.S' >>> --- grub-core/kern/arm/uboot/startup.S 1970-01-01 00:00:00 +0000 >>> +++ grub-core/kern/arm/uboot/startup.S 2013-03-24 13:03:31 +0000 > [...] >>> + @ Set up a new stack, beyond the end of copied modules. >>> + ldr r3, =GRUB_KERNEL_MACHINE_STACK_SIZE >>> + add r3, r1, r3 @ Place stack beyond end of modules >>> + and sp, r3, #~0x7 @ Ensure 8-byte alignment >>> + >>> + @ Since we _are_ the C run-time, we need to manually zero the BSS >>> + @ region before continuing >>> + bl uboot_get_real_bss_start @ zero from here >> >> This start is wrong. Even if modules start later due to alignment, BSS >> starts at __bss_start. Additional problem is that both __bss_start and >> _end may be unaligned unless special care is taken (like putting a dummy >> uint32_t at the beginning of BSS by putting it at the end of startup.S >> or using ld options) > > My main concern here is getting the module start address right. > But see below. > >>> + ldr r1, =EXT_C(_end) @ to here >>> + mov r2, #0 >>> +1: str r2, [r0], #4 >>> + cmp r0, r1 >>> + bne 1b >>> + >>> + @ Global variables now accessible - store kernel parameters in memory >>> + ldr r12, =EXT_C(uboot_machine_type) >>> + str r4, [r12] >>> + ldr r12, =EXT_C(uboot_boot_data) >>> + str r5, [r12] >>> + >> >> Instead of temporary stashing the values to registers you can just init >> those values in C code to e.g. 0x55aa55aa so they'll be in .data and so >> accessible from the very beginning. > > Neat :) > I'll do that. > >>> + b EXT_C(grub_main) >>> + >>> + /* >>> + * __bss_start does not actually point to the start of the runtime >>> + * BSS, but rather to the next byte following the preceding data. >>> + */ >> >> Only modules are aligned. BSS itself is still at _bss. > > My issue with this statement is that this definition of BSS can > include padding before the first symbol inside the BSS. > I accept that it can also contain less-aligned symbols, which is a > problem that I need to handle in the code above. > Actually since BSS surely contains at least one uint32_t its start and has to be aligned to 32-bit. So we can just align_up __bss_start to 4 and _end align_down to 4. This would work correctly enough even with the presence of the bug you rerported to GCC folks. >>> +FUNCTION (uboot_get_real_bss_start) >>> + ldr r0, =EXT_C(__bss_start) @ src >>> + tst r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) >>> + beq 1f >>> + mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) >>> + and r0, r0, r1 >>> + add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN) >> >> Can be trivially simplified to: >> mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) >> add r0, r0, r1 >> and r0, r0, r1 > > Yes, I may have been a bit silly when writing the above (and now), but > I don't follow (0xfffffff8 + __bss_start) & 0xfffffff8 ? > Do you mean: > mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN) > add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) > and r0, r0, r1 > Yes, sorry, I proposed it without testing and I'm a beginner in ARM asm. >> which can be then inlined. Also it's more reliable to save grub_modbase >> as soon as we computed it in asm part (and use 0x55aa55aa trick to make >> it accessible early) > > OK, that makes sense. And having done that, it can be inlined, since I no > longer need it from within uboot/init.c. > > / > Leif > [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 294 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/7] Support for ARM/U-Boot platforms 2013-04-09 11:39 ` Leif Lindholm 2013-04-09 11:55 ` Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-09 12:45 ` Vladimir 'φ-coder/phcoder' Serbinenko 1 sibling, 0 replies; 14+ messages in thread From: Vladimir 'φ-coder/phcoder' Serbinenko @ 2013-04-09 12:45 UTC (permalink / raw) To: Leif Lindholm, The development of GRUB 2 [-- Attachment #1.1: Type: text/plain, Size: 187 bytes --] Here is what I have in my local tree (full patch). Contains also an initial attempt at i386-uboot but given sorry state of uboot on i386, I'll probably abandon it instead of finishing [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #1.2: q.diff --] [-- Type: text/x-diff; name="q.diff", Size: 36224 bytes --] === modified file 'Makefile.util.def' --- Makefile.util.def 2013-04-07 00:41:07 +0000 +++ Makefile.util.def 2013-04-09 12:14:38 +0000 @@ -150,7 +150,7 @@ common = util/resolve.c; common = grub-core/kern/emu/argp_common.c; - arm = grub-core/kern/arm/dl.c; + common = grub-core/kern/arm/dl.c; extra_dist = util/grub-mkimagexx.c; @@ -472,7 +472,6 @@ enable = mips_loongson; enable = ia64_efi; enable = powerpc_ieee1275; - enable = arm_uboot; }; script = { === modified file 'conf/Makefile.common' --- conf/Makefile.common 2013-04-07 00:41:07 +0000 +++ conf/Makefile.common 2013-04-07 16:08:07 +0000 @@ -40,8 +40,7 @@ if COND_arm # Image entry point always in ARM (A32) state - ensure proper functionality if # the rest is built for the Thumb (T32) state. - CFLAGS_PLATFORM += -mthumb-interwork -mno-unaligned-access -mlong-calls - CCASFLAGS_PLATFORM = -Wa,-mimplicit-it=thumb + CFLAGS_PLATFORM += -mthumb-interwork -march=armv6 -mlong-calls LDFLAGS_PLATFORM = -Wl,--wrap=__clear_cache endif === modified file 'configure.ac' --- configure.ac 2013-04-07 00:41:07 +0000 +++ configure.ac 2013-04-08 21:48:08 +0000 @@ -141,6 +141,7 @@ i386-linuxbios) platform=coreboot ;; i386-ieee1275) ;; i386-qemu) ;; + i386-uboot) ;; powerpc-ieee1275) ;; sparc64-ieee1275) ;; ia64-efi) ;; @@ -717,7 +718,7 @@ fi # Check for libgcc symbols -AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x __udivsi3 __umoddi3 __udivdi3 __divsi3 __modsi3 __umodsi3 __moddi3 __divdi3 __ctzdi2 __ctzsi2) +AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x __udivsi3 __umoddi3 __udivdi3 __divsi3 __modsi3 __umodsi3 __moddi3 __divdi3 __ctzdi2 __ctzsi2 __aeabi_ulcmp) if test "x$TARGET_APPLE_CC" = x1 ; then CFLAGS="$TARGET_CFLAGS -nostdlib" @@ -1149,6 +1150,7 @@ AM_CONDITIONAL([COND_i386_ieee1275], [test x$target_cpu = xi386 -a x$platform = xieee1275]) AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform = xcoreboot]) AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot]) +AM_CONDITIONAL([COND_i386_uboot], [test x$target_cpu = xi386 -a x$platform = xuboot]) AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi]) AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson]) AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips]) === modified file 'gentpl.py' --- gentpl.py 2013-04-07 00:41:07 +0000 +++ gentpl.py 2013-04-08 23:20:22 +0000 @@ -20,7 +20,8 @@ # GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", - "i386_multiboot", "i386_ieee1275", "x86_64_efi", + "i386_multiboot", "i386_ieee1275", "i386_uboot", + "x86_64_efi", "mips_loongson", "sparc64_ieee1275", "powerpc_ieee1275", "mips_arc", "ia64_efi", "mips_qemu_mips", "arm_uboot", "arm_efi" ] @@ -30,7 +31,7 @@ GROUPS["common"] = GRUB_PLATFORMS[:] # Groups based on CPU -GROUPS["i386"] = [ "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", "i386_multiboot", "i386_ieee1275" ] +GROUPS["i386"] = [ "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", "i386_multiboot", "i386_ieee1275", "i386_uboot" ] GROUPS["x86_64"] = [ "x86_64_efi" ] GROUPS["x86"] = GROUPS["i386"] + GROUPS["x86_64"] GROUPS["mips"] = [ "mips_loongson", "mips_qemu_mips", "mips_arc" ] @@ -41,7 +42,7 @@ # Groups based on firmware GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi" ] GROUPS["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ] -GROUPS["uboot"] = [ "arm_uboot" ] +GROUPS["uboot"] = [ "arm_uboot", "i386_uboot" ] # emu is a special case so many core functionality isn't needed on this platform GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu") @@ -64,7 +65,7 @@ for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i) # Flattened Device Trees (FDT) -GROUPS["fdt"] = [ "arm_uboot", "arm_efi" ] +GROUPS["fdt"] = [ "arm_uboot", "arm_efi", "i386_uboot" ] # Miscelaneous groups schedulded to disappear in future GROUPS["i386_coreboot_multiboot_qemu"] = ["i386_coreboot", "i386_multiboot", "i386_qemu"] === modified file 'grub-core/Makefile.am' --- grub-core/Makefile.am 2013-04-07 00:41:07 +0000 +++ grub-core/Makefile.am 2013-04-08 23:41:09 +0000 @@ -132,6 +132,15 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h endif +if COND_i386_uboot +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/uboot.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/disk.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h +endif + if COND_x86_64_efi KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h === modified file 'grub-core/Makefile.core.def' --- grub-core/Makefile.core.def 2013-04-07 00:41:07 +0000 +++ grub-core/Makefile.core.def 2013-04-09 00:05:56 +0000 @@ -79,6 +79,7 @@ i386_ieee1275_startup = kern/i386/ieee1275/startup.S; i386_coreboot_startup = kern/i386/coreboot/startup.S; i386_multiboot_startup = kern/i386/coreboot/startup.S; + i386_uboot_startup = kern/i386/uboot/startup.S; mips_startup = kern/mips/startup.S; sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S; powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S; @@ -492,6 +493,7 @@ enable = i386_ieee1275; enable = i386_coreboot; enable = i386_multiboot; + enable = i386_uboot; }; module = { @@ -569,11 +571,13 @@ i386_pc = commands/i386/pc/acpi.c; i386_coreboot = commands/i386/pc/acpi.c; i386_multiboot = commands/i386/pc/acpi.c; + i386_uboot = commands/i386/pc/acpi.c; enable = efi; enable = i386_pc; enable = i386_coreboot; enable = i386_multiboot; + enable = i386_uboot; }; module = { @@ -1057,6 +1061,8 @@ i386_multiboot = efiemu/i386/pc/cfgtables.c; i386_ieee1275 = efiemu/i386/nocfgtables.c; i386_qemu = efiemu/i386/nocfgtables.c; + i386_uboot = efiemu/i386/pc/cfgtables.c; + common = efiemu/mm.c; common = efiemu/loadcore_common.c; common = efiemu/symbols.c; @@ -1077,6 +1083,7 @@ enable = i386_ieee1275; enable = i386_multiboot; enable = i386_qemu; + enable = i386_uboot; }; module = { @@ -1656,6 +1663,7 @@ enable = terminfomodule; enable = ieee1275; + enable = i386_uboot; }; module = { === modified file 'grub-core/disk/uboot/ubootdisk.c' --- grub-core/disk/uboot/ubootdisk.c 2013-04-07 00:41:07 +0000 +++ grub-core/disk/uboot/ubootdisk.c 2013-04-08 08:34:08 +0000 @@ -246,7 +246,7 @@ grub_dprintf ("ubootdisk", "(%s) blocksize=%d, log_sector_size=%d\n", disk->name, d->block_size, disk->log_sector_size); - disk->total_sectors = GRUB_DISK_SIZE_UNKNOWN; + disk->total_sectors = devinfo->di_stor.block_count; disk->data = d; return GRUB_ERR_NONE; === modified file 'grub-core/kern/arm/dl.c' --- grub-core/kern/arm/dl.c 2013-04-07 00:41:07 +0000 +++ grub-core/kern/arm/dl.c 2013-04-09 11:44:28 +0000 @@ -23,17 +23,11 @@ #include <grub/err.h> #include <grub/mm.h> #include <grub/i18n.h> +#include <grub/arm/reloc.h> #ifdef GRUB_UTIL # include <grub/util/misc.h> #else -# if !defined(__thumb2__) -# error "Relocations not implemented for A32 ("ARM") instruction set yet!" -# endif - -grub_err_t reloc_jump24 (grub_uint32_t *addr, Elf32_Addr sym_addr); -grub_err_t reloc_thm_call (grub_uint16_t *addr, Elf32_Addr sym_addr); -grub_err_t reloc_thm_jump19 (grub_uint16_t *addr, Elf32_Addr sym_addr); #ifdef DL_DEBUG static const char *symstrtab; @@ -104,7 +98,7 @@ * B.W, BL and BLX */ grub_err_t -reloc_thm_call (grub_uint16_t *target, Elf32_Addr sym_addr) +grub_arm_reloc_thm_call (grub_uint16_t *target, Elf32_Addr sym_addr) { grub_int32_t offset, offset_low, offset_high; grub_uint32_t sign, j1, j2, is_blx; @@ -122,14 +116,8 @@ /* If BLX, target symbol must be ARM (target address LSB == 0) */ if (is_blx && (sym_addr & 1)) - { -#ifndef GRUB_UTIL - return grub_error - (GRUB_ERR_BUG, N_("Relocation targeting wrong execution state")); -#else - grub_util_error ("Relocation targeting wrong execution state"); -#endif - } + return grub_error (GRUB_ERR_BUG, + N_("Relocation targeting wrong execution state")); offset_low = -16777216; offset_high = is_blx ? 16777212 : 16777214; @@ -159,18 +147,12 @@ #endif if ((offset < offset_low) || (offset > offset_high)) - { -#ifdef GRUB_UTIL - grub_util_error ("Relocation out of range"); -#else - return grub_error - (GRUB_ERR_OUT_OF_RANGE, N_("THM_CALL Relocation out of range.")); -#endif - } + return grub_error (GRUB_ERR_OUT_OF_RANGE, + N_("THM_CALL Relocation out of range.")); #ifdef GRUB_UTIL - grub_util_info (" relative destination = 0x%08x", - (unsigned int)target + offset); + grub_util_info (" relative destination = 0x%08lx", + (unsigned long)target + offset); #endif /* Reassemble instruction word */ @@ -200,7 +182,7 @@ * Relocate conditional Thumb (T32) B<c>.W */ grub_err_t -reloc_thm_jump19 (grub_uint16_t *addr, Elf32_Addr sym_addr) +grub_arm_reloc_thm_jump19 (grub_uint16_t *addr, Elf32_Addr sym_addr) { grub_int32_t offset; grub_uint32_t insword, insmask; @@ -260,7 +242,7 @@ * Relocate ARM (A32) B */ grub_err_t -reloc_jump24 (grub_uint32_t *addr, Elf32_Addr sym_addr) +grub_arm_reloc_jump24 (grub_uint32_t *addr, Elf32_Addr sym_addr) { grub_uint32_t insword; grub_int32_t offset; @@ -358,9 +340,10 @@ return retval; } break; + case R_ARM_CALL: case R_ARM_JUMP24: { - retval = reloc_jump24 (target, sym_addr); + retval = grub_arm_reloc_jump24 (target, sym_addr); if (retval != GRUB_ERR_NONE) return retval; } @@ -369,7 +352,7 @@ case R_ARM_THM_JUMP24: { /* Thumb instructions can be 16-bit aligned */ - retval = reloc_thm_call ((grub_uint16_t *) target, sym_addr); + retval = grub_arm_reloc_thm_call ((grub_uint16_t *) target, sym_addr); if (retval != GRUB_ERR_NONE) return retval; } @@ -377,7 +360,7 @@ case R_ARM_THM_JUMP19: { /* Thumb instructions can be 16-bit aligned */ - retval = reloc_thm_jump19 ((grub_uint16_t *) target, sym_addr); + retval = grub_arm_reloc_thm_jump19 ((grub_uint16_t *) target, sym_addr); if (retval != GRUB_ERR_NONE) return retval; } === modified file 'grub-core/kern/arm/uboot/startup.S' --- grub-core/kern/arm/uboot/startup.S 2013-04-07 00:41:07 +0000 +++ grub-core/kern/arm/uboot/startup.S 2013-04-09 12:36:48 +0000 @@ -65,20 +65,29 @@ ldr sp, =entry_state push {r4-r12,lr} @ store U-Boot context (sp in r12) - @ Put kernel parameters aside until we can store them (further down) - mov r4, r1 @ machine type - mov r5, r2 @ boot data + ldr r12, =EXT_C(uboot_machine_type) + str r1, [r12] + ldr r12, =EXT_C(uboot_boot_data) + str r2, [r12] + @ Modules have been stored as a blob in BSS, @ they need to be manually relocated to _end or @ (__bss_start + grub_total_module_size), whichever greater. - bl uboot_get_real_bss_start @ r0 = src + ldr r0, =EXT_C(__bss_start) @ src + add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) + mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) + and r0, r0, r1 + ldr r1, =EXT_C(_end) @ dst = End of BSS ldr r2, grub_total_module_size @ blob size add r3, r0, r2 @ blob end cmp r1, r3 @ _end < blob end? movlt r1, r3 @ dst = blob end + blob size - + + ldr r12, =EXT_C(grub_modbase) + str r1, [r12] + 1: ldr r3, [r0], #4 @ r3 = *src++ str r3, [r1], #4 @ *dst++ = r3 subs r2, #4 @ remaining -= 4 @@ -91,35 +100,16 @@ @ Since we _are_ the C run-time, we need to manually zero the BSS @ region before continuing - bl uboot_get_real_bss_start @ zero from here + ldr r0, =EXT_C(__bss_start) @ zero from here ldr r1, =EXT_C(_end) @ to here mov r2, #0 1: str r2, [r0], #4 cmp r0, r1 bne 1b - - @ Global variables now accessible - store kernel parameters in memory - ldr r12, =EXT_C(uboot_machine_type) - str r4, [r12] - ldr r12, =EXT_C(uboot_boot_data) - str r5, [r12] b EXT_C(grub_main) /* - * __bss_start does not actually point to the start of the runtime - * BSS, but rather to the next byte following the preceding data. - */ -FUNCTION (uboot_get_real_bss_start) - ldr r0, =EXT_C(__bss_start) @ src - tst r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) - beq 1f - mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1) - and r0, r0, r1 - add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN) -1: bx lr - - /* * uboot_syscall(): * This function is effectively a veneer, so it cannot * modify the stack or corrupt any registers other than === modified file 'grub-core/kern/dl.c' --- grub-core/kern/dl.c 2013-03-19 19:25:09 +0000 +++ grub-core/kern/dl.c 2013-04-07 16:08:07 +0000 @@ -588,7 +588,7 @@ { grub_dprintf ("modules", "flushing 0x%lx bytes at %p\n", (unsigned long) mod->sz, mod->base); - grub_arch_sync_caches (mod->base, mod->sz); + // grub_arch_sync_caches (mod->base, mod->sz); } /* Load a module from core memory. */ === added directory 'grub-core/kern/i386/uboot' === added file 'grub-core/kern/i386/uboot/startup.S' --- grub-core/kern/i386/uboot/startup.S 1970-01-01 00:00:00 +0000 +++ grub-core/kern/i386/uboot/startup.S 2013-04-08 23:47:50 +0000 @@ -0,0 +1,61 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 1999,2000,2001,2002,2003,2005,2006,2007,2008 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <grub/symbol.h> +/* For stack parameters. */ +#include <grub/i386/pc/memory.h> +#include <grub/machine/memory.h> +#include <grub/offsets.h> + +/* + * Note: GRUB is compiled with the options -mrtd and -mregparm=3. + * So the first three arguments are passed in %eax, %edx, and %ecx, + * respectively, and if a function has a fixed number of arguments + * and the number if greater than three, the function must return + * with "ret $N" where N is ((the number of arguments) - 3) * 4. + */ + + .file "startup.S" + .text + .globl start, _start +start: +_start: + + /* clean out the bss */ + movl $BSS_START_SYMBOL, %edi + + /* compute the bss length */ + movl $END_SYMBOL, %ecx + subl %edi, %ecx + + /* clean out */ + xorl %eax, %eax + cld + rep + stosb + + /* + * Call the start of main body of C code. + */ + call EXT_C(grub_main) + + /* This should never happen. */ + cli +1: + hlt + jmp 1b === modified file 'grub-core/kern/uboot/init.c' --- grub-core/kern/uboot/init.c 2013-04-07 00:41:07 +0000 +++ grub-core/kern/uboot/init.c 2013-04-09 12:23:57 +0000 @@ -35,10 +35,10 @@ extern grub_size_t grub_total_module_size; extern int (*uboot_syscall_ptr) (int, int *, ...); -grub_addr_t grub_modbase; - -grub_uint32_t uboot_machine_type; -grub_addr_t uboot_boot_data; +/* Set to anything other than zero so it lands in .data and not .bss. */ +grub_addr_t grub_modbase = 0x55aa55aa; +grub_uint32_t uboot_machine_type = 0x55aa55aa; +grub_addr_t uboot_boot_data = 0x55aa55aa; static unsigned long timer_start; @@ -69,7 +69,6 @@ void grub_machine_init (void) { - grub_addr_t end, real_bss_start; int ver; /* First of all - establish connection with U-Boot */ @@ -85,26 +84,14 @@ uboot_puts ("invalid U-Boot API version\n"); } - /* - * Modules were relocated to _end, or __bss_start + grub_total_module_size, - * whichever greater. (And __bss_start may not point to actual BSS start...) - */ - real_bss_start = uboot_get_real_bss_start (); - end = real_bss_start + grub_total_module_size; - if (end < (grub_addr_t) _end) - end = (grub_addr_t) _end; - grub_modbase = end; - /* Initialize the console so that GRUB can display messages. */ grub_console_init_early (); /* Enumerate memory and initialize the memory management system. */ grub_uboot_mm_init (); - grub_dprintf ("init", "__bss_start: 0x%08x, real_bss_start: 0x%08x\n", - (grub_addr_t) __bss_start, real_bss_start); - grub_dprintf ("init", "end: 0x%08x, _end: 0x%08x\n", - (grub_addr_t) end, (grub_addr_t) _end); + grub_dprintf ("init", "__bss_start: %p\n", __bss_start); + grub_dprintf ("init", "_end: %p\n", _end); grub_dprintf ("init", "grub_modbase: %p\n", (void *) grub_modbase); grub_dprintf ("init", "grub_modules_get_end(): %p\n", (void *) grub_modules_get_end ()); === modified file 'grub-core/lib/uboot/datetime.c' --- grub-core/lib/uboot/datetime.c 2013-04-07 00:41:07 +0000 +++ grub-core/lib/uboot/datetime.c 2013-04-08 23:31:38 +0000 @@ -25,6 +25,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); /* No simple platform-independent RTC access exists in U-Boot. */ +#ifndef __i386__ grub_err_t grub_get_datetime (struct grub_datetime *datetime __attribute__ ((unused))) @@ -39,3 +40,5 @@ return grub_error (GRUB_ERR_INVALID_COMMAND, "can\'t set datetime using U-Boot"); } + +#endif === modified file 'grub-core/lib/uboot/reboot.c' --- grub-core/lib/uboot/reboot.c 2013-04-07 00:41:07 +0000 +++ grub-core/lib/uboot/reboot.c 2013-04-08 23:32:06 +0000 @@ -20,6 +20,8 @@ #include <grub/misc.h> #include <grub/uboot/uboot.h> +#ifndef __i386__ + void grub_reboot (void) { @@ -28,3 +30,5 @@ uboot_reset (); while (1); } + +#endif === added file 'include/grub/arm/reloc.h' --- include/grub/arm/reloc.h 1970-01-01 00:00:00 +0000 +++ include/grub/arm/reloc.h 2013-04-09 11:38:30 +0000 @@ -0,0 +1,26 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2013 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef GRUB_ARM_RELOC_H +#define GRUB_ARM_RELOC_H 1 + +grub_err_t grub_arm_reloc_jump24 (grub_uint32_t *addr, Elf32_Addr sym_addr); +grub_err_t grub_arm_reloc_thm_call (grub_uint16_t *addr, Elf32_Addr sym_addr); +grub_err_t grub_arm_reloc_thm_jump19 (grub_uint16_t *addr, Elf32_Addr sym_addr); + +#endif === added directory 'include/grub/i386/uboot' === added file 'include/grub/i386/uboot/kernel.h' --- include/grub/i386/uboot/kernel.h 1970-01-01 00:00:00 +0000 +++ include/grub/i386/uboot/kernel.h 2013-04-08 23:34:00 +0000 @@ -0,0 +1,32 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2013 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef GRUB_KERNEL_MACHINE_HEADER +#define GRUB_KERNEL_MACHINE_HEADER 1 + +#ifndef ASM_FILE + +#include <grub/symbol.h> +#include <grub/types.h> + +#endif /* ! ASM_FILE */ + +#define GRUB_KERNEL_MACHINE_STACK_SIZE 0x40000 +#define GRUB_KERNEL_MACHINE_HEAP_SIZE (grub_size_t) (2 * 1024 * 1024) + +#endif /* ! GRUB_KERNEL_MACHINE_HEADER */ === added file 'include/grub/i386/uboot/memory.h' --- include/grub/i386/uboot/memory.h 1970-01-01 00:00:00 +0000 +++ include/grub/i386/uboot/memory.h 2013-04-08 23:33:14 +0000 @@ -0,0 +1,1 @@ +#include <grub/i386/coreboot/memory.h> === added file 'include/grub/i386/uboot/serial.h' --- include/grub/i386/uboot/serial.h 1970-01-01 00:00:00 +0000 +++ include/grub/i386/uboot/serial.h 2013-04-08 23:52:51 +0000 @@ -0,0 +1,1 @@ +#include <grub/i386/coreboot/serial.h> === modified file 'include/grub/libgcc.h' --- include/grub/libgcc.h 2013-04-07 00:41:07 +0000 +++ include/grub/libgcc.h 2013-04-07 16:08:07 +0000 @@ -122,4 +122,5 @@ void EXPORT_FUNC (__aeabi_uidiv) (void); void EXPORT_FUNC (__aeabi_uidivmod) (void); void EXPORT_FUNC (__wrap___clear_cache) (void *, void *); +void EXPORT_FUNC (__aeabi_ulcmp) (void); #endif === modified file 'include/grub/uboot/api_public.h' --- include/grub/uboot/api_public.h 2013-04-07 00:41:07 +0000 +++ include/grub/uboot/api_public.h 2013-04-07 16:08:07 +0000 @@ -61,9 +61,6 @@ typedef int (*scp_t) (int, int *, ...); -typedef grub_uint16_t uint16_t; -typedef grub_uint32_t uint32_t; - #define API_SIG_VERSION 1 #define API_SIG_MAGIC "UBootAPI" #define API_SIG_MAGLEN 8 @@ -71,8 +68,8 @@ struct api_signature { char magic[API_SIG_MAGLEN]; /* magic string */ - uint16_t version; /* API version */ - uint32_t checksum; /* checksum of this sig struct */ + grub_uint16_t version; /* API version */ + grub_uint32_t checksum; /* checksum of this sig struct */ scp_t syscall; /* entry point to the API */ }; === added file 'include/grub/uboot/image.h' --- include/grub/uboot/image.h 1970-01-01 00:00:00 +0000 +++ include/grub/uboot/image.h 2013-04-08 09:20:19 +0000 @@ -0,0 +1,175 @@ +/* + * (C) Copyright 2008 Semihalf + * + * (C) Copyright 2000-2005 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ******************************************************************** + * NOTE: This header file defines an interface to U-Boot. Including + * this (unmodified) header file in another file is considered normal + * use of U-Boot, and does *not* fall under the heading of "derived + * work". + ******************************************************************** + */ + +#ifndef __GRUB_UBOOT_IMAGE_H__ +#define __GRUB_UBOOT_IMAGE_H__ + +/* + * Operating System Codes + */ +#define GRUB_UBOOT_IH_OS_INVALID 0 /* Invalid OS */ +#define GRUB_UBOOT_IH_OS_OPENBSD 1 /* OpenBSD */ +#define GRUB_UBOOT_IH_OS_NETBSD 2 /* NetBSD */ +#define GRUB_UBOOT_IH_OS_FREEBSD 3 /* FreeBSD */ +#define GRUB_UBOOT_IH_OS_4_4BSD 4 /* 4.4BSD */ +#define GRUB_UBOOT_IH_OS_LINUX 5 /* Linux */ +#define GRUB_UBOOT_IH_OS_SVR4 6 /* SVR4 */ +#define GRUB_UBOOT_IH_OS_ESIX 7 /* Esix */ +#define GRUB_UBOOT_IH_OS_SOLARIS 8 /* Solaris */ +#define GRUB_UBOOT_IH_OS_IRIX 9 /* Irix */ +#define GRUB_UBOOT_IH_OS_SCO 10 /* SCO */ +#define GRUB_UBOOT_IH_OS_DELL 11 /* Dell */ +#define GRUB_UBOOT_IH_OS_NCR 12 /* NCR */ +#define GRUB_UBOOT_IH_OS_LYNXOS 13 /* LynxOS */ +#define GRUB_UBOOT_IH_OS_VXWORKS 14 /* VxWorks */ +#define GRUB_UBOOT_IH_OS_PSOS 15 /* pSOS */ +#define GRUB_UBOOT_IH_OS_QNX 16 /* QNX */ +#define GRUB_UBOOT_IH_OS_U_BOOT 17 /* Firmware */ +#define GRUB_UBOOT_IH_OS_RTEMS 18 /* RTEMS */ +#define GRUB_UBOOT_IH_OS_ARTOS 19 /* ARTOS */ +#define GRUB_UBOOT_IH_OS_UNITY 20 /* Unity OS */ +#define GRUB_UBOOT_IH_OS_INTEGRITY 21 /* INTEGRITY */ +#define GRUB_UBOOT_IH_OS_OSE 22 /* OSE */ + +/* + * CPU Architecture Codes (supported by Linux) + */ +#define GRUB_UBOOT_IH_ARCH_INVALID 0 /* Invalid CPU */ +#define GRUB_UBOOT_IH_ARCH_ALPHA 1 /* Alpha */ +#define GRUB_UBOOT_IH_ARCH_ARM 2 /* ARM */ +#define GRUB_UBOOT_IH_ARCH_I386 3 /* Intel x86 */ +#define GRUB_UBOOT_IH_ARCH_IA64 4 /* IA64 */ +#define GRUB_UBOOT_IH_ARCH_MIPS 5 /* MIPS */ +#define GRUB_UBOOT_IH_ARCH_MIPS64 6 /* MIPS 64 Bit */ +#define GRUB_UBOOT_IH_ARCH_PPC 7 /* PowerPC */ +#define GRUB_UBOOT_IH_ARCH_S390 8 /* IBM S390 */ +#define GRUB_UBOOT_IH_ARCH_SH 9 /* SuperH */ +#define GRUB_UBOOT_IH_ARCH_SPARC 10 /* Sparc */ +#define GRUB_UBOOT_IH_ARCH_SPARC64 11 /* Sparc 64 Bit */ +#define GRUB_UBOOT_IH_ARCH_M68K 12 /* M68K */ +#define GRUB_UBOOT_IH_ARCH_MICROBLAZE 14 /* MicroBlaze */ +#define GRUB_UBOOT_IH_ARCH_NIOS2 15 /* Nios-II */ +#define GRUB_UBOOT_IH_ARCH_BLACKFIN 16 /* Blackfin */ +#define GRUB_UBOOT_IH_ARCH_AVR32 17 /* AVR32 */ +#define GRUB_UBOOT_IH_ARCH_ST200 18 /* STMicroelectronics ST200 */ +#define GRUB_UBOOT_IH_ARCH_SANDBOX 19 /* Sandbox architecture (test only) */ +#define GRUB_UBOOT_IH_ARCH_NDS32 20 /* ANDES Technology - NDS32 */ +#define GRUB_UBOOT_IH_ARCH_OPENRISC 21 /* OpenRISC 1000 */ + +/* + * Image Types + * + * "Standalone Programs" are directly runnable in the environment + * provided by U-Boot; it is expected that (if they behave + * well) you can continue to work in U-Boot after return from + * the Standalone Program. + * "OS Kernel Images" are usually images of some Embedded OS which + * will take over control completely. Usually these programs + * will install their own set of exception handlers, device + * drivers, set up the MMU, etc. - this means, that you cannot + * expect to re-enter U-Boot except by resetting the CPU. + * "RAMDisk Images" are more or less just data blocks, and their + * parameters (address, size) are passed to an OS kernel that is + * being started. + * "Multi-File Images" contain several images, typically an OS + * (Linux) kernel image and one or more data images like + * RAMDisks. This construct is useful for instance when you want + * to boot over the network using BOOTP etc., where the boot + * server provides just a single image file, but you want to get + * for instance an OS kernel and a RAMDisk image. + * + * "Multi-File Images" start with a list of image sizes, each + * image size (in bytes) specified by an "uint32_t" in network + * byte order. This list is terminated by an "(uint32_t)0". + * Immediately after the terminating 0 follow the images, one by + * one, all aligned on "uint32_t" boundaries (size rounded up to + * a multiple of 4 bytes - except for the last file). + * + * "Firmware Images" are binary images containing firmware (like + * U-Boot or FPGA images) which usually will be programmed to + * flash memory. + * + * "Script files" are command sequences that will be executed by + * U-Boot's command interpreter; this feature is especially + * useful when you configure U-Boot to use a real shell (hush) + * as command interpreter (=> Shell Scripts). + */ + +#define GRUB_UBOOT_IH_TYPE_INVALID 0 /* Invalid Image */ +#define GRUB_UBOOT_IH_TYPE_STANDALONE 1 /* Standalone Program */ +#define GRUB_UBOOT_IH_TYPE_KERNEL 2 /* OS Kernel Image */ +#define GRUB_UBOOT_IH_TYPE_RAMDISK 3 /* RAMDisk Image */ +#define GRUB_UBOOT_IH_TYPE_MULTI 4 /* Multi-File Image */ +#define GRUB_UBOOT_IH_TYPE_FIRMWARE 5 /* Firmware Image */ +#define GRUB_UBOOT_IH_TYPE_SCRIPT 6 /* Script file */ +#define GRUB_UBOOT_IH_TYPE_FILESYSTEM 7 /* Filesystem Image (any type) */ +#define GRUB_UBOOT_IH_TYPE_FLATDT 8 /* Binary Flat Device Tree Blob */ +#define GRUB_UBOOT_IH_TYPE_KWBIMAGE 9 /* Kirkwood Boot Image */ +#define GRUB_UBOOT_IH_TYPE_IMXIMAGE 10 /* Freescale IMXBoot Image */ +#define GRUB_UBOOT_IH_TYPE_UBLIMAGE 11 /* Davinci UBL Image */ +#define GRUB_UBOOT_IH_TYPE_OMAPIMAGE 12 /* TI OMAP Config Header Image */ +#define GRUB_UBOOT_IH_TYPE_AISIMAGE 13 /* TI Davinci AIS Image */ +#define GRUB_UBOOT_IH_TYPE_KERNEL_NOLOAD 14 /* OS Kernel Image, can run from any load address */ +#define GRUB_UBOOT_IH_TYPE_PBLIMAGE 15 /* Freescale PBL Boot Image */ + +/* + * Compression Types + */ +#define GRUB_UBOOT_IH_COMP_NONE 0 /* No Compression Used */ +#define GRUB_UBOOT_IH_COMP_GZIP 1 /* gzip Compression Used */ +#define GRUB_UBOOT_IH_COMP_BZIP2 2 /* bzip2 Compression Used */ +#define GRUB_UBOOT_IH_COMP_LZMA 3 /* lzma Compression Used */ +#define GRUB_UBOOT_IH_COMP_LZO 4 /* lzo Compression Used */ + +#define GRUB_UBOOT_IH_MAGIC 0x27051956 /* Image Magic Number */ +#define GRUB_UBOOT_IH_NMLEN 32 /* Image Name Length */ + +/* + * Legacy format image header, + * all data in network byte order (aka natural aka bigendian). + */ +struct grub_uboot_image_header { + grub_uint32_t ih_magic; /* Image Header Magic Number */ + grub_uint32_t ih_hcrc; /* Image Header CRC Checksum */ + grub_uint32_t ih_time; /* Image Creation Timestamp */ + grub_uint32_t ih_size; /* Image Data Size */ + grub_uint32_t ih_load; /* Data Load Address */ + grub_uint32_t ih_ep; /* Entry Point Address */ + grub_uint32_t ih_dcrc; /* Image Data CRC Checksum */ + grub_uint8_t ih_os; /* Operating System */ + grub_uint8_t ih_arch; /* CPU architecture */ + grub_uint8_t ih_type; /* Image Type */ + grub_uint8_t ih_comp; /* Compression Type */ + grub_uint8_t ih_name[GRUB_UBOOT_IH_NMLEN]; /* Image Name */ +}; + +#endif /* __IMAGE_H__ */ === modified file 'util/grub-install.in' --- util/grub-install.in 2013-04-07 00:41:07 +0000 +++ util/grub-install.in 2013-04-08 10:42:46 +0000 @@ -833,14 +833,6 @@ -L "$bootloader_id" -l "\\EFI\\$efi_distributor\\$efi_file" fi fi -elif [ x"${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = xarm-uboot ]; then - grub_imgname="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" - raw_imgname="${uboot_imgname}.raw" - mv "$grub_imgname" "$raw_imgname" - mkimage -T kernel -A ARM -O Linux -a 0x08000000 -e 0x08000000 -C none -d "$raw_imgname" "$grub_imgname" - if [ $? -eq 0 ]; then - rm -f "$raw_imgname" - fi else gettext "WARNING: no platform-specific install was performed" 1>&2 echo 1>&2 === modified file 'util/grub-mkimage.c' --- util/grub-mkimage.c 2013-04-07 00:41:07 +0000 +++ util/grub-mkimage.c 2013-04-09 11:45:10 +0000 @@ -40,6 +40,8 @@ #include <stdlib.h> #include <assert.h> #include <grub/efi/pe32.h> +#include <grub/uboot/image.h> +#include <grub/arm/reloc.h> #define _GNU_SOURCE 1 #include <argp.h> @@ -1499,6 +1501,42 @@ core_size = rom_size; } break; + + case IMAGE_UBOOT: + { + struct grub_uboot_image_header *hdr; + GRUB_PROPERLY_ALIGNED_ARRAY (crc32_context, GRUB_MD_CRC32->contextsize); + + hdr = xmalloc (core_size + sizeof (struct grub_uboot_image_header)); + memcpy (hdr + 1, core_img, core_size); + + memset (hdr, 0, sizeof (*hdr)); + hdr->ih_magic = grub_cpu_to_be32_compile_time (GRUB_UBOOT_IH_MAGIC); + hdr->ih_time = grub_cpu_to_be32 (time (0)); + hdr->ih_size = grub_cpu_to_be32 (core_size); + hdr->ih_load = grub_cpu_to_be32 (image_target->link_addr); + hdr->ih_ep = grub_cpu_to_be32 (image_target->link_addr); + hdr->ih_os = GRUB_UBOOT_IH_OS_LINUX; + hdr->ih_arch = GRUB_UBOOT_IH_ARCH_ARM; + hdr->ih_type = GRUB_UBOOT_IH_TYPE_KERNEL; + hdr->ih_comp = GRUB_UBOOT_IH_COMP_NONE; + + GRUB_MD_CRC32->init(crc32_context); + GRUB_MD_CRC32->write(crc32_context, hdr + 1, core_size); + GRUB_MD_CRC32->final(crc32_context); + hdr->ih_dcrc = grub_get_unaligned32 (GRUB_MD_CRC32->read (crc32_context)); + + GRUB_MD_CRC32->init(crc32_context); + GRUB_MD_CRC32->write(crc32_context, hdr, sizeof (*hdr)); + GRUB_MD_CRC32->final(crc32_context); + hdr->ih_hcrc = grub_get_unaligned32 (GRUB_MD_CRC32->read (crc32_context)); + + free (core_img); + core_img = (char *) hdr; + core_size += sizeof (struct grub_uboot_image_header); + } + break; + case IMAGE_MIPS_ARC: { char *ecoff_img; @@ -1725,9 +1763,6 @@ core_size = program_size + header_size + footer_size; } break; - case IMAGE_UBOOT: - /* Raw image, header added by grub-install */ - break; } grub_util_write_image (core_img, core_size, out, outname); === modified file 'util/grub-mkimagexx.c' --- util/grub-mkimagexx.c 2013-04-07 00:41:07 +0000 +++ util/grub-mkimagexx.c 2013-04-09 12:21:25 +0000 @@ -60,9 +60,6 @@ static Elf_Addr SUFFIX (entry_point); -grub_err_t reloc_thm_call (grub_uint16_t *addr, Elf32_Addr sym_addr); -grub_err_t reloc_thm_jump19 (grub_uint16_t *addr, Elf32_Addr sym_addr); - /* Relocate symbols; note that this function overwrites the symbol table. Return the address of a start symbol. */ static Elf_Addr @@ -553,19 +550,27 @@ case R_ARM_THM_CALL: case R_ARM_THM_JUMP24: { - grub_util_info (" THM_JUMP24:\ttarget=0x%08x\toffset=(0x%08x)", (unsigned int) target, sym_addr); + grub_err_t err; + grub_util_info (" THM_JUMP24:\ttarget=0x%08lx\toffset=(0x%08x)", (unsigned long) target, sym_addr); sym_addr -= offset; /* Thumb instructions can be 16-bit aligned */ - reloc_thm_call ((grub_uint16_t *) target, sym_addr); + err = grub_arm_reloc_thm_call ((grub_uint16_t *) target, + sym_addr); + if (err) + grub_util_error ("%s", grub_errmsg); } break; case R_ARM_THM_JUMP19: { + grub_err_t err; grub_util_info (" THM_JUMP19:\toffset=%d\t(0x%08x)", sym_addr, sym_addr); sym_addr -= offset; /* Thumb instructions can be 16-bit aligned */ - reloc_thm_jump19 ((grub_uint16_t *) target, sym_addr); + err = grub_arm_reloc_thm_jump19 ((grub_uint16_t *) target, + sym_addr); + if (err) + grub_util_error ("%s", grub_errmsg); } break; default: [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 294 bytes --] ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2013-04-09 17:27 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-03-24 17:01 [PATCH 4/7] Support for ARM/U-Boot platforms Leif Lindholm 2013-04-01 2:15 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-01 9:53 ` Francesco Lavra 2013-04-01 11:24 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-01 14:29 ` Francesco Lavra 2013-04-03 10:29 ` Leif Lindholm 2013-04-03 16:32 ` Leif Lindholm 2013-04-08 10:47 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-09 10:26 ` Leif Lindholm 2013-04-09 17:26 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-09 0:15 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-09 11:39 ` Leif Lindholm 2013-04-09 11:55 ` Vladimir 'φ-coder/phcoder' Serbinenko 2013-04-09 12:45 ` Vladimir 'φ-coder/phcoder' Serbinenko
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.