From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Subject: Re: [PATCH 4/7] Support for ARM/U-Boot platforms
Date: Tue, 09 Apr 2013 02:15:20 +0200 [thread overview]
Message-ID: <51635D98.7020901@gmail.com> (raw)
In-Reply-To: <CAF7UmSwm_MMp7Kw4+ozEt4TNQRNTydBFoG_FSA2GuK5ZMSjF2A@mail.gmail.com>
[-- 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 --]
next prev parent reply other threads:[~2013-04-09 0:15 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51635D98.7020901@gmail.com \
--to=phcoder@gmail.com \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.