From 8dbc18cf90da942617936d7574d4dfc13249644d Mon Sep 17 00:00:00 2001 From: Jakub Jermar Date: Sun, 21 Jan 2007 16:46:46 +0000 Subject: [PATCH] When invalidating entire TLBs on sparc64, make sure to also invalidate any (locked) global entries. This fixes Ticket #21. Fix a comment in start.S stating that the kernel installs a global entry for itself. All entries installed by the kernel are local to some memory context. --- kernel/arch/sparc64/src/mm/tlb.c | 15 ++++++++++++--- kernel/arch/sparc64/src/start.S | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/kernel/arch/sparc64/src/mm/tlb.c b/kernel/arch/sparc64/src/mm/tlb.c index ba048aed8..6f24dff71 100644 --- a/kernel/arch/sparc64/src/mm/tlb.c +++ b/kernel/arch/sparc64/src/mm/tlb.c @@ -327,7 +327,7 @@ void tlb_print(void) for (i = 0; i < ITLB_ENTRY_COUNT; i++) { d.value = itlb_data_access_read(i); t.value = itlb_tag_read_read(i); - + printf("%d: vpn=%#llx, context=%d, v=%d, size=%d, nfo=%d, " "ie=%d, soft2=%#x, diag=%#x, pfn=%#x, soft=%#x, l=%d, " "cp=%d, cv=%d, e=%d, p=%d, w=%d, g=%d\n", i, t.vpn, @@ -408,9 +408,18 @@ void tlb_invalidate_all(void) tlb_data_t d; tlb_tag_read_reg_t t; + /* + * Walk all ITLB and DTLB entries and remove all unlocked mappings. + * + * The kernel doesn't use global mappings so any locked global mappings + * found must have been created by someone else. Their only purpose now + * is to collide with proper mappings. Invalidate immediately. It should + * be safe to invalidate them as late as now. + */ + for (i = 0; i < ITLB_ENTRY_COUNT; i++) { d.value = itlb_data_access_read(i); - if (!d.l) { + if (!d.l || d.g) { t.value = itlb_tag_read_read(i); d.v = false; itlb_tag_access_write(t.value); @@ -420,7 +429,7 @@ void tlb_invalidate_all(void) for (i = 0; i < DTLB_ENTRY_COUNT; i++) { d.value = dtlb_data_access_read(i); - if (!d.l) { + if (!d.l || d.g) { t.value = dtlb_tag_read_read(i); d.v = false; dtlb_tag_access_write(t.value); diff --git a/kernel/arch/sparc64/src/start.S b/kernel/arch/sparc64/src/start.S index aca912b81..b37a8fad8 100644 --- a/kernel/arch/sparc64/src/start.S +++ b/kernel/arch/sparc64/src/start.S @@ -99,7 +99,7 @@ kernel_image_start: wrpr %g1, %lo(trap_table), %tba /* - * Take over the DMMU by installing global locked TTE entry identically + * Take over the DMMU by installing locked TTE entry identically * mapping the first 4M of memory. * * In case of DMMU, no FLUSH instructions need to be issued. Because of -- 2.11.4.GIT