1/* SPDX-License-Identifier: GPL-2.0-only */ 2 .text 3#include <linux/linkage.h> 4#include <asm/segment.h> 5#include <asm/page_types.h> 6 7# Copyright 2003, 2008 Pavel Machek <pavel@suse.cz 8 9 .code32 10 ALIGN 11 12SYM_CODE_START(wakeup_pmode_return) 13 movw $__KERNEL_DS, %ax 14 movw %ax, %ss 15 movw %ax, %fs 16 movw %ax, %gs 17 18 movw $__USER_DS, %ax 19 movw %ax, %ds 20 movw %ax, %es 21 22 # reload the gdt, as we need the full 32 bit address 23 lidt saved_idt 24 lldt saved_ldt 25 ljmp $(__KERNEL_CS), $1f 261: 27 movl %cr3, %eax 28 movl %eax, %cr3 29 wbinvd 30 31 # and restore the stack ... but you need gdt for this to work 32 movl saved_context_esp, %esp 33 34 movl %cs:saved_magic, %eax 35 cmpl $0x12345678, %eax 36 jne bogus_magic 37 38 # jump to place where we left off 39 movl saved_eip, %eax 40 jmp *%eax 41SYM_CODE_END(wakeup_pmode_return) 42 43bogus_magic: 44 jmp bogus_magic 45 46 47 48save_registers: 49 sidt saved_idt 50 sldt saved_ldt 51 str saved_tss 52 53 leal 4(%esp), %eax 54 movl %eax, saved_context_esp 55 movl %ebx, saved_context_ebx 56 movl %ebp, saved_context_ebp 57 movl %esi, saved_context_esi 58 movl %edi, saved_context_edi 59 pushfl 60 popl saved_context_eflags 61 62 movl $ret_point, saved_eip 63 ret 64 65 66restore_registers: 67 movl saved_context_ebp, %ebp 68 movl saved_context_ebx, %ebx 69 movl saved_context_esi, %esi 70 movl saved_context_edi, %edi 71 pushl saved_context_eflags 72 popfl 73 ret 74 75SYM_CODE_START(do_suspend_lowlevel) 76 call save_processor_state 77 call save_registers 78 pushl $3 79 call x86_acpi_enter_sleep_state 80 addl $4, %esp 81 82# In case of S3 failure, we'll emerge here. Jump 83# to ret_point to recover 84 jmp ret_point 85 .p2align 4,,7 86ret_point: 87 call restore_registers 88 call restore_processor_state 89 ret 90SYM_CODE_END(do_suspend_lowlevel) 91 92.data 93ALIGN 94ENTRY(saved_magic) .long 0 95saved_eip: .long 0 96 97# saved registers 98saved_idt: .long 0,0 99saved_ldt: .long 0 100saved_tss: .long 0 101 102