x86_64: fixed selective tlb flushing page size choice.
authorSimon Gerber <simon.gerber@hp.com>
Mon, 16 Jun 2014 19:54:02 +0000 (12:54 -0700)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Thu, 30 Apr 2015 19:19:27 +0000 (21:19 +0200)
Signed-off-by: Simon Gerber <simon.gerber@hp.com>

kernel/paging_generic.c

index cb937ab..0e0d1e1 100644 (file)
@@ -4,12 +4,13 @@
  */
 
 /*
- * Copyright (c) 2012 ETH Zurich.
+ * Copyright (c) 2012, ETH Zurich.
+ * Copyright (c) 2014, HP Labs.
  * All rights reserved.
  *
  * This file is distributed under the terms in the attached LICENSE file.
  * If you do not find this file, copies can be found by writing to:
- * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
+ * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
  */
 
 #include <paging_generic.h>
@@ -247,9 +248,25 @@ errval_t paging_tlb_flush_range(struct cte *frame, size_t pages)
             PRIxGENVADDR"--0x%"PRIxGENVADDR"\n",
             vaddr, vaddr+(pages * BASE_PAGE_SIZE));
     // flush TLB entries for all modified pages
+    size_t page_size = 0;
+    switch(leaf_pt->cap.type) {
+        case ObjType_VNode_x86_64_ptable:
+            page_size = X86_64_BASE_PAGE_SIZE;
+            break;
+        case ObjType_VNode_x86_64_pdir:
+            page_size = X86_64_LARGE_PAGE_SIZE;
+            break;
+        case ObjType_VNode_x86_64_pdpt:
+            page_size = X86_64_HUGE_PAGE_SIZE;
+            break;
+        default:
+            break;
+    }
+    assert(page_size);
+    // TODO: check what tlb flushing instructions expect for large/huge pages
     for (int i = 0; i < pages; i++) {
         do_one_tlb_flush(vaddr);
-        vaddr += BASE_PAGE_SIZE;
+        vaddr += page_size;
     }
 
     return SYS_ERR_OK;