• Jan Beulich's avatar
    xen/x86: replace order-based range checking of M2P table by linear one · ccbcdf7c
    Jan Beulich authored
    The order-based approach is not only less efficient (requiring a shift
    and a compare, typical generated code looking like this
    
    	mov	eax, [machine_to_phys_order]
    	mov	ecx, eax
    	shr	ebx, cl
    	test	ebx, ebx
    	jnz	...
    
    whereas a direct check requires just a compare, like in
    
    	cmp	ebx, [machine_to_phys_nr]
    	jae	...
    
    ), but also slightly dangerous in the 32-on-64 case - the element
    address calculation can wrap if the next power of two boundary is
    sufficiently far away from the actual upper limit of the table, and
    hence can result in user space addresses being accessed (with it being
    unknown what may actually be mapped there).
    
    Additionally, the elimination of the mistaken use of fls() here (should
    have been __fls()) fixes a latent issue on x86-64 that would trigger
    if the code was run on a system with memory extending beyond the 44-bit
    boundary.
    
    CC: stable@kernel.org
    Signed-off-by: default avatarJan Beulich <jbeulich@novell.com>
    [v1: Based on Jeremy's feedback]
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    ccbcdf7c
mmu.c 58.9 KB