google / google/android-riscv64

kernel: can't distinguish read vs write for faults?

Open
#118 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
No language data
Stars
254
Forks
20
PR merge metrics
No merged PRs in 30d

Description

https://android-review.googlesource.com/c/platform/system/core/+/2812873 distinguishes between reads and writes for everything except rv64, where there doesn't seem to be a way?
```
static ReadOrWrite get_read_or_write(__attribute__((unused)) ucontext_t* ucontext) {
#if defined(__x86_64__) || defined(__i386__)
static const uintptr_t PF_WRITE = 1U << 1;
uintptr_t err = ucontext->uc_mcontext.gregs[REG_ERR];
return err & PF_WRITE ? ReadOrWrite::WRITE : ReadOrWrite::READ;
#elif defined(__arm__)
static const uintptr_t FSR_WRITE = 1U << 11;
uintptr_t fsr = ucontext->uc_mcontext.error_code;
return fsr & FSR_WRITE ? ReadOrWrite::WRITE : ReadOrWrite::READ;
#elif defined(__aarch64__)
static const uint64_t ESR_ELx_WNR = 1U << 6;
static const uint32_t kEsrMagic = 0x45535201;
uint8_t* aux = reinterpret_cast(ucontext->uc_mcontext.__reserved);
while (true) {
_aarch64_ctx* ctx = reinterpret_cast<_aarch64_ctx*>(aux);
if (ctx->size == 0) return ReadOrWrite::UNKNOWN;
if (ctx->magic == kEsrMagic) {
uint64_t esr = reinterpret_cast(ctx)->esr;
return esr & ESR_ELx_WNR ? ReadOrWrite::WRITE : ReadOrWrite::READ;
}
aux += ctx->size;
}
#else // defined(__x86_64__) || defined(__i386__) || defined(__arm__)
return ReadOrWrite::UNKNOWN;
#endif // defined(__x86_64__) || defined(__i386__) || defined(__arm__)
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.