forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
2.4 KiB
128 lines
2.4 KiB
/* 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)
|
|
|