aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/core/test/run-cpufeatures.c
diff options
context:
space:
mode:
Diffstat (limited to 'roms/skiboot/core/test/run-cpufeatures.c')
-rw-r--r--roms/skiboot/core/test/run-cpufeatures.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/roms/skiboot/core/test/run-cpufeatures.c b/roms/skiboot/core/test/run-cpufeatures.c
new file mode 100644
index 000000000..bb89b2573
--- /dev/null
+++ b/roms/skiboot/core/test/run-cpufeatures.c
@@ -0,0 +1,144 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+/*
+ * Copyright 2019 IBM Corp.
+ */
+
+#include <skiboot.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+/* Override this for testing. */
+#define is_rodata(p) fake_is_rodata(p)
+
+char __rodata_start[16];
+#define __rodata_end (__rodata_start + sizeof(__rodata_start))
+
+static inline bool fake_is_rodata(const void *p)
+{
+ return ((char *)p >= __rodata_start && (char *)p < __rodata_end);
+}
+
+#define zalloc(bytes) calloc((bytes), 1)
+
+#include "../device.c"
+#include <assert.h>
+#include "../../test/dt_common.c"
+
+#define __TEST__
+
+static inline unsigned long mfspr(unsigned int spr);
+
+#include <ccan/str/str.c>
+
+#include "../cpufeatures.c"
+
+static unsigned long fake_pvr = PVR_TYPE_P8;
+
+static inline unsigned long mfspr(unsigned int spr)
+{
+ assert(spr == SPR_PVR);
+ return fake_pvr;
+}
+
+int main(void)
+{
+ struct dt_node *dt_root;
+
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, true);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P8E << 16) | 0x100; // P8E DD1.0
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P8E << 16) | 0x200; // P8E DD2.0
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P8 << 16) | 0x100; // P8 DD1.0
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P8 << 16) | 0x200; // P8 DD2.0
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P8NVL << 16) | 0x100; // P8NVL DD1.0
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P9 << 16) | 0x200; // P9 DD2.0
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix"));
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P9 << 16) | 0x201; // P9 DD2.1
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix"));
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") == 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P9 << 16) | 0x202; // P9 DD2.2
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix"));
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") != 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") != 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P9 << 16) | 0x203; // P9 DD2.3
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix"));
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") != 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ fake_pvr = (PVR_TYPE_P9P << 16) | 0x100; // P9P DD1.0
+ dt_root = dt_new_root("");
+ dt_add_cpufeatures(dt_root);
+ dump_dt(dt_root, 0, false);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/mmu-radix"));
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-hypervisor-assist") != 0);
+ assert(dt_find_by_path(dt_root, "cpus/ibm,powerpc-cpu-features/tm-suspend-xer-so-bug") == 0);
+ dt_free(dt_root);
+
+ exit(EXIT_SUCCESS);
+}