movl $swapper_pg_dir-__PAGE_OFFSET, %eax
movl %eax, %cr3
+ testl $1, real_efer_save_restore - wakeup_code
+ jz 4f
+ # restore efer setting
+ movl real_save_efer_edx - wakeup_code, %edx
+ movl real_save_efer_eax - wakeup_code, %eax
+ mov $0xc0000080, %ecx
+ wrmsr
+4:
# make sure %cr4 is set correctly (features, etc)
movl real_save_cr4 - wakeup_code, %eax
movl %eax, %cr4
movw %ax,%fs
movw $0x0e00 + 'i', %fs:(0x12)
- # need a gdt
- #use the gdt copied in this low mem
- lea temp_gdt_table - wakeup_code, %eax
- xor %ebx, %ebx
- movw %ds, %bx
- shll $4, %ebx
- addl %ebx, %eax
- movl %eax, real_save_gdt + 2 - wakeup_code
- lgdt real_save_gdt - wakeup_code
+ # need a gdt -- use lgdtl to force 32-bit operands, in case
+ # the GDT is located past 16 megabytes.
+ lgdtl real_save_gdt - wakeup_code
movl real_save_cr0 - wakeup_code, %eax
movl %eax, %cr0
real_magic: .long 0
video_mode: .long 0
video_flags: .long 0
-temp_gdt_table: .fill GDT_ENTRIES, 8, 0
+real_efer_save_restore: .long 0
+real_save_efer_edx: .long 0
+real_save_efer_eax: .long 0
bogus_real_magic:
movw $0x0e00 + 'B', %fs:(0x12)
sldt saved_ldt
str saved_tss
+ movl nx_enabled, %edx
+ movl %edx, real_efer_save_restore - wakeup_start (%eax)
+ testl $1, real_efer_save_restore - wakeup_start (%eax)
+ jz 2f
+ # save efer setting
+ pushl %eax
+ movl %eax, %ebx
+ mov $0xc0000080, %ecx
+ rdmsr
+ movl %edx, real_save_efer_edx - wakeup_start (%ebx)
+ movl %eax, real_save_efer_eax - wakeup_start (%ebx)
+ popl %eax
+2:
+
movl %cr3, %edx
movl %edx, real_save_cr3 - wakeup_start (%eax)
movl %cr4, %edx
movl %edx, real_save_cr0 - wakeup_start (%eax)
sgdt real_save_gdt - wakeup_start (%eax)
- # gdt wont be addressable from real mode in 4g4g split
- # copying it to the lower mem
- xor %ecx, %ecx
- movw saved_gdt, %cx
- movl saved_gdt + 2, %esi
- lea temp_gdt_table - wakeup_start (%eax), %edi
- rep movsb
movl saved_videomode, %edx
movl %edx, video_mode - wakeup_start (%eax)
movl acpi_video_flags, %edx
movl %edi, saved_context_edi
pushfl ; popl saved_context_eflags
- movl $ret_point,saved_eip
+ movl $ret_point, saved_eip
ret
call save_registers
pushl $3
call acpi_enter_sleep_state
+ addl $4, %esp
ret
.p2align 4,,7
ret_point:
call restore_processor_state
ret
-ENTRY(do_suspend_lowlevel_s4bios)
- call save_processor_state
- call save_registers
- call acpi_enter_sleep_state_s4bios
- ret
-
ALIGN
# saved registers
saved_gdt: .long 0,0