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 ;\ 12name: 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 */ 26ENTRY(mte_insert_random_tag) 27 irg x0, x0, xzr 28 ret 29ENDPROC(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 */ 39ENTRY(mte_insert_new_tag) 40 gmi x1, x0, xzr 41 irg x0, x0, x1 42 ret 43ENDPROC(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 */ 52ENTRY(mte_get_tag_address) 53 ldg x0, [x0] 54 ret 55ENDPROC(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 */ 65ENTRY(mte_set_tag_address_range) 66 cbz x1, 2f 671: 68 stg x0, [x0, #0x0] 69 add x0, x0, #MT_GRANULE_SIZE 70 sub x1, x1, #MT_GRANULE_SIZE 71 cbnz x1, 1b 722: 73 ret 74ENDPROC(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 */ 84ENTRY(mte_clear_tag_address_range) 85 cbz x1, 2f 861: 87 stzg x0, [x0, #0x0] 88 add x0, x0, #MT_GRANULE_SIZE 89 sub x1, x1, #MT_GRANULE_SIZE 90 cbnz x1, 1b 912: 92 ret 93ENDPROC(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 */ 102ENTRY(mte_enable_pstate_tco) 103 msr tco, #MT_PSTATE_TCO_EN 104 ret 105ENDPROC(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 */ 114ENTRY(mte_disable_pstate_tco) 115 msr tco, #MT_PSTATE_TCO_DIS 116 ret 117ENDPROC(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 */ 126ENTRY(mte_get_pstate_tco) 127 mrs x0, tco 128 ubfx x0, x0, #MT_PSTATE_TCO_SHIFT, #1 129 ret 130ENDPROC(mte_get_pstate_tco) 131