linux/arch/x86/platform/olpc/xo1-wakeup.S
<<
>>
Prefs
   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
  93ENTRY(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
 113
 114.data
 115saved_gdt:             .long   0,0
 116saved_idt:             .long   0,0
 117saved_ldt:             .long   0
 118saved_cr4:             .long   0
 119saved_cr0:             .long   0
 120saved_context_esp:     .long   0
 121saved_context_edi:     .long   0
 122saved_context_esi:     .long   0
 123saved_context_ebx:     .long   0
 124saved_context_ebp:     .long   0
 125saved_context_eflags:  .long   0
 126