blob: 5d35efebae292f88b1d74950b50e157d715333b0 [file] [log] [blame]
// Copyright 2020 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
#ifndef ZIRCON_KERNEL_PHYS_STACK_H_
#define ZIRCON_KERNEL_PHYS_STACK_H_
#include <zircon/compiler.h>
#define BOOT_STACK_ALIGN 16
#define BOOT_STACK_SIZE 16384
#if __has_feature(shadow_call_stack)
#define BOOT_SHADOW_CALL_STACK_SIZE 512
#endif // __has_feature(shadow_call_stack)
#ifndef __ASSEMBLER__
#include <stdint.h>
struct BootStack {
alignas(BOOT_STACK_ALIGN) uint8_t stack[BOOT_STACK_SIZE];
static_assert(BOOT_STACK_SIZE % BOOT_STACK_ALIGN == 0);
};
extern BootStack boot_stack;
// Returns true iff SP falls on the boot stack.
// This considers the limit to be "on".
bool IsOnStack(uintptr_t sp);
#if __has_feature(safe_stack)
extern BootStack boot_unsafe_stack;
#endif // __has_feature(safe_stack)
#if __has_feature(shadow_call_stack)
static_assert(BOOT_SHADOW_CALL_STACK_SIZE % sizeof(uintptr_t) == 0);
extern uintptr_t boot_shadow_call_stack[BOOT_SHADOW_CALL_STACK_SIZE / sizeof(uintptr_t)];
#endif // __has_feature(shadow_call_stack)
#endif // __ASSEMBLER__
#endif // ZIRCON_KERNEL_PHYS_STACK_H_