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