mirror of https://github.com/torvalds/linux.git
Merge branch 'for-next/feat_mte_store_only' into for-next/core
* for-next/feat_mte_store_only: : MTE feature to restrict tag checking to store only operations kselftest/arm64/mte: Add MTE_STORE_ONLY testcases kselftest/arm64/mte: Preparation for mte store only test kselftest/arm64/abi: Add MTE_STORE_ONLY feature hwcap test KVM: arm64: Expose MTE_STORE_ONLY feature to guest arm64/hwcaps: Add MTE_STORE_ONLY hwcaps arm64/kernel: Support store-only mte tag check prctl: Introduce PR_MTE_STORE_ONLY arm64/cpufeature: Add MTE_STORE_ONLY feature
This commit is contained in:
commit
5b1ae9de71
|
|
@ -438,6 +438,9 @@ HWCAP2_POE
|
||||||
HWCAP3_MTE_FAR
|
HWCAP3_MTE_FAR
|
||||||
Functionality implied by ID_AA64PFR2_EL1.MTEFAR == 0b0001.
|
Functionality implied by ID_AA64PFR2_EL1.MTEFAR == 0b0001.
|
||||||
|
|
||||||
|
HWCAP3_MTE_STORE_ONLY
|
||||||
|
Functionality implied by ID_AA64PFR2_EL1.MTESTOREONLY == 0b0001.
|
||||||
|
|
||||||
4. Unused AT_HWCAP bits
|
4. Unused AT_HWCAP bits
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -177,6 +177,7 @@
|
||||||
|
|
||||||
#define __khwcap3_feature(x) (const_ilog2(HWCAP3_ ## x) + 128)
|
#define __khwcap3_feature(x) (const_ilog2(HWCAP3_ ## x) + 128)
|
||||||
#define KERNEL_HWCAP_MTE_FAR __khwcap3_feature(MTE_FAR)
|
#define KERNEL_HWCAP_MTE_FAR __khwcap3_feature(MTE_FAR)
|
||||||
|
#define KERNEL_HWCAP_MTE_STORE_ONLY __khwcap3_feature(MTE_STORE_ONLY)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This yields a mask that user programs can use to figure out what
|
* This yields a mask that user programs can use to figure out what
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,8 @@
|
||||||
#define MTE_CTRL_TCF_ASYNC (1UL << 17)
|
#define MTE_CTRL_TCF_ASYNC (1UL << 17)
|
||||||
#define MTE_CTRL_TCF_ASYMM (1UL << 18)
|
#define MTE_CTRL_TCF_ASYMM (1UL << 18)
|
||||||
|
|
||||||
|
#define MTE_CTRL_STORE_ONLY (1UL << 19)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <linux/build_bug.h>
|
#include <linux/build_bug.h>
|
||||||
|
|
|
||||||
|
|
@ -144,5 +144,6 @@
|
||||||
* HWCAP3 flags - for AT_HWCAP3
|
* HWCAP3 flags - for AT_HWCAP3
|
||||||
*/
|
*/
|
||||||
#define HWCAP3_MTE_FAR (1UL << 0)
|
#define HWCAP3_MTE_FAR (1UL << 0)
|
||||||
|
#define HWCAP3_MTE_STORE_ONLY (1UL << 1)
|
||||||
|
|
||||||
#endif /* _UAPI__ASM_HWCAP_H */
|
#endif /* _UAPI__ASM_HWCAP_H */
|
||||||
|
|
|
||||||
|
|
@ -321,6 +321,7 @@ static const struct arm64_ftr_bits ftr_id_aa64pfr1[] = {
|
||||||
static const struct arm64_ftr_bits ftr_id_aa64pfr2[] = {
|
static const struct arm64_ftr_bits ftr_id_aa64pfr2[] = {
|
||||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR2_EL1_FPMR_SHIFT, 4, 0),
|
ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64PFR2_EL1_FPMR_SHIFT, 4, 0),
|
||||||
ARM64_FTR_BITS(FTR_VISIBLE, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR2_EL1_MTEFAR_SHIFT, 4, ID_AA64PFR2_EL1_MTEFAR_NI),
|
ARM64_FTR_BITS(FTR_VISIBLE, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR2_EL1_MTEFAR_SHIFT, 4, ID_AA64PFR2_EL1_MTEFAR_NI),
|
||||||
|
ARM64_FTR_BITS(FTR_VISIBLE, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR2_EL1_MTESTOREONLY_SHIFT, 4, ID_AA64PFR2_EL1_MTESTOREONLY_NI),
|
||||||
ARM64_FTR_END,
|
ARM64_FTR_END,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -2914,6 +2915,13 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
|
||||||
.matches = has_cpuid_feature,
|
.matches = has_cpuid_feature,
|
||||||
ARM64_CPUID_FIELDS(ID_AA64PFR2_EL1, MTEFAR, IMP)
|
ARM64_CPUID_FIELDS(ID_AA64PFR2_EL1, MTEFAR, IMP)
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.desc = "Store Only MTE Tag Check",
|
||||||
|
.capability = ARM64_MTE_STORE_ONLY,
|
||||||
|
.type = ARM64_CPUCAP_SYSTEM_FEATURE,
|
||||||
|
.matches = has_cpuid_feature,
|
||||||
|
ARM64_CPUID_FIELDS(ID_AA64PFR2_EL1, MTESTOREONLY, IMP)
|
||||||
|
},
|
||||||
#endif /* CONFIG_ARM64_MTE */
|
#endif /* CONFIG_ARM64_MTE */
|
||||||
{
|
{
|
||||||
.desc = "RCpc load-acquire (LDAPR)",
|
.desc = "RCpc load-acquire (LDAPR)",
|
||||||
|
|
@ -3258,6 +3266,7 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
|
||||||
HWCAP_CAP(ID_AA64PFR1_EL1, MTE, MTE2, CAP_HWCAP, KERNEL_HWCAP_MTE),
|
HWCAP_CAP(ID_AA64PFR1_EL1, MTE, MTE2, CAP_HWCAP, KERNEL_HWCAP_MTE),
|
||||||
HWCAP_CAP(ID_AA64PFR1_EL1, MTE, MTE3, CAP_HWCAP, KERNEL_HWCAP_MTE3),
|
HWCAP_CAP(ID_AA64PFR1_EL1, MTE, MTE3, CAP_HWCAP, KERNEL_HWCAP_MTE3),
|
||||||
HWCAP_CAP(ID_AA64PFR2_EL1, MTEFAR, IMP, CAP_HWCAP, KERNEL_HWCAP_MTE_FAR),
|
HWCAP_CAP(ID_AA64PFR2_EL1, MTEFAR, IMP, CAP_HWCAP, KERNEL_HWCAP_MTE_FAR),
|
||||||
|
HWCAP_CAP(ID_AA64PFR2_EL1, MTESTOREONLY, IMP, CAP_HWCAP , KERNEL_HWCAP_MTE_STORE_ONLY),
|
||||||
#endif /* CONFIG_ARM64_MTE */
|
#endif /* CONFIG_ARM64_MTE */
|
||||||
HWCAP_CAP(ID_AA64MMFR0_EL1, ECV, IMP, CAP_HWCAP, KERNEL_HWCAP_ECV),
|
HWCAP_CAP(ID_AA64MMFR0_EL1, ECV, IMP, CAP_HWCAP, KERNEL_HWCAP_ECV),
|
||||||
HWCAP_CAP(ID_AA64MMFR1_EL1, AFP, IMP, CAP_HWCAP, KERNEL_HWCAP_AFP),
|
HWCAP_CAP(ID_AA64MMFR1_EL1, AFP, IMP, CAP_HWCAP, KERNEL_HWCAP_AFP),
|
||||||
|
|
|
||||||
|
|
@ -161,6 +161,7 @@ static const char *const hwcap_str[] = {
|
||||||
[KERNEL_HWCAP_SME_STMOP] = "smestmop",
|
[KERNEL_HWCAP_SME_STMOP] = "smestmop",
|
||||||
[KERNEL_HWCAP_SME_SMOP4] = "smesmop4",
|
[KERNEL_HWCAP_SME_SMOP4] = "smesmop4",
|
||||||
[KERNEL_HWCAP_MTE_FAR] = "mtefar",
|
[KERNEL_HWCAP_MTE_FAR] = "mtefar",
|
||||||
|
[KERNEL_HWCAP_MTE_STORE_ONLY] = "mtestoreonly",
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@ static void mte_update_sctlr_user(struct task_struct *task)
|
||||||
* program requested values go with what was requested.
|
* program requested values go with what was requested.
|
||||||
*/
|
*/
|
||||||
resolved_mte_tcf = (mte_ctrl & pref) ? pref : mte_ctrl;
|
resolved_mte_tcf = (mte_ctrl & pref) ? pref : mte_ctrl;
|
||||||
sctlr &= ~SCTLR_EL1_TCF0_MASK;
|
sctlr &= ~(SCTLR_EL1_TCF0_MASK | SCTLR_EL1_TCSO0_MASK);
|
||||||
/*
|
/*
|
||||||
* Pick an actual setting. The order in which we check for
|
* Pick an actual setting. The order in which we check for
|
||||||
* set bits and map into register values determines our
|
* set bits and map into register values determines our
|
||||||
|
|
@ -212,6 +212,10 @@ static void mte_update_sctlr_user(struct task_struct *task)
|
||||||
sctlr |= SYS_FIELD_PREP_ENUM(SCTLR_EL1, TCF0, ASYNC);
|
sctlr |= SYS_FIELD_PREP_ENUM(SCTLR_EL1, TCF0, ASYNC);
|
||||||
else if (resolved_mte_tcf & MTE_CTRL_TCF_SYNC)
|
else if (resolved_mte_tcf & MTE_CTRL_TCF_SYNC)
|
||||||
sctlr |= SYS_FIELD_PREP_ENUM(SCTLR_EL1, TCF0, SYNC);
|
sctlr |= SYS_FIELD_PREP_ENUM(SCTLR_EL1, TCF0, SYNC);
|
||||||
|
|
||||||
|
if (mte_ctrl & MTE_CTRL_STORE_ONLY)
|
||||||
|
sctlr |= SYS_FIELD_PREP(SCTLR_EL1, TCSO0, 1);
|
||||||
|
|
||||||
task->thread.sctlr_user = sctlr;
|
task->thread.sctlr_user = sctlr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -371,6 +375,9 @@ long set_mte_ctrl(struct task_struct *task, unsigned long arg)
|
||||||
(arg & PR_MTE_TCF_SYNC))
|
(arg & PR_MTE_TCF_SYNC))
|
||||||
mte_ctrl |= MTE_CTRL_TCF_ASYMM;
|
mte_ctrl |= MTE_CTRL_TCF_ASYMM;
|
||||||
|
|
||||||
|
if (arg & PR_MTE_STORE_ONLY)
|
||||||
|
mte_ctrl |= MTE_CTRL_STORE_ONLY;
|
||||||
|
|
||||||
task->thread.mte_ctrl = mte_ctrl;
|
task->thread.mte_ctrl = mte_ctrl;
|
||||||
if (task == current) {
|
if (task == current) {
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
@ -398,6 +405,8 @@ long get_mte_ctrl(struct task_struct *task)
|
||||||
ret |= PR_MTE_TCF_ASYNC;
|
ret |= PR_MTE_TCF_ASYNC;
|
||||||
if (mte_ctrl & MTE_CTRL_TCF_SYNC)
|
if (mte_ctrl & MTE_CTRL_TCF_SYNC)
|
||||||
ret |= PR_MTE_TCF_SYNC;
|
ret |= PR_MTE_TCF_SYNC;
|
||||||
|
if (mte_ctrl & MTE_CTRL_STORE_ONLY)
|
||||||
|
ret |= PR_MTE_STORE_ONLY;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -850,10 +850,14 @@ long set_tagged_addr_ctrl(struct task_struct *task, unsigned long arg)
|
||||||
if (is_compat_thread(ti))
|
if (is_compat_thread(ti))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (system_supports_mte())
|
if (system_supports_mte()) {
|
||||||
valid_mask |= PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC \
|
valid_mask |= PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC \
|
||||||
| PR_MTE_TAG_MASK;
|
| PR_MTE_TAG_MASK;
|
||||||
|
|
||||||
|
if (cpus_have_cap(ARM64_MTE_STORE_ONLY))
|
||||||
|
valid_mask |= PR_MTE_STORE_ONLY;
|
||||||
|
}
|
||||||
|
|
||||||
if (arg & ~valid_mask)
|
if (arg & ~valid_mask)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1618,7 +1618,9 @@ static u64 __kvm_read_sanitised_id_reg(const struct kvm_vcpu *vcpu,
|
||||||
break;
|
break;
|
||||||
case SYS_ID_AA64PFR2_EL1:
|
case SYS_ID_AA64PFR2_EL1:
|
||||||
val &= ID_AA64PFR2_EL1_FPMR |
|
val &= ID_AA64PFR2_EL1_FPMR |
|
||||||
(kvm_has_mte(vcpu->kvm) ? ID_AA64PFR2_EL1_MTEFAR : 0);
|
(kvm_has_mte(vcpu->kvm) ?
|
||||||
|
ID_AA64PFR2_EL1_MTEFAR | ID_AA64PFR2_EL1_MTESTOREONLY :
|
||||||
|
0);
|
||||||
break;
|
break;
|
||||||
case SYS_ID_AA64ISAR1_EL1:
|
case SYS_ID_AA64ISAR1_EL1:
|
||||||
if (!vcpu_has_ptrauth(vcpu))
|
if (!vcpu_has_ptrauth(vcpu))
|
||||||
|
|
@ -2878,7 +2880,8 @@ static const struct sys_reg_desc sys_reg_descs[] = {
|
||||||
ID_AA64PFR1_EL1_MTE)),
|
ID_AA64PFR1_EL1_MTE)),
|
||||||
ID_WRITABLE(ID_AA64PFR2_EL1,
|
ID_WRITABLE(ID_AA64PFR2_EL1,
|
||||||
ID_AA64PFR2_EL1_FPMR |
|
ID_AA64PFR2_EL1_FPMR |
|
||||||
ID_AA64PFR2_EL1_MTEFAR),
|
ID_AA64PFR2_EL1_MTEFAR |
|
||||||
|
ID_AA64PFR2_EL1_MTESTOREONLY),
|
||||||
ID_UNALLOCATED(4,3),
|
ID_UNALLOCATED(4,3),
|
||||||
ID_WRITABLE(ID_AA64ZFR0_EL1, ~ID_AA64ZFR0_EL1_RES0),
|
ID_WRITABLE(ID_AA64ZFR0_EL1, ~ID_AA64ZFR0_EL1_RES0),
|
||||||
ID_HIDDEN(ID_AA64SMFR0_EL1),
|
ID_HIDDEN(ID_AA64SMFR0_EL1),
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@ MPAM_HCR
|
||||||
MTE
|
MTE
|
||||||
MTE_ASYMM
|
MTE_ASYMM
|
||||||
MTE_FAR
|
MTE_FAR
|
||||||
|
MTE_STORE_ONLY
|
||||||
SME
|
SME
|
||||||
SME_FA64
|
SME_FA64
|
||||||
SME2
|
SME2
|
||||||
|
|
|
||||||
|
|
@ -244,6 +244,8 @@ struct prctl_mm_map {
|
||||||
# define PR_MTE_TAG_MASK (0xffffUL << PR_MTE_TAG_SHIFT)
|
# define PR_MTE_TAG_MASK (0xffffUL << PR_MTE_TAG_SHIFT)
|
||||||
/* Unused; kept only for source compatibility */
|
/* Unused; kept only for source compatibility */
|
||||||
# define PR_MTE_TCF_SHIFT 1
|
# define PR_MTE_TCF_SHIFT 1
|
||||||
|
/* MTE tag check store only */
|
||||||
|
# define PR_MTE_STORE_ONLY (1UL << 19)
|
||||||
/* RISC-V pointer masking tag length */
|
/* RISC-V pointer masking tag length */
|
||||||
# define PR_PMLEN_SHIFT 24
|
# define PR_PMLEN_SHIFT 24
|
||||||
# define PR_PMLEN_MASK (0x7fUL << PR_PMLEN_SHIFT)
|
# define PR_PMLEN_MASK (0x7fUL << PR_PMLEN_SHIFT)
|
||||||
|
|
|
||||||
|
|
@ -1108,6 +1108,12 @@ static const struct hwcap_data {
|
||||||
.hwcap_bit = HWCAP3_MTE_FAR,
|
.hwcap_bit = HWCAP3_MTE_FAR,
|
||||||
.cpuinfo = "mtefar",
|
.cpuinfo = "mtefar",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "MTE_STOREONLY",
|
||||||
|
.at_hwcap = AT_HWCAP3,
|
||||||
|
.hwcap_bit = HWCAP3_MTE_STORE_ONLY,
|
||||||
|
.cpuinfo = "mtestoreonly",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*sighandler_fn)(int, siginfo_t *, void *);
|
typedef void (*sighandler_fn)(int, siginfo_t *, void *);
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ static int check_buffer_by_byte(int mem_type, int mode)
|
||||||
int i, j, item;
|
int i, j, item;
|
||||||
bool err;
|
bool err;
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
item = ARRAY_SIZE(sizes);
|
item = ARRAY_SIZE(sizes);
|
||||||
|
|
||||||
for (i = 0; i < item; i++) {
|
for (i = 0; i < item; i++) {
|
||||||
|
|
@ -68,7 +68,7 @@ static int check_buffer_underflow_by_byte(int mem_type, int mode,
|
||||||
bool err;
|
bool err;
|
||||||
char *und_ptr = NULL;
|
char *und_ptr = NULL;
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
item = ARRAY_SIZE(sizes);
|
item = ARRAY_SIZE(sizes);
|
||||||
for (i = 0; i < item; i++) {
|
for (i = 0; i < item; i++) {
|
||||||
ptr = (char *)mte_allocate_memory_tag_range(sizes[i], mem_type, 0,
|
ptr = (char *)mte_allocate_memory_tag_range(sizes[i], mem_type, 0,
|
||||||
|
|
@ -164,7 +164,7 @@ static int check_buffer_overflow_by_byte(int mem_type, int mode,
|
||||||
size_t tagged_size, overflow_size;
|
size_t tagged_size, overflow_size;
|
||||||
char *over_ptr = NULL;
|
char *over_ptr = NULL;
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
item = ARRAY_SIZE(sizes);
|
item = ARRAY_SIZE(sizes);
|
||||||
for (i = 0; i < item; i++) {
|
for (i = 0; i < item; i++) {
|
||||||
ptr = (char *)mte_allocate_memory_tag_range(sizes[i], mem_type, 0,
|
ptr = (char *)mte_allocate_memory_tag_range(sizes[i], mem_type, 0,
|
||||||
|
|
@ -337,7 +337,7 @@ static int check_buffer_by_block(int mem_type, int mode)
|
||||||
{
|
{
|
||||||
int i, item, result = KSFT_PASS;
|
int i, item, result = KSFT_PASS;
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
item = ARRAY_SIZE(sizes);
|
item = ARRAY_SIZE(sizes);
|
||||||
cur_mte_cxt.fault_valid = false;
|
cur_mte_cxt.fault_valid = false;
|
||||||
for (i = 0; i < item; i++) {
|
for (i = 0; i < item; i++) {
|
||||||
|
|
@ -368,7 +368,7 @@ static int check_memory_initial_tags(int mem_type, int mode, int mapping)
|
||||||
int run, fd;
|
int run, fd;
|
||||||
int total = ARRAY_SIZE(sizes);
|
int total = ARRAY_SIZE(sizes);
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
for (run = 0; run < total; run++) {
|
for (run = 0; run < total; run++) {
|
||||||
/* check initial tags for anonymous mmap */
|
/* check initial tags for anonymous mmap */
|
||||||
ptr = (char *)mte_allocate_memory(sizes[run], mem_type, mapping, false);
|
ptr = (char *)mte_allocate_memory(sizes[run], mem_type, mapping, false);
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ static int check_child_memory_mapping(int mem_type, int mode, int mapping)
|
||||||
int item = ARRAY_SIZE(sizes);
|
int item = ARRAY_SIZE(sizes);
|
||||||
|
|
||||||
item = ARRAY_SIZE(sizes);
|
item = ARRAY_SIZE(sizes);
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
for (run = 0; run < item; run++) {
|
for (run = 0; run < item; run++) {
|
||||||
ptr = (char *)mte_allocate_memory_tag_range(sizes[run], mem_type, mapping,
|
ptr = (char *)mte_allocate_memory_tag_range(sizes[run], mem_type, mapping,
|
||||||
UNDERFLOW, OVERFLOW);
|
UNDERFLOW, OVERFLOW);
|
||||||
|
|
@ -109,7 +109,7 @@ static int check_child_file_mapping(int mem_type, int mode, int mapping)
|
||||||
int run, fd, map_size, result = KSFT_PASS;
|
int run, fd, map_size, result = KSFT_PASS;
|
||||||
int total = ARRAY_SIZE(sizes);
|
int total = ARRAY_SIZE(sizes);
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
for (run = 0; run < total; run++) {
|
for (run = 0; run < total; run++) {
|
||||||
fd = create_temp_file();
|
fd = create_temp_file();
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ static int check_hugetlb_memory_mapping(int mem_type, int mode, int mapping, int
|
||||||
|
|
||||||
map_size = default_huge_page_size();
|
map_size = default_huge_page_size();
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
map_ptr = (char *)mte_allocate_memory(map_size, mem_type, mapping, false);
|
map_ptr = (char *)mte_allocate_memory(map_size, mem_type, mapping, false);
|
||||||
if (check_allocated_memory(map_ptr, map_size, mem_type, false) != KSFT_PASS)
|
if (check_allocated_memory(map_ptr, map_size, mem_type, false) != KSFT_PASS)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
|
|
@ -180,7 +180,7 @@ static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping)
|
||||||
unsigned long map_size;
|
unsigned long map_size;
|
||||||
|
|
||||||
prot_flag = PROT_READ | PROT_WRITE;
|
prot_flag = PROT_READ | PROT_WRITE;
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
map_size = default_huge_page_size();
|
map_size = default_huge_page_size();
|
||||||
map_ptr = (char *)mte_allocate_memory_tag_range(map_size, mem_type, mapping,
|
map_ptr = (char *)mte_allocate_memory_tag_range(map_size, mem_type, mapping,
|
||||||
0, 0);
|
0, 0);
|
||||||
|
|
@ -210,7 +210,7 @@ static int check_child_hugetlb_memory_mapping(int mem_type, int mode, int mappin
|
||||||
|
|
||||||
map_size = default_huge_page_size();
|
map_size = default_huge_page_size();
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
ptr = (char *)mte_allocate_memory_tag_range(map_size, mem_type, mapping,
|
ptr = (char *)mte_allocate_memory_tag_range(map_size, mem_type, mapping,
|
||||||
0, 0);
|
0, 0);
|
||||||
if (check_allocated_memory_range(ptr, map_size, mem_type,
|
if (check_allocated_memory_range(ptr, map_size, mem_type,
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ static int check_madvise_options(int mem_type, int mode, int mapping)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
ptr = mte_allocate_memory(TEST_UNIT * page_sz, mem_type, mapping, true);
|
ptr = mte_allocate_memory(TEST_UNIT * page_sz, mem_type, mapping, true);
|
||||||
if (check_allocated_memory(ptr, TEST_UNIT * page_sz, mem_type, false) != KSFT_PASS)
|
if (check_allocated_memory(ptr, TEST_UNIT * page_sz, mem_type, false) != KSFT_PASS)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,11 @@ enum mte_mem_check_type {
|
||||||
CHECK_CLEAR_PROT_MTE = 2,
|
CHECK_CLEAR_PROT_MTE = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum mte_tag_op_type {
|
||||||
|
TAG_OP_ALL = 0,
|
||||||
|
TAG_OP_STONLY = 1,
|
||||||
|
};
|
||||||
|
|
||||||
struct check_mmap_testcase {
|
struct check_mmap_testcase {
|
||||||
int check_type;
|
int check_type;
|
||||||
int mem_type;
|
int mem_type;
|
||||||
|
|
@ -42,17 +47,24 @@ struct check_mmap_testcase {
|
||||||
int mapping;
|
int mapping;
|
||||||
int tag_check;
|
int tag_check;
|
||||||
int atag_check;
|
int atag_check;
|
||||||
|
int tag_op;
|
||||||
bool enable_tco;
|
bool enable_tco;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define TAG_OP_ALL 0
|
||||||
|
#define TAG_OP_STONLY 1
|
||||||
|
|
||||||
static size_t page_size;
|
static size_t page_size;
|
||||||
static int sizes[] = {
|
static int sizes[] = {
|
||||||
1, 537, 989, 1269, MT_GRANULE_SIZE - 1, MT_GRANULE_SIZE,
|
1, 537, 989, 1269, MT_GRANULE_SIZE - 1, MT_GRANULE_SIZE,
|
||||||
/* page size - 1*/ 0, /* page_size */ 0, /* page size + 1 */ 0
|
/* page size - 1*/ 0, /* page_size */ 0, /* page size + 1 */ 0
|
||||||
};
|
};
|
||||||
|
|
||||||
static int check_mte_memory(char *ptr, int size, int mode, int tag_check, int atag_check)
|
static int check_mte_memory(char *ptr, int size, int mode,
|
||||||
|
int tag_check,int atag_check, int tag_op)
|
||||||
{
|
{
|
||||||
|
char buf[MT_GRANULE_SIZE];
|
||||||
|
|
||||||
if (!mtefar_support && atag_check == ATAG_CHECK_ON)
|
if (!mtefar_support && atag_check == ATAG_CHECK_ON)
|
||||||
return KSFT_SKIP;
|
return KSFT_SKIP;
|
||||||
|
|
||||||
|
|
@ -81,16 +93,34 @@ static int check_mte_memory(char *ptr, int size, int mode, int tag_check, int at
|
||||||
if (cur_mte_cxt.fault_valid == true && tag_check == TAG_CHECK_OFF)
|
if (cur_mte_cxt.fault_valid == true && tag_check == TAG_CHECK_OFF)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
|
|
||||||
|
if (tag_op == TAG_OP_STONLY) {
|
||||||
|
mte_initialize_current_context(mode, (uintptr_t)ptr, -UNDERFLOW);
|
||||||
|
memcpy(buf, ptr - UNDERFLOW, MT_GRANULE_SIZE);
|
||||||
|
mte_wait_after_trig();
|
||||||
|
if (cur_mte_cxt.fault_valid == true)
|
||||||
|
return KSFT_FAIL;
|
||||||
|
|
||||||
|
mte_initialize_current_context(mode, (uintptr_t)ptr, size + OVERFLOW);
|
||||||
|
memcpy(buf, ptr + size, MT_GRANULE_SIZE);
|
||||||
|
mte_wait_after_trig();
|
||||||
|
if (cur_mte_cxt.fault_valid == true)
|
||||||
|
return KSFT_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
return KSFT_PASS;
|
return KSFT_PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int check_anonymous_memory_mapping(int mem_type, int mode, int mapping, int tag_check, int atag_check)
|
static int check_anonymous_memory_mapping(int mem_type, int mode, int mapping,
|
||||||
|
int tag_check, int atag_check, int tag_op)
|
||||||
{
|
{
|
||||||
char *ptr, *map_ptr;
|
char *ptr, *map_ptr;
|
||||||
int run, result, map_size;
|
int run, result, map_size;
|
||||||
int item = ARRAY_SIZE(sizes);
|
int item = ARRAY_SIZE(sizes);
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
if (tag_op == TAG_OP_STONLY && !mtestonly_support)
|
||||||
|
return KSFT_SKIP;
|
||||||
|
|
||||||
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, tag_op);
|
||||||
for (run = 0; run < item; run++) {
|
for (run = 0; run < item; run++) {
|
||||||
map_size = sizes[run] + OVERFLOW + UNDERFLOW;
|
map_size = sizes[run] + OVERFLOW + UNDERFLOW;
|
||||||
map_ptr = (char *)mte_allocate_memory(map_size, mem_type, mapping, false);
|
map_ptr = (char *)mte_allocate_memory(map_size, mem_type, mapping, false);
|
||||||
|
|
@ -106,7 +136,7 @@ static int check_anonymous_memory_mapping(int mem_type, int mode, int mapping, i
|
||||||
munmap((void *)map_ptr, map_size);
|
munmap((void *)map_ptr, map_size);
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
}
|
}
|
||||||
result = check_mte_memory(ptr, sizes[run], mode, tag_check, atag_check);
|
result = check_mte_memory(ptr, sizes[run], mode, tag_check, atag_check, tag_op);
|
||||||
mte_clear_tags((void *)ptr, sizes[run]);
|
mte_clear_tags((void *)ptr, sizes[run]);
|
||||||
mte_free_memory((void *)map_ptr, map_size, mem_type, false);
|
mte_free_memory((void *)map_ptr, map_size, mem_type, false);
|
||||||
if (result != KSFT_PASS)
|
if (result != KSFT_PASS)
|
||||||
|
|
@ -115,14 +145,18 @@ static int check_anonymous_memory_mapping(int mem_type, int mode, int mapping, i
|
||||||
return KSFT_PASS;
|
return KSFT_PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int check_file_memory_mapping(int mem_type, int mode, int mapping, int tag_check, int atag_check)
|
static int check_file_memory_mapping(int mem_type, int mode, int mapping,
|
||||||
|
int tag_check, int atag_check, int tag_op)
|
||||||
{
|
{
|
||||||
char *ptr, *map_ptr;
|
char *ptr, *map_ptr;
|
||||||
int run, fd, map_size;
|
int run, fd, map_size;
|
||||||
int total = ARRAY_SIZE(sizes);
|
int total = ARRAY_SIZE(sizes);
|
||||||
int result = KSFT_PASS;
|
int result = KSFT_PASS;
|
||||||
|
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
if (tag_op == TAG_OP_STONLY && !mtestonly_support)
|
||||||
|
return KSFT_SKIP;
|
||||||
|
|
||||||
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, tag_op);
|
||||||
for (run = 0; run < total; run++) {
|
for (run = 0; run < total; run++) {
|
||||||
fd = create_temp_file();
|
fd = create_temp_file();
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
|
|
@ -144,7 +178,7 @@ static int check_file_memory_mapping(int mem_type, int mode, int mapping, int ta
|
||||||
close(fd);
|
close(fd);
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
}
|
}
|
||||||
result = check_mte_memory(ptr, sizes[run], mode, tag_check, atag_check);
|
result = check_mte_memory(ptr, sizes[run], mode, tag_check, atag_check, tag_op);
|
||||||
mte_clear_tags((void *)ptr, sizes[run]);
|
mte_clear_tags((void *)ptr, sizes[run]);
|
||||||
munmap((void *)map_ptr, map_size);
|
munmap((void *)map_ptr, map_size);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
@ -161,7 +195,7 @@ static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping, int at
|
||||||
int total = ARRAY_SIZE(sizes);
|
int total = ARRAY_SIZE(sizes);
|
||||||
|
|
||||||
prot_flag = PROT_READ | PROT_WRITE;
|
prot_flag = PROT_READ | PROT_WRITE;
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
for (run = 0; run < total; run++) {
|
for (run = 0; run < total; run++) {
|
||||||
map_size = sizes[run] + OVERFLOW + UNDERFLOW;
|
map_size = sizes[run] + OVERFLOW + UNDERFLOW;
|
||||||
ptr = (char *)mte_allocate_memory_tag_range(sizes[run], mem_type, mapping,
|
ptr = (char *)mte_allocate_memory_tag_range(sizes[run], mem_type, mapping,
|
||||||
|
|
@ -177,10 +211,10 @@ static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping, int at
|
||||||
ksft_print_msg("FAIL: mprotect not ignoring clear PROT_MTE property\n");
|
ksft_print_msg("FAIL: mprotect not ignoring clear PROT_MTE property\n");
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
}
|
}
|
||||||
result = check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON, atag_check);
|
result = check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON, atag_check, TAG_OP_ALL);
|
||||||
mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, OVERFLOW);
|
mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, OVERFLOW);
|
||||||
if (result != KSFT_PASS)
|
if (result != KSFT_PASS)
|
||||||
return KSFT_FAIL;
|
return result;
|
||||||
|
|
||||||
fd = create_temp_file();
|
fd = create_temp_file();
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
|
|
@ -201,7 +235,7 @@ static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping, int at
|
||||||
close(fd);
|
close(fd);
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
}
|
}
|
||||||
result = check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON, atag_check);
|
result = check_mte_memory(ptr, sizes[run], mode, TAG_CHECK_ON, atag_check, TAG_OP_ALL);
|
||||||
mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, OVERFLOW);
|
mte_free_memory_tag_range((void *)ptr, sizes[run], mem_type, UNDERFLOW, OVERFLOW);
|
||||||
close(fd);
|
close(fd);
|
||||||
if (result != KSFT_PASS)
|
if (result != KSFT_PASS)
|
||||||
|
|
@ -219,6 +253,7 @@ const char *format_test_name(struct check_mmap_testcase *tc)
|
||||||
const char *mapping_str;
|
const char *mapping_str;
|
||||||
const char *tag_check_str;
|
const char *tag_check_str;
|
||||||
const char *atag_check_str;
|
const char *atag_check_str;
|
||||||
|
const char *tag_op_str;
|
||||||
|
|
||||||
switch (tc->check_type) {
|
switch (tc->check_type) {
|
||||||
case CHECK_ANON_MEM:
|
case CHECK_ANON_MEM:
|
||||||
|
|
@ -303,6 +338,23 @@ const char *format_test_name(struct check_mmap_testcase *tc)
|
||||||
check_type_str, mapping_str, sync_str, mem_type_str,
|
check_type_str, mapping_str, sync_str, mem_type_str,
|
||||||
tag_check_str, atag_check_str);
|
tag_check_str, atag_check_str);
|
||||||
|
|
||||||
|
switch (tc->tag_op) {
|
||||||
|
case TAG_OP_ALL:
|
||||||
|
tag_op_str = "";
|
||||||
|
break;
|
||||||
|
case TAG_OP_STONLY:
|
||||||
|
tag_op_str = " / store-only";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(test_name, TEST_NAME_MAX,
|
||||||
|
"Check %s with %s mapping, %s mode, %s memory and %s (%s%s)\n",
|
||||||
|
check_type_str, mapping_str, sync_str, mem_type_str,
|
||||||
|
tag_check_str, atag_check_str, tag_op_str);
|
||||||
|
|
||||||
return test_name;
|
return test_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -318,6 +370,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_OFF,
|
.tag_check = TAG_CHECK_OFF,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = true,
|
.enable_tco = true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -327,6 +380,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_OFF,
|
.tag_check = TAG_CHECK_OFF,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = true,
|
.enable_tco = true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -336,6 +390,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_OFF,
|
.tag_check = TAG_CHECK_OFF,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -345,6 +400,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_OFF,
|
.tag_check = TAG_CHECK_OFF,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -354,6 +410,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -363,6 +420,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -372,6 +430,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -381,6 +440,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -390,6 +450,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -399,6 +460,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -408,6 +470,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -417,6 +480,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -426,6 +490,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -435,6 +500,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -444,6 +510,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -453,6 +520,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -462,6 +530,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -471,6 +540,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -480,6 +550,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -489,6 +560,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -498,6 +570,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -507,6 +580,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_OFF,
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -516,6 +590,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -525,6 +600,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -534,6 +610,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -543,6 +620,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -552,6 +630,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -561,6 +640,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -570,6 +650,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -579,6 +660,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_SHARED,
|
.mapping = MAP_SHARED,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -588,6 +670,257 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_OFF,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_ANON_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MPROTECT,
|
||||||
|
.mte_sync = MTE_SYNC_ERR,
|
||||||
|
.mapping = MAP_SHARED,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
|
.enable_tco = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.check_type = CHECK_FILE_MEM,
|
||||||
|
.mem_type = USE_MMAP,
|
||||||
|
.mte_sync = MTE_ASYNC_ERR,
|
||||||
|
.mapping = MAP_PRIVATE,
|
||||||
|
.tag_check = TAG_CHECK_ON,
|
||||||
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_STONLY,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -597,6 +930,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -606,6 +940,7 @@ int main(int argc, char *argv[])
|
||||||
.mapping = MAP_PRIVATE,
|
.mapping = MAP_PRIVATE,
|
||||||
.tag_check = TAG_CHECK_ON,
|
.tag_check = TAG_CHECK_ON,
|
||||||
.atag_check = ATAG_CHECK_ON,
|
.atag_check = ATAG_CHECK_ON,
|
||||||
|
.tag_op = TAG_OP_ALL,
|
||||||
.enable_tco = false,
|
.enable_tco = false,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
@ -643,7 +978,8 @@ int main(int argc, char *argv[])
|
||||||
test_cases[i].mte_sync,
|
test_cases[i].mte_sync,
|
||||||
test_cases[i].mapping,
|
test_cases[i].mapping,
|
||||||
test_cases[i].tag_check,
|
test_cases[i].tag_check,
|
||||||
test_cases[i].atag_check),
|
test_cases[i].atag_check,
|
||||||
|
test_cases[i].tag_op),
|
||||||
format_test_name(&test_cases[i]));
|
format_test_name(&test_cases[i]));
|
||||||
break;
|
break;
|
||||||
case CHECK_FILE_MEM:
|
case CHECK_FILE_MEM:
|
||||||
|
|
@ -651,7 +987,8 @@ int main(int argc, char *argv[])
|
||||||
test_cases[i].mte_sync,
|
test_cases[i].mte_sync,
|
||||||
test_cases[i].mapping,
|
test_cases[i].mapping,
|
||||||
test_cases[i].tag_check,
|
test_cases[i].tag_check,
|
||||||
test_cases[i].atag_check),
|
test_cases[i].atag_check,
|
||||||
|
test_cases[i].tag_op),
|
||||||
format_test_name(&test_cases[i]));
|
format_test_name(&test_cases[i]));
|
||||||
break;
|
break;
|
||||||
case CHECK_CLEAR_PROT_MTE:
|
case CHECK_CLEAR_PROT_MTE:
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ void check_basic_read(void)
|
||||||
/*
|
/*
|
||||||
* Attempt to set a specified combination of modes.
|
* Attempt to set a specified combination of modes.
|
||||||
*/
|
*/
|
||||||
void set_mode_test(const char *name, int hwcap2, int mask)
|
void set_mode_test(const char *name, int hwcap2, int hwcap3, int mask)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
@ -73,6 +73,11 @@ void set_mode_test(const char *name, int hwcap2, int mask)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((getauxval(AT_HWCAP3) & hwcap3) != hwcap3) {
|
||||||
|
ksft_test_result_skip("%s\n", name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ret = set_tagged_addr_ctrl(mask);
|
ret = set_tagged_addr_ctrl(mask);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ksft_test_result_fail("%s\n", name);
|
ksft_test_result_fail("%s\n", name);
|
||||||
|
|
@ -85,7 +90,7 @@ void set_mode_test(const char *name, int hwcap2, int mask)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret & PR_MTE_TCF_MASK) == mask) {
|
if ((ret & (PR_MTE_TCF_MASK | PR_MTE_STORE_ONLY)) == mask) {
|
||||||
ksft_test_result_pass("%s\n", name);
|
ksft_test_result_pass("%s\n", name);
|
||||||
} else {
|
} else {
|
||||||
ksft_print_msg("Got %x, expected %x\n",
|
ksft_print_msg("Got %x, expected %x\n",
|
||||||
|
|
@ -97,12 +102,16 @@ void set_mode_test(const char *name, int hwcap2, int mask)
|
||||||
struct mte_mode {
|
struct mte_mode {
|
||||||
int mask;
|
int mask;
|
||||||
int hwcap2;
|
int hwcap2;
|
||||||
|
int hwcap3;
|
||||||
const char *name;
|
const char *name;
|
||||||
} mte_modes[] = {
|
} mte_modes[] = {
|
||||||
{ PR_MTE_TCF_NONE, 0, "NONE" },
|
{ PR_MTE_TCF_NONE, 0, 0, "NONE" },
|
||||||
{ PR_MTE_TCF_SYNC, HWCAP2_MTE, "SYNC" },
|
{ PR_MTE_TCF_SYNC, HWCAP2_MTE, 0, "SYNC" },
|
||||||
{ PR_MTE_TCF_ASYNC, HWCAP2_MTE, "ASYNC" },
|
{ PR_MTE_TCF_ASYNC, HWCAP2_MTE, 0, "ASYNC" },
|
||||||
{ PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC, HWCAP2_MTE, "SYNC+ASYNC" },
|
{ PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC, HWCAP2_MTE, 0, "SYNC+ASYNC" },
|
||||||
|
{ PR_MTE_TCF_SYNC | PR_MTE_STORE_ONLY, HWCAP2_MTE, HWCAP3_MTE_STORE_ONLY, "SYNC+STONLY" },
|
||||||
|
{ PR_MTE_TCF_ASYNC | PR_MTE_STORE_ONLY, HWCAP2_MTE, HWCAP3_MTE_STORE_ONLY, "ASYNC+STONLY" },
|
||||||
|
{ PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC | PR_MTE_STORE_ONLY, HWCAP2_MTE, HWCAP3_MTE_STORE_ONLY, "SYNC+ASYNC+STONLY" },
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
|
|
@ -110,11 +119,11 @@ int main(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ksft_print_header();
|
ksft_print_header();
|
||||||
ksft_set_plan(5);
|
ksft_set_plan(ARRAY_SIZE(mte_modes));
|
||||||
|
|
||||||
check_basic_read();
|
check_basic_read();
|
||||||
for (i = 0; i < ARRAY_SIZE(mte_modes); i++)
|
for (i = 0; i < ARRAY_SIZE(mte_modes); i++)
|
||||||
set_mode_test(mte_modes[i].name, mte_modes[i].hwcap2,
|
set_mode_test(mte_modes[i].name, mte_modes[i].hwcap2, mte_modes[i].hwcap3,
|
||||||
mte_modes[i].mask);
|
mte_modes[i].mask);
|
||||||
|
|
||||||
ksft_print_cnts();
|
ksft_print_cnts();
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ static int check_single_included_tags(int mem_type, int mode)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
|
|
||||||
for (tag = 0; (tag < MT_TAG_COUNT) && (result == KSFT_PASS); tag++) {
|
for (tag = 0; (tag < MT_TAG_COUNT) && (result == KSFT_PASS); tag++) {
|
||||||
ret = mte_switch_mode(mode, MT_INCLUDE_VALID_TAG(tag));
|
ret = mte_switch_mode(mode, MT_INCLUDE_VALID_TAG(tag), false);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
result = KSFT_FAIL;
|
result = KSFT_FAIL;
|
||||||
/* Try to catch a excluded tag by a number of tries. */
|
/* Try to catch a excluded tag by a number of tries. */
|
||||||
|
|
@ -91,7 +91,7 @@ static int check_multiple_included_tags(int mem_type, int mode)
|
||||||
|
|
||||||
for (tag = 0; (tag < MT_TAG_COUNT - 1) && (result == KSFT_PASS); tag++) {
|
for (tag = 0; (tag < MT_TAG_COUNT - 1) && (result == KSFT_PASS); tag++) {
|
||||||
excl_mask |= 1 << tag;
|
excl_mask |= 1 << tag;
|
||||||
mte_switch_mode(mode, MT_INCLUDE_VALID_TAGS(excl_mask));
|
mte_switch_mode(mode, MT_INCLUDE_VALID_TAGS(excl_mask), false);
|
||||||
/* Try to catch a excluded tag by a number of tries. */
|
/* Try to catch a excluded tag by a number of tries. */
|
||||||
for (run = 0; (run < RUNS) && (result == KSFT_PASS); run++) {
|
for (run = 0; (run < RUNS) && (result == KSFT_PASS); run++) {
|
||||||
ptr = mte_insert_tags(ptr, BUFFER_SIZE);
|
ptr = mte_insert_tags(ptr, BUFFER_SIZE);
|
||||||
|
|
@ -120,7 +120,7 @@ static int check_all_included_tags(int mem_type, int mode)
|
||||||
mem_type, false) != KSFT_PASS)
|
mem_type, false) != KSFT_PASS)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
|
|
||||||
ret = mte_switch_mode(mode, MT_INCLUDE_TAG_MASK);
|
ret = mte_switch_mode(mode, MT_INCLUDE_TAG_MASK, false);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
/* Try to catch a excluded tag by a number of tries. */
|
/* Try to catch a excluded tag by a number of tries. */
|
||||||
|
|
@ -145,7 +145,7 @@ static int check_none_included_tags(int mem_type, int mode)
|
||||||
if (check_allocated_memory(ptr, BUFFER_SIZE, mem_type, false) != KSFT_PASS)
|
if (check_allocated_memory(ptr, BUFFER_SIZE, mem_type, false) != KSFT_PASS)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
|
|
||||||
ret = mte_switch_mode(mode, MT_EXCLUDE_TAG_MASK);
|
ret = mte_switch_mode(mode, MT_EXCLUDE_TAG_MASK, false);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
/* Try to catch a excluded tag by a number of tries. */
|
/* Try to catch a excluded tag by a number of tries. */
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ static int check_usermem_access_fault(int mem_type, int mode, int mapping,
|
||||||
|
|
||||||
err = KSFT_PASS;
|
err = KSFT_PASS;
|
||||||
len = 2 * page_sz;
|
len = 2 * page_sz;
|
||||||
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG, false);
|
||||||
fd = create_temp_file();
|
fd = create_temp_file();
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return KSFT_FAIL;
|
return KSFT_FAIL;
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,10 @@
|
||||||
|
|
||||||
struct mte_fault_cxt cur_mte_cxt;
|
struct mte_fault_cxt cur_mte_cxt;
|
||||||
bool mtefar_support;
|
bool mtefar_support;
|
||||||
|
bool mtestonly_support;
|
||||||
static unsigned int mte_cur_mode;
|
static unsigned int mte_cur_mode;
|
||||||
static unsigned int mte_cur_pstate_tco;
|
static unsigned int mte_cur_pstate_tco;
|
||||||
|
static bool mte_cur_stonly;
|
||||||
|
|
||||||
void mte_default_handler(int signum, siginfo_t *si, void *uc)
|
void mte_default_handler(int signum, siginfo_t *si, void *uc)
|
||||||
{
|
{
|
||||||
|
|
@ -314,7 +316,7 @@ void mte_initialize_current_context(int mode, uintptr_t ptr, ssize_t range)
|
||||||
cur_mte_cxt.trig_si_code = 0;
|
cur_mte_cxt.trig_si_code = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mte_switch_mode(int mte_option, unsigned long incl_mask)
|
int mte_switch_mode(int mte_option, unsigned long incl_mask, bool stonly)
|
||||||
{
|
{
|
||||||
unsigned long en = 0;
|
unsigned long en = 0;
|
||||||
|
|
||||||
|
|
@ -346,6 +348,9 @@ int mte_switch_mode(int mte_option, unsigned long incl_mask)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mtestonly_support && stonly)
|
||||||
|
en |= PR_MTE_STORE_ONLY;
|
||||||
|
|
||||||
en |= (incl_mask << PR_MTE_TAG_SHIFT);
|
en |= (incl_mask << PR_MTE_TAG_SHIFT);
|
||||||
/* Enable address tagging ABI, mte error reporting mode and tag inclusion mask. */
|
/* Enable address tagging ABI, mte error reporting mode and tag inclusion mask. */
|
||||||
if (prctl(PR_SET_TAGGED_ADDR_CTRL, en, 0, 0, 0) != 0) {
|
if (prctl(PR_SET_TAGGED_ADDR_CTRL, en, 0, 0, 0) != 0) {
|
||||||
|
|
@ -370,6 +375,9 @@ int mte_default_setup(void)
|
||||||
|
|
||||||
mtefar_support = !!(hwcaps3 & HWCAP3_MTE_FAR);
|
mtefar_support = !!(hwcaps3 & HWCAP3_MTE_FAR);
|
||||||
|
|
||||||
|
if (hwcaps3 & HWCAP3_MTE_STORE_ONLY)
|
||||||
|
mtestonly_support = true;
|
||||||
|
|
||||||
/* Get current mte mode */
|
/* Get current mte mode */
|
||||||
ret = prctl(PR_GET_TAGGED_ADDR_CTRL, en, 0, 0, 0);
|
ret = prctl(PR_GET_TAGGED_ADDR_CTRL, en, 0, 0, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
@ -383,6 +391,8 @@ int mte_default_setup(void)
|
||||||
else if (ret & PR_MTE_TCF_NONE)
|
else if (ret & PR_MTE_TCF_NONE)
|
||||||
mte_cur_mode = MTE_NONE_ERR;
|
mte_cur_mode = MTE_NONE_ERR;
|
||||||
|
|
||||||
|
mte_cur_stonly = (ret & PR_MTE_STORE_ONLY) ? true : false;
|
||||||
|
|
||||||
mte_cur_pstate_tco = mte_get_pstate_tco();
|
mte_cur_pstate_tco = mte_get_pstate_tco();
|
||||||
/* Disable PSTATE.TCO */
|
/* Disable PSTATE.TCO */
|
||||||
mte_disable_pstate_tco();
|
mte_disable_pstate_tco();
|
||||||
|
|
@ -391,7 +401,7 @@ int mte_default_setup(void)
|
||||||
|
|
||||||
void mte_restore_setup(void)
|
void mte_restore_setup(void)
|
||||||
{
|
{
|
||||||
mte_switch_mode(mte_cur_mode, MTE_ALLOW_NON_ZERO_TAG);
|
mte_switch_mode(mte_cur_mode, MTE_ALLOW_NON_ZERO_TAG, mte_cur_stonly);
|
||||||
if (mte_cur_pstate_tco == MT_PSTATE_TCO_EN)
|
if (mte_cur_pstate_tco == MT_PSTATE_TCO_EN)
|
||||||
mte_enable_pstate_tco();
|
mte_enable_pstate_tco();
|
||||||
else if (mte_cur_pstate_tco == MT_PSTATE_TCO_DIS)
|
else if (mte_cur_pstate_tco == MT_PSTATE_TCO_DIS)
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@ struct mte_fault_cxt {
|
||||||
|
|
||||||
extern struct mte_fault_cxt cur_mte_cxt;
|
extern struct mte_fault_cxt cur_mte_cxt;
|
||||||
extern bool mtefar_support;
|
extern bool mtefar_support;
|
||||||
|
extern bool mtestonly_support;
|
||||||
|
|
||||||
/* MTE utility functions */
|
/* MTE utility functions */
|
||||||
void mte_default_handler(int signum, siginfo_t *si, void *uc);
|
void mte_default_handler(int signum, siginfo_t *si, void *uc);
|
||||||
|
|
@ -60,7 +61,7 @@ void *mte_insert_atag(void *ptr);
|
||||||
void *mte_clear_atag(void *ptr);
|
void *mte_clear_atag(void *ptr);
|
||||||
int mte_default_setup(void);
|
int mte_default_setup(void);
|
||||||
void mte_restore_setup(void);
|
void mte_restore_setup(void);
|
||||||
int mte_switch_mode(int mte_option, unsigned long incl_mask);
|
int mte_switch_mode(int mte_option, unsigned long incl_mask, bool stonly);
|
||||||
void mte_initialize_current_context(int mode, uintptr_t ptr, ssize_t range);
|
void mte_initialize_current_context(int mode, uintptr_t ptr, ssize_t range);
|
||||||
|
|
||||||
/* Common utility functions */
|
/* Common utility functions */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue