[PATCH v4 17/36] arm64/mm: Handle GCS data aborts
Mark Brown
broonie at kernel.org
Tue Aug 15 16:54:30 PDT 2023
On Fri, Aug 11, 2023 at 04:09:33PM +0100, Catalin Marinas wrote:
> On Mon, Aug 07, 2023 at 11:00:22PM +0100, Mark Brown wrote:
> > + if (is_write_abort(esr) &&
> > + !(is_gcs_fault(esr) || is_el1_data_abort(esr)))
> > + return VM_FAULT_BADACCESS;
> Related to my PIE permissions comment: when do we have a valid EL1 data
> write abort that's not a GCS fault? Does a faulting GCSSTTR set the
> ESR_ELx_GCS bit?
Yes, it should do. The GCS instructions have access descriptors created
with CreateAccDescGCS() which results in the access being flagged as a
GCS access.
> > + } else {
> > + /*
> > + * GCS faults should never happen for pages that are
> > + * not part of a GCS and the operation being attempted
> > + * can never succeed.
> > + */
> > + if (is_gcs_fault(esr))
> > + return VM_FAULT_BADACCESS;
> If one does a GCS push/store to a non-GCS page, do we get a GCS fault or
> something else? I couldn't figure out from the engineering spec. If the
> hardware doesn't generate such exceptions, we might as well remove this
> 'else' branch. But maybe it does generate a GCS-specific fault as you
> added a similar check in is_invalid_el0_gcs_access().
Yes, see AddGCSRecord() and LoadCheckGCSRecord() - all GCS initiated
accesses need to be AccDescGCS so appropriate permissions enforcement
can happen and that's what causes the fault to be flagged as GCS.
> > @@ -595,6 +644,19 @@ static int __kprobes do_page_fault(unsigned long far, unsigned long esr,
> > if (!vma)
> > goto lock_mmap;
> >
> > + /*
> > + * We get legitimate write faults for GCS pages from GCS
> > + * operations and from EL1 writes to EL0 pages but just plain
> What are the EL1 writes to the shadow stack? Would it not use
> copy_to_user_gcs()?
They should, yes - I'll reword the comment.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-riscv/attachments/20230816/e8cfe653/attachment.sig>
More information about the linux-riscv
mailing list