[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/4] x86: switch default mapping attributes to non-executable
>>> On 19.05.15 at 20:53, <andrew.cooper3@xxxxxxxxxx> wrote: > On 18/05/15 13:47, Jan Beulich wrote: >> --- a/xen/arch/x86/x86_64/mm.c >> +++ b/xen/arch/x86/x86_64/mm.c >> @@ -895,6 +895,33 @@ void __init subarch_init_memory(void) >> share_xen_page_with_privileged_guests(page, XENSHARE_readonly); >> } >> } >> + >> + /* Mark low 16Mb of direct map NX if hardware supports it. */ >> + if ( !cpu_has_nx ) >> + return; >> + >> + v = DIRECTMAP_VIRT_START + (1UL << 20); > > What about 0-1MB ? I'd like to avoid fiddling with that range, as the trampoline living there will want to continue to be RWX anyway. >> + l3e = l4e_to_l3e(idle_pg_table[l4_table_offset(v)])[l3_table_offset(v)]; >> + ASSERT(l3e_get_flags(l3e) & _PAGE_PRESENT); >> + do { >> + l2e = l3e_to_l2e(l3e)[l2_table_offset(v)]; >> + ASSERT(l2e_get_flags(l2e) & _PAGE_PRESENT); >> + if ( l2e_get_flags(l2e) & _PAGE_PSE ) >> + { >> + l2e_add_flags(l2e, _PAGE_NX_BIT); >> + l3e_to_l2e(l3e)[l2_table_offset(v)] = l2e; >> + v += 1 << L2_PAGETABLE_SHIFT; >> + } >> + else >> + { >> + l1_pgentry_t l1e = l2e_to_l1e(l2e)[l1_table_offset(v)]; >> + >> + ASSERT(l1e_get_flags(l1e) & _PAGE_PRESENT); >> + l1e_add_flags(l1e, _PAGE_NX_BIT); >> + l2e_to_l1e(l2e)[l1_table_offset(v)] = l1e; >> + v += 1 << L1_PAGETABLE_SHIFT; >> + } >> + } while ( v < DIRECTMAP_VIRT_START + (16UL << 20) ); > > How about just setting l3e.nx and leaving all lower tables alone? Apart from the trampoline aspect (see above) I don't think it's a good idea to restrict permissions in non-leaf entries - that just calls for more intrusive patches if later an individual page needs them lifted. >> --- a/xen/include/asm-x86/x86_64/page.h >> +++ b/xen/include/asm-x86/x86_64/page.h >> @@ -147,9 +147,20 @@ typedef l4_pgentry_t root_pgentry_t; >> */ >> #define _PAGE_GUEST_KERNEL (1U<<12) >> >> -#define PAGE_HYPERVISOR (__PAGE_HYPERVISOR | _PAGE_GLOBAL) >> +#define PAGE_HYPERVISOR_RO (__PAGE_HYPERVISOR_RO | _PAGE_GLOBAL) >> +#define PAGE_HYPERVISOR_RW (__PAGE_HYPERVISOR_RW | _PAGE_GLOBAL) >> #define PAGE_HYPERVISOR_RX (__PAGE_HYPERVISOR_RX | _PAGE_GLOBAL) >> -#define PAGE_HYPERVISOR_NOCACHE (__PAGE_HYPERVISOR_NOCACHE | _PAGE_GLOBAL) >> +#define PAGE_HYPERVISOR_RWX (__PAGE_HYPERVISOR | _PAGE_GLOBAL) >> + >> +#ifdef __ASSEMBLY__ >> +/* Dependency on NX being available can't be expressed. */ >> +# define PAGE_HYPERVISOR PAGE_HYPERVISOR_RWX >> +# define PAGE_HYPERVISOR_NOCACHE (__PAGE_HYPERVISOR_NOCACHE | _PAGE_GLOBAL) >> +#else >> +# define PAGE_HYPERVISOR PAGE_HYPERVISOR_RW >> +# define PAGE_HYPERVISOR_NOCACHE (__PAGE_HYPERVISOR_NOCACHE | \ >> + _PAGE_GLOBAL | _PAGE_NX) >> +#endif > > This patch is clearly an improvement, so my comments can possibly be > deferred to subsequent patches. > > After boot, I can't think of a legitimate reason for Xen to have a RWX > mapping. As such, leaving __PAGE_HYPERVISOR around constitutes a risk > that RWX mappings will be used. It would be nice if we could remove all > constants (which aren't BOOT_*) which could lead to accidental use of > RWX mappings on NX-enabled hardware. But you realize that __PAGE_HYPERVISOR is particularly used for intermediate page table entry permissions? > I think we also want a warning on boot if we find NX unavailable. The > only 64bit capable CPUs which do not support NX are now 11 years old, > and I don't expect many of those to be running Xen these days. However, > given that "disable NX" is a common BIOS option for compatibility > reasons, we should press people to alter their settings if possible. Sure, easily done. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |