cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

wakeup_32.S (1800B)


      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
     94SYM_DATA(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