Some of the aeabi functions were missing PACBTI support. The lack of it resulted in exceptions at runtime if the running environment had PAC and/or BTI enabled. This patch adds this support. This involves the addition of PACBTI instructions, depending on whether each of these features is enabled, plus the saving and restoring of the PAC code that resides in r12. Some of the common code has been put in preprocessor macros to reduce duplication, but not all, especially since some register saving and restoring is very specific to each context.
56 lines
1.4 KiB
ArmAsm
56 lines
1.4 KiB
ArmAsm
//===-- aeabi_ldivmod.S - EABI ldivmod implementation ---------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "../assembly.h"
|
|
|
|
// struct { int64_t quot, int64_t rem}
|
|
// __aeabi_ldivmod(int64_t numerator, int64_t denominator) {
|
|
// int64_t rem, quot;
|
|
// quot = __divmoddi4(numerator, denominator, &rem);
|
|
// return {quot, rem};
|
|
// }
|
|
|
|
#if defined(__MINGW32__)
|
|
#define __aeabi_ldivmod __rt_sdiv64
|
|
#endif
|
|
|
|
.syntax unified
|
|
.p2align 2
|
|
DEFINE_COMPILERRT_FUNCTION(__aeabi_ldivmod)
|
|
PACBTI_LANDING
|
|
#if defined(__ARM_FEATURE_PAC_DEFAULT)
|
|
push {r6, r12, lr}
|
|
#else
|
|
push {r6, lr}
|
|
#endif
|
|
sub sp, sp, #16
|
|
add r6, sp, #8
|
|
str r6, [sp]
|
|
#if defined(__MINGW32__)
|
|
movs r6, r0
|
|
movs r0, r2
|
|
movs r2, r6
|
|
movs r6, r1
|
|
movs r1, r3
|
|
movs r3, r6
|
|
#endif
|
|
bl SYMBOL_NAME(__divmoddi4)
|
|
ldr r2, [sp, #8]
|
|
ldr r3, [sp, #12]
|
|
add sp, sp, #16
|
|
#if defined(__ARM_FEATURE_PAC_DEFAULT)
|
|
pop {r6, r12, lr}
|
|
bxaut r12, lr, sp
|
|
#else
|
|
pop {r6, pc}
|
|
#endif
|
|
END_COMPILERRT_FUNCTION(__aeabi_ldivmod)
|
|
|
|
NO_EXEC_STACK_DIRECTIVE
|
|
|