• Borislav Petkov's avatar
    x86/cpu: Fix MSR value truncation issue · 31ac34ca
    Borislav Petkov authored
    So sparse rightfully complains that the u64 MSR value we're
    writing into the STAR MSR, i.e. 0xc0000081, is being truncated:
    
    ./arch/x86/include/asm/msr.h:193:36: warning: cast truncates
    bits from constant value (23001000000000 becomes 0)
    
    because the actual value doesn't fit into the unsigned 32-bit
    quantity which are the @low and @high wrmsrl() parameters.
    
    This is not a problem, practically, because gcc is actually
    being smart enough here and does the right thing:
    
      .loc 3 87 0
      xorl    %esi, %esi		# we needz a 32-bit zero
      movl    $2293776, %edx	# 0x00230010 == (__USER32_CS << 16) | __KERNEL_CS go into the high bits
      movl    $-1073741695, %ecx	# MSR_STAR, i.e., 0xc0000081
      movl    %esi, %eax		# low order 32 bits in the MSR which are 0
      #APP
      # 87 "./arch/x86/include/asm/msr.h" 1
              wrmsr
    
    More specifically, MSR_STAR[31:0] is being set to 0. That field
    is reserved on Intel and on AMD it is 32-bit SYSCALL Target EIP.
    
    I'd strongly guess because Intel doesn't have SYSCALL in
    compat/legacy mode and we're using SYSENTER and INT80 there. And
    for compat syscalls in long mode we use CSTAR.
    
    So let's fix the sparse warning by writing SYSRET and SYSCALL CS
    and SS into the high 32-bit half of STAR and 0 in the low half
    explicitly.
    
     [ Actually, if we had to be precise, we would have to read what's in
       STAR[31:0] and write it back unchanged on Intel and write 0 on AMD. I
       guess the current writing to 0 is still ok since Intel can apparently
       stomach it. ]
    
    The resulting code is identical to what we have above:
    
      .loc 3 87 0
      xorl    %esi, %esi      # tmp104
      movl    $2293776, %eax  #, tmp103
      movl    $-1073741695, %ecx      #, tmp102
      movl    %esi, %edx      # tmp104, tmp104
    
      ...
    
            wrmsr
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/1448273546-2567-6-git-send-email-bp@alien8.deSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    31ac34ca
common.c 35.6 KB