Messages in this thread | | | Date | Wed, 23 Jan 2008 16:26:31 -0800 | From | Jeremy Fitzhardinge <> | Subject | Re: [PATCH] x86: ignore spurious faults |
| |
Harvey Harrison wrote: > On Wed, 2008-01-23 at 16:05 -0800, Jeremy Fitzhardinge wrote: > >> =================================================================== >> --- a/arch/x86/mm/fault_32.c >> +++ b/arch/x86/mm/fault_32.c >> @@ -290,6 +290,53 @@ static int is_errata93(struct pt_regs *r >> >> >> /* >> + * Handle a spurious fault caused by a stale TLB entry. This allows >> + * us to lazily refresh the TLB when increasing the permissions of a >> + * kernel page (RO -> RW or NX -> X). Doing it eagerly is very >> + * expensive since that implies doing a full cross-processor TLB >> + * flush, even if no stale TLB entries exist on other processors. >> + * There are no security implications to leaving a stale TLB when >> + * increasing the permissions on a page. >> + */ >> +static int spurious_fault(unsigned long address, >> + unsigned long error_code) >> +{ >> + pgd_t *pgd; >> + pud_t *pud; >> + pmd_t *pmd; >> + pte_t *pte; >> + >> + /* Reserved-bit violation or user access to kernel space? */ >> + if (error_code & (PF_USER | PF_RSVD)) >> + return 0; >> + >> + pgd = init_mm.pgd + pgd_index(address); >> + if (!pgd_present(*pgd)) >> + return 0; >> + >> + pud = pud_offset(pgd, address); >> + if (!pud_present(*pud)) >> + return 0; >> + >> + pmd = pmd_offset(pud, address); >> + if (!pmd_present(*pmd)) >> + return 0; >> + >> + pte = pte_offset_kernel(pmd, address); >> + if (!pte_present(*pte)) >> + return 0; >> + if ((error_code & 0x02) && !pte_write(*pte)) >> + return 0; >> > > if ((error_code & PF_WRITE) && !pte_write(*pte)) > return 0; >
Oops, thanks. Overlooked that one.
> How about dropping the #if and rely on the !pte_exec() test always > being false when _PAGE_NX = 0? The compiler should just trim this > all away. > > from pgtable.h: > > static inline int pte_exec(pte_t pte) { return !(pte_val(pte) > & _PAGE_NX); } >
Thanks for reminding me; I thought of this the other day, but forgot to do it. Will post an updated patch shortly.
J
| |