linux/tools/testing/selftests/arm64/mte/mte_helper.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright (C) 2020 ARM Limited */
   3
   4#include "mte_def.h"
   5
   6#define ENTRY(name) \
   7        .globl name ;\
   8        .p2align 2;\
   9        .type name, @function ;\
  10name:
  11
  12#define ENDPROC(name) \
  13        .size name, .-name ;
  14
  15        .text
  16/*
  17 * mte_insert_random_tag: Insert random tag and might be same as the source tag if
  18 *                        the source pointer has it.
  19 * Input:
  20 *              x0 - source pointer with a tag/no-tag
  21 * Return:
  22 *              x0 - pointer with random tag
  23 */
  24ENTRY(mte_insert_random_tag)
  25        irg     x0, x0, xzr
  26        ret
  27ENDPROC(mte_insert_random_tag)
  28
  29/*
  30 * mte_insert_new_tag: Insert new tag and different from the source tag if
  31 *                     source pointer has it.
  32 * Input:
  33 *              x0 - source pointer with a tag/no-tag
  34 * Return:
  35 *              x0 - pointer with random tag
  36 */
  37ENTRY(mte_insert_new_tag)
  38        gmi     x1, x0, xzr
  39        irg     x0, x0, x1
  40        ret
  41ENDPROC(mte_insert_new_tag)
  42
  43/*
  44 * mte_get_tag_address: Get the tag from given address.
  45 * Input:
  46 *              x0 - source pointer
  47 * Return:
  48 *              x0 - pointer with appended tag
  49 */
  50ENTRY(mte_get_tag_address)
  51        ldg     x0, [x0]
  52        ret
  53ENDPROC(mte_get_tag_address)
  54
  55/*
  56 * mte_set_tag_address_range: Set the tag range from the given address
  57 * Input:
  58 *              x0 - source pointer with tag data
  59 *              x1 - range
  60 * Return:
  61 *              none
  62 */
  63ENTRY(mte_set_tag_address_range)
  64        cbz     x1, 2f
  651:
  66        stg     x0, [x0, #0x0]
  67        add     x0, x0, #MT_GRANULE_SIZE
  68        sub     x1, x1, #MT_GRANULE_SIZE
  69        cbnz    x1, 1b
  702:
  71        ret
  72ENDPROC(mte_set_tag_address_range)
  73
  74/*
  75 * mt_clear_tag_address_range: Clear the tag range from the given address
  76 * Input:
  77 *              x0 - source pointer with tag data
  78 *              x1 - range
  79 * Return:
  80 *              none
  81 */
  82ENTRY(mte_clear_tag_address_range)
  83        cbz     x1, 2f
  841:
  85        stzg    x0, [x0, #0x0]
  86        add     x0, x0, #MT_GRANULE_SIZE
  87        sub     x1, x1, #MT_GRANULE_SIZE
  88        cbnz    x1, 1b
  892:
  90        ret
  91ENDPROC(mte_clear_tag_address_range)
  92
  93/*
  94 * mte_enable_pstate_tco: Enable PSTATE.TCO (tag check override) field
  95 * Input:
  96 *              none
  97 * Return:
  98 *              none
  99 */
 100ENTRY(mte_enable_pstate_tco)
 101        msr     tco, #MT_PSTATE_TCO_EN
 102        ret
 103ENDPROC(mte_enable_pstate_tco)
 104
 105/*
 106 * mte_disable_pstate_tco: Disable PSTATE.TCO (tag check override) field
 107 * Input:
 108 *              none
 109 * Return:
 110 *              none
 111 */
 112ENTRY(mte_disable_pstate_tco)
 113        msr     tco, #MT_PSTATE_TCO_DIS
 114        ret
 115ENDPROC(mte_disable_pstate_tco)
 116
 117/*
 118 * mte_get_pstate_tco: Get PSTATE.TCO (tag check override) field
 119 * Input:
 120 *              none
 121 * Return:
 122 *              x0
 123 */
 124ENTRY(mte_get_pstate_tco)
 125        mrs     x0, tco
 126        ubfx    x0, x0, #MT_PSTATE_TCO_SHIFT, #1
 127        ret
 128ENDPROC(mte_get_pstate_tco)
 129