All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH -tip] x86/mm/32: Sync only to LDT_BASE_ADDR in vmalloc_sync_all()
@ 2019-11-26 10:09 Joerg Roedel
  2019-11-26 10:19 ` Borislav Petkov
  2019-11-26 11:11 ` [PATCH -tip, v2] x86/mm/32: Sync only to VMALLOC_END " Ingo Molnar
  0 siblings, 2 replies; 6+ messages in thread
From: Joerg Roedel @ 2019-11-26 10:09 UTC (permalink / raw)
  To: Dave Hansen, Andy Lutomirski, Thomas Gleixner, Ingo Molnar,
	Borislav Petkov, Peter Zijlstra
  Cc: hpa, x86, linux-kernel, Joerg Roedel, stable

From: Joerg Roedel <jroedel@suse.de>

When vmalloc_sync_all() iterates over the address space until
FIX_ADDR_TOP it will sync the whole kernel address space starting from
VMALLOC_START.

This is not a problem when the kernel address range is identical in
all page-tables, but this is no longer the case when PTI is enabled on
x86-32. In that case the per-process LDT is mapped in the kernel
address range and vmalloc_sync_all() clears the LDT mapping for all
processes.

To make LDT working again vmalloc_sync_all() must only iterate over
the volatile parts of the kernel address range that are identical
between all processes. This includes the VMALLOC and the PKMAP areas
on x86-32.

The order of the ranges in the address space is:

	VMALLOC -> PKMAP -> LDT -> CPU_ENTRY_AREA -> FIX_ADDR

So the right check in vmalloc_sync_all() is "address < LDT_BASE_ADDR"
to make sure the VMALLOC and PKMAP areas are synchronized and the LDT
mapping is not falsely overwritten. the CPU_ENTRY_AREA and
the FIXMAP area are no longer synced as well, but these
ranges are synchronized on page-table creation time and do
not change during runtime.

This change fixes the ldt_gdt selftest in my setup.

Fixes: 7757d607c6b3 ("x86/pti: AllowCONFIG_PAGE_TABLE_ISOLATION for x86_32")
Cc: stable@vger.kernel.org
Signed-off-by: Joerg Roedel <jroedel@suse.de>
---
 arch/x86/mm/fault.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 9ceacd1156db..144329c44436 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -197,7 +197,7 @@ void vmalloc_sync_all(void)
 		return;
 
 	for (address = VMALLOC_START & PMD_MASK;
-	     address >= TASK_SIZE_MAX && address < FIXADDR_TOP;
+	     address >= TASK_SIZE_MAX && address < LDT_BASE_ADDR;
 	     address += PMD_SIZE) {
 		struct page *page;
 
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-11-27  8:19 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-11-26 10:09 [PATCH -tip] x86/mm/32: Sync only to LDT_BASE_ADDR in vmalloc_sync_all() Joerg Roedel
2019-11-26 10:19 ` Borislav Petkov
2019-11-26 11:11 ` [PATCH -tip, v2] x86/mm/32: Sync only to VMALLOC_END " Ingo Molnar
2019-11-26 12:30   ` Joerg Roedel
2019-11-26 17:14     ` Ingo Molnar
2019-11-27  8:19   ` [tip: x86/urgent] " tip-bot2 for Joerg Roedel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.