[PATCH 2/3] bios: mtrr: fix cache type corner case at end of mtrr range

Colin Ian King colin.king at canonical.com
Thu Apr 28 08:04:55 UTC 2016


On 27/04/16 21:11, Ricardo Neri wrote:
> An entry in the mtrr list is set as entry->end = entry->start +
> entry->size. Thus, it follows that in order to assign a cache type, we
> must test whether any part of the memory range under test is in the
> range [entry->start, entry->end); this is, inclusive of entry->start
> but exclusive of entry->end.
> 
> A DEFAULT type is assigned to a memory range if it is not covered by
> any entry of the mtrr list. This check begins verifying whether the
> end of the memory range under test ,e, lies inside any of the ranges
> described in the mtrr list. This is:
> 
>                      entry.start < e <= entry.end                   (1)
> 
> However, consider an hypothetical mtrr entry [0x1000, 0x3000) and a
> test range [0x2000, 0x3000]. Clearly, the memory location 0x3000 is
> not covered by the mtrr entry. However, the condition (1) is met and
> the function incorrectly determines that memory range under test is
> fully covered by the mtrr entry. Thus, the correct test should be
> 
>                      entry.start < e < entry.end                    (1)
> 
> Signed-off-by: Ricardo Neri <ricardo.neri-calderon at linux.intel.com>
> ---
>  src/bios/mtrr/mtrr.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/bios/mtrr/mtrr.c b/src/bios/mtrr/mtrr.c
> index 698a96c..8176803 100644
> --- a/src/bios/mtrr/mtrr.c
> +++ b/src/bios/mtrr/mtrr.c
> @@ -186,7 +186,7 @@ restart:
>  	fwts_list_foreach(item, mtrr_list) {
>  		entry = fwts_list_data(struct mtrr_entry*, item);
>  
> -		if (entry->end >= end && entry->start < end) {
> +		if (entry->end > end && entry->start < end) {
>  			end = entry->start;
>  			if (end < start)
>  				end = start;
> 
Acked-by: Colin Ian King <colin.king at canonical.com>



More information about the fwts-devel mailing list