[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