1. 01 Oct, 2019 2 commits
    • Tom Lendacky's avatar
      x86/CPU/AMD: Clear RDRAND CPUID bit on AMD family 15h/16h · 0b927905
      Tom Lendacky authored
      BugLink: https://bugs.launchpad.net/bugs/1845036
      
      [ Upstream commit c49a0a80 ]
      
      There have been reports of RDRAND issues after resuming from suspend on
      some AMD family 15h and family 16h systems. This issue stems from a BIOS
      not performing the proper steps during resume to ensure RDRAND continues
      to function properly.
      
      RDRAND support is indicated by CPUID Fn00000001_ECX[30]. This bit can be
      reset by clearing MSR C001_1004[62]. Any software that checks for RDRAND
      support using CPUID, including the kernel, will believe that RDRAND is
      not supported.
      
      Update the CPU initialization to clear the RDRAND CPUID bit for any family
      15h and 16h processor that supports RDRAND. If it is known that the family
      15h or family 16h system does not have an RDRAND resume issue or that the
      system will not be placed in suspend, the "rdrand=force" kernel parameter
      can be used to stop the clearing of the RDRAND CPUID bit.
      
      Additionally, update the suspend and resume path to save and restore the
      MSR C001_1004 value to ensure that the RDRAND CPUID setting remains in
      place after resuming from suspend.
      
      Note, that clearing the RDRAND CPUID bit does not prevent a processor
      that normally supports the RDRAND instruction from executing it. So any
      code that determined the support based on family and model won't #UD.
      Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Cc: Andrew Cooper <andrew.cooper3@citrix.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Chen Yu <yu.c.chen@intel.com>
      Cc: "H. Peter Anvin" <hpa@zytor.com>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Jonathan Corbet <corbet@lwn.net>
      Cc: Josh Poimboeuf <jpoimboe@redhat.com>
      Cc: Juergen Gross <jgross@suse.com>
      Cc: Kees Cook <keescook@chromium.org>
      Cc: "linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>
      Cc: "linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>
      Cc: Nathan Chancellor <natechancellor@gmail.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Pavel Machek <pavel@ucw.cz>
      Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
      Cc: <stable@vger.kernel.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: "x86@kernel.org" <x86@kernel.org>
      Link: https://lkml.kernel.org/r/7543af91666f491547bd86cebb1e17c66824ab9f.1566229943.git.thomas.lendacky@amd.com
      [sl: adjust context in docs]
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      Signed-off-by: default avatarConnor Kuehl <connor.kuehl@canonical.com>
      Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
      0b927905
    • Chen Yu's avatar
      x86/pm: Introduce quirk framework to save/restore extra MSR registers around suspend/resume · 5c320011
      Chen Yu authored
      BugLink: https://bugs.launchpad.net/bugs/1845036
      
      [ Upstream commit 7a9c2dd0 ]
      
      A bug was reported that on certain Broadwell platforms, after
      resuming from S3, the CPU is running at an anomalously low
      speed.
      
      It turns out that the BIOS has modified the value of the
      THERM_CONTROL register during S3, and changed it from 0 to 0x10,
      thus enabled clock modulation(bit4), but with undefined CPU Duty
      Cycle(bit1:3) - which causes the problem.
      
      Here is a simple scenario to reproduce the issue:
      
       1. Boot up the system
       2. Get MSR 0x19a, it should be 0
       3. Put the system into sleep, then wake it up
       4. Get MSR 0x19a, it shows 0x10, while it should be 0
      
      Although some BIOSen want to change the CPU Duty Cycle during
      S3, in our case we don't want the BIOS to do any modification.
      
      Fix this issue by introducing a more generic x86 framework to
      save/restore specified MSR registers(THERM_CONTROL in this case)
      for suspend/resume. This allows us to fix similar bugs in a much
      simpler way in the future.
      
      When the kernel wants to protect certain MSRs during suspending,
      we simply add a quirk entry in msr_save_dmi_table, and customize
      the MSR registers inside the quirk callback, for example:
      
        u32 msr_id_need_to_save[] = {MSR_ID0, MSR_ID1, MSR_ID2...};
      
      and the quirk mechanism ensures that, once resumed from suspend,
      the MSRs indicated by these IDs will be restored to their
      original, pre-suspend values.
      
      Since both 64-bit and 32-bit kernels are affected, this patch
      covers the common 64/32-bit suspend/resume code path. And
      because the MSRs specified by the user might not be available or
      readable in any situation, we use rdmsrl_safe() to safely save
      these MSRs.
      Reported-and-tested-by: default avatarMarcin Kaszewski <marcin.kaszewski@intel.com>
      Signed-off-by: default avatarChen Yu <yu.c.chen@intel.com>
      Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: default avatarPavel Machek <pavel@ucw.cz>
      Cc: Andy Lutomirski <luto@amacapital.net>
      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>
      Cc: bp@suse.de
      Cc: len.brown@intel.com
      Cc: linux@horizon.com
      Cc: luto@kernel.org
      Cc: rjw@rjwysocki.net
      Link: http://lkml.kernel.org/r/c9abdcbc173dd2f57e8990e304376f19287e92ba.1448382971.git.yu.c.chen@intel.com
      [ More edits to the naming of data structures. ]
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      Signed-off-by: default avatarConnor Kuehl <connor.kuehl@canonical.com>
      Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
      5c320011
  2. 26 Sep, 2019 38 commits