diff options
| author | Andrew Turner <andrew@FreeBSD.org> | 2022-03-26 15:59:34 +0000 |
|---|---|---|
| committer | Andrew Turner <andrew@FreeBSD.org> | 2022-03-28 09:10:15 +0000 |
| commit | 029c1c4828aab451ba262cd4e2e1d9362cf18b76 (patch) | |
| tree | e20e7d86c34c79548258d8f5f51bdff9023231f6 | |
| parent | 7afec5182a6385aaac91ea33a88e64b3a4363897 (diff) | |
| download | src-029c1c4828aab451ba262cd4e2e1d9362cf18b76.tar.gz src-029c1c4828aab451ba262cd4e2e1d9362cf18b76.zip | |
Treat cache write as a read in arm64 data faults
On arm64 we can ask the hardware to perform cache operations from
userspace. These require read permission however when the memory is
unmapped the kernel will receive a write exception. Add a check to
see if the cause of the exception is from the cache and pass a memory
read fault type to the vm subsystem.
PR: 262836
Reported by: dch
Sponsored by: The FreeBSD Foundation
| -rw-r--r-- | sys/arm64/arm64/trap.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c index fa921e39b844..226f69592952 100644 --- a/sys/arm64/arm64/trap.c +++ b/sys/arm64/arm64/trap.c @@ -318,8 +318,16 @@ data_abort(struct thread *td, struct trapframe *frame, uint64_t esr, ftype = VM_PROT_EXECUTE; break; default: - ftype = (esr & ISS_DATA_WnR) == 0 ? VM_PROT_READ : - VM_PROT_WRITE; + /* + * If the exception was because of a read or cache operation + * pass a read fault type into the vm code. Cache operations + * need read permission but will set the WnR flag when the + * memory is unmapped. + */ + if ((esr & ISS_DATA_WnR) == 0 || (esr & ISS_DATA_CM) != 0) + ftype = VM_PROT_READ; + else + ftype = VM_PROT_WRITE; break; } |
