[coreboot] Patch set updated for coreboot: ba5be28 cb_parse_header() should not assume table in 4K of contiguous memory

Philip Prindeville philipp_subx at redfish-solutions.com
Fri Jan 6 20:12:17 CET 2012


Ok, didn't know that was still in my "git commit" list waiting for a "git push"...

Should have checked.

On 1/6/12 11:53 AM, Philip Prindeville (pprindeville at gmail.com) wrote:
> Philip Prindeville (pprindeville at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/501
> 
> -gerrit
> 
> commit ba5be2861e5adcc3cb990cc219e4207947beefde
> Author: Philip Prindeville <philipp at redfish-solutions.com>
> Date:   Fri Dec 23 18:09:25 2011 -0700
> 
>     cb_parse_header() should not assume table in 4K of contiguous memory
>     
>     If we have the CB table in E820 memory, we might not have an entire 4K
>     (0x1000) bytes of memory to scan through. Instead, a better strategy
>     is to pass in a pointer to the end of the region or the start + 4K
>     (which ever is lower). This change prepares the cb_parse_header()
>     calling convention for that change.
>     
>     Change-Id: I9257726c6a7065b5596d4c32ab451edd0a3cdc10
>     Signed-off-by: Philip Prindeville <philipp at redfish-solutions.com>
> ---
>  payloads/libpayload/arch/i386/coreboot.c |   22 ++++++++++++++--------
>  1 files changed, 14 insertions(+), 8 deletions(-)
> 
> diff --git a/payloads/libpayload/arch/i386/coreboot.c b/payloads/libpayload/arch/i386/coreboot.c
> index 709f8ae..135c59c 100644
> --- a/payloads/libpayload/arch/i386/coreboot.c
> +++ b/payloads/libpayload/arch/i386/coreboot.c
> @@ -109,21 +109,21 @@ static void cb_parse_framebuffer(void *ptr, struct sysinfo_t *info)
>  }
>  #endif
>  
> -static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
> +static int cb_parse_header(void *addr, void *end, struct sysinfo_t *info)
>  {
>  	struct cb_header *header;
> -	unsigned char *ptr = addr;
> +	unsigned char *ptr;
>  	void *forward;
>  	int i;
>  
> -	for (i = 0; i < len; i += 16, ptr += 16) {
> +	for (ptr = addr; (void *)ptr < end; ptr += 16) {
>  		header = (struct cb_header *)ptr;
>  		if (!strncmp((const char *)header->signature, "LBIO", 4))
>  			break;
>  	}
>  
>  	/* We walked the entire space and didn't find anything. */
> -	if (i >= len)
> +	if ((void *)ptr >= end)
>  		return -1;
>  
>  	if (!header->table_bytes)
> @@ -147,7 +147,7 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
>  		switch (rec->tag) {
>  		case CB_TAG_FORWARD:
>  			forward = phys_to_virt((void *)(unsigned long)((struct cb_forward *)rec)->forward);
> -			return cb_parse_header(forward, len, info);
> +			return cb_parse_header(forward, forward + 0x1000, info);
>  			continue;
>  		case CB_TAG_MEMORY:
>  			cb_parse_memory(ptr, info);
> @@ -176,6 +176,9 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
>  		}
>  
>  		ptr += rec->size;
> +
> +		if ((void *)ptr >= end)
> +			return -1;
>  	}
>  
>  	return 1;
> @@ -186,10 +189,13 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
>  
>  int get_coreboot_info(struct sysinfo_t *info)
>  {
> -	int ret = cb_parse_header(phys_to_virt(0x00000000), 0x1000, info);
> +	void *base = phys_to_virt(0x00000000);
> +	int ret = cb_parse_header(base, base + 0x1000, info);
>  
> -	if (ret != 1)
> -		ret = cb_parse_header(phys_to_virt(0x000f0000), 0x1000, info);
> +	if (ret != 1) {
> +		base = phys_to_virt(0x000f0000);
> +		ret = cb_parse_header(base, base + 0x1000, info);
> +	}
>  
>  	return (ret == 1) ? 0 : -1;
>  }
> 





More information about the coreboot mailing list