blob: a7af9f53c0cb773d05fd84ebe94525a1971e3ebb [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * Copyright 2001-2003 Pavel Machek <pavel@suse.cz>
4 * Based on code
5 * Copyright 2001 Patrick Mochel <mochel@osdl.org>
6 */
H. Peter Anvin1965aae2008-10-22 22:26:29 -07007#ifndef _ASM_X86_SUSPEND_64_H
8#define _ASM_X86_SUSPEND_64_H
Rafael J. Wysocki0de80bc2007-10-23 22:37:24 +02009
Linus Torvalds1da177e2005-04-16 15:20:36 -070010#include <asm/desc.h>
Ingo Molnardf6b35f2015-04-24 02:46:00 +020011#include <asm/fpu/api.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070012
Rafael J. Wysocki5c9c9be2008-01-30 13:30:04 +010013/*
14 * Image of the saved processor state, used by the low level ACPI suspend to
15 * RAM code and by the low level hibernation code.
16 *
17 * If you modify it, fix arch/x86/kernel/acpi/wakeup_64.S and make sure that
18 * __save/__restore_processor_state(), defined in arch/x86/kernel/suspend_64.c,
19 * still work as required.
20 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070021struct saved_context {
Rafael J. Wysocki0de80bc2007-10-23 22:37:24 +020022 struct pt_regs regs;
Andy Lutomirski7ee18d62017-12-14 13:19:07 -080023
24 /*
25 * User CS and SS are saved in current_pt_regs(). The rest of the
26 * segment selectors need to be saved and restored here.
27 */
28 u16 ds, es, fs, gs;
29
30 /*
31 * Usermode FSBASE and GSBASE may not match the fs and gs selectors,
32 * so we save them separately. We save the kernelmode GSBASE to
33 * restore percpu access after resume.
34 */
35 unsigned long kernelmode_gs_base, usermode_gs_base, fs_base;
36
Pavel Machek8d783b32005-06-25 14:55:14 -070037 unsigned long cr0, cr2, cr3, cr4, cr8;
Ondrej Zary85a0e7532010-06-08 00:32:49 +020038 u64 misc_enable;
39 bool misc_enable_saved;
Chen Yu7a9c2dd2015-11-25 01:03:41 +080040 struct saved_msrs saved_msrs;
Vivek Goyal3c321bc2007-05-02 19:27:07 +020041 unsigned long efer;
Konrad Rzeszutek Wilkcc456c42013-05-01 21:53:30 -040042 u16 gdt_pad; /* Unused */
43 struct desc_ptr gdt_desc;
Linus Torvalds1da177e2005-04-16 15:20:36 -070044 u16 idt_pad;
Andy Lutomirski090edbe2017-12-14 13:19:05 -080045 struct desc_ptr idt;
Linus Torvalds1da177e2005-04-16 15:20:36 -070046 u16 ldt;
47 u16 tss;
48 unsigned long tr;
49 unsigned long safety;
50 unsigned long return_address;
Linus Torvalds1da177e2005-04-16 15:20:36 -070051} __attribute__((packed));
52
Linus Torvalds1da177e2005-04-16 15:20:36 -070053#define loaddebug(thread,register) \
Jan Beulich2b514e72006-03-25 16:29:22 +010054 set_debugreg((thread)->debugreg##register, register)
Linus Torvalds1da177e2005-04-16 15:20:36 -070055
Linus Torvalds1da177e2005-04-16 15:20:36 -070056/* routines for saving/restoring kernel state */
Kees Cookc0944882017-05-09 14:00:51 -070057extern char core_restore_code[];
58extern char restore_registers[];
Rafael J. Wysocki0de80bc2007-10-23 22:37:24 +020059
H. Peter Anvin1965aae2008-10-22 22:26:29 -070060#endif /* _ASM_X86_SUSPEND_64_H */