if (max_pmlen == 0)
ksft_exit_fail_msg("Failed to enable pointer masking\n");
}
staticint set_tagged_addr_ctrl(int pmlen, bool tagged_addr_abi)
{ int arg, ret;
arg = pmlen << PR_PMLEN_SHIFT | tagged_addr_abi;
ret = prctl(PR_SET_TAGGED_ADDR_CTRL, arg, 0, 0, 0); if (!ret) {
ret = prctl(PR_GET_TAGGED_ADDR_CTRL, 0, 0, 0, 0); if (ret == arg) return 0;
}
return ret < 0 ? -errno : -ENODATA;
}
staticvoid test_dereference_pmlen(int pmlen)
{ staticvolatileint i; volatileint *p; int ret;
ret = set_tagged_addr_ctrl(pmlen, false); if (ret) return ksft_test_result_error("PMLEN=%d setup (%d)\n", pmlen, ret);
i = pmlen;
if (pmlen) {
p = (volatileint *)((uintptr_t)&i | 1UL << (__riscv_xlen - pmlen));
/* These dereferences should succeed. */ if (sigsetjmp(jmpbuf, 1)) return ksft_test_result_fail("PMLEN=%d valid tag\n", pmlen); if (*p != pmlen) return ksft_test_result_fail("PMLEN=%d bad value\n", pmlen);
++*p;
}
staticbool pwrite_wrapper(int fd, void *buf, size_t count, constchar *msg)
{ int ret = pwrite(fd, buf, count, 0);
if (ret != count) {
ksft_perror(msg); returnfalse;
} returntrue;
}
staticvoid test_tagged_addr_abi_sysctl(void)
{ char *err_pwrite_msg = "failed to write to /proc/sys/abi/tagged_addr_disabled\n"; char value; int fd;
ksft_print_msg("Testing tagged address ABI sysctl\n");
fd = open("/proc/sys/abi/tagged_addr_disabled", O_WRONLY); if (fd < 0) {
ksft_test_result_skip("failed to open sysctl file\n");
ksft_test_result_skip("failed to open sysctl file\n"); return;
}
value = '1'; if (!pwrite_wrapper(fd, &value, 1, "write '1'"))
ksft_test_result_fail(err_pwrite_msg); else
ksft_test_result(set_tagged_addr_ctrl(min_pmlen, true) == -EINVAL, "sysctl disabled\n");
value = '0'; if (!pwrite_wrapper(fd, &value, 1, "write '0'"))
ksft_test_result_fail(err_pwrite_msg); else
ksft_test_result(set_tagged_addr_ctrl(min_pmlen, true) == 0, "sysctl enabled\n");
set_tagged_addr_ctrl(0, false);
close(fd);
}
staticvoid test_tagged_addr_abi_pmlen(int pmlen)
{ int i, *p, ret;
i = ~pmlen;
if (pmlen) {
p = (int *)((uintptr_t)&i | 1UL << (__riscv_xlen - pmlen));
ret = set_tagged_addr_ctrl(pmlen, false); if (ret) return ksft_test_result_error("PMLEN=%d ABI disabled setup (%d)\n",
pmlen, ret);
ret = write(pipefd[1], p, sizeof(*p)); if (ret >= 0 || errno != EFAULT) return ksft_test_result_fail("PMLEN=%d ABI disabled write\n", pmlen);
ret = read(dev_zero, p, sizeof(*p)); if (ret >= 0 || errno != EFAULT) return ksft_test_result_fail("PMLEN=%d ABI disabled read\n", pmlen);
if (i != ~pmlen) return ksft_test_result_fail("PMLEN=%d ABI disabled value\n", pmlen);
ret = set_tagged_addr_ctrl(pmlen, true); if (ret) return ksft_test_result_error("PMLEN=%d ABI enabled setup (%d)\n",
pmlen, ret);
ret = write(pipefd[1], p, sizeof(*p)); if (ret != sizeof(*p)) return ksft_test_result_fail("PMLEN=%d ABI enabled write\n", pmlen);
ret = read(dev_zero, p, sizeof(*p)); if (ret != sizeof(*p)) return ksft_test_result_fail("PMLEN=%d ABI enabled read\n", pmlen);
if (i) return ksft_test_result_fail("PMLEN=%d ABI enabled value\n", pmlen);
i = ~pmlen;
} else { /* The tagged address ABI cannot be enabled when PMLEN == 0. */
ret = set_tagged_addr_ctrl(pmlen, true); if (ret != -EINVAL) return ksft_test_result_error("PMLEN=%d ABI setup (%d)\n",
pmlen, ret);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.