ARMv7: A15/A17 FVPs. Don't quite work yet.
authorDavid Cock <david.cock@inf.ethz.ch>
Thu, 1 Sep 2016 19:15:21 +0000 (21:15 +0200)
committerDavid Cock <david.cock@inf.ethz.ch>
Thu, 1 Sep 2016 19:15:21 +0000 (21:15 +0200)
Signed-off-by: David Cock <david.cock@inf.ethz.ch>

hake/menu.lst.armv7_a15ve_fvp_1 [new file with mode: 0644]
hake/menu.lst.armv7_a15ve_fvp_4 [new file with mode: 0644]
kernel/arch/armv7/init.c
kernel/arch/armv7/plat_a15mpcore.c
kernel/include/arch/armv7/a15_gt.h
platforms/Hakefile

diff --git a/hake/menu.lst.armv7_a15ve_fvp_1 b/hake/menu.lst.armv7_a15ve_fvp_1
new file mode 100644 (file)
index 0000000..8321f57
--- /dev/null
@@ -0,0 +1,43 @@
+timeout 0
+
+#
+# This script is used to describe the commands to start at
+# boot-time and the arguments they should receive.
+#
+# Kernel arguments are not read from this script. On QEMU they can be
+# set using 'qemu-system-arm -append ...'.
+
+title  Barrelfish
+#root  (nd)
+kernel /armv7/sbin/cpu_a15ve loglevel=4 periphbase=0x2c000000 cntfrq=100000000 consolePort=0
+module /armv7/sbin/cpu_a15ve
+module /armv7/sbin/init
+
+# Domains spawned by init
+module /armv7/sbin/mem_serv
+module /armv7/sbin/monitor
+
+# Special boot time domains spawned by monitor
+module /armv7/sbin/ramfsd boot
+module /armv7/sbin/skb boot
+modulenounzip /eclipseclp_ramfs.cpio.gz nospawn
+modulenounzip /skb_ramfs.cpio.gz nospawn
+module /armv7/sbin/kaluga boot add_device_db=plat_VE_A15x1
+module /armv7/sbin/spawnd boot
+module /armv7/sbin/startd boot
+
+# Device drivers
+# module /armv7/sbin/serial_pl011 auto
+module /armv7/sbin/serial_kernel irq=37
+module /armv7/sbin/corectrl auto
+
+# General user domains
+module /armv7/sbin/angler serial0.terminal dumb
+module /armv7/sbin/fish nospawn
+
+module /armv7/sbin/memtest
+
+# gem5 simulates 512MB of RAM starting at 0x80000000
+#        start       size       id
+mmap map 0x00000000  0x80000000 13 # Device region
+mmap map 0x80000000  0x20000000 1
diff --git a/hake/menu.lst.armv7_a15ve_fvp_4 b/hake/menu.lst.armv7_a15ve_fvp_4
new file mode 100644 (file)
index 0000000..a6ffb37
--- /dev/null
@@ -0,0 +1,43 @@
+timeout 0
+
+#
+# This script is used to describe the commands to start at
+# boot-time and the arguments they should receive.
+#
+# Kernel arguments are not read from this script. On QEMU they can be
+# set using 'qemu-system-arm -append ...'.
+
+title  Barrelfish
+#root  (nd)
+kernel /armv7/sbin/cpu_a15ve loglevel=4 periphbase=0x2c000000 cntfrq=100000000 consolePort=0
+module /armv7/sbin/cpu_a15ve
+module /armv7/sbin/init
+
+# Domains spawned by init
+module /armv7/sbin/mem_serv
+module /armv7/sbin/monitor
+
+# Special boot time domains spawned by monitor
+module /armv7/sbin/ramfsd boot
+module /armv7/sbin/skb boot
+modulenounzip /eclipseclp_ramfs.cpio.gz nospawn
+modulenounzip /skb_ramfs.cpio.gz nospawn
+module /armv7/sbin/kaluga boot add_device_db=plat_VE_A15x4
+module /armv7/sbin/spawnd boot
+module /armv7/sbin/startd boot
+
+# Device drivers
+# module /armv7/sbin/serial_pl011 auto
+module /armv7/sbin/serial_kernel irq=37
+module /armv7/sbin/corectrl auto
+
+# General user domains
+module /armv7/sbin/angler serial0.terminal dumb
+module /armv7/sbin/fish nospawn
+
+module /armv7/sbin/memtest
+
+# gem5 simulates 512MB of RAM starting at 0x80000000
+#        start       size       id
+mmap map 0x00000000  0x80000000 13 # Device region
+mmap map 0x80000000  0x20000000 1
index 48390c8..dfa3065 100644 (file)
@@ -59,6 +59,7 @@ static bool is_bsp = false;
 uint32_t periphclk = 0;
 uint32_t periphbase = 0;
 uint32_t timerirq = 0;
+uint32_t cntfrq = 0;
 
 static struct cmdarg cmdargs[] = {
     { "consolePort", ArgType_UInt, { .uinteger = (void *)0 } },
@@ -69,6 +70,7 @@ static struct cmdarg cmdargs[] = {
     { "periphclk",   ArgType_UInt, { .uinteger = (void *)0 } },
     { "periphbase",  ArgType_UInt, { .uinteger = (void *)0 } },
     { "timerirq"  ,  ArgType_UInt, { .uinteger = (void *)0 } },
+    { "cntfrq"  ,    ArgType_UInt, { .uinteger = (void *)0 } },
     { NULL, 0, { NULL } }
 };
 
@@ -82,6 +84,7 @@ init_cmdargs(void) {
     cmdargs[5].var.uinteger= &periphclk;
     cmdargs[6].var.uinteger= &periphbase;
     cmdargs[7].var.uinteger= &timerirq;
+    cmdargs[8].var.uinteger= &cntfrq;
 }
 
 /**
index dc8a37c..99cea54 100644 (file)
@@ -61,10 +61,17 @@ platform_get_core_count(void) {
 #define DEFAULT_TIMER_IRQ 30
 
 extern uint32_t timerirq;
+extern uint32_t cntfrq;
+
 static uint32_t timeslice_ticks;
 
 void
 timers_init(int timeslice) {
+    /* If there was a cntfrq parameter passed, then overwrite the current
+     * CNTFRQ register.  We need to do this if there was no bootloader to set
+     * it for us, as on the FVP simulators. */
+    if(cntfrq != 0) a15_gt_set_cntfrq(cntfrq);
+
     /* The timeslice is in ms, so divide by 1000. */
     timeslice_ticks= timeslice * a15_gt_frequency() / 1000;
 
index 5837fab..631a980 100644 (file)
@@ -23,6 +23,13 @@ a15_gt_frequency(void) {
     return cntfrq;
 }
 
+/* Set the CNTFRQ register.  Note that this does *not* set the actual
+ * frequency of the timer, just the value that software sees. */
+static inline void
+a15_gt_set_cntfrq(uint32_t cntfrq) {
+    __asm volatile("mcr p15, 0, %0, c14, c0, 0" : : "r"(cntfrq));
+}
+
 /* Return the current counter value. */
 static inline uint64_t
 a15_gt_counter(void) {
index 64853f0..bb4c641 100644 (file)
@@ -493,8 +493,12 @@ let bin_rcce_lu = [ "/sbin/" ++ f | f <- [
     ([ ("armv7", f) | f <- vExpressEMMModules_A15 ] ++
      [ ("root", "/armv7_a15ve_1_image"),
        ("root", "/armv7_a15ve_1_image-gdb.gdb"),
+       ("root", "/armv7_a15ve_fvp_1_image"),
+       ("root", "/armv7_a15ve_fvp_1_image-gdb.gdb"),
        ("root", "/armv7_a15ve_4_image"),
        ("root", "/armv7_a15ve_4_image-gdb.gdb"),
+       ("root", "/armv7_a15ve_fvp_4_image"),
+       ("root", "/armv7_a15ve_fvp_4_image-gdb.gdb"),
        ("root", "/armv7_a15ve_gem5_image"),
        ("root", "/armv7_a15ve_gem5_image-gdb.gdb") ])
     "VersatileExpress EMM board with ARM Cortex-A15s",
@@ -527,9 +531,17 @@ let bin_rcce_lu = [ "/sbin/" ++ f | f <- [
     -- Build the A15 simulation image (VersatileExpress EMM board, 1 core)
     armv7Image "armv7_a15ve_1" "ve" "a15ve" "0x80000000" vExpressEMMModules_A15,
 
-    -- Build the A15 simulation image (VersatileExpress EMM board, 1 cores)
+    -- Build the A15 simulation image (VersatileExpress EMM board, 1 core, FVP
+    -- quirks)
+    armv7Image "armv7_a15ve_fvp_1" "ve" "a15ve" "0x80000000" vExpressEMMModules_A15,
+
+    -- Build the A15 simulation image (VersatileExpress EMM board, 4 cores)
     armv7Image "armv7_a15ve_4" "ve" "a15ve" "0x80000000" vExpressEMMModules_A15,
 
+    -- Build the A15 simulation image (VersatileExpress EMM board, 4 cores,
+    -- FVP quirks)
+    armv7Image "armv7_a15ve_fvp_4" "ve" "a15ve" "0x80000000" vExpressEMMModules_A15,
+
     -- Build the A15 simulation image (VersatileExpress EMM board, with GEM5
     -- quirks)
     armv7Image "armv7_a15ve_gem5" "ve" "a15ve" "0x80000000" vExpressEMMModules_A15,
@@ -569,6 +581,8 @@ let bin_rcce_lu = [ "/sbin/" ++ f | f <- [
                      "armv7_a9ve_4",
                      "armv7_a15ve_1",
                      "armv7_a15ve_4",
+                     "armv7_a15ve_fvp_1",
+                     "armv7_a15ve_fvp_4",
                      "armv7_a15ve_gem5",
                      "armv7_omap44xx",
                      "armv7_zynq7" ]],
@@ -614,17 +628,17 @@ let bin_rcce_lu = [ "/sbin/" ++ f | f <- [
 
     boot "FVP_VE_A15x1" [ "armv7" ] [
       Str "FVP_VE_Cortex-A15x1",
-      In BuildTree "root" "/armv7_a15ve_1_image" ]
+      In BuildTree "root" "/armv7_a15ve_fvp_1_image" ]
     "Boot on a single-core Cortex-A15 FVP model",
 
     boot "FVP_VE_A15x4" [ "armv7" ] [
       Str "FVP_VE_Cortex-A15x4-A7x4",
-      In BuildTree "root" "/armv7_a15ve_4_image" ]
+      In BuildTree "root" "/armv7_a15ve_fvp_4_image" ]
     "Boot on a eight-core Cortex-A15/A7 FVP model",
 
     boot "FVP_VE_A17x1" [ "armv7" ] [
       Str "FVP_VE_Cortex-A17x1",
-      In BuildTree "root" "/armv7_a15ve_1_image" ]
+      In BuildTree "root" "/armv7_a15ve_fvp_1_image" ]
     "Boot on a single-core Cortex-A17 FVP model",
 
     boot "qemu_x86_64" [ "x86_64" ] [