1// Copyright 2019 The Marl Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#define MARL_REG_RBX 0x00
16#define MARL_REG_RBP 0x08
17#define MARL_REG_R12 0x10
18#define MARL_REG_R13 0x18
19#define MARL_REG_R14 0x20
20#define MARL_REG_R15 0x28
21#define MARL_REG_RDI 0x30
22#define MARL_REG_RSI 0x38
23#define MARL_REG_RSP 0x40
24#define MARL_REG_RIP 0x48
25
26#if defined(__APPLE__)
27#define MARL_ASM_SYMBOL(x) _##x
28#else
29#define MARL_ASM_SYMBOL(x) x
30#endif
31
32#ifndef MARL_BUILD_ASM
33
34#include <stdint.h>
35
36struct marl_fiber_context {
37 // callee-saved registers
38 uintptr_t RBX;
39 uintptr_t RBP;
40 uintptr_t R12;
41 uintptr_t R13;
42 uintptr_t R14;
43 uintptr_t R15;
44
45 // parameter registers
46 uintptr_t RDI;
47 uintptr_t RSI;
48
49 // stack and instruction registers
50 uintptr_t RSP;
51 uintptr_t RIP;
52};
53
54#ifdef __cplusplus
55#include <cstddef>
56static_assert(offsetof(marl_fiber_context, RBX) == MARL_REG_RBX,
57 "Bad register offset");
58static_assert(offsetof(marl_fiber_context, RBP) == MARL_REG_RBP,
59 "Bad register offset");
60static_assert(offsetof(marl_fiber_context, R12) == MARL_REG_R12,
61 "Bad register offset");
62static_assert(offsetof(marl_fiber_context, R13) == MARL_REG_R13,
63 "Bad register offset");
64static_assert(offsetof(marl_fiber_context, R14) == MARL_REG_R14,
65 "Bad register offset");
66static_assert(offsetof(marl_fiber_context, R15) == MARL_REG_R15,
67 "Bad register offset");
68static_assert(offsetof(marl_fiber_context, RDI) == MARL_REG_RDI,
69 "Bad register offset");
70static_assert(offsetof(marl_fiber_context, RSI) == MARL_REG_RSI,
71 "Bad register offset");
72static_assert(offsetof(marl_fiber_context, RSP) == MARL_REG_RSP,
73 "Bad register offset");
74static_assert(offsetof(marl_fiber_context, RIP) == MARL_REG_RIP,
75 "Bad register offset");
76#endif // __cplusplus
77
78#endif // MARL_BUILD_ASM
79