[U-Boot] [PATCH 0/4] Add support for the 32 bit boot protocol to the x86 zboot command.

Graeme Russ graeme.russ at gmail.com
Wed Nov 30 21:19:47 CET 2011


Hi Gabe,

On Thursday, December 1, 2011, Gabe Black <gabeblack at google.com> wrote:
>
>
> On Wed, Nov 30, 2011 at 4:13 AM, Graeme Russ <graeme.russ at gmail.com>
wrote:
>>
>> Hi Gabe,
>>
>> On 30/11/11 20:17, Gabe Black wrote:
>> > These four patches add support for the 32 bit Linux boot protocol to
the
>> > zboot command. They also add support for an initrd.
>> >
>> >
>> > Gabe Black (4):
>> >   x86: Clean up the x86 zimage code in preparation to extend it
>> >   x86: Add support for booting Linux using the 32 bit boot protocol
>> >   x86: Refactor the zboot innards so they can be reused with a vboot
>> >     image
>> >   x86: Add support for specifying an initrd with the zboot command
>> >
>> >  arch/x86/include/asm/zimage.h |   31 +----
>> >  arch/x86/lib/bootm.c          |   21 +++-
>> >  arch/x86/lib/zimage.c         |  257
++++++++++++++++++++++++++---------------
>> >  3 files changed, 183 insertions(+), 126 deletions(-)
>>
>> Well I managed to bolt it all together (you have other changes to
>> arch/x86/include/asm/zimage.h so one of the patches had to be applied
manually)
>>
>> But I cannot get the e820 map setup right for Linux - I tried to create a
>> single 2GB entry (I have no reserved memory, it's all free for Linux to
do
>> what it wishes) with:
>>
>> unsigned install_e820_map(unsigned max_entries, struct e820entry
*entries)
>> {
>>        entries[0].addr = 0x00000000;
>>        entries[0].size = 0x80000000;
>>        entries[0].type = E820_RAM;
>>
>>        return 1;
>> }
>>
>> But Linux throws back:
>> [    0.000000] Initializing cgroup subsys cpu
>> [    0.000000] Linux version 3.1.0 (graeme at helios) (gcc version 4.5.2
>> (Ubuntu/Linaro 4.5.2-8ubuntu4) ) #4 Sun Nov 20 20:38:20 EST 2011
>> [    0.000000] KERNEL supported cpus:
>> [    0.000000]   Intel GenuineIntel
>> [    0.000000] Disabled fast string operations
>> [    0.000000] BIOS-provided physical RAM map:
>> [    0.000000]  BIOS-e801: 0000000000000000 - 000000000009f000 (usable)
>> [    0.000000]  BIOS-e801: 0000000000100000 - 0000000000100000 (usable)
>> [    0.000000] bootconsole [earlyser0] enabled
>> [    0.000000] Notice: NX (Execute Disable) protection cannot be enabled:
>> non-PAE kernel!
>> [    0.000000] DMI not present or invalid.
>> [    0.000000] e820 update range: 0000000000000000 - 0000000000010000
>> (usable) ==> (reserved)
>> [    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000
(usable)
>> [    0.000000] last_pfn = 0x9f max_arch_pfn = 0x100000
>> [    0.000000] MTRR default type: uncachable
>> [    0.000000] MTRR fixed ranges enabled:
>> [    0.000000]   00000-FFFFF uncachable
>> [    0.000000] MTRR variable ranges enabled:
>> [    0.000000]   0 base 000000000 mask 0C0000000 write-back
>> [    0.000000]   1 base 0FFFB0000 mask 0FFFF0000 write-protect
>> [    0.000000]   2 disabled
>> [    0.000000]   3 disabled
>> [    0.000000]   4 disabled
>> [    0.000000]   5 disabled
>> [    0.000000]   6 disabled
>> [    0.000000]   7 disabled
>> [    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new
0x7010600070106
>> [    0.000000] initial memory mapped : 0 - 01800000
>> [    0.000000] Base memory trampoline at [c009e000] 9e000 size 4096
>> [    0.000000] init_memory_mapping: 0000000000000000-000000000009f000
>> [    0.000000]  0000000000 - 000009f000 page 4k
>> [    0.000000] kernel direct mapping tables up to 9f000 @ 99000-9e000
>> [    0.000000] 0MB HIGHMEM available.
>> [    0.000000] 0MB LOWMEM available.
>> [    0.000000]   mapped low ram: 0 - 0009f000
>> [    0.000000]   low ram: 0 - 0009f000
>>
>> Any ideas?
>>
>> Regards,
>>
>> Graeme
>>
>>
>
>
> If you use the old 16 bit boot protocol Linux will attempt to figure out
the memory size using calls into the BIOS itself and ignore e820 (or
attempt to call it itself?). One of those BIOS calls is e801 which, if I
remember correctly, is handled by u-boot and returns the total size of
memory which is stored in the global data structure. If you're using the 32
bit protocol, it skips all the BIOS stuff and uses the e820 map passed in
the zero page structure.

But I'm using your 32-bit entry point...

Regards,

Graeme


More information about the U-Boot mailing list