1. 26 11月, 2015 1 次提交
    • C
      x86/pm: Introduce quirk framework to save/restore extra MSR registers around suspend/resume · 7a9c2dd0
      Chen Yu 提交于
      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: NMarcin Kaszewski <marcin.kaszewski@intel.com>
      Signed-off-by: NChen Yu <yu.c.chen@intel.com>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NPavel 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: NIngo Molnar <mingo@kernel.org>
      7a9c2dd0
  2. 19 5月, 2015 1 次提交
    • I
      x86/fpu: Rename i387.h to fpu/api.h · df6b35f4
      Ingo Molnar 提交于
      We already have fpu/types.h, move i387.h to fpu/api.h.
      
      The file name has become a misnomer anyway: it offers generic FPU APIs,
      but is not limited to i387 functionality.
      Reviewed-by: NBorislav Petkov <bp@alien8.de>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Dave Hansen <dave.hansen@linux.intel.com>
      Cc: Fenghua Yu <fenghua.yu@intel.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Oleg Nesterov <oleg@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Signed-off-by: NIngo Molnar <mingo@kernel.org>
      df6b35f4
  3. 03 5月, 2013 1 次提交
    • K
      x86, gdt, hibernate: Store/load GDT for hibernate path. · cc456c4e
      Konrad Rzeszutek Wilk 提交于
      The git commite7a5cd06
      ("x86-64, gdt: Store/load GDT for ACPI S3 or hibernate/resume path
      is not needed.") assumes that for the hibernate path the booting
      kernel and the resuming kernel MUST be the same. That is certainly
      the case for a 32-bit kernel (see check_image_kernel and
      CONFIG_ARCH_HIBERNATION_HEADER config option).
      
      However for 64-bit kernels it is OK to have a different kernel
      version (and size of the image) of the booting and resuming kernels.
      Hence the above mentioned git commit introduces an regression.
      
      This patch fixes it by introducing a 'struct desc_ptr gdt_desc'
      back in the 'struct saved_context'. However instead of having in the
      'save_processor_state' and 'restore_processor_state' the
      store/load_gdt calls, we are only saving the GDT in the
      save_processor_state.
      
      For the restore path the lgdt operation is done in
      hibernate_asm_[32|64].S in the 'restore_registers' path.
      
      The apt reader of this description will recognize that only 64-bit
      kernels need this treatment, not 32-bit. This patch adds the logic
      in the 32-bit path to be more similar to 64-bit so that in the future
      the unification process can take advantage of this.
      
      [ hpa: this also reverts an inadvertent on-disk format change ]
      Suggested-by: N"H. Peter Anvin" <hpa@zytor.com>
      Acked-by: N"Rafael J. Wysocki" <rjw@sisk.pl>
      Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      Link: http://lkml.kernel.org/r/1367459610-9656-2-git-send-email-konrad.wilk@oracle.comSigned-off-by: NH. Peter Anvin <hpa@linux.intel.com>
      cc456c4e
  4. 12 4月, 2013 1 次提交
    • K
      x86-64, gdt: Store/load GDT for ACPI S3 or hibernate/resume path is not needed. · e7a5cd06
      Konrad Rzeszutek Wilk 提交于
      During the ACPI S3 resume path the trampoline code handles it already.
      
      During the ACPI S3 suspend phase (acpi_suspend_lowlevel) we set:
      early_gdt_descr.address = (..)get_cpu_gdt_table(smp_processor_id());
      
      which is then used during the resume path and has the same exact
      value as what the store/load_gdt do with the saved_context
      (which is saved/restored via save/restore_processor_state()).
      
      The flow during resume is complex and for 64-bit kernels we use three GDTs
      - one early bootstrap GDT (wakeup_igdt) that we load to workaround
      broken BIOSes, an early Protected Mode to Long Mode transition one
      (tr_gdt), and the final one - early_gdt_descr (which points to the real GDT).
      
      The early ('wakeup_gdt') is loaded in 'trampoline_start' for working
      around broken BIOSes, and then when we end up in Protected Mode in the
      startup_32 (in trampoline_64.s, not head_32.s) we use the 'tr_gdt'
      (still in trampoline_64.s). This 'tr_gdt' has a a 32-bit code segment,
      64-bit code segment with L=1, and a 32-bit data segment.
      
      Once we have transitioned from Protected Mode to Long Mode we then
      set the GDT to 'early_gdt_desc' and then via an iretq emerge in
      wakeup_long64 (set via 'initial_code' variable in acpi_suspend_lowlevel).
      
      In the wakeup_long64 we end up restoring the %rip (which is set to
      'resume_point') and jump there.
      
      In 'resume_point' we call 'restore_processor_state' which does
      the load_gdt on the saved context. This load_gdt is redundant as the
      GDT loaded via early_gdt_desc is the same.
      
      Here is the call-chain:
       wakeup_start
         |- lgdtl wakeup_gdt [the work-around broken BIOSes]
         |
         \-- trampoline_start (trampoline_64.S)
               |- lgdtl tr_gdt
               |
               \-- startup_32 (trampoline_64.S)
                     |
                     \-- startup_64 (trampoline_64.S)
                            |
                            \-- secondary_startup_64
                                     |- lgdtl early_gdt_desc
                                     | ...
                                     |- movq initial_code(%rip), %eax
                                     |-.. lretq
                                     \-- wakeup_64
                                           |-- other registers are reloaded
                                           |-- call restore_processor_state
      
      The hibernate path is much simpler. During the saving of the hibernation
      image we call save_processor_state() and save the contents of that along
      with the rest of the kernel in the hibernation image destination.
      We save the EIP of 'restore_registers' (restore_jump_address) and cr3
      (restore_cr3).
      
      During hibernate resume, the 'restore_registers' (via the
      'restore_jump_address) in hibernate_asm_64.S is invoked which restores
      the contents of most registers. Naturally the resume path benefits from
      already being in 64-bit mode, so it does not have to load the GDT.
      
      It only reloads the cr3 (from restore_cr3) and continues on. Note that
      the restoration of the restore image page-tables is done prior to this.
      
      After the 'restore_registers' it returns and we end up called
      restore_processor_state() - where we reload the GDT. The reload of
      the GDT is not needed as bootup kernel has already loaded the GDT which
      is at the same physical location as the the restored kernel.
      
      Note that the hibernation path assumes the GDT is correct during its
      'restore_registers'. The assumption in the code is that the restored
      image is the same as saved - meaning we are not trying to restore
      an different kernel in the virtual address space of a new kernel.
      Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      Link: http://lkml.kernel.org/r/1365194544-14648-2-git-send-email-konrad.wilk@oracle.com
      Cc: Rafael J. Wysocki <rjw@sisk.pl>
      Signed-off-by: NH. Peter Anvin <hpa@linux.intel.com>
      e7a5cd06
  5. 25 5月, 2011 1 次提交
  6. 08 6月, 2010 1 次提交
  7. 23 10月, 2008 2 次提交
  8. 23 7月, 2008 1 次提交
    • V
      x86: consolidate header guards · 77ef50a5
      Vegard Nossum 提交于
      This patch is the result of an automatic script that consolidates the
      format of all the headers in include/asm-x86/.
      
      The format:
      
      1. No leading underscore. Names with leading underscores are reserved.
      2. Pathname components are separated by two underscores. So we can
         distinguish between mm_types.h and mm/types.h.
      3. Everything except letters and numbers are turned into single
         underscores.
      Signed-off-by: NVegard Nossum <vegard.nossum@gmail.com>
      77ef50a5
  9. 17 4月, 2008 1 次提交
  10. 30 1月, 2008 2 次提交
  11. 24 10月, 2007 1 次提交
  12. 19 10月, 2007 1 次提交
    • R
      Hibernation: Arbitrary boot kernel support on x86_64 · d158cbdf
      Rafael J. Wysocki 提交于
      Make it possible to restore a hibernation image on x86_64 with the help of a
      kernel different from the one in the image.
      
      The idea is to split the core restoration code into two separate parts and to
      place each of them in a different page.   The first part belongs to the boot
      kernel and is executed as the last step of the image kernel's memory
      restoration procedure.   Before being executed, it is relocated to a safe page
      that won't be overwritten while copying the image kernel pages.
      
      The final operation performed by it is a jump to the second part of the core
      restoration code that belongs to the image kernel and has just been restored.
      This code makes the CPU switch to the image kernel's page tables and restores
      the state of general purpose registers (including the stack pointer) from
      before the hibernation.
      
      The main issue with this idea is that in order to jump to the second part of
      the core restoration code the boot kernel needs to know its address.
       However, this address may be passed to it in the image header.   Namely, the
      part of the image header previously used for checking if the version of the
      image kernel is correct can be replaced with some architecture specific data
      that will allow the boot kernel to jump to the right address within the image
      kernel.   These data should also be used for checking if the image kernel is
      compatible with the boot kernel (as far as the memory restroration procedure
      is concerned).  It can be done, for example, with the help of a "magic" value
      that has to be equal in both kernels, so that they can be regarded as
      compatible.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NPavel Machek <pavel@ucw.cz>
      Cc: Andi Kleen <ak@suse.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      d158cbdf
  13. 11 10月, 2007 1 次提交
  14. 25 7月, 2007 1 次提交
  15. 03 5月, 2007 2 次提交
  16. 26 3月, 2006 1 次提交
  17. 26 6月, 2005 1 次提交
  18. 17 4月, 2005 1 次提交
    • L
      Linux-2.6.12-rc2 · 1da177e4
      Linus Torvalds 提交于
      Initial git repository build. I'm not bothering with the full history,
      even though we have it. We can create a separate "historical" git
      archive of that later if we want to, and in the meantime it's about
      3.2GB when imported into git - space that would just make the early
      git days unnecessarily complicated, when we don't have a lot of good
      infrastructure for it.
      
      Let it rip!
      1da177e4