|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 3/6] x86: Enable Supervisor Mode Access Prevention (SMAP) for Xen
>>> On 15.04.14 at 15:40, <feng.wu@xxxxxxxxx> wrote:
> @@ -61,6 +61,10 @@ integer_param("maxcpus", max_cpus);
> static bool_t __initdata disable_smep;
> invbool_param("smep", disable_smep);
>
> +/* smap: Enable/disable Supervisor Mode Access Prevention (default on). */
> +static bool_t __initdata disable_smap;
> +invbool_param("smap", disable_smap);
This wants an entry in docs/misc/xen-command-line.markdown.
> @@ -1270,11 +1272,26 @@ leaf:
> ((error_code & (PFEC_insn_fetch|PFEC_user_mode)) ==
> PFEC_insn_fetch) )
> return smep_fault;
>
> + /*
> + * Supervisor Mode Access Prevention (SMAP):
> + * Disallow supervisor access user-accessible mappings
> + * A fault is considered as an SMAP violation if the following
> + * conditions are ture:
> + * - X86_CR4_SMAP is set in CR4
> + * - An user page is accessed
> + * - CPL=3 or X86_EFLAGS_AC is clear
> + * - Page fault in kernel mode
> + */
> + if ( (read_cr4() & X86_CR4_SMAP) && page_user &&
> + !(((regs->cs & 0x03) < 3) && (regs->eflags & X86_EFLAGS_AC)) &&
> + !(error_code & PFEC_user_mode) )
> + return smap_fault;
Please combine this conditional with the SMEP one (check page_user
only first and read CR4 just once).
> @@ -1379,8 +1396,8 @@ void do_page_fault(struct cpu_user_regs *regs)
>
> if ( unlikely(!guest_mode(regs)) )
> {
> - pf_type = spurious_page_fault(addr, error_code);
> - BUG_ON(pf_type == smep_fault);
> + pf_type = spurious_page_fault(addr, regs);
> + BUG_ON((pf_type == smep_fault) || (pf_type == smap_fault));
Please make these two separate BUG_ON()s, so one has a slightly
better chance to telling them apart without having to disassemble
the code and check pf_type in register/memory.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |