cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

memmove_validate.c (1228B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <malloc.h>
      3#include <stdlib.h>
      4#include <string.h>
      5#include <assert.h>
      6#include "utils.h"
      7
      8void *TEST_MEMMOVE(const void *s1, const void *s2, size_t n);
      9
     10#define BUF_LEN 65536
     11#define MAX_OFFSET 512
     12
     13size_t max(size_t a, size_t b)
     14{
     15	if (a >= b)
     16		return a;
     17	return b;
     18}
     19
     20static int testcase_run(void)
     21{
     22	size_t i, src_off, dst_off, len;
     23
     24	char *usermap = memalign(BUF_LEN, BUF_LEN);
     25	char *kernelmap = memalign(BUF_LEN, BUF_LEN);
     26
     27	assert(usermap != NULL);
     28	assert(kernelmap != NULL);
     29
     30	memset(usermap, 0, BUF_LEN);
     31	memset(kernelmap, 0, BUF_LEN);
     32
     33	for (i = 0; i < BUF_LEN; i++) {
     34		usermap[i] = i & 0xff;
     35		kernelmap[i] = i & 0xff;
     36	}
     37
     38	for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
     39		for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
     40			for (len = 1; len < MAX_OFFSET - max(src_off, dst_off); len++) {
     41
     42				memmove(usermap + dst_off, usermap + src_off, len);
     43				TEST_MEMMOVE(kernelmap + dst_off, kernelmap + src_off, len);
     44				if (memcmp(usermap, kernelmap, MAX_OFFSET) != 0) {
     45					printf("memmove failed at %ld %ld %ld\n",
     46							src_off, dst_off, len);
     47					abort();
     48				}
     49			}
     50		}
     51	}
     52	return 0;
     53}
     54
     55int main(void)
     56{
     57	return test_harness(testcase_run, "memmove");
     58}