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