blob: 3a03af469d8925fc84958214293da7275817b00f [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
//
#include <asm.h>
/*
struct x86_realmode_entry_data_registers {
uint64_t rdi, rsi, rbp, rbx, rdx, rcx, rax;
uint64_t r8, r9, r10, r11, r12, r13, r14, r15;
uint64_t rsp, rip;
};
*/
.code64
.section .text
// ACPI_STATUS x86_acpi_transition_s_state(struct x86_realmode_entry_data_registers* reg,
// uint8_t target_s_state, uint8_t sleep_type_a,
// uint8_t sleep_type_b)
FUNCTION_LABEL(x86_acpi_transition_s_state)
// We do not need to save floating point registers, since this method must be called
// by a kernel thread if the system is expected to return from the S-state.
mov %rdi, (%rdi)
mov %rsi, 8(%rdi)
mov %rbp, 16(%rdi)
mov %rbx, 24(%rdi)
mov %rdx, 32(%rdi)
mov %rcx, 40(%rdi)
// Stash 0 as rax, so we return AE_OK if we do suspend
movq $0, 48(%rdi)
mov %r8, 56(%rdi)
mov %r9, 64(%rdi)
mov %r10, 72(%rdi)
mov %r11, 80(%rdi)
mov %r12, 88(%rdi)
mov %r13, 96(%rdi)
mov %r14, 104(%rdi)
mov %r15, 112(%rdi)
mov %rsp, 120(%rdi)
// Set up our return IP, in case the S-state needs it (jumped to by _x86_suspend_wakeup())
leaq .Lafter_sleep(%rip), %rax
movq %rax, 128(%rdi)
// Enter the sleep state
sub $8, %rsp
mov %rsi, %rdi
mov %rdx, %rsi
mov %rcx, %rdx
call AcpiHwLegacySleepFinal
add $8, %rsp
.Lafter_sleep:
ret