cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

mte.h (1494B)


      1/*
      2 * Linux kernel fallback API definitions for MTE and test helpers.
      3 *
      4 * Copyright (c) 2021 Linaro Ltd
      5 * SPDX-License-Identifier: GPL-2.0-or-later
      6 */
      7
      8#include <assert.h>
      9#include <string.h>
     10#include <stdlib.h>
     11#include <stdio.h>
     12#include <unistd.h>
     13#include <signal.h>
     14#include <sys/mman.h>
     15#include <sys/prctl.h>
     16
     17#ifndef PR_SET_TAGGED_ADDR_CTRL
     18# define PR_SET_TAGGED_ADDR_CTRL  55
     19#endif
     20#ifndef PR_TAGGED_ADDR_ENABLE
     21# define PR_TAGGED_ADDR_ENABLE    (1UL << 0)
     22#endif
     23#ifndef PR_MTE_TCF_SHIFT
     24# define PR_MTE_TCF_SHIFT         1
     25# define PR_MTE_TCF_NONE          (0UL << PR_MTE_TCF_SHIFT)
     26# define PR_MTE_TCF_SYNC          (1UL << PR_MTE_TCF_SHIFT)
     27# define PR_MTE_TCF_ASYNC         (2UL << PR_MTE_TCF_SHIFT)
     28# define PR_MTE_TAG_SHIFT         3
     29#endif
     30
     31#ifndef PROT_MTE
     32# define PROT_MTE 0x20
     33#endif
     34
     35#ifndef SEGV_MTEAERR
     36# define SEGV_MTEAERR    8
     37# define SEGV_MTESERR    9
     38#endif
     39
     40static void enable_mte(int tcf)
     41{
     42    int r = prctl(PR_SET_TAGGED_ADDR_CTRL,
     43                  PR_TAGGED_ADDR_ENABLE | tcf | (0xfffe << PR_MTE_TAG_SHIFT),
     44                  0, 0, 0);
     45    if (r < 0) {
     46        perror("PR_SET_TAGGED_ADDR_CTRL");
     47        exit(2);
     48    }
     49}
     50
     51static void * alloc_mte_mem(size_t size) __attribute__((unused));
     52static void * alloc_mte_mem(size_t size)
     53{
     54    void *p = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_MTE,
     55                   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
     56    if (p == MAP_FAILED) {
     57        perror("mmap PROT_MTE");
     58        exit(2);
     59    }
     60    return p;
     61}