blob: 2ef09b9f35d75cc8fabe552173bafbf74d5e041a [file] [log] [blame]
// Copyright 2018 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_VM_INCLUDE_VM_KSTACK_H_
#define ZIRCON_KERNEL_VM_INCLUDE_VM_KSTACK_H_
#include <sys/types.h>
#include <zircon/types.h>
#include <fbl/ref_ptr.h>
class VmAddressRegion;
// KernelStack encapsulates a kernel stack.
// A kernel stack object is not valid until Init() has been successfully
// called.
class KernelStack {
public:
KernelStack() = default;
// Destruction will automatically call Teardown();
~KernelStack();
// Disallow copy; disallow move.
KernelStack(KernelStack&) = delete;
KernelStack& operator=(KernelStack&) = delete;
KernelStack(KernelStack&&) = delete;
KernelStack& operator=(KernelStack&&) = delete;
// Initializes a kernel stack with appropriate overrun padding.
zx_status_t Init();
// Logs the relevant stack memory addresses at the given debug level.
// This is useful during a thread dump.
void DumpInfo(int debug_level) const;
// Returns the stack to its pre-Init() state.
zx_status_t Teardown();
vaddr_t base() const { return main_map_.base(); }
vaddr_t top() const { return main_map_.top(); }
#if __has_feature(safe_stack)
vaddr_t unsafe_base() const { return unsafe_map_.base(); }
vaddr_t unsafe_top() const { return unsafe_map_.top(); }
#endif
#if __has_feature(shadow_call_stack)
vaddr_t shadow_call_base() const { return shadow_call_map_.base(); }
vaddr_t shadow_call_top() const { return shadow_call_map_.top(); }
#endif
// Holds the relevant metadata and pointers for an individual mapping
struct Mapping {
fbl::RefPtr<VmAddressRegion> vmar_;
vaddr_t base() const;
size_t size() const;
vaddr_t top() const { return base() + size(); }
};
private:
Mapping main_map_;
#if __has_feature(safe_stack)
Mapping unsafe_map_;
#endif
#if __has_feature(shadow_call_stack)
Mapping shadow_call_map_;
#endif
};
#endif // ZIRCON_KERNEL_VM_INCLUDE_VM_KSTACK_H_