Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions abis/linux/auxv.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
#define AT_FPUCW 18
#define AT_SECURE 23
#define AT_RANDOM 25
#define AT_HWCAP2 26
#define AT_HWCAP3 29
#define AT_HWCAP4 30
#define AT_EXECFN 31
#define AT_SYSINFO_EHDR 33

Expand Down
7 changes: 4 additions & 3 deletions abis/linux/ipc.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#ifndef _ABIBITS_IPC_H
#define _ABIBITS_IPC_H

#include <abi-bits/uid_t.h>
#include <abi-bits/gid_t.h>
#include <abi-bits/mode_t.h>
#include <abi-bits/uid_t.h>

#ifdef __cplusplus
extern "C" {
Expand All @@ -18,11 +18,12 @@ extern "C" {
#define IPC_STAT 2
#define IPC_INFO 3

#define IPC_PRIVATE ((key_t) 0)
#define IPC_PRIVATE ((key_t)0)

#if defined(__aarch64__) || defined(__i386__) || defined(__m68k__)
#define IPC_64 0x100
#elif defined(__x86_64__) || (defined(__riscv) && __riscv_xlen == 64) || defined(__loongarch64)
#elif defined(__x86_64__) || (defined(__riscv) && __riscv_xlen == 64) || defined(__loongarch64) \
|| defined(__powerpc64__)
#define IPC_64 0
#else
#error "Unsupported arch!"
Expand Down
19 changes: 16 additions & 3 deletions abis/linux/shm.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
extern "C" {
#endif

#include <bits/ansi/time_t.h>
#include <abi-bits/pid_t.h>
#include <bits/ansi/time_t.h>

#include <unistd.h>
#include <sys/ipc.h>
#include <unistd.h>

#define SHM_R 0400
#define SHM_W 0200
Expand Down Expand Up @@ -64,7 +64,8 @@ struct shmid_ds {
time_t shm_dtime;
time_t shm_ctime;
};
#elif defined(__x86_64__) || defined(__aarch64__) || (defined(__riscv) && __riscv_xlen == 64) || defined(__loongarch64)
#elif defined(__x86_64__) || defined(__aarch64__) || (defined(__riscv) && __riscv_xlen == 64) \
|| defined(__loongarch64)
struct shmid_ds {
struct ipc_perm shm_perm;
size_t shm_segsz;
Expand All @@ -76,6 +77,18 @@ struct shmid_ds {
unsigned long shm_nattch;
unsigned long __unused[2];
};
#elif defined(__powerpc64__)
struct shmid_ds {
struct ipc_perm shm_perm;
time_t shm_atime;
time_t shm_dtime;
time_t shm_ctime;
size_t shm_segsz;
pid_t shm_cpid;
pid_t shm_lpid;
unsigned long shm_nattch;
unsigned long __unused[2];
};
Comment on lines +81 to +91
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure this is correct - this seems to match the definition of shmid64_ds for ppc64, which is a different struct. I think the correct definition is the one above.

#else
#error "Missing architecture specific code."
#endif
Expand Down
204 changes: 121 additions & 83 deletions abis/linux/signal.h
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
#ifndef _ABIBITS_SIGNAL_H
#define _ABIBITS_SIGNAL_H

#include <stdint.h>
#include <time.h>
#include <abi-bits/sigevent.h>
#include <abi-bits/pid_t.h>
#include <abi-bits/sigevent.h>
#include <abi-bits/uid_t.h>
#include <asm/types.h>
#include <bits/size_t.h>
#include <stdint.h>
#include <time.h>

#define POLL_IN 1
#define POLL_OUT 2
Expand All @@ -20,7 +21,7 @@
typedef struct {
int si_signo, si_errno, si_code;
union {
char __pad[128 - 2*sizeof(int) - sizeof(long)];
char __pad[128 - 2 * sizeof(int) - sizeof(long)];
struct {
union {
struct {
Expand Down Expand Up @@ -62,26 +63,26 @@ typedef struct {
} __sigsys;
} __si_fields;
} siginfo_t;
#define si_pid __si_fields.__si_common.__first.__piduid.si_pid
#define si_uid __si_fields.__si_common.__first.__piduid.si_uid
#define si_status __si_fields.__si_common.__second.__sigchld.si_status
#define si_utime __si_fields.__si_common.__second.__sigchld.si_utime
#define si_stime __si_fields.__si_common.__second.__sigchld.si_stime
#define si_value __si_fields.__si_common.__second.si_value
#define si_addr __si_fields.__sigfault.si_addr
#define si_pid __si_fields.__si_common.__first.__piduid.si_pid
#define si_uid __si_fields.__si_common.__first.__piduid.si_uid
#define si_status __si_fields.__si_common.__second.__sigchld.si_status
#define si_utime __si_fields.__si_common.__second.__sigchld.si_utime
#define si_stime __si_fields.__si_common.__second.__sigchld.si_stime
#define si_value __si_fields.__si_common.__second.si_value
#define si_addr __si_fields.__sigfault.si_addr
#define si_addr_lsb __si_fields.__sigfault.si_addr_lsb
#define si_lower __si_fields.__sigfault.__first.__addr_bnd.si_lower
#define si_upper __si_fields.__sigfault.__first.__addr_bnd.si_upper
#define si_pkey __si_fields.__sigfault.__first.si_pkey
#define si_band __si_fields.__sigpoll.si_band
#define si_fd __si_fields.__sigpoll.si_fd
#define si_lower __si_fields.__sigfault.__first.__addr_bnd.si_lower
#define si_upper __si_fields.__sigfault.__first.__addr_bnd.si_upper
#define si_pkey __si_fields.__sigfault.__first.si_pkey
#define si_band __si_fields.__sigpoll.si_band
#define si_fd __si_fields.__sigpoll.si_fd
#define si_timerid __si_fields.__si_common.__first.__timer.si_timerid
#define si_overrun __si_fields.__si_common.__first.__timer.si_overrun
#define si_ptr si_value.sival_ptr
#define si_int si_value.sival_int
#define si_ptr si_value.sival_ptr
#define si_int si_value.sival_int
#define si_call_addr __si_fields.__sigsys.si_call_addr
#define si_syscall __si_fields.__sigsys.si_syscall
#define si_arch __si_fields.__sigsys.si_arch
#define si_arch __si_fields.__sigsys.si_arch

/* Required for sys_sigaction sysdep. */
#define SA_NOCLDSTOP 1
Expand All @@ -98,7 +99,7 @@ extern "C" {
#endif

/* Argument for signal() */
typedef void (*__sighandler) (int);
typedef void (*__sighandler)(int);

#define SIG_ERR ((__sighandler)(void *)(-1))
#define SIG_DFL ((__sighandler)(void *)(0))
Expand All @@ -125,35 +126,41 @@ typedef struct {
#define SIG_UNBLOCK 1
#define SIG_SETMASK 2

#define SIGHUP 1
#define SIGQUIT 3
#define SIGTRAP 5
#define SIGIOT SIGABRT
#define SIGBUS 7
#define SIGKILL 9
#define SIGUSR1 10
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGHUP 1
#define SIGQUIT 3
#define SIGTRAP 5
#define SIGIOT SIGABRT
#define SIGBUS 7
#define SIGKILL 9
#define SIGUSR1 10
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGWINCH 28
#define SIGPOLL 29
#define SIGSYS 31
#define SIGWINCH 28
#define SIGPOLL 29
#define SIGSYS 31
#define SIGUNUSED SIGSYS
#define SIGCANCEL 32

#if defined(__powerpc64__)
#define MINSIGSTKSZ 8192
#define SIGSTKSZ 32768
#else
#define MINSIGSTKSZ 2048
#define SIGSTKSZ 8192
#endif

#define SS_ONSTACK 1
#define SS_DISABLE 2

Expand Down Expand Up @@ -359,17 +366,17 @@ typedef struct __ucontext {
#define NGREG 32

enum {
REG_PC = 0,
REG_PC = 0,
#define REG_PC REG_PC
REG_RA = 1,
REG_RA = 1,
#define REG_RA REG_RA
REG_SP = 2,
REG_SP = 2,
#define REG_SP REG_SP
REG_TP = 4,
REG_TP = 4,
#define REG_TP REG_TP
REG_S0 = 8,
REG_S0 = 8,
#define REG_S0 REG_S0
REG_A0 = 10
REG_A0 = 10
#define REG_A0 REG_A0
};

Expand Down Expand Up @@ -404,7 +411,7 @@ typedef struct sigcontext {

typedef struct __ucontext {
unsigned long uc_flags;
struct ucontext *uc_link;
struct ucontext *uc_link;
stack_t uc_stack;
sigset_t uc_sigmask;
#pragma GCC diagnostic push
Expand All @@ -414,7 +421,7 @@ typedef struct __ucontext {
mcontext_t uc_mcontext;
} ucontext_t;

#elif defined (__aarch64__)
#elif defined(__aarch64__)

#define NGREG 34

Expand Down Expand Up @@ -456,38 +463,29 @@ struct sve_context {
uint16_t vl;
uint16_t __reserved[3];
};
#define SVE_VQ_BYTES 16
#define SVE_VQ_MIN 1
#define SVE_VQ_MAX 512
#define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES)
#define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES)
#define SVE_NUM_ZREGS 32
#define SVE_NUM_PREGS 16
#define sve_vl_valid(vl) \
((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
#define sve_vq_from_vl(vl) ((vl) / SVE_VQ_BYTES)
#define sve_vl_from_vq(vq) ((vq) * SVE_VQ_BYTES)
#define SVE_SIG_ZREG_SIZE(vq) ((unsigned)(vq) * SVE_VQ_BYTES)
#define SVE_SIG_PREG_SIZE(vq) ((unsigned)(vq) * (SVE_VQ_BYTES / 8))
#define SVE_SIG_FFR_SIZE(vq) SVE_SIG_PREG_SIZE(vq)
#define SVE_SIG_REGS_OFFSET \
((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) \
/ SVE_VQ_BYTES * SVE_VQ_BYTES)
#define SVE_SIG_ZREGS_OFFSET SVE_SIG_REGS_OFFSET
#define SVE_SIG_ZREG_OFFSET(vq, n) \
(SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n))
#define SVE_SIG_ZREGS_SIZE(vq) \
(SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET)
#define SVE_SIG_PREGS_OFFSET(vq) \
(SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq))
#define SVE_SIG_PREG_OFFSET(vq, n) \
(SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n))
#define SVE_SIG_PREGS_SIZE(vq) \
(SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq))
#define SVE_SIG_FFR_OFFSET(vq) \
(SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq))
#define SVE_SIG_REGS_SIZE(vq) \
(SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET)
#define SVE_VQ_BYTES 16
#define SVE_VQ_MIN 1
#define SVE_VQ_MAX 512
#define SVE_VL_MIN (SVE_VQ_MIN * SVE_VQ_BYTES)
#define SVE_VL_MAX (SVE_VQ_MAX * SVE_VQ_BYTES)
#define SVE_NUM_ZREGS 32
#define SVE_NUM_PREGS 16
#define sve_vl_valid(vl) ((vl) % SVE_VQ_BYTES == 0 && (vl) >= SVE_VL_MIN && (vl) <= SVE_VL_MAX)
#define sve_vq_from_vl(vl) ((vl) / SVE_VQ_BYTES)
#define sve_vl_from_vq(vq) ((vq) * SVE_VQ_BYTES)
#define SVE_SIG_ZREG_SIZE(vq) ((unsigned)(vq) * SVE_VQ_BYTES)
#define SVE_SIG_PREG_SIZE(vq) ((unsigned)(vq) * (SVE_VQ_BYTES / 8))
#define SVE_SIG_FFR_SIZE(vq) SVE_SIG_PREG_SIZE(vq)
#define SVE_SIG_REGS_OFFSET \
((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) / SVE_VQ_BYTES * SVE_VQ_BYTES)
#define SVE_SIG_ZREGS_OFFSET SVE_SIG_REGS_OFFSET
#define SVE_SIG_ZREG_OFFSET(vq, n) (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREG_SIZE(vq) * (n))
#define SVE_SIG_ZREGS_SIZE(vq) (SVE_SIG_ZREG_OFFSET(vq, SVE_NUM_ZREGS) - SVE_SIG_ZREGS_OFFSET)
#define SVE_SIG_PREGS_OFFSET(vq) (SVE_SIG_ZREGS_OFFSET + SVE_SIG_ZREGS_SIZE(vq))
#define SVE_SIG_PREG_OFFSET(vq, n) (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREG_SIZE(vq) * (n))
#define SVE_SIG_PREGS_SIZE(vq) (SVE_SIG_PREG_OFFSET(vq, SVE_NUM_PREGS) - SVE_SIG_PREGS_OFFSET(vq))
#define SVE_SIG_FFR_OFFSET(vq) (SVE_SIG_PREGS_OFFSET(vq) + SVE_SIG_PREGS_SIZE(vq))
#define SVE_SIG_REGS_SIZE(vq) (SVE_SIG_FFR_OFFSET(vq) + SVE_SIG_FFR_SIZE(vq) - SVE_SIG_REGS_OFFSET)
#define SVE_SIG_CONTEXT_SIZE(vq) (SVE_SIG_REGS_OFFSET + SVE_SIG_REGS_SIZE(vq))

typedef struct __ucontext {
Expand All @@ -498,7 +496,7 @@ typedef struct __ucontext {
mcontext_t uc_mcontext;
} ucontext_t;

#elif defined (__m68k__)
#elif defined(__m68k__)

/* taken from musl */

Expand Down Expand Up @@ -630,6 +628,46 @@ typedef struct __ucontext {
mcontext_t uc_mcontext;
} ucontext_t;

#elif defined(__powerpc64__)

struct sigaltstack {
void *ss_sp;
int ss_flags;
size_t ss_size;
};

typedef unsigned long greg_t, gregset_t[48];
typedef double fpreg_t, fpregset_t[33];

typedef __vector128 vrreg_t;
typedef vrreg_t vrregset_t[34];

struct pt_regs {
greg_t gpr[32];
greg_t pc;
};

struct sigcontext {
unsigned long _unused[4];
int signal;
int _pad0;
unsigned long handler;
unsigned long oldmask;
struct pt_regs *regs;
gregset_t gp_regs;
fpregset_t fp_regs;
vrreg_t *v_regs;
long vmx_reserve[101];
};

typedef struct __ucontext {
unsigned long uc_flags;
struct ucontext *uc_link;
stack_t uc_stack;
sigset_t uc_sigmask;
struct sigcontext uc_mcontext;
} ucontext_t;

#else
#error "Missing architecture specific code."
#endif
Expand Down
Loading