powerpc/mm: add exec protection on powerpc 603
The 603 doesn't have a HASH table, TLB misses are handled by software. It is then possible to generate page fault when _PAGE_EXEC is not set like in nohash/32. There is one "reserved" PTE bit available, this patch uses it for _PAGE_EXEC. In order to support it, set_pte_filter() and set_access_flags_filter() are made common, and the handling is made dependent on MMU_FTR_HPTE_TABLE Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
badb9687ce
commit
385e89d5b2
@@ -74,7 +74,7 @@ static struct page *maybe_pte_to_page(pte_t pte)
|
||||
* support falls into the same category.
|
||||
*/
|
||||
|
||||
static pte_t set_pte_filter(pte_t pte)
|
||||
static pte_t set_pte_filter_hash(pte_t pte)
|
||||
{
|
||||
if (radix_enabled())
|
||||
return pte;
|
||||
@@ -93,14 +93,12 @@ static pte_t set_pte_filter(pte_t pte)
|
||||
return pte;
|
||||
}
|
||||
|
||||
static pte_t set_access_flags_filter(pte_t pte, struct vm_area_struct *vma,
|
||||
int dirty)
|
||||
{
|
||||
return pte;
|
||||
}
|
||||
|
||||
#else /* CONFIG_PPC_BOOK3S */
|
||||
|
||||
static pte_t set_pte_filter_hash(pte_t pte) { return pte; }
|
||||
|
||||
#endif /* CONFIG_PPC_BOOK3S */
|
||||
|
||||
/* Embedded type MMU with HW exec support. This is a bit more complicated
|
||||
* as we don't have two bits to spare for _PAGE_EXEC and _PAGE_HWEXEC so
|
||||
* instead we "filter out" the exec permission for non clean pages.
|
||||
@@ -109,6 +107,9 @@ static pte_t set_pte_filter(pte_t pte)
|
||||
{
|
||||
struct page *pg;
|
||||
|
||||
if (mmu_has_feature(MMU_FTR_HPTE_TABLE))
|
||||
return set_pte_filter_hash(pte);
|
||||
|
||||
/* No exec permission in the first place, move on */
|
||||
if (!pte_exec(pte) || !pte_looks_normal(pte))
|
||||
return pte;
|
||||
@@ -138,6 +139,9 @@ static pte_t set_access_flags_filter(pte_t pte, struct vm_area_struct *vma,
|
||||
{
|
||||
struct page *pg;
|
||||
|
||||
if (mmu_has_feature(MMU_FTR_HPTE_TABLE))
|
||||
return pte;
|
||||
|
||||
/* So here, we only care about exec faults, as we use them
|
||||
* to recover lost _PAGE_EXEC and perform I$/D$ coherency
|
||||
* if necessary. Also if _PAGE_EXEC is already set, same deal,
|
||||
@@ -172,8 +176,6 @@ static pte_t set_access_flags_filter(pte_t pte, struct vm_area_struct *vma,
|
||||
return pte_mkexec(pte);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PPC_BOOK3S */
|
||||
|
||||
/*
|
||||
* set_pte stores a linux PTE into the linux page table.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user