The Pedigree Project 0.1
linux-amd64-signal-abi.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef POSIX_LINUX_AMD64_SIGNAL_ABI_H
21#define POSIX_LINUX_AMD64_SIGNAL_ABI_H
22
23#include "pedigree/kernel/processor/types.h"
24
25namespace LinuxAmd64SignalAbi {
26struct Stack {
27 uint64_t stackPointer;
28 int32_t flags;
29 uint32_t padding;
30 uint64_t size;
31};
32
33struct Sigcontext {
34 uint64_t r8;
35 uint64_t r9;
36 uint64_t r10;
37 uint64_t r11;
38 uint64_t r12;
39 uint64_t r13;
40 uint64_t r14;
41 uint64_t r15;
42 uint64_t rdi;
43 uint64_t rsi;
44 uint64_t rbp;
45 uint64_t rbx;
46 uint64_t rdx;
47 uint64_t rax;
48 uint64_t rcx;
49 uint64_t rsp;
50 uint64_t rip;
51 uint64_t rflags;
52 uint16_t cs;
53 uint16_t gs;
54 uint16_t fs;
55 uint16_t ss;
56 uint64_t errorCode;
57 uint64_t trapNumber;
58 uint64_t oldMask;
59 uint64_t cr2;
60 uint64_t fpstate;
61 uint64_t reserved[8];
62};
63
64struct Ucontext {
65 uint64_t flags;
66 uint64_t link;
67 Stack stack;
68 Sigcontext mcontext;
69 uint64_t signalMask;
70};
71
72struct alignas(8) Siginfo {
73 uint8_t bytes[128];
74};
75
76struct RtSigframe {
77 uint64_t restorer;
78 Ucontext ucontext;
79 Siginfo info;
80};
81
82struct alignas(16) Fpstate {
83 uint16_t cwd;
84 uint16_t swd;
85 uint16_t ftw;
86 uint16_t fop;
87 uint64_t rip;
88 uint64_t rdp;
89 uint32_t mxcsr;
90 uint32_t mxcsrMask;
91 uint32_t stSpace[32];
92 uint32_t xmmSpace[64];
93 uint32_t reserved2[12];
94 uint32_t reserved3[12];
95};
96
97static_assert(sizeof(Stack) == 24, "Linux amd64 stack_t must be 24 bytes");
98static_assert(sizeof(Sigcontext) == 256, "Linux amd64 sigcontext must be 256 bytes");
99static_assert(sizeof(Ucontext) == 304, "Linux amd64 ucontext must be 304 bytes");
100static_assert(sizeof(Siginfo) == 128, "Linux siginfo_t must be 128 bytes");
101static_assert(alignof(Siginfo) == 8, "Linux siginfo_t must be 8-byte aligned");
102static_assert(sizeof(RtSigframe) == 440, "Linux amd64 rt_sigframe base must be 440 bytes");
103static_assert(sizeof(Fpstate) == 512, "Linux amd64 fpstate must be 512 bytes");
104static_assert(alignof(Fpstate) == 16, "Linux amd64 fpstate must be 16-byte aligned");
105
106static_assert(__builtin_offsetof(Ucontext, mcontext) == 40,
107 "Linux amd64 ucontext mcontext offset must be 40");
108static_assert(__builtin_offsetof(RtSigframe, ucontext) == 8,
109 "Linux amd64 rt_sigframe ucontext offset must be 8");
110static_assert(__builtin_offsetof(RtSigframe, info) == 312,
111 "Linux amd64 rt_sigframe siginfo offset must be 312");
112static_assert(__builtin_offsetof(Sigcontext, fpstate) == 184,
113 "Linux amd64 sigcontext fpstate offset must be 184");
114} // namespace LinuxAmd64SignalAbi
115
116#endif