[coreboot] [PATCH] The filo crashes if the filo and corebootoverlap.
Bao, Zheng
Zheng.Bao at amd.com
Thu Nov 5 11:04:22 CET 2009
r4912.
Delete some trailing whitespace.
-----Original Message-----
From: Stefan Reinauer [mailto:stepan at coresystems.de]
Sent: Thursday, November 05, 2009 5:15 PM
To: Bao, Zheng
Cc: coreboot at coreboot.org
Subject: Re: [coreboot] [PATCH] The filo crashes if the filo and corebootoverlap.
Bao, Zheng wrote:
> Ping, before we forget.
> Can anyone ack or nack this?
>
> Zheng
>
>
> -----Original Message-----
> From: coreboot-bounces at coreboot.org
> [mailto:coreboot-bounces at coreboot.org] On Behalf Of Bao, Zheng
> Sent: Tuesday, November 03, 2009 11:23 AM
> To: coreboot at coreboot.org
> Subject: Re: [coreboot] [PATCH] The filo crashes if the filo and
> corebootoverlap.
>
> If the coreboot and filo overlap, it will "slice off" a piece at the
> beginning or end. In the beginning case, a new segment is inserted
> before the current one. The ptr will move forward and doesn't seem to
> have any chance to process the "new" segment.
>
> ptr ---------+ move --->
> |
> V
> +--------+ +--------+
> | | | |
> | new | <---> |current | <---> .....
> | | | |
> +--------+ +--------+
>
> Now we change the ptr to the previous one and restart the loop. The
> new and current segment will both be processed.
>
> +----------------ptr move --->
> |
> V
> +--------+ +--------+ +--------+
> | | | | | |
> | prev | <---> | new | <---> |current | <---> .....
> | | | | | |
> +--------+ +--------+ +--------+
>
> It is tested on my Family 10 board.
>
>
Very nice explanation... :-)
Acked-by: Stefan Reinauer <stepan at coresystems.de>
> Zheng
>
> Signed-off-by: Zheng Bao <zheng.bao at amd.com>
>
>
> Index: src/boot/selfboot.c
> ===================================================================
> --- src/boot/selfboot.c (revision 4892)
> +++ src/boot/selfboot.c (working copy)
> @@ -211,19 +211,21 @@
> return !((end <= lb_start) || (start >= lb_end));
> }
>
> -static void relocate_segment(unsigned long buffer, struct segment *seg)
> +static int relocate_segment(unsigned long buffer, struct segment *seg)
> {
> /* Modify all segments that want to load onto coreboot
> * to load onto the bounce buffer instead.
> */
> - unsigned long start, middle, end;
> + /* ret: 1 : A new segment is inserted before the seg.
> + * 0 : A new segment is inserted after the seg, or no new
> one. */
> + unsigned long start, middle, end, ret = 0;
>
> printk_spew("lb: [0x%016lx, 0x%016lx)\n",
> lb_start, lb_end);
>
> /* I don't conflict with coreboot so get out of here */
> if (!overlaps_coreboot(seg))
> - return;
> + return 0;
>
> start = seg->s_dstaddr;
> middle = start + seg->s_filesz;
> @@ -270,6 +272,8 @@
> new->s_dstaddr,
> new->s_dstaddr + new->s_filesz,
> new->s_dstaddr + new->s_memsz);
> +
> + ret = 1;
> }
>
> /* Slice off a piece at the end
> @@ -319,6 +323,8 @@
> seg->s_dstaddr,
> seg->s_dstaddr + seg->s_filesz,
> seg->s_dstaddr + seg->s_memsz);
> +
> + return ret;
> }
>
>
> @@ -446,7 +452,10 @@
>
> /* Modify the segment to load onto the bounce_buffer if
> necessary.
> */
> - relocate_segment(bounce_buffer, ptr);
> + if (relocate_segment(bounce_buffer, ptr)) {
> + ptr = (ptr->prev)->prev;
> + continue;
> + }
>
> printk_debug("Post relocation: addr: 0x%016lx memsz:
> 0x%016lx filesz: 0x%016lx\n",
> ptr->s_dstaddr, ptr->s_memsz, ptr->s_filesz);
>
> -----Original Message-----
> From: coreboot-bounces at coreboot.org
> [mailto:coreboot-bounces at coreboot.org] On Behalf Of Bao, Zheng
> Sent: Monday, November 02, 2009 11:25 AM
> To: Patrick Georgi
> Cc: coreboot at coreboot.org
> Subject: Re: [coreboot] The filo crashes if the filo and coreboot
> overlap.
>
> In relocate_segment().
> If the coreboot and filo overlap, it will "slice off" a piece at the
> beginning or end. A new segment is allocated. If it is inserted before
> the "seg" that is being processed, is there any chance that the "new"
> segment will be processed? I am confused about it. On my fam 10 board,
> it seems that the "new" segment was not processed and an error happens
> when the code jumps to filo which is actually middle of nowhere.
>
>
> Zheng
>
> -----Original Message-----
> From: coreboot-bounces+zheng.bao=amd.com at coreboot.org
> [mailto:coreboot-bounces+zheng.bao=amd.com at coreboot.org] On Behalf Of
> Patrick Georgi
> Sent: Sunday, November 01, 2009 12:13 AM
> To: Zheng Bao
> Cc: coreboot at coreboot.org
> Subject: Re: [coreboot] The filo crashes if the filo and coreboot
> overlap.
>
> Am Samstag, den 31.10.2009, 15:43 +0000 schrieb Zheng Bao:
>
>> The filo crashes if the filo and coreboot overlap.
>> Since the CBFS is the must-have feature, my family 10
>> board crashes when it jumps to filo. I am trying to
>> find out why. I need help.
>> Based on current code, the AMD Family 10 will cause the filo
>> and coreboot overlap in RAM. The overlaps_coreboot() in selfboot.c
>> will return 1. But I am not sure if it will make the system
>> crashes.
>>
> What revision is that? There was an issue like that but I fixed it
> several weeks ago.
>
>
>> If anybody explains briefly what happens if they
>> overlap.
>>
> When coreboot and payload overlap, coreboot uses a bounce buffer. The
> bounce buffer is twice the size of coreboot. The first half is for the
> part of the payload that overlaps coreboot, the other half is for
> coreboot itself.
>
> The SELF loader loads data that would overlap coreboot to the bounce
> buffer, and jumps into jmp_to_elf_entry when it's done with loading.
> The jmp_to_elf_entry function copies coreboot to the upper half of the
> bounce buffer, and jumps in there, so the code is out of the way.
>
> Then it copies the lower half to the coreboot area and jumps to the
> entry point.
>
> There are some complications to that because of the decompression
> routine, so the code is not as nice as it should be. But I specifically
> tested your scenario (payload from 1mb to 2.3mb or so, coreboot starting
> at 2mb)
>
>
>> The coreboot information:
>> CONFIG_RAMBASE=0x00200000
>>
> Try changing that to 0x100000.
>
>
> Patrick
>
>
>
--
coresystems GmbH * Brahmsstr. 16 * D-79104 Freiburg i. Br.
Tel.: +49 761 7668825 * Fax: +49 761 7664613
Email: info at coresystems.de * http://www.coresystems.de/
Registergericht: Amtsgericht Freiburg * HRB 7656
Geschäftsführer: Stefan Reinauer * Ust-IdNr.: DE245674866
More information about the coreboot
mailing list