Skip to content

Commit d60ad74

Browse files
amlutoIngo Molnar
authored andcommitted
selftests/x86/ldt_gdt: Robustify against set_thread_area() and LAR oddities
Bits 19:16 of LAR's result are undefined, and some upcoming improvements to the test case seem to trigger this. Mask off those bits to avoid spurious failures. commit 5b781c7 ("x86/tls: Forcibly set the accessed bit in TLS segments") adds a valid case in which LAR's output doesn't quite agree with set_thread_area()'s input. This isn't triggered in the test as is, but it will be if we start calling set_thread_area() with the accessed bit clear. Work around this discrepency. I've added a Fixes tag so that -stable can pick this up if neccesary. Signed-off-by: Andy Lutomirski <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Thomas Gleixner <[email protected]> Fixes: 5b781c7 ("x86/tls: Forcibly set the accessed bit in TLS segments") Link: http://lkml.kernel.org/r/b82f3f89c034b53580970ac865139fd8863f44e2.1509794321.git.luto@kernel.org Signed-off-by: Ingo Molnar <[email protected]>
1 parent 693cb55 commit d60ad74

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

tools/testing/selftests/x86/ldt_gdt.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,15 @@ static void check_valid_segment(uint16_t index, int ldt,
115115
return;
116116
}
117117

118-
if (ar != expected_ar) {
118+
/* The SDM says "bits 19:16 are undefined". Thanks. */
119+
ar &= ~0xF0000;
120+
121+
/*
122+
* NB: Different Linux versions do different things with the
123+
* accessed bit in set_thread_area().
124+
*/
125+
if (ar != expected_ar &&
126+
(ldt || ar != (expected_ar | AR_ACCESSED))) {
119127
printf("[FAIL]\t%s entry %hu has AR 0x%08X but expected 0x%08X\n",
120128
(ldt ? "LDT" : "GDT"), index, ar, expected_ar);
121129
nerrs++;

0 commit comments

Comments
 (0)