| // Copyright 2016 The Fuchsia Authors | 
 | // Copyright (c) 2008-2014 Travis Geiselbrecht | 
 | // | 
 | // 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 | 
 |  | 
 | #ifndef ZIRCON_KERNEL_INCLUDE_ARCH_H_ | 
 | #define ZIRCON_KERNEL_INCLUDE_ARCH_H_ | 
 |  | 
 | #include <sys/types.h> | 
 | #include <zircon/compiler.h> | 
 |  | 
 | __BEGIN_CDECLS | 
 |  | 
 | struct iframe_t; | 
 |  | 
 | // Early platform initialization, before UART, MMU, kernel command line args, etc. | 
 | void arch_early_init(void); | 
 |  | 
 | // Perform any set up required before virtual memory is enabled, or the heap is set up. | 
 | void arch_prevm_init(void); | 
 |  | 
 | // Perform any set up required after heap/MMU is available. | 
 | void arch_init(void); | 
 |  | 
 | // Perform any per-CPU set up required. | 
 | void arch_late_init_percpu(void); | 
 |  | 
 | // Called just before initiating a system suspend to give the arch layer a | 
 | // chance to save state.  Must be called with interrupts disabled. | 
 | void arch_suspend(void); | 
 |  | 
 | // Called immediately after resuming from a system suspend to let the arch layer | 
 | // reinitialize arch components.  Must be called with interrupts disabled. | 
 | void arch_resume(void); | 
 |  | 
 | // Initialize |iframe| for running a userspace thread. | 
 | // The rest of the current thread's state must already have been | 
 | // appropriately initialized (as viewable from a debugger at the | 
 | // ZX_EXCP_THREAD_STARTING exception). | 
 | void arch_setup_uspace_iframe(iframe_t* iframe, uintptr_t entry_point, uintptr_t sp, uintptr_t arg1, | 
 |                               uintptr_t arg2); | 
 |  | 
 | // Enter userspace. | 
 | // |iframe| is generally initialized with |arch_setup_uspace_iframe()|. | 
 | void arch_enter_uspace(iframe_t* iframe) __NO_RETURN; | 
 |  | 
 | __END_CDECLS | 
 |  | 
 | // On x86, user mode general registers are stored in one of two structures depending on how the | 
 | // thread entered the kernel.  If via interrupt/exception, they are stored in an iframe_t.  If via | 
 | // syscall, they are stored in an syscall_regs_t. | 
 | // | 
 | // On arm64, user mode general registers are stored in an iframe_t regardless of how the thread | 
 | // entered the kernel. | 
 | enum class GeneralRegsSource : uint32_t { | 
 |   None = 0u, | 
 |   Iframe = 1u, | 
 | #if defined(__x86_64__) | 
 |   Syscall = 2u, | 
 | #endif | 
 | }; | 
 |  | 
 | /* arch specific bits */ | 
 | #include <arch/defines.h> | 
 |  | 
 | #endif  // ZIRCON_KERNEL_INCLUDE_ARCH_H_ |