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. commit5b781c7e31("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 <luto@kernel.org> Cc: Borislav Petkov <bpetkov@suse.de> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Fixes:5b781c7e31("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 <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									693cb5580f
								
							
						
					
					
						commit
						d60ad744c9
					
				@ -115,7 +115,15 @@ static void check_valid_segment(uint16_t index, int ldt,
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ar != expected_ar) {
 | 
			
		||||
	/* The SDM says "bits 19:16 are undefined".  Thanks. */
 | 
			
		||||
	ar &= ~0xF0000;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * NB: Different Linux versions do different things with the
 | 
			
		||||
	 * accessed bit in set_thread_area().
 | 
			
		||||
	 */
 | 
			
		||||
	if (ar != expected_ar &&
 | 
			
		||||
	    (ldt || ar != (expected_ar | AR_ACCESSED))) {
 | 
			
		||||
		printf("[FAIL]\t%s entry %hu has AR 0x%08X but expected 0x%08X\n",
 | 
			
		||||
		       (ldt ? "LDT" : "GDT"), index, ar, expected_ar);
 | 
			
		||||
		nerrs++;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user