armv8: add definitions for VMSAv8-64 translation table entries.
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Fri, 19 Jun 2015 15:44:27 +0000 (17:44 +0200)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Fri, 19 Jun 2015 15:44:27 +0000 (17:44 +0200)
Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

include/arch/aarch64/barrelfish_kpi/paging_arch.h
include/target/aarch64/barrelfish_kpi/paging_arm_v8.h [moved from include/target/arm/barrelfish_kpi/paging_arm_v8.h with 100% similarity]
kernel/arch/apm88xxxx/init.c
kernel/arch/apm88xxxx/uart.c
kernel/include/arch/armv8/paging_kernel_arch.h

index 6201989..02cb275 100644 (file)
@@ -16,7 +16,7 @@
 #define ARCH_AARCH64_BARRELFISH_KPI_PAGING_H
 
 #if defined(__ARM_ARCH_8A__)
-#include <target/arm/barrelfish_kpi/paging_arm_v8.h>
+#include <target/aarch64/barrelfish_kpi/paging_arm_v8.h>
 #else
 #error "Missing ARM Paging header file"
 #endif
index 63012fe..463f003 100644 (file)
@@ -3,6 +3,7 @@
 #include <uefi_mmap.h>
 #include <sysreg.h>
 #include <multiboot.h>
+#include <paging_kernel_arch.h>
 
 /*
  * Create kernel page tables (high 256G)
@@ -15,8 +16,25 @@ static void paging_init(void)
 
 static void paging_dump(void)
 {
-    lvaddr_t lvl0 = sysreg_read_ttbr0();
-    lvl0 = lvl0;
+    union armv8_ttable_entry *lvl0 =
+        (union armv8_ttable_entry *)sysreg_read_ttbr0();
+    for (int i = 0; i < 512; i++) {
+        union armv8_ttable_entry *entry0 = lvl0 + i;
+        if (entry0->d.valid && entry0->d.mb1) {
+            printf("%d: level 1 table @%lx\n", i, (entry0->d.base)<<BASE_PAGE_BITS);
+            union armv8_ttable_entry *lvl1 =
+                (union armv8_ttable_entry *)((uint64_t)(entry0->d.base)<<BASE_PAGE_BITS);
+            for (int j = 0; j < 512; j++) {
+                union armv8_ttable_entry *entry1 = lvl1 + j;
+                if (entry1->d.valid && entry1->d.mb1) {
+                    printf("%d: level 1 table @%lx\n", i, (entry1->d.base)<<BASE_PAGE_BITS);
+                } else if (entry1->block_l1.valid) {
+                    printf("%d: level 1 block @%lx\n", i,
+                            (entry1->block_l1.base) << HUGE_PAGE_BITS);
+                }
+            }
+        }
+    }
 }
 
 bool is_bsp = true;
index b675c4f..92f8869 100644 (file)
@@ -14,7 +14,7 @@
 #define NUM_PORTS 4
 
 unsigned serial_console_port = 0;
-unsigned serial_debug_port = 0;
+unsigned serial_debug_port   = 0;
 
 // port base addresses for lookup by port no
 static const mackerel_addr_t portbases[NUM_PORTS] =
@@ -25,7 +25,7 @@ static apm88xxxx_pc16550_t ports[NUM_PORTS];
 errval_t serial_init(unsigned port, bool initialize_hw)
 {
     // XXX: remove once we have data section
-    port = 0;
+    //port = 0;
     if (port >= NUM_PORTS) {
         return SYS_ERR_SERIAL_PORT_INVALID;
     }
@@ -61,7 +61,7 @@ errval_t serial_early_init(unsigned port)
 void serial_putchar(unsigned port, char c)
 {
     // XXX: remove once we have data section
-    port = 0;
+    //port = 0;
     assert(port < NUM_PORTS);
     assert(ports[port].base != 0);
     // Wait until FIFO can hold more characters
index f593f2d..a41ba3b 100644 (file)
@@ -1,19 +1,19 @@
 /**
  * \file
- * \brief ARM kernel page-table structures.
+ * \brief ARMv8 kernel page-table structures.
  */
 
 /*
- * Copyright (c) 2007, 2008, 2009, ETH Zurich.
+ * Copyright (c) 2015, ETH Zurich.
  * 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.
  */
 
-#ifndef KERNEL_ARCH_ARM_PAGING_H
-#define KERNEL_ARCH_ARM_PAGING_H
+#ifndef KERNEL_ARCH_ARMv8_PAGING_H
+#define KERNEL_ARCH_ARMv8_PAGING_H
 
 // XXX: Not sure if these includes are required
 #include <capabilities.h>
 #include <sysreg.h>
 
 /**
+ * A translation table entry for VMSAv8-64 stage 1.
+ */
+union armv8_ttable_entry {
+    uint64_t raw;
+    struct {
+        uint64_t        valid       :1;
+        uint64_t        mb1         :1;         // 1 -> table, 0 -> block
+        uint64_t        ignored1    :10;        // lower block attrs, ignored for table
+        uint64_t        base        :36;        // base address of next level table
+        uint64_t        reserved1   :4;
+        uint64_t        ignored2    :7;
+        uint64_t        pxntable    :1;         // only stage 1, executable from EL1
+        uint64_t        uxntable    :1;         // only stage 1, executable from EL0
+        uint64_t        aptable     :2;         // only stage 1, access from EL0
+        uint64_t        nstable     :1;         // only stage 1, access from secure state
+    } d;
+    struct {
+        uint64_t        valid       :1;
+        uint64_t        mb0         :1;         // 1 -> table, 0 -> block
+        uint64_t        attrindex   :3;         // mem attr index field, D4-1798
+        uint64_t        ns          :1;         // non-secure bit
+        uint64_t        ap          :2;         // access permissions bits
+        uint64_t        sh          :2;         // shareability field
+        uint64_t        af          :1;         // accessed flag
+        uint64_t        ng          :1;         // not global bit
+        uint64_t        reserved1   :18;
+        uint64_t        base        :18;
+        uint64_t        reserved2   :4;
+        uint64_t        contiguous  :1;         // hint that entry is part of set
+                                                // of contiguous entries, D4-1811
+        uint64_t        pxn         :1;         // privileged execute never bit
+        uint64_t        uxn         :1;         // (user) execute never bit
+        uint64_t        avail1      :4;         // available for SW use
+        uint64_t        ignored1    :5;
+    } block_l1;
+    struct {
+        uint64_t        valid       :1;
+        uint64_t        mb0         :1;         // 1 -> table, 0 -> block
+        uint64_t        attrindex   :3;         // mem attr index field, D4-1798
+        uint64_t        ns          :1;         // non-secure bit
+        uint64_t        ap          :2;         // access permissions bits
+        uint64_t        sh          :2;         // shareability field
+        uint64_t        af          :1;         // accessed flag
+        uint64_t        ng          :1;         // not global bit
+        uint64_t        reserved1   :9;
+        uint64_t        base        :27;
+        uint64_t        reserved2   :4;
+        uint64_t        contiguous  :1;         // hint that entry is part of set
+                                                // of contiguous entries, D4-1811
+        uint64_t        pxn         :1;         // privileged execute never bit
+        uint64_t        uxn         :1;         // (user) execute never bit
+        uint64_t        avail1      :4;         // available for SW use
+        uint64_t        ignored1    :5;
+    } block_l2;
+    struct {
+        uint64_t        valid       :1;
+        uint64_t        mb1         :1;         // 0 -> makes entry invalid
+        uint64_t        attrindex   :3;         // mem attr index field, D4-1798
+        uint64_t        ns          :1;         // non-secure bit
+        uint64_t        ap          :2;         // access permissions bits
+        uint64_t        sh          :2;         // shareability field
+        uint64_t        af          :1;         // accessed flag
+        uint64_t        ng          :1;         // not global bit
+        uint64_t        base        :36;
+        uint64_t        reserved1   :4;
+        uint64_t        contiguous  :1;         // hint that entry is part of set
+                                                // of contiguous entries, D4-1811
+        uint64_t        pxn         :1;         // privileged execute never bit
+        uint64_t        uxn         :1;         // (user) execute never bit
+        uint64_t        avail1      :4;         // available for SW use
+        uint64_t        ignored1    :5;
+    } page;
+};
+
+STATIC_ASSERT_SIZEOF(union armv8_ttable_entry, sizeof(uint64_t));
+
+
+
+/**
  * Setup bootstrap page table with direct and relocated mappings for kernel.
  *
  * This function does not enable paging.
@@ -95,4 +174,4 @@ static inline void do_full_tlb_flush(void)
 }
 
 
-#endif // KERNEL_ARCH_ARM_PAGING_H
+#endif // KERNEL_ARCH_ARMv8_PAGING_H