mirror of https://github.com/n-hys/nspr.git
Added support for OpenSolaris on Alpha, AArch64 and RISC-V
This commit is contained in:
parent
8c7d5607f1
commit
6b845ba0ee
|
@ -18,6 +18,12 @@
|
|||
#define _PR_SI_ARCHITECTURE "x86-64"
|
||||
#elif defined(i386)
|
||||
#define _PR_SI_ARCHITECTURE "x86"
|
||||
#elif defined(__alpha)
|
||||
#define _PR_SI_ARCHITECTURE "alpha"
|
||||
#elif defined(__aarch64)
|
||||
#define _PR_SI_ARCHITECTURE "aarch64"
|
||||
#elif defined(__riscv)
|
||||
#define _PR_SI_ARCHITECTURE "riscv64"
|
||||
#else
|
||||
#error unknown processor
|
||||
#endif
|
||||
|
@ -292,7 +298,63 @@ NSPR_API(void) _MD_SolarisInit();
|
|||
setcontext(uc); \
|
||||
PR_END_MACRO
|
||||
#endif
|
||||
#elif defined __alpha
|
||||
|
||||
#define USE_SETJMP
|
||||
#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \
|
||||
{ \
|
||||
*status = PR_TRUE; \
|
||||
if (setjmp(CONTEXT(_thread))) { \
|
||||
(*_main)(); \
|
||||
} \
|
||||
_MD_GET_SP(_thread) = (long) ((_sp) - 64); \
|
||||
_MD_GET_SP(_thread) &= ~15; \
|
||||
}
|
||||
|
||||
#define _MD_SWITCH_CONTEXT(_thread) \
|
||||
if (!setjmp(CONTEXT(_thread))) { \
|
||||
(_thread)->md.errcode = errno; \
|
||||
_PR_Schedule(); \
|
||||
}
|
||||
|
||||
/*
|
||||
** Restore a thread context, saved by _MD_SWITCH_CONTEXT
|
||||
*/
|
||||
#define _MD_RESTORE_CONTEXT(_thread) \
|
||||
{ \
|
||||
errno = (_thread)->md.errcode; \
|
||||
_MD_SET_CURRENT_THREAD(_thread); \
|
||||
longjmp(CONTEXT(_thread), 1); \
|
||||
}
|
||||
|
||||
#elif defined __aarch64
|
||||
|
||||
#define USE_SETJMP
|
||||
#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \
|
||||
{ \
|
||||
*status = PR_TRUE; \
|
||||
if (setjmp(CONTEXT(_thread))) { \
|
||||
(*_main)(); \
|
||||
} \
|
||||
_MD_GET_SP(_thread) = (long) ((_sp) - 64); \
|
||||
_MD_GET_SP(_thread) &= ~15; \
|
||||
}
|
||||
|
||||
#define _MD_SWITCH_CONTEXT(_thread) \
|
||||
if (!setjmp(CONTEXT(_thread))) { \
|
||||
(_thread)->md.errcode = errno; \
|
||||
_PR_Schedule(); \
|
||||
}
|
||||
|
||||
/*
|
||||
** Restore a thread context, saved by _MD_SWITCH_CONTEXT
|
||||
*/
|
||||
#define _MD_RESTORE_CONTEXT(_thread) \
|
||||
{ \
|
||||
errno = (_thread)->md.errcode; \
|
||||
_MD_SET_CURRENT_THREAD(_thread); \
|
||||
longjmp(CONTEXT(_thread), 1); \
|
||||
}
|
||||
#else /* x86 solaris */
|
||||
|
||||
#ifdef USE_SETJMP
|
||||
|
|
|
@ -0,0 +1,189 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef nspr_cpucfg___
|
||||
#define nspr_cpucfg___
|
||||
|
||||
#ifndef XP_UNIX
|
||||
#define XP_UNIX
|
||||
#endif
|
||||
|
||||
#ifndef SOLARIS
|
||||
#define SOLARIS
|
||||
#endif
|
||||
|
||||
#define PR_AF_INET6 26 /* same as AF_INET6 */
|
||||
|
||||
#if defined(sparc) || defined(__sparc)
|
||||
#undef IS_LITTLE_ENDIAN
|
||||
#define IS_BIG_ENDIAN 1
|
||||
#define PR_ALIGN_OF_INT64 8
|
||||
#define PR_ALIGN_OF_DOUBLE 8
|
||||
#if defined(__sparcv9)
|
||||
#define IS_64
|
||||
#endif
|
||||
#elif defined(__x86_64)
|
||||
#define IS_LITTLE_ENDIAN 1
|
||||
#undef IS_BIG_ENDIAN
|
||||
#define PR_ALIGN_OF_INT64 8
|
||||
#define PR_ALIGN_OF_DOUBLE 8
|
||||
#define IS_64
|
||||
#elif defined(i386) || defined(__i386)
|
||||
#define IS_LITTLE_ENDIAN 1
|
||||
#undef IS_BIG_ENDIAN
|
||||
#define PR_ALIGN_OF_INT64 4
|
||||
#define PR_ALIGN_OF_DOUBLE 4
|
||||
#elif defined(__alpha)
|
||||
#define IS_LITTLE_ENDIAN 1
|
||||
#undef IS_BIG_ENDIAN
|
||||
#define PR_ALIGN_OF_INT64 8
|
||||
#define PR_ALIGN_OF_DOUBLE 8
|
||||
#define IS_64
|
||||
#elif defined(__aarch64)
|
||||
#define IS_LITTLE_ENDIAN 1
|
||||
#undef IS_BIG_ENDIAN
|
||||
#define PR_ALIGN_OF_INT64 8
|
||||
#define PR_ALIGN_OF_DOUBLE 8
|
||||
#define IS_64
|
||||
#elif defined(__riscv)
|
||||
#define IS_LITTLE_ENDIAN 1
|
||||
#undef IS_BIG_ENDIAN
|
||||
#define PR_ALIGN_OF_INT64 8
|
||||
#define PR_ALIGN_OF_DOUBLE 8
|
||||
#define IS_64
|
||||
#else
|
||||
#error unknown processor
|
||||
#endif
|
||||
|
||||
#ifdef IS_64
|
||||
|
||||
#define PR_BYTES_PER_BYTE 1
|
||||
#define PR_BYTES_PER_SHORT 2
|
||||
#define PR_BYTES_PER_INT 4
|
||||
#define PR_BYTES_PER_INT64 8
|
||||
#define PR_BYTES_PER_LONG 8
|
||||
#define PR_BYTES_PER_FLOAT 4
|
||||
#define PR_BYTES_PER_DOUBLE 8
|
||||
#define PR_BYTES_PER_WORD 8
|
||||
#define PR_BYTES_PER_DWORD 8
|
||||
#define PR_BYTES_PER_WORD_LOG2 3
|
||||
#define PR_BYTES_PER_DWORD_LOG2 3
|
||||
|
||||
#define PR_BITS_PER_BYTE 8
|
||||
#define PR_BITS_PER_SHORT 16
|
||||
#define PR_BITS_PER_INT 32
|
||||
#define PR_BITS_PER_INT64 64
|
||||
#define PR_BITS_PER_LONG 64
|
||||
#define PR_BITS_PER_FLOAT 32
|
||||
#define PR_BITS_PER_DOUBLE 64
|
||||
#define PR_BITS_PER_WORD 64
|
||||
|
||||
#define PR_BITS_PER_BYTE_LOG2 3
|
||||
#define PR_BITS_PER_SHORT_LOG2 4
|
||||
#define PR_BITS_PER_INT_LOG2 5
|
||||
#define PR_BITS_PER_INT64_LOG2 6
|
||||
#define PR_BITS_PER_LONG_LOG2 6
|
||||
#define PR_BITS_PER_FLOAT_LOG2 5
|
||||
#define PR_BITS_PER_DOUBLE_LOG2 6
|
||||
#define PR_BITS_PER_WORD_LOG2 6
|
||||
|
||||
#define PR_ALIGN_OF_SHORT 2
|
||||
#define PR_ALIGN_OF_INT 4
|
||||
#define PR_ALIGN_OF_LONG 8
|
||||
#define PR_ALIGN_OF_FLOAT 4
|
||||
#define PR_ALIGN_OF_POINTER 8
|
||||
|
||||
#else /* IS_64 */
|
||||
|
||||
#define PR_BYTES_PER_BYTE 1
|
||||
#define PR_BYTES_PER_SHORT 2
|
||||
#define PR_BYTES_PER_INT 4
|
||||
#define PR_BYTES_PER_INT64 8
|
||||
#define PR_BYTES_PER_LONG 4
|
||||
#define PR_BYTES_PER_FLOAT 4
|
||||
#define PR_BYTES_PER_DOUBLE 8
|
||||
#define PR_BYTES_PER_WORD 4
|
||||
#define PR_BYTES_PER_DWORD 8
|
||||
#define PR_BYTES_PER_WORD_LOG2 2
|
||||
#define PR_BYTES_PER_DWORD_LOG2 3
|
||||
|
||||
#define PR_BITS_PER_BYTE 8
|
||||
#define PR_BITS_PER_SHORT 16
|
||||
#define PR_BITS_PER_INT 32
|
||||
#define PR_BITS_PER_INT64 64
|
||||
#define PR_BITS_PER_LONG 32
|
||||
#define PR_BITS_PER_FLOAT 32
|
||||
#define PR_BITS_PER_DOUBLE 64
|
||||
#define PR_BITS_PER_WORD 32
|
||||
|
||||
#define PR_BITS_PER_BYTE_LOG2 3
|
||||
#define PR_BITS_PER_SHORT_LOG2 4
|
||||
#define PR_BITS_PER_INT_LOG2 5
|
||||
#define PR_BITS_PER_INT64_LOG2 6
|
||||
#define PR_BITS_PER_LONG_LOG2 5
|
||||
#define PR_BITS_PER_FLOAT_LOG2 5
|
||||
#define PR_BITS_PER_DOUBLE_LOG2 6
|
||||
#define PR_BITS_PER_WORD_LOG2 5
|
||||
|
||||
#define PR_ALIGN_OF_SHORT 2
|
||||
#define PR_ALIGN_OF_INT 4
|
||||
#define PR_ALIGN_OF_LONG 4
|
||||
#define PR_ALIGN_OF_FLOAT 4
|
||||
#define PR_ALIGN_OF_POINTER 4
|
||||
|
||||
#endif /* IS_64 */
|
||||
|
||||
#ifndef HAVE_LONG_LONG
|
||||
#define HAVE_LONG_LONG
|
||||
#endif
|
||||
#define HAVE_ALIGNED_DOUBLES
|
||||
#define HAVE_ALIGNED_LONGLONGS
|
||||
|
||||
#ifndef NO_NSPR_10_SUPPORT
|
||||
|
||||
#define BYTES_PER_BYTE PR_BYTES_PER_BYTE
|
||||
#define BYTES_PER_SHORT PR_BYTES_PER_SHORT
|
||||
#define BYTES_PER_INT PR_BYTES_PER_INT
|
||||
#define BYTES_PER_INT64 PR_BYTES_PER_INT64
|
||||
#define BYTES_PER_LONG PR_BYTES_PER_LONG
|
||||
#define BYTES_PER_FLOAT PR_BYTES_PER_FLOAT
|
||||
#define BYTES_PER_DOUBLE PR_BYTES_PER_DOUBLE
|
||||
#define BYTES_PER_WORD PR_BYTES_PER_WORD
|
||||
#define BYTES_PER_DWORD PR_BYTES_PER_DWORD
|
||||
|
||||
#define BITS_PER_BYTE PR_BITS_PER_BYTE
|
||||
#define BITS_PER_SHORT PR_BITS_PER_SHORT
|
||||
#define BITS_PER_INT PR_BITS_PER_INT
|
||||
#define BITS_PER_INT64 PR_BITS_PER_INT64
|
||||
#define BITS_PER_LONG PR_BITS_PER_LONG
|
||||
#define BITS_PER_FLOAT PR_BITS_PER_FLOAT
|
||||
#define BITS_PER_DOUBLE PR_BITS_PER_DOUBLE
|
||||
#define BITS_PER_WORD PR_BITS_PER_WORD
|
||||
|
||||
#define BITS_PER_BYTE_LOG2 PR_BITS_PER_BYTE_LOG2
|
||||
#define BITS_PER_SHORT_LOG2 PR_BITS_PER_SHORT_LOG2
|
||||
#define BITS_PER_INT_LOG2 PR_BITS_PER_INT_LOG2
|
||||
#define BITS_PER_INT64_LOG2 PR_BITS_PER_INT64_LOG2
|
||||
#define BITS_PER_LONG_LOG2 PR_BITS_PER_LONG_LOG2
|
||||
#define BITS_PER_FLOAT_LOG2 PR_BITS_PER_FLOAT_LOG2
|
||||
#define BITS_PER_DOUBLE_LOG2 PR_BITS_PER_DOUBLE_LOG2
|
||||
#define BITS_PER_WORD_LOG2 PR_BITS_PER_WORD_LOG2
|
||||
|
||||
#define ALIGN_OF_SHORT PR_ALIGN_OF_SHORT
|
||||
#define ALIGN_OF_INT PR_ALIGN_OF_INT
|
||||
#define ALIGN_OF_LONG PR_ALIGN_OF_LONG
|
||||
#define ALIGN_OF_INT64 PR_ALIGN_OF_INT64
|
||||
#define ALIGN_OF_FLOAT PR_ALIGN_OF_FLOAT
|
||||
#define ALIGN_OF_DOUBLE PR_ALIGN_OF_DOUBLE
|
||||
#define ALIGN_OF_POINTER PR_ALIGN_OF_POINTER
|
||||
#define ALIGN_OF_WORD PR_ALIGN_OF_WORD
|
||||
|
||||
#define BYTES_PER_WORD_LOG2 PR_BYTES_PER_WORD_LOG2
|
||||
#define BYTES_PER_DWORD_LOG2 PR_BYTES_PER_DWORD_LOG2
|
||||
#define WORDS_PER_DWORD_LOG2 PR_WORDS_PER_DWORD_LOG2
|
||||
|
||||
#endif /* NO_NSPR_10_SUPPORT */
|
||||
|
||||
#endif /* ifndef nspr_cpucfg___ */
|
|
@ -0,0 +1,65 @@
|
|||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#include <sys/asm_linkage.h>
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicIncrement(PRInt32 *val)
|
||||
//
|
||||
// Atomically increment the integer pointed to by 'val' and return
|
||||
// the result of the increment.
|
||||
//
|
||||
ENTRY(_MD_AtomicIncrement)
|
||||
1: ldaxr w1, [x0]
|
||||
add w1, w1, #1
|
||||
stxr w2, w1, [x0]
|
||||
cbnz w2, 1b
|
||||
mov w0, w1
|
||||
ret
|
||||
SET_SIZE(_MD_AtomicIncrement)
|
||||
|
||||
// PRInt32 _MD_AtomicDecrement(PRInt32 *val)
|
||||
//
|
||||
// Atomically decrement the integer pointed to by 'val' and return
|
||||
// the result of the decrement.
|
||||
//
|
||||
ENTRY(_MD_AtomicDecrement)
|
||||
1: ldaxr w1, [x0]
|
||||
sub w1, w1, #1
|
||||
stxr w2, w1, [x0]
|
||||
cbnz w2, 1b
|
||||
mov w0, w1
|
||||
ret
|
||||
SET_SIZE(_MD_AtomicDecrement)
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicSet(PRInt32 *val, PRInt32 newval)
|
||||
//
|
||||
// Atomically set the integer pointed to by 'val' to the new
|
||||
// value 'newval' and return the old value.
|
||||
//
|
||||
ENTRY(_MD_AtomicSet)
|
||||
1: ldaxr w2, [x0]
|
||||
stxr w3, w1, [x0]
|
||||
cbnz w3, 1b
|
||||
mov w0, w2
|
||||
ret
|
||||
SET_SIZE(_MD_AtomicSet)
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicAdd(PRInt32 *ptr, PRInt32 val)
|
||||
//
|
||||
// Atomically add 'val' to the integer pointed to by 'ptr'
|
||||
// and return the result of the addition.
|
||||
//
|
||||
ENTRY(_MD_AtomicAdd)
|
||||
1: ldaxr w2, [x0]
|
||||
add w2, w2, w1
|
||||
stxr w4, w2, [x0]
|
||||
cbnz w4, 1b
|
||||
mov w0, w2
|
||||
ret
|
||||
SET_SIZE(_MD_AtomicAdd)
|
|
@ -0,0 +1,69 @@
|
|||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#include <sys/asm_linkage.h>
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicIncrement(PRInt32 *val)
|
||||
//
|
||||
// Atomically increment the integer pointed to by 'val' and return
|
||||
// the result of the increment.
|
||||
//
|
||||
ENTRY(_MD_AtomicIncrement)
|
||||
1: ldl_l v0, 0(a0)
|
||||
addl v0, 1, v0
|
||||
mov v0, t2
|
||||
stl_c t2, 0(a0)
|
||||
beq t2, 2f
|
||||
ret
|
||||
2: br 1b
|
||||
SET_SIZE(_MD_AtomicIncrement)
|
||||
|
||||
// PRInt32 _MD_AtomicDecrement(PRInt32 *val)
|
||||
//
|
||||
// Atomically decrement the integer pointed to by 'val' and return
|
||||
// the result of the decrement.
|
||||
//
|
||||
ENTRY(_MD_AtomicDecrement)
|
||||
1: ldl_l v0, 0(a0)
|
||||
subl v0, 1, v0
|
||||
mov v0, t2
|
||||
stl_c t2, 0(a0)
|
||||
beq t2, 2f
|
||||
ret
|
||||
2: br 1b
|
||||
SET_SIZE(_MD_AtomicDecrement)
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicSet(PRInt32 *val, PRInt32 newval)
|
||||
//
|
||||
// Atomically set the integer pointed to by 'val' to the new
|
||||
// value 'newval' and return the old value.
|
||||
//
|
||||
ENTRY(_MD_AtomicSet)
|
||||
1: ldl_l v0, 0(a0)
|
||||
mov a1, t2
|
||||
stl_c t2, 0(a0)
|
||||
beq t2, 2f
|
||||
ret
|
||||
2: br 1b
|
||||
SET_SIZE(_MD_AtomicSet)
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicAdd(PRInt32 *ptr, PRInt32 val)
|
||||
//
|
||||
// Atomically add 'val' to the integer pointed to by 'ptr'
|
||||
// and return the result of the addition.
|
||||
//
|
||||
ENTRY(_MD_AtomicAdd)
|
||||
1: ldl_l v0, 0(a0)
|
||||
addl v0, a1, v0
|
||||
mov v0, t2
|
||||
stl_c t2, 0(a0)
|
||||
beq t2, 2f
|
||||
ret
|
||||
2: br 1b
|
||||
SET_SIZE(_MD_AtomicAdd)
|
|
@ -0,0 +1,55 @@
|
|||
// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#include <sys/asm_linkage.h>
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicIncrement(PRInt32 *val)
|
||||
//
|
||||
// Atomically increment the integer pointed to by 'val' and return
|
||||
// the result of the increment.
|
||||
//
|
||||
ENTRY(_MD_AtomicIncrement)
|
||||
li t0, 1
|
||||
amoadd.w a0, t0, (a0)
|
||||
addi a0, a0, 1
|
||||
ret
|
||||
SET_SIZE(_MD_AtomicIncrement)
|
||||
|
||||
// PRInt32 _MD_AtomicDecrement(PRInt32 *val)
|
||||
//
|
||||
// Atomically decrement the integer pointed to by 'val' and return
|
||||
// the result of the decrement.
|
||||
//
|
||||
ENTRY(_MD_AtomicDecrement)
|
||||
li t0, -1
|
||||
amoadd.w a0, t0, (a0)
|
||||
addi a0, a0, 1
|
||||
ret
|
||||
SET_SIZE(_MD_AtomicDecrement)
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicSet(PRInt32 *val, PRInt32 newval)
|
||||
//
|
||||
// Atomically set the integer pointed to by 'val' to the new
|
||||
// value 'newval' and return the old value.
|
||||
//
|
||||
ENTRY(_MD_AtomicSet)
|
||||
amoswap.w a0, a1, (a0)
|
||||
ret
|
||||
SET_SIZE(_MD_AtomicSet)
|
||||
|
||||
|
||||
// PRInt32 _MD_AtomicAdd(PRInt32 *ptr, PRInt32 val)
|
||||
//
|
||||
// Atomically add 'val' to the integer pointed to by 'ptr'
|
||||
// and return the result of the addition.
|
||||
//
|
||||
ENTRY(_MD_AtomicAdd)
|
||||
amoadd.w a0, a1, (a0)
|
||||
add a0, a1, a0
|
||||
ret
|
||||
SET_SIZE(_MD_AtomicAdd)
|
|
@ -2752,7 +2752,7 @@ static void _PR_InitIOV(void)
|
|||
#else
|
||||
_md_iovector._open64 = open64;
|
||||
#endif
|
||||
_md_iovector._mmap64 = mmap64;
|
||||
_md_iovector._mmap64 = (_MD_Mmap64)mmap64;
|
||||
#if (defined(ANDROID) && __ANDROID_API__ < 21)
|
||||
/* Same as the open64 case for Android. */
|
||||
_md_iovector._fstat64 = fstat;
|
||||
|
|
Loading…
Reference in New Issue