[coreboot] Mohon Peak, Memtest86+ does not start
Kuzmichev Viktor
kuzmichevviktorv at gmail.com
Mon Feb 2 11:33:48 CET 2015
Hello,
So, I've checked the memtest source files recently. And I guess, I was
wrong when I thought that SeaBIOS should control serial IO. There is
code in memtest (file named lib.c) that should handle serial input
itself. I've added a debug message in the check_input() function and it
seems like memtest just does not receive any input. Any suggestions?
Viktor
On 28.01.2015 06:23, Martin Roth wrote:
> Hi Viktor,
> I mentioned on the mailing list that Sage has done a read/write
> implementation for SeaBIOS. You can find a copy of that SeaBIOS code
> in the Gizmo BSP on this page:
> http://www.gizmosphere.org/gizmoboard-support/resources/
>
> Download the Gizmo BSP, extract it, and go to the
> Gizmo_Reference/coreboot/payloads/seabios directory and run make
> menuconfig. Enable 'Enable serial console to receive keystrokes'.
>
> This SeaBIOS tree is pretty out of date, but that's the feature you're
> looking for.
>
> Hope this helps.
> Martin
>
> On 01/27/2015 05:59 AM, Kuzmichev Viktor wrote:
>> Thank you very much, this helped a lot! Now memtest is loading and it
>> successfully performs RAM tests.
>> But there is another issue. Somehow, input via serial console does
>> not work. And it seems like the problem is not in memtest, rather
>> it's in SeaBIOS or coreboot. There is no any prompt for input in
>> coreboot. But there is in SeaBIOS, and I was not able to enter boot
>> menu since it did not respond to F12. Although, SeaBIOS responds to
>> the keyboard that is directly connected to the board while memtest
>> does not seem to respond at all (at least, I tried to hit Esc which
>> should reboot the board).
>> I've tried to search for this but so far found nothing.
>> Will appreciate any help.
>>
>> Viktor
>>
>> On 23.01.2015 18:47, Aaron Durbin wrote:
>>> On Fri, Jan 23, 2015 at 1:45 AM, Kuzmichev Viktor
>>> <kuzmichevviktorv at gmail.com> wrote:
>>>> Hello Stefan,
>>>>
>>>> Thank you for the tip, I'm currently looking into that. But I'm
>>>> still not
>>>> sure how to specify the load address. My guess is that I should
>>>> edit the
>>>> linking script properly to do it. By default it looks as follows
>>>> (memtest.lds):
>>>>
>>>> OUTPUT_FORMAT("elf32-i386");
>>>> OUTPUT_ARCH(i386);
>>>>
>>>> ENTRY(_start);
>>>> SECTIONS {
>>>> . = 0x10000;
>>>> _start = . ;
>>>> .data : {
>>>> *(.data)
>>>> }
>>>> }
>>>>
>>>> And here is the output of 'readelf -a memtest' command:
>>>>
>>>> ELF Header:
>>>> Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
>>>> Class: ELF32
>>>> Data: 2's complement, little endian
>>>> Version: 1 (current)
>>>> OS/ABI: UNIX - System V
>>>> ABI Version: 0
>>>> Type: EXEC (Executable file)
>>>> Machine: Intel 80386
>>>> Version: 0x1
>>>> Entry point address: 0x10000
>>>> Start of program headers: 52 (bytes into file)
>>>> Start of section headers: 239496 (bytes into file)
>>>> Flags: 0x0
>>>> Size of this header: 52 (bytes)
>>>> Size of program headers: 32 (bytes)
>>>> Number of program headers: 1
>>>> Size of section headers: 40 (bytes)
>>>> Number of section headers: 3
>>>> Section header string table index: 2
>>>>
>>>> Section Headers:
>>>> [Nr] Name Type Addr Off Size ES
>>>> Flg Lk
>>>> Inf Al
>>>> [ 0] NULL 00000000 000000 000000
>>>> 00 0
>>>> 0 0
>>>> [ 1] .data PROGBITS 00010000 010000 02a774 00
>>>> WA 0 0
>>>> 1
>>>> [ 2] .shstrtab STRTAB 00000000 03a774 000011
>>>> 00 0
>>>> 0 1
>>>> Key to Flags:
>>>> W (write), A (alloc), X (execute), M (merge), S (strings)
>>>> I (info), L (link order), G (group), T (TLS), E (exclude), x
>>>> (unknown)
>>>> O (extra OS processing required) o (OS specific), p (processor
>>>> specific)
>>>>
>>>> There are no section groups in this file.
>>>>
>>>> Program Headers:
>>>> Type Offset VirtAddr PhysAddr FileSiz MemSiz
>>>> Flg Align
>>>> LOAD 0x000000 0x00000000 0x00000000 0x3a774 0x3a774 RW
>>>> 0x200000
>>>>
>>>> Section to Segment mapping:
>>>> Segment Sections...
>>>> 00 .data
>>>>
>>>> There is no dynamic section in this file.
>>>>
>>>> There are no relocations in this file.
>>>>
>>>> The decoding of unwind sections for machine type Intel 80386 is not
>>>> currently supported.
>>>>
>>>> No version information found in this file.
>>>>
>>>> So, the entry point is at the offset of 0x10000. But I think I should
>>>> somehow change the 'VirtAddr'. I've tried to edit the script in
>>>> different
>>>> ways, for example, I've tried to add MEMORY command and then allocate
>>>> certain sections to the regions as explained here:
>>>> https://sourceware.org/binutils/docs/ld/REGION_005fALIAS.html#REGION_005fALIAS
>>>>
>>>> but haven't come to any success yet.
>>>>
>>>> Are there any advices you could give me? Am I even looking in the
>>>> right
>>>> direction?
>>> Ya. You are on the right path. I just confirmed your findings locally.
>>> What you'd like to see is VirtAddr/PhysAddr = 0x10000 as well as
>>> offset to be 0x10000 because that would match with .data section. Also
>>> notice that MemSiz is 0x10000 greater than the Size of the .data
>>> section. So when this payload is loading all memory from 0x00000 to
>>> 0x10000 is filled with zeros before the start of the program at
>>> 0x10000.
>>>
>>> I poked around in trying to relink in different ways but it kept
>>> loading at 0. You could hexedit the memtest elf file. Apparently there
>>> is an 'ht editor' program. However, I couldn't for the life of me
>>> figure it out, but I was able to make it coredump trying to figure out
>>> how to navigate it. :/
>>>
>>> But I just found this page:
>>> http://dwarfdump.blogspot.com/2009/08/executable-file-editor-elf-editor.html
>>>
>>>
>>> $ hte memtest
>>>
>>> <hit space>
>>>
>>> Goto 'elf/program headers'. Hit <enter>
>>>
>>> Expand 'entry 0' with <enter>
>>> Goto 'offset'
>>> Hit <F4>.
>>> Make 'offset', 'virtual address', 'physical address' all to 00010000
>>> Make 'in file size' and 'in memory size' 00027008.
>>>
>>> Hit <F2> to save.
>>> Hit <F10> to quit.
>>>
>>> Those values were based on the memtest I compiled:
>>> $ readelf -e memtest
>>> ELF Header:
>>> Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
>>> Class: ELF32
>>> Data: 2's complement, little endian
>>> Version: 1 (current)
>>> OS/ABI: UNIX - System V
>>> ABI Version: 0
>>> Type: EXEC (Executable file)
>>> Machine: Intel 80386
>>> Version: 0x1
>>> Entry point address: 0x10000
>>> Start of program headers: 52 (bytes into file)
>>> Start of section headers: 225308 (bytes into file)
>>> Flags: 0x0
>>> Size of this header: 52 (bytes)
>>> Size of program headers: 32 (bytes)
>>> Number of program headers: 1
>>> Size of section headers: 40 (bytes)
>>> Number of section headers: 3
>>> Section header string table index: 2
>>>
>>> Section Headers:
>>> [Nr] Name Type Addr Off Size ES
>>> Flg Lk Inf Al
>>> [ 0] NULL 00000000 000000 000000
>>> 00 0 0 0
>>> [ 1] .data PROGBITS 00010000 010000 027008 00
>>> WA 0 0 1
>>> [ 2] .shstrtab STRTAB 00000000 037008 000011
>>> 00 0 0 1
>>> Key to Flags:
>>> W (write), A (alloc), X (execute), M (merge), S (strings)
>>> I (info), L (link order), G (group), T (TLS), E (exclude), x
>>> (unknown)
>>> O (extra OS processing required) o (OS specific), p (processor
>>> specific)
>>>
>>> Program Headers:
>>> Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg
>>> Align
>>> LOAD 0x000000 0x00000000 0x00000000 0x37008 0x37008 RW
>>> 0x200000
>>>
>>> Section to Segment mapping:
>>> Segment Sections...
>>> 00 .data
>>>
>>>
>>> After the instructions above I get the following:
>>>
>>> $ readelf -e memtest
>>> ELF Header:
>>> Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
>>> Class: ELF32
>>> Data: 2's complement, little endian
>>> Version: 1 (current)
>>> OS/ABI: UNIX - System V
>>> ABI Version: 0
>>> Type: EXEC (Executable file)
>>> Machine: Intel 80386
>>> Version: 0x1
>>> Entry point address: 0x10000
>>> Start of program headers: 52 (bytes into file)
>>> Start of section headers: 225308 (bytes into file)
>>> Flags: 0x0
>>> Size of this header: 52 (bytes)
>>> Size of program headers: 32 (bytes)
>>> Number of program headers: 1
>>> Size of section headers: 40 (bytes)
>>> Number of section headers: 3
>>> Section header string table index: 2
>>>
>>> Section Headers:
>>> [Nr] Name Type Addr Off Size ES
>>> Flg Lk Inf Al
>>> [ 0] NULL 00000000 000000 000000
>>> 00 0 0 0
>>> [ 1] .data PROGBITS 00010000 010000 027008 00
>>> WA 0 0 1
>>> [ 2] .shstrtab STRTAB 00000000 037008 000011
>>> 00 0 0 1
>>> Key to Flags:
>>> W (write), A (alloc), X (execute), M (merge), S (strings)
>>> I (info), L (link order), G (group), T (TLS), E (exclude), x
>>> (unknown)
>>> O (extra OS processing required) o (OS specific), p (processor
>>> specific)
>>>
>>> Program Headers:
>>> Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg
>>> Align
>>> LOAD 0x010000 0x00010000 0x00010000 0x27008 0x27008 RW
>>> 0x200000
>>>
>>> Section to Segment mapping:
>>> Segment Sections...
>>> 00 .data
>>>
>>>
>>> Notice now that we're only loading the .data section at 0x10000. I
>>> hope that helps.
>>>
>>>> Thanks in advance,
>>>> Viktor
>>>>
>>>>
>>>> On 20.01.2015 22:33, Stefan Reinauer wrote:
>>>>> * Kuzmichev Viktor <kuzmichevviktorv at gmail.com> [150120 14:31]:
>>>>>> Hello,
>>>>>>
>>>>>> I'm trying to load Memtest86+ on the Mohon Peak reference board from
>>>>>> CBFS and it fails.
>>>>>> My primary payload is SeaBIOS. Memtest is added using cbfstool, so
>>>>>> the layout of my ROM file is as follows:
>>>>>>
>>>>>> $ ./build/cbfstool build/coreboot.rom print
>>>>>> coreboot.rom: 8192 kB, bootblocksize 1024, romsize 8388608, offset
>>>>>> 0x600000
>>>>>> alignment: 64 bytes, architecture: x86
>>>>>>
>>>>>> Name Offset Type Size
>>>>>> cmos_layout.bin 0x600000 cmos_layout 1352
>>>>>> fallback/romstage 0x600580 stage 26616
>>>>>> fallback/ramstage 0x606dc0 stage 60446
>>>>>> fallback/payload 0x615a40 payload 55799
>>>>>> config 0x623480 raw 4323
>>>>>> revision 0x6245c0 raw 714
>>>>>> img/Memtest86+ 0x6248c0 payload 225028
>>>>>> (empty) 0x65b800 null 1001368
>>>>>> mrc.cache 0x74ffc0 (unknown) 65536
>>>>>> cpu_microcode_blob.bin 0x760000 microcode 83968
>>>>>> (empty) 0x774840 null 46936
>>>>>> fsp.bin 0x77ffc0 (unknown) 372736
>>>>>> (empty) 0x7db000 null 150424
>>>>>>
>>>>>> I've tried versions 4.20 and 5.01. Memtest86+ v4.20 just hangs, here
>>>>>> is output of SeaBIOS trying to load it:
>>>>>> Trying CBFS
>>>>>> Booting from CBFS...
>>>>>> Run img/Memtest86+
>>>>>> Segment 41544144 194420 at 0xffe24920 -> 194420 at 0x00000000
>>>>>> No compression
>>>>>>
>>>>>> And then nothing. Memtest86+ v5.01 goes a bit further, SeaBIOS finds
>>>>>> its entry point:
>>>>>> Trying CBFS
>>>>>> Booting from CBFS...
>>>>>> Run img/Memtest86+
>>>>>> Segment 41544144 224972 at 0xffe24920 -> 224972 at 0x00000000
>>>>>> No compression
>>>>>> Calling addr 0x00010000
>>>>> It looks like in both cases memtest86+ is loaded at address
>>>>> 0x00000000
>>>>> which will overwrite a bunch of memory, including the coreboot
>>>>> tables.
>>>>> Looks like the memtest86+ elf binary needs to specify a load address.
>>>>>
>>>>> Stefan
>>>>>
>>>>
>>>> --
>>>> coreboot mailing list: coreboot at coreboot.org
>>>> http://www.coreboot.org/mailman/listinfo/coreboot
>>
>>
>
More information about the coreboot
mailing list