Messages in this thread |  | | Date | Sun, 12 May 2024 18:28:59 +0200 | | Subject | Re: [PATCH v3 12/29] riscv mmu: teach pte_mkwrite to manufacture shadow stack PTEs | | From | Alexandre Ghiti <> |
| |
On 04/04/2024 01:35, Deepak Gupta wrote: > pte_mkwrite creates PTEs with WRITE encodings for underlying arch. > Underlying arch can have two types of writeable mappings. One that can be > written using regular store instructions. Another one that can only be > written using specialized store instructions (like shadow stack stores). > pte_mkwrite can select write PTE encoding based on VMA range (i.e. > VM_SHADOW_STACK) > > Signed-off-by: Deepak Gupta <debug@rivosinc.com> > --- > arch/riscv/include/asm/pgtable.h | 7 +++++++ > arch/riscv/mm/pgtable.c | 21 +++++++++++++++++++++ > 2 files changed, 28 insertions(+) > > diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h > index 6362407f1e83..9b837239d3e8 100644 > --- a/arch/riscv/include/asm/pgtable.h > +++ b/arch/riscv/include/asm/pgtable.h > @@ -403,6 +403,10 @@ static inline pte_t pte_wrprotect(pte_t pte) > > /* static inline pte_t pte_mkread(pte_t pte) */ > > +struct vm_area_struct; > +pte_t pte_mkwrite(pte_t pte, struct vm_area_struct *vma); > +#define pte_mkwrite pte_mkwrite > + > static inline pte_t pte_mkwrite_novma(pte_t pte) > { > return __pte(pte_val(pte) | _PAGE_WRITE); > @@ -694,6 +698,9 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd) > return pte_pmd(pte_mkyoung(pmd_pte(pmd))); > } > > +pmd_t pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma); > +#define pmd_mkwrite pmd_mkwrite > + > static inline pmd_t pmd_mkwrite_novma(pmd_t pmd) > { > return pte_pmd(pte_mkwrite_novma(pmd_pte(pmd))); > diff --git a/arch/riscv/mm/pgtable.c b/arch/riscv/mm/pgtable.c > index ef887efcb679..c84ae2e0424d 100644 > --- a/arch/riscv/mm/pgtable.c > +++ b/arch/riscv/mm/pgtable.c > @@ -142,3 +142,24 @@ pmd_t pmdp_collapse_flush(struct vm_area_struct *vma, > return pmd; > } > #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ > + > +pte_t pte_mkwrite(pte_t pte, struct vm_area_struct *vma) > +{ > + if (vma_is_shadow_stack(vma->vm_flags)) > + return pte_mkwrite_shstk(pte); > + > + pte = pte_mkwrite_novma(pte);
I would directly return pte_mkwrite_novma(pte) instead of assigning pte.
> + > + return pte; > +} > + > +pmd_t pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma) > +{ > + if (vma_is_shadow_stack(vma->vm_flags)) > + return pmd_mkwrite_shstk(pmd); > + > + pmd = pmd_mkwrite_novma(pmd);
Ditto here.
> + > + return pmd; > +} > +
Otherwise:
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Thanks,
Alex
|  |