Skip to content

Commit 0a48860

Browse files
committed
add riscv64 architecture support
Author: Alex Suykov <[email protected]> Author: Aric Belsito <[email protected]> Author: Drew DeVault <[email protected]> Author: Michael Clark <[email protected]> Author: Michael Forney <[email protected]> Author: Stefan O'Rear <[email protected]> This port has involved the work of many people over several years. I have tried to ensure that everyone with substantial contributions has been credited above; if any omissions are found they will be noted later in an update to the authors/contributors list in the COPYRIGHT file. The version committed here comes from the riscv/riscv-musl repo's commit 3fe7e2c75df78eef42dcdc352a55757729f451e2, with minor changes by me for issues found during final review: - a_ll/a_sc atomics are removed (according to the ISA spec, lr/sc are not safe to use in separate inline asm fragments) - a_cas[_p] is fixed to be a memory barrier - the call from the _start assembly into the C part of crt1/ldso is changed to allow for the possibility that the linker does not place them nearby each other. - DTP_OFFSET is defined correctly so that local-dynamic TLS works - reloc.h LDSO_ARCH logic is simplified and made explicit. - unused, non-functional crti/n asm files are removed. - an empty .sdata section is added to crt1 so that the __global_pointer reference is resolvable. - indentation style errors in some asm files are fixed.
1 parent 5fc4379 commit 0a48860

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1362
-0
lines changed

arch/riscv64/atomic_arch.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#define a_barrier a_barrier
2+
static inline void a_barrier()
3+
{
4+
__asm__ __volatile__ ("fence rw,rw" : : : "memory");
5+
}
6+
7+
#define a_cas a_cas
8+
static inline int a_cas(volatile int *p, int t, int s)
9+
{
10+
int old, tmp;
11+
__asm__("\n1: lr.w.aqrl %0, %2\n"
12+
" bne %0, %3, 1f\n"
13+
" sc.w.aqrl %1, %4, %2\n"
14+
" bnez %1, 1b\n"
15+
"1:"
16+
: "=&r"(old), "+r"(tmp), "+A"(*p)
17+
: "r"(t), "r"(s));
18+
return old;
19+
}
20+
21+
#define a_cas_p a_cas_p
22+
static inline void *a_cas_p(volatile void *p, void *t, void *s)
23+
{
24+
void *old;
25+
int tmp;
26+
__asm__("\n1: lr.d.aqrl %0, %2\n"
27+
" bne %0, %3, 1f\n"
28+
" sc.d.aqrl %1, %4, %2\n"
29+
" bnez %1, 1b\n"
30+
"1:"
31+
: "=&r"(old), "+r"(tmp), "+A"(*(long *)p)
32+
: "r"(t), "r"(s));
33+
return old;
34+
}

arch/riscv64/bits/alltypes.h.in

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#define _Addr long
2+
#define _Int64 long
3+
#define _Reg long
4+
5+
TYPEDEF __builtin_va_list va_list;
6+
TYPEDEF __builtin_va_list __isoc_va_list;
7+
8+
#ifndef __cplusplus
9+
TYPEDEF int wchar_t;
10+
#endif
11+
12+
TYPEDEF int blksize_t;
13+
TYPEDEF unsigned int nlink_t;
14+
15+
TYPEDEF float float_t;
16+
TYPEDEF double double_t;
17+
18+
TYPEDEF struct { long long __ll; long double __ld; } max_align_t;
19+
20+
TYPEDEF long time_t;
21+
TYPEDEF long suseconds_t;
22+
23+
TYPEDEF struct { union { int __i[14]; volatile int __vi[14]; unsigned long __s[7]; } __u; } pthread_attr_t;
24+
TYPEDEF struct { union { int __i[10]; volatile int __vi[10]; volatile void *volatile __p[5]; } __u; } pthread_mutex_t;
25+
TYPEDEF struct { union { int __i[10]; volatile int __vi[10]; volatile void *volatile __p[5]; } __u; } mtx_t;
26+
TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[6]; } __u; } pthread_cond_t;
27+
TYPEDEF struct { union { int __i[12]; volatile int __vi[12]; void *__p[6]; } __u; } cnd_t;
28+
TYPEDEF struct { union { int __i[14]; volatile int __vi[14]; void *__p[7]; } __u; } pthread_rwlock_t;
29+
TYPEDEF struct { union { int __i[8]; volatile int __vi[8]; void *__p[4]; } __u; } pthread_barrier_t;

arch/riscv64/bits/endian.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#define __BYTE_ORDER __LITTLE_ENDIAN

arch/riscv64/bits/fcntl.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#define O_CREAT 0100
2+
#define O_EXCL 0200
3+
#define O_NOCTTY 0400
4+
#define O_TRUNC 01000
5+
#define O_APPEND 02000
6+
#define O_NONBLOCK 04000
7+
#define O_DSYNC 010000
8+
#define O_SYNC 04010000
9+
#define O_RSYNC 04010000
10+
#define O_DIRECTORY 0200000
11+
#define O_NOFOLLOW 0400000
12+
#define O_CLOEXEC 02000000
13+
14+
#define O_ASYNC 020000
15+
#define O_DIRECT 040000
16+
#define O_LARGEFILE 0100000
17+
#define O_NOATIME 01000000
18+
#define O_PATH 010000000
19+
#define O_TMPFILE 020200000
20+
#define O_NDELAY O_NONBLOCK
21+
22+
#define F_DUPFD 0
23+
#define F_GETFD 1
24+
#define F_SETFD 2
25+
#define F_GETFL 3
26+
#define F_SETFL 4
27+
#define F_GETLK 5
28+
#define F_SETLK 6
29+
#define F_SETLKW 7
30+
#define F_SETOWN 8
31+
#define F_GETOWN 9
32+
#define F_SETSIG 10
33+
#define F_GETSIG 11
34+
35+
#define F_SETOWN_EX 15
36+
#define F_GETOWN_EX 16
37+
38+
#define F_GETOWNER_UIDS 17

arch/riscv64/bits/fenv.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#define FE_INVALID 16
2+
#define FE_DIVBYZERO 8
3+
#define FE_OVERFLOW 4
4+
#define FE_UNDERFLOW 2
5+
#define FE_INEXACT 1
6+
7+
#define FE_ALL_EXCEPT 31
8+
9+
#define FE_TONEAREST 0
10+
#define FE_DOWNWARD 2
11+
#define FE_UPWARD 3
12+
#define FE_TOWARDZERO 1
13+
14+
typedef unsigned int fexcept_t;
15+
typedef unsigned int fenv_t;
16+
17+
#define FE_DFL_ENV ((const fenv_t *) -1)

arch/riscv64/bits/float.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#define FLT_EVAL_METHOD 0
2+
3+
#define LDBL_TRUE_MIN 6.47517511943802511092443895822764655e-4966L
4+
#define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
5+
#define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
6+
#define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
7+
8+
#define LDBL_MANT_DIG 113
9+
#define LDBL_MIN_EXP (-16381)
10+
#define LDBL_MAX_EXP 16384
11+
12+
#define LDBL_DIG 33
13+
#define LDBL_MIN_10_EXP (-4931)
14+
#define LDBL_MAX_10_EXP 4932
15+
16+
#define DECIMAL_DIG 36

arch/riscv64/bits/ipc.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
struct ipc_perm {
2+
key_t __ipc_perm_key;
3+
uid_t uid;
4+
gid_t gid;
5+
uid_t cuid;
6+
gid_t cgid;
7+
mode_t mode;
8+
unsigned short __ipc_perm_seq;
9+
10+
unsigned long __pad1;
11+
unsigned long __pad2;
12+
};
13+
14+
#define IPC_64 0

arch/riscv64/bits/limits.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
2+
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
3+
#define LONG_BIT 64
4+
#endif
5+
6+
#define LONG_MAX 0x7fffffffffffffffL
7+
#define LLONG_MAX 0x7fffffffffffffffLL

arch/riscv64/bits/mman.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#define MAP_32BIT 0x40

arch/riscv64/bits/msg.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
struct msqid_ds {
2+
struct ipc_perm msg_perm;
3+
time_t msg_stime;
4+
time_t msg_rtime;
5+
time_t msg_ctime;
6+
unsigned long msg_cbytes;
7+
msgqnum_t msg_qnum;
8+
msglen_t msg_qbytes;
9+
pid_t msg_lspid;
10+
pid_t msg_lrpid;
11+
unsigned long __pad1;
12+
unsigned long __pad2;
13+
};

0 commit comments

Comments
 (0)