Copied from x86/sieve.c. Modifications: - proper code formatting. - as setup_vm() is already called, temporarily disable DAT. The test takes fairly long, especially because we only have 128MB of ram and allocate 3 times in a row ~100mb of virtual memory. Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> --- s390x/Makefile | 1 + s390x/sieve.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ s390x/unittests.cfg | 6 ++++++ 3 files changed, 66 insertions(+) create mode 100644 s390x/sieve.c diff --git a/s390x/Makefile b/s390x/Makefile index d9bef37..2d3336c 100644 --- a/s390x/Makefile +++ b/s390x/Makefile @@ -1,6 +1,7 @@ tests = $(TEST_DIR)/selftest.elf tests += $(TEST_DIR)/intercept.elf tests += $(TEST_DIR)/emulator.elf +tests += $(TEST_DIR)/sieve.elf all: directories test_cases diff --git a/s390x/sieve.c b/s390x/sieve.c new file mode 100644 index 0000000..28d4d1e --- /dev/null +++ b/s390x/sieve.c @@ -0,0 +1,59 @@ +/* + * Copied from x86/sieve.c + */ + +#include <libcflat.h> +#include <alloc.h> +#include <asm/pgtable.h> + +int sieve(char* data, int size) +{ + int i, j, r = 0; + + for (i = 0; i < size; ++i) + data[i] = 1; + + data[0] = data[1] = 0; + + for (i = 2; i < size; ++i) + if (data[i]) { + ++r; + for (j = i * 2; j < size; j += i) + data[j] = 0; + } + return r; +} + +void test_sieve(const char *msg, char *data, int size) +{ + int r; + + printf("%s:", msg); + r = sieve(data, size); + printf("%d out of %d\n", r, size); +} + +#define STATIC_SIZE 1000000 +#define VSIZE 100000000 +char static_data[STATIC_SIZE]; + +int main() +{ + void *v; + int i; + + printf("starting sieve\n"); + + configure_dat(0); + test_sieve("static", static_data, STATIC_SIZE); + configure_dat(1); + + test_sieve("mapped", static_data, STATIC_SIZE); + for (i = 0; i < 3; ++i) { + v = malloc(VSIZE); + test_sieve("virtual", v, VSIZE); + free(v); + } + + return 0; +} diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg index 1343a19..4a1e469 100644 --- a/s390x/unittests.cfg +++ b/s390x/unittests.cfg @@ -28,3 +28,9 @@ file = intercept.elf [emulator] file = emulator.elf + +[sieve] +file = sieve.elf +groups = selftest +# can take fairly long even on KVM guests +timeout = 600 -- 2.14.3