blob: 62118d892aad232d6a10988ceb8adb4ea38aba67 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_ARM64_CONTEXT_H_
#define PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_ARM64_CONTEXT_H_
// Offset of all saved registers.
#define X19_O 0
#define X20_O 8
#define X21_O 16
#define X22_O 24
#define X23_O 32
#define X24_O 40
#define X25_O 48
#define X26_O 56
#define X27_O 64
#define X28_O 72
#define X29_O 80
#define X30_O 88
#define SP_O 96
#define D8_O 104
#define D9_O 112
#define D10_O 120
#define D11_O 128
#define D12_O 136
#define D13_O 144
#define D14_O 152
#define D15_O 160
#define X0_O 168
#if __has_feature(safe_stack)
#define UNSAFE_SP_O 176
#endif
#ifndef __ASSEMBLER__
#include <stddef.h>
#include <stdint.h>
namespace context {
enum Register {
REG_X19 = 0,
REG_X20,
REG_X21,
REG_X22,
REG_X23,
REG_X24,
REG_X25,
REG_X26,
REG_X27,
REG_X28,
REG_X29,
REG_X30,
REG_SP,
REG_D8,
REG_D9,
REG_D10,
REG_D11,
REG_D12,
REG_D13,
REG_D14,
REG_D15,
REG_X0,
#if __has_feature(safe_stack)
REG_UNSAFE_SP,
#endif
NUM_REGISTERS,
// Special registers.
REG_ARG0 = REG_X0,
REG_LR = REG_X30,
};
inline constexpr size_t kAdditionalStackAlignment = 0;
struct InternalContext {
uint64_t registers[NUM_REGISTERS];
};
#define ASSERT_REGISTER_OFFSET(REG) \
static_assert(offsetof(struct InternalContext, \
registers[context::REG_##REG]) == REG##_O, \
"offset is incorrect")
ASSERT_REGISTER_OFFSET(X19);
ASSERT_REGISTER_OFFSET(X20);
ASSERT_REGISTER_OFFSET(X21);
ASSERT_REGISTER_OFFSET(X22);
ASSERT_REGISTER_OFFSET(X23);
ASSERT_REGISTER_OFFSET(X24);
ASSERT_REGISTER_OFFSET(X25);
ASSERT_REGISTER_OFFSET(X26);
ASSERT_REGISTER_OFFSET(X27);
ASSERT_REGISTER_OFFSET(X28);
ASSERT_REGISTER_OFFSET(X29);
ASSERT_REGISTER_OFFSET(X30);
ASSERT_REGISTER_OFFSET(SP);
ASSERT_REGISTER_OFFSET(D8);
ASSERT_REGISTER_OFFSET(D9);
ASSERT_REGISTER_OFFSET(D10);
ASSERT_REGISTER_OFFSET(D11);
ASSERT_REGISTER_OFFSET(D12);
ASSERT_REGISTER_OFFSET(D13);
ASSERT_REGISTER_OFFSET(D14);
ASSERT_REGISTER_OFFSET(D15);
ASSERT_REGISTER_OFFSET(X0);
#if __has_feature(safe_stack)
ASSERT_REGISTER_OFFSET(UNSAFE_SP);
#endif
} // namespace context
#endif // __ASSEMBLER__
#endif // PERIDOT_BIN_LEDGER_COROUTINE_CONTEXT_ARM64_CONTEXT_H_