linux-user/aarch64: Implement PROT_MTE
Remember the PROT_MTE bit as PAGE_MTE/PAGE_TARGET_2. Otherwise this does not yet have effect. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210212184902.1251044-25-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
bfd0572f43
commit
d109b46d8d
@ -276,6 +276,7 @@ extern intptr_t qemu_host_page_mask;
|
|||||||
#endif
|
#endif
|
||||||
/* Target-specific bits that will be used via page_get_flags(). */
|
/* Target-specific bits that will be used via page_get_flags(). */
|
||||||
#define PAGE_TARGET_1 0x0080
|
#define PAGE_TARGET_1 0x0080
|
||||||
|
#define PAGE_TARGET_2 0x0200
|
||||||
|
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
void page_dump(FILE *f);
|
void page_dump(FILE *f);
|
||||||
|
@ -84,18 +84,24 @@ static int validate_prot_to_pageflags(int *host_prot, int prot)
|
|||||||
| (prot & PROT_EXEC ? PROT_READ : 0);
|
| (prot & PROT_EXEC ? PROT_READ : 0);
|
||||||
|
|
||||||
#ifdef TARGET_AARCH64
|
#ifdef TARGET_AARCH64
|
||||||
|
{
|
||||||
|
ARMCPU *cpu = ARM_CPU(thread_cpu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The PROT_BTI bit is only accepted if the cpu supports the feature.
|
* The PROT_BTI bit is only accepted if the cpu supports the feature.
|
||||||
* Since this is the unusual case, don't bother checking unless
|
* Since this is the unusual case, don't bother checking unless
|
||||||
* the bit has been requested. If set and valid, record the bit
|
* the bit has been requested. If set and valid, record the bit
|
||||||
* within QEMU's page_flags.
|
* within QEMU's page_flags.
|
||||||
*/
|
*/
|
||||||
if (prot & TARGET_PROT_BTI) {
|
if ((prot & TARGET_PROT_BTI) && cpu_isar_feature(aa64_bti, cpu)) {
|
||||||
ARMCPU *cpu = ARM_CPU(thread_cpu);
|
|
||||||
if (cpu_isar_feature(aa64_bti, cpu)) {
|
|
||||||
valid |= TARGET_PROT_BTI;
|
valid |= TARGET_PROT_BTI;
|
||||||
page_flags |= PAGE_BTI;
|
page_flags |= PAGE_BTI;
|
||||||
}
|
}
|
||||||
|
/* Similarly for the PROT_MTE bit. */
|
||||||
|
if ((prot & TARGET_PROT_MTE) && cpu_isar_feature(aa64_mte, cpu)) {
|
||||||
|
valid |= TARGET_PROT_MTE;
|
||||||
|
page_flags |= PAGE_MTE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1311,6 +1311,7 @@ struct target_winsize {
|
|||||||
|
|
||||||
#ifdef TARGET_AARCH64
|
#ifdef TARGET_AARCH64
|
||||||
#define TARGET_PROT_BTI 0x10
|
#define TARGET_PROT_BTI 0x10
|
||||||
|
#define TARGET_PROT_MTE 0x20
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Common */
|
/* Common */
|
||||||
|
@ -3608,6 +3608,7 @@ static inline MemTxAttrs *typecheck_memtxattrs(MemTxAttrs *x)
|
|||||||
* AArch64 usage of the PAGE_TARGET_* bits for linux-user.
|
* AArch64 usage of the PAGE_TARGET_* bits for linux-user.
|
||||||
*/
|
*/
|
||||||
#define PAGE_BTI PAGE_TARGET_1
|
#define PAGE_BTI PAGE_TARGET_1
|
||||||
|
#define PAGE_MTE PAGE_TARGET_2
|
||||||
|
|
||||||
#ifdef TARGET_TAGGED_ADDRESSES
|
#ifdef TARGET_TAGGED_ADDRESSES
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user