x86/mtrr: Add get_effective_type() service function
authorJuergen Gross <jgross@suse.com>
Tue, 2 May 2023 12:09:25 +0000 (14:09 +0200)
committerBorislav Petkov (AMD) <bp@alien8.de>
Thu, 1 Jun 2023 13:04:33 +0000 (15:04 +0200)
Add a service function for obtaining the effective cache mode of
overlapping MTRR registers.

Make use of that function in check_type_overlap().

Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Tested-by: Michael Kelley <mikelley@microsoft.com>
Link: https://lore.kernel.org/r/20230502120931.20719-11-jgross@suse.com
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
arch/x86/kernel/cpu/mtrr/generic.c

index 4d8ca62..b944271 100644 (file)
@@ -80,31 +80,30 @@ static u64 get_mtrr_size(u64 mask)
        return size;
 }
 
+static u8 get_effective_type(u8 type1, u8 type2)
+{
+       if (type1 == MTRR_TYPE_UNCACHABLE || type2 == MTRR_TYPE_UNCACHABLE)
+               return MTRR_TYPE_UNCACHABLE;
+
+       if ((type1 == MTRR_TYPE_WRBACK && type2 == MTRR_TYPE_WRTHROUGH) ||
+           (type1 == MTRR_TYPE_WRTHROUGH && type2 == MTRR_TYPE_WRBACK))
+               return MTRR_TYPE_WRTHROUGH;
+
+       if (type1 != type2)
+               return MTRR_TYPE_UNCACHABLE;
+
+       return type1;
+}
+
 /*
  * Check and return the effective type for MTRR-MTRR type overlap.
- * Returns 1 if the effective type is UNCACHEABLE, else returns 0
+ * Returns true if the effective type is UNCACHEABLE, else returns false
  */
-static int check_type_overlap(u8 *prev, u8 *curr)
+static bool check_type_overlap(u8 *prev, u8 *curr)
 {
-       if (*prev == MTRR_TYPE_UNCACHABLE || *curr == MTRR_TYPE_UNCACHABLE) {
-               *prev = MTRR_TYPE_UNCACHABLE;
-               *curr = MTRR_TYPE_UNCACHABLE;
-               return 1;
-       }
-
-       if ((*prev == MTRR_TYPE_WRBACK && *curr == MTRR_TYPE_WRTHROUGH) ||
-           (*prev == MTRR_TYPE_WRTHROUGH && *curr == MTRR_TYPE_WRBACK)) {
-               *prev = MTRR_TYPE_WRTHROUGH;
-               *curr = MTRR_TYPE_WRTHROUGH;
-       }
+       *prev = *curr = get_effective_type(*curr, *prev);
 
-       if (*prev != *curr) {
-               *prev = MTRR_TYPE_UNCACHABLE;
-               *curr = MTRR_TYPE_UNCACHABLE;
-               return 1;
-       }
-
-       return 0;
+       return *prev == MTRR_TYPE_UNCACHABLE;
 }
 
 /**