mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-04 10:18:31 +00:00
Get LIBC_MEM and LIBC_STDIO building with aarch64
This commit is contained in:
parent
ae0ee59614
commit
d04430f4ef
81 changed files with 440 additions and 1064 deletions
|
@ -16,7 +16,6 @@
|
|||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#ifdef __x86_64__
|
||||
#include "libc/calls/state.internal.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/intrin/asan.internal.h"
|
||||
|
@ -33,7 +32,7 @@
|
|||
#include "libc/log/libfatal.internal.h"
|
||||
#include "libc/log/log.h"
|
||||
#include "libc/macros.internal.h"
|
||||
#include "libc/mem/hook/hook.internal.h"
|
||||
#include "libc/mem/hook.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/nexgen32e/gc.internal.h"
|
||||
#include "libc/nexgen32e/stackframe.h"
|
||||
|
@ -1087,7 +1086,7 @@ size_t __asan_get_heap_size(const void *p) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static size_t __asan_malloc_usable_size(const void *p) {
|
||||
static size_t __asan_malloc_usable_size(void *p) {
|
||||
size_t n, c;
|
||||
struct AsanExtra *e;
|
||||
if ((e = __asan_get_extra(p, &c)) && __asan_read48(e->size, &n)) {
|
||||
|
@ -1498,5 +1497,3 @@ __attribute__((__constructor__)) void __asan_init(int argc, char **argv,
|
|||
STRACE("/_/ \\_\\____/_/ \\_\\_| \\_|");
|
||||
STRACE("cosmopolitan memory safety module initialized");
|
||||
}
|
||||
|
||||
#endif /* __x86_64__ */
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_BITS_CMPXCHG16B_INTERNAL_H_
|
||||
#define COSMOPOLITAN_LIBC_BITS_CMPXCHG16B_INTERNAL_H_
|
||||
#include "libc/intrin/asmflag.h"
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
/**
|
||||
* Compares and exchanges 128-bit value, i.e.
|
||||
*
|
||||
* if (*IfThing == *IsEqualToMe) {
|
||||
* *IfThing = ReplaceItWithMe;
|
||||
* return true;
|
||||
* } else {
|
||||
* *IsEqualToMe = *IfThing;
|
||||
* return false;
|
||||
* }
|
||||
*
|
||||
* Please note that Intel Architecture doesn't guarantee 16-byte memory
|
||||
* accesses to be atomic on their own. Therefore _lockcmpxchg16b should
|
||||
* be considered instead for both thread and asynchronous signal safety
|
||||
*
|
||||
* @param IfThing should point to aligned memory
|
||||
* @param IsEqualToMe should point to in/out local variable
|
||||
* @param ReplaceItWithMe might become the new memory value
|
||||
* @return true if *IfThing was changed
|
||||
*/
|
||||
static inline bool _cmpxchg16b(uint128_t *IfThing, uint128_t *IsEqualToMe,
|
||||
uint128_t ReplaceItWithMe) {
|
||||
bool DidIt;
|
||||
uint64_t ax, bx, cx, dx;
|
||||
ax = *IsEqualToMe;
|
||||
dx = *IsEqualToMe >> 64;
|
||||
bx = ReplaceItWithMe;
|
||||
cx = ReplaceItWithMe >> 64;
|
||||
asm volatile(ZFLAG_ASM("cmpxchg16b\t%1")
|
||||
: ZFLAG_CONSTRAINT(DidIt), "+m"(*IfThing), "+a"(ax), "+d"(dx)
|
||||
: "b"(bx), "c"(cx));
|
||||
if (!DidIt) {
|
||||
*IsEqualToMe = ax | (uint128_t)dx << 64;
|
||||
}
|
||||
return DidIt;
|
||||
}
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_BITS_CMPXCHG16B_INTERNAL_H_ */
|
|
@ -20,7 +20,9 @@
|
|||
#include "libc/macros.internal.h"
|
||||
.privileged
|
||||
|
||||
_futex: push %rbp
|
||||
_futex:
|
||||
#ifdef __x86_64__
|
||||
push %rbp
|
||||
mov %rsp,%rbp
|
||||
mov %rcx,%r10
|
||||
mov __NR_futex,%eax
|
||||
|
@ -29,5 +31,11 @@ _futex: push %rbp
|
|||
jnc 1f
|
||||
neg %eax
|
||||
1: pop %rbp
|
||||
#elif defined(__aarch64__)
|
||||
mov x8,#0x062
|
||||
svc #0
|
||||
#else
|
||||
#error "unsupported architecture"
|
||||
#endif /* __x86_64__ */
|
||||
ret
|
||||
.endfn _futex,globl,hidden
|
||||
|
|
|
@ -189,6 +189,8 @@ o/$(MODE)/libc/intrin/memmove.o: private \
|
|||
# these assembly files are safe to build on aarch64
|
||||
o/$(MODE)/libc/intrin/fenv.o: libc/intrin/fenv.S
|
||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/intrin/futex.o: libc/intrin/futex.S
|
||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/intrin/kclocknames.o: libc/intrin/kclocknames.S
|
||||
@$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $<
|
||||
o/$(MODE)/libc/intrin/kdos2errno.o: libc/intrin/kdos2errno.S
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_INTRIN_LOCKCMPXCHG_H_
|
||||
#define COSMOPOLITAN_LIBC_INTRIN_LOCKCMPXCHG_H_
|
||||
#include "libc/intrin/asmflag.h"
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && defined(__x86__)
|
||||
#define _lockcmpxchg(IFTHING, ISEQUALTOME, REPLACEITWITHME) \
|
||||
({ \
|
||||
bool DidIt; \
|
||||
autotype(IFTHING) IfThing = (IFTHING); \
|
||||
typeof(*IfThing) IsEqualToMe = (ISEQUALTOME); \
|
||||
typeof(*IfThing) ReplaceItWithMe = (REPLACEITWITHME); \
|
||||
asm volatile(ZFLAG_ASM("lock cmpxchg\t%3,%1") \
|
||||
: ZFLAG_CONSTRAINT(DidIt), "+m"(*IfThing), "+a"(IsEqualToMe) \
|
||||
: "r"(ReplaceItWithMe) \
|
||||
: "cc"); \
|
||||
DidIt; \
|
||||
})
|
||||
#endif /* GNUC && !ANSI && x86 */
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_INTRIN_LOCKCMPXCHG_H_ */
|
|
@ -1,46 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_BITS_LOCKCMPXCHG16B_H_
|
||||
#define COSMOPOLITAN_LIBC_BITS_LOCKCMPXCHG16B_H_
|
||||
#include "libc/intrin/asmflag.h"
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && defined(__x86__)
|
||||
/**
|
||||
* Compares and exchanges 128-bit value, i.e.
|
||||
*
|
||||
* if (*IfThing == *IsEqualToMe) {
|
||||
* *IfThing = ReplaceItWithMe;
|
||||
* return true;
|
||||
* } else {
|
||||
* *IsEqualToMe = *IfThing;
|
||||
* return false;
|
||||
* }
|
||||
*
|
||||
* @param IfThing should point to aligned memory
|
||||
* @param IsEqualToMe should point to in/out local variable
|
||||
* @param ReplaceItWithMe might become the new memory value
|
||||
* @return true if *IfThing was changed
|
||||
* @asyncsignalsafe
|
||||
* @threadsafe
|
||||
*/
|
||||
static inline bool _lockcmpxchg16b(uint128_t *IfThing, uint128_t *IsEqualToMe,
|
||||
uint128_t ReplaceItWithMe) {
|
||||
bool DidIt;
|
||||
uint64_t ax, bx, cx, dx;
|
||||
ax = *IsEqualToMe;
|
||||
dx = *IsEqualToMe >> 64;
|
||||
bx = ReplaceItWithMe;
|
||||
cx = ReplaceItWithMe >> 64;
|
||||
asm volatile(ZFLAG_ASM("lock cmpxchg16b\t%1")
|
||||
: ZFLAG_CONSTRAINT(DidIt), "+m"(*IfThing), "+a"(ax), "+d"(dx)
|
||||
: "b"(bx), "c"(cx));
|
||||
if (!DidIt) {
|
||||
*IsEqualToMe = ax | (uint128_t)dx << 64;
|
||||
}
|
||||
return DidIt;
|
||||
}
|
||||
#endif /* __GNUC__ && !__STRICT_ANSI__ */
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_BITS_LOCKCMPXCHG16B_H_ */
|
|
@ -1,24 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_INTRIN_LOCKCMPXCHGP_H_
|
||||
#define COSMOPOLITAN_LIBC_INTRIN_LOCKCMPXCHGP_H_
|
||||
#include "libc/intrin/asmflag.h"
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && defined(__x86__)
|
||||
#define _lockcmpxchgp(IN_OUT_IFTHING, IN_OUT_ISEQUALTOME, IN_REPLACEITWITHME) \
|
||||
({ \
|
||||
bool DidIt; \
|
||||
autotype(IN_OUT_IFTHING) IfThing = (IN_OUT_IFTHING); \
|
||||
typeof(IfThing) IsEqualToMe = (IN_OUT_ISEQUALTOME); \
|
||||
typeof(*IfThing) ReplaceItWithMe = (IN_REPLACEITWITHME); \
|
||||
asm volatile(ZFLAG_ASM("lock cmpxchg\t%3,%1") \
|
||||
: ZFLAG_CONSTRAINT(DidIt), "+m"(*IfThing), "+a"(*IsEqualToMe) \
|
||||
: "r"(ReplaceItWithMe) \
|
||||
: "cc"); \
|
||||
DidIt; \
|
||||
})
|
||||
#endif /* GNUC && !ANSI && x86 */
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_INTRIN_LOCKCMPXCHGP_H_ */
|
|
@ -1,31 +0,0 @@
|
|||
#ifndef COSMOPOLITAN_LIBC_INTRIN_LOCKXCHG_H_
|
||||
#define COSMOPOLITAN_LIBC_INTRIN_LOCKXCHG_H_
|
||||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
/* TODO(jart): DELETE */
|
||||
|
||||
intptr_t lockxchg(void *, void *, size_t);
|
||||
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && defined(__x86_64__)
|
||||
/**
|
||||
* Exchanges *MEMORY into *LOCALVAR w/ one operation.
|
||||
*
|
||||
* @param MEMORY is uint𝑘_t[hasatleast 1] where 𝑘 ∈ {8,16,32,64}
|
||||
* @param LOCALVAR is uint𝑘_t[hasatleast 1]
|
||||
* @return LOCALVAR[0]
|
||||
* @see xchg()
|
||||
*/
|
||||
#define lockxchg(MEMORY, LOCALVAR) \
|
||||
({ \
|
||||
asm("xchg\t%0,%1" : "+%m"(*(MEMORY)), "+r"(*(LOCALVAR))); \
|
||||
*(LOCALVAR); \
|
||||
})
|
||||
#else
|
||||
#define lockxchg(MEM, VAR) \
|
||||
lockxchg(MEM, VAR, sizeof(*(MEM)) / (sizeof(*(MEM)) == sizeof(*(VAR))))
|
||||
#endif /* __GNUC__ && !__STRICT_ANSI__ */
|
||||
|
||||
COSMOPOLITAN_C_END_
|
||||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||||
#endif /* COSMOPOLITAN_LIBC_INTRIN_LOCKXCHG_H_ */
|
|
@ -7,7 +7,6 @@
|
|||
* Exchanges *MEMORY into *LOCALVAR.
|
||||
*
|
||||
* @return *MEMORY
|
||||
* @see lockcmpxchg()
|
||||
* todo(jart): what's the point of this?
|
||||
*/
|
||||
#define xchg(MEMORY, LOCALVAR) \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue