diff options
Diffstat (limited to 'roms/skiboot/core/test/run-cpufeatures.c')
-rw-r--r-- | roms/skiboot/core/test/run-cpufeatures.c | 144 |
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); +} |