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

xo1-wakeup.S (2250B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2.text
      3#include <linux/linkage.h>
      4#include <asm/segment.h>
      5#include <asm/page.h>
      6#include <asm/pgtable_32.h>
      7
      8	.macro writepost,value
      9		movb $0x34, %al
     10		outb %al, $0x70
     11		movb $\value, %al
     12		outb %al, $0x71
     13	.endm
     14
     15wakeup_start:
     16	# OFW lands us here, running in protected mode, with a
     17	# kernel-compatible GDT already setup.
     18
     19	# Clear any dangerous flags
     20	pushl $0
     21	popfl
     22
     23	writepost 0x31
     24
     25	# Set up %cr3
     26	movl $initial_page_table - __PAGE_OFFSET, %eax
     27	movl %eax, %cr3
     28
     29	movl saved_cr4, %eax
     30	movl %eax, %cr4
     31
     32	movl saved_cr0, %eax
     33	movl %eax, %cr0
     34
     35	# Control registers were modified, pipeline resync is needed
     36	jmp 1f
     371:
     38
     39	movw    $__KERNEL_DS, %ax
     40	movw    %ax, %ss
     41	movw    %ax, %ds
     42	movw    %ax, %es
     43	movw    %ax, %fs
     44	movw    %ax, %gs
     45
     46	lgdt    saved_gdt
     47	lidt    saved_idt
     48	lldt    saved_ldt
     49	ljmp    $(__KERNEL_CS),$1f
     501:
     51	movl    %cr3, %eax
     52	movl    %eax, %cr3
     53	wbinvd
     54
     55	# Go back to the return point
     56	jmp ret_point
     57
     58save_registers:
     59	sgdt  saved_gdt
     60	sidt  saved_idt
     61	sldt  saved_ldt
     62
     63	pushl %edx
     64	movl %cr4, %edx
     65	movl %edx, saved_cr4
     66
     67	movl %cr0, %edx
     68	movl %edx, saved_cr0
     69
     70	popl %edx
     71
     72	movl %ebx, saved_context_ebx
     73	movl %ebp, saved_context_ebp
     74	movl %esi, saved_context_esi
     75	movl %edi, saved_context_edi
     76
     77	pushfl
     78	popl saved_context_eflags
     79
     80	RET
     81
     82restore_registers:
     83	movl saved_context_ebp, %ebp
     84	movl saved_context_ebx, %ebx
     85	movl saved_context_esi, %esi
     86	movl saved_context_edi, %edi
     87
     88	pushl saved_context_eflags
     89	popfl
     90
     91	RET
     92
     93SYM_CODE_START(do_olpc_suspend_lowlevel)
     94	call	save_processor_state
     95	call	save_registers
     96
     97	# This is the stack context we want to remember
     98	movl %esp, saved_context_esp
     99
    100	pushl	$3
    101	call	xo1_do_sleep
    102
    103	jmp	wakeup_start
    104	.p2align 4,,7
    105ret_point:
    106	movl    saved_context_esp, %esp
    107
    108	writepost 0x32
    109
    110	call	restore_registers
    111	call	restore_processor_state
    112	RET
    113SYM_CODE_END(do_olpc_suspend_lowlevel)
    114
    115.data
    116saved_gdt:             .long   0,0
    117saved_idt:             .long   0,0
    118saved_ldt:             .long   0
    119saved_cr4:             .long   0
    120saved_cr0:             .long   0
    121saved_context_esp:     .long   0
    122saved_context_edi:     .long   0
    123saved_context_esi:     .long   0
    124saved_context_ebx:     .long   0
    125saved_context_ebp:     .long   0
    126saved_context_eflags:  .long   0