标签: armv8

如何在iOS上运行时确定ARMv8功能?

我试图确定何时在运行时iOS上可用的可选ARMv8 cpu功能.在OS X桌面上,我们可以使用i686,x86_64,PPC和PPC64 sysctl.例如,请参阅Mac OS X上的PR 3108,无SIGILL处理器功能检测.

"自由SIGILL处理器能力"部分是重要的,因为SIGILL基于特征探讨在苹果的平台来破坏内存.我遵循的至少三个项目都遇到了问题,包括Crypto ++和OpenSSL.问题的另一部分是像Apple Clang在Xcode 10下缺少ARMv8/Aarch64的CRC32这样的问题吗?,应该存在的核心ARMv8功能似乎缺失或不受支持.

我已经找到了相当于OS X台式机的iOS,但我找不到它们(见下文).

我们真的更喜欢避免像CommonCrypto这样的Apple框架.我们努力保持平台不可知.我们不使用CommonCrypto,但如果没有任何不可知的东西(我正在制作它),我会考虑使用下面的Apple函数:

BOOL CCHasAes();
BOOL CCHasSHA1();
BOOL CCHasSHA2();
Run Code Online (Sandbox Code Playgroud)

Apple是否发布了一种在运行时确定cpu功能的方法?

我们如何在iOS上确定运行时的cpu功能?


这些可能是相关的,但我不确定这是否是我们拥有的最好的,或者这是我们唯一拥有的,或者是否还有其他方法可以解决它.


下面我正在寻找CRC-32,CRC-32C,AES,PMULL,SHA1和SHA2功能.我没有看到任何类似于我正在寻找的点击.Apple自Xcode 7起支持ARMv8,因此8.2支持CPU.

$ grep -IR CTL_ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk | \
  sed 's|/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk/usr/include|...|g'
.../c++/4.2.1/bits/c++config.h:#define _GLIBCXX_HAVE_SYS_IOCTL_H 1
.../netinet/in.h:#define        IPCTL_FORWARDING        1       /* act as router */
.../netinet/in.h:#define        IPCTL_SENDREDIRECTS     2       /* may send redirects when forwarding */
.../netinet/in.h:#define        IPCTL_DEFTTL            3       /* default TTL */
.../netinet/in.h:#define        IPCTL_DEFMTU …
Run Code Online (Sandbox Code Playgroud)

c xcode ios armv8

16
推荐指数
1
解决办法
549
查看次数

ARM v8 中的 LDUR 和 STUR

我上过几门涉及 ARMv8 汇编的课程,但是两位老师都以不同的方式描述了 LDUR/STUR 指令,现在我已经迷失了方向。有人可以帮忙澄清一下吗?

如果我有指令:

LDUR R3, [R1, #8]
Run Code Online (Sandbox Code Playgroud)

我将把答案放在 R3 中,但是我从 R1 中得到了什么以及偏移量如何运作?这就像一个逻辑转变吗?ARM 手册将其描述为“字节偏移量”,但并未描述该偏移量如何在 R1 上运行。我是否移动了存储在 R1 中的值(比如 R1 的值是 50),还是我需要考虑 R1 之外的内存地址?其他消息来源说我需要以某种方式将 R1 视为一个数组?

assembly arm armv8

10
推荐指数
1
解决办法
2万
查看次数

为什么可以在ARMv8上使用xzr寄存器而不是文字0?

我正在阅读ARM发布的SVE白皮书,并发现了令我印象深刻的东西(在非SVE示例中):

mov x8, xzr
Run Code Online (Sandbox Code Playgroud)

我不知道这个xzr寄存器是什么,所以我查了一下,发现ARM的一些内容,说它在很多情况下都是零的同义词.

所以看起来x8它被初始化为零,这是有道理的,因为它在循环之前执行,x8用作循环计数器.

我不明白的是,为什么不使用文字0而不是xzr?例如:

mov x8, 0
Run Code Online (Sandbox Code Playgroud)

总而言之,我的问题是:为什么可以使用xzr寄存器而不是文字0

assembly arm armv8

8
推荐指数
2
解决办法
3868
查看次数

除以零不会导致Nvidia Jetson出现运行时异常

我对ARM处理器的内部细节不是很熟悉,但是我不了解Nvidia Jetson Nano开发板上的以下行为。

C代码示例...

//main.c

#include <stdio.h>

int main()
{
  int fred = 123;
  int i;

  for(i = -10 ; i <= 10 ; i++)
    printf("%d / %d == %d\n", fred, i, fred / i);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译:

gcc main.c -ggdb
Run Code Online (Sandbox Code Playgroud)

运行生成的a.out可执行文件将产生以下输出...

123 / -10 == -12
123 / -9 == -13
123 / -8 == -15
123 / -7 == -17
123 / -6 == -20
123 / -5 == -24
123 / -4 == -30
123 / …
Run Code Online (Sandbox Code Playgroud)

c arm integer-division divide-by-zero armv8

8
推荐指数
1
解决办法
113
查看次数

避免 ASM 中灵活第二操作数的硬数移位

这个问题涉及ARM汇编语言。

我的问题是是否可以使用宏来替换 ASM 代码中的立即值来移位寄存器值,这样我就不必对数字进行硬编码。

我不确定上面的问题是否有意义,所以我将提供一个带有一些asm代码的示例:

因此,存在很少的指令,例如(https://developer.arm.com/documentation/dui0473/m/arm-and-thumb-instructions/rorror )中的指令,其中可以使用寄存器值来旋转值如我们所愿:ARM

#define rotate(number, ptr) ({                       \
  asm volatile( \
    "ror %[output], %[output], %1\n" \ 
    : [output]"+r"(ptr) \ // this is the in/output 
    : "r"(number)); \ // this is the rotator
})
Run Code Online (Sandbox Code Playgroud)

现在,让我们看一下( https://developer.arm.com/documentation/dui0473/m/arm-and-thumb-instructions/orrorr )中的指令。ARM

语法如下:ORR{S}{cond} Rd, Rn, Operand2

其中Operand2是一个灵活的操作数,这意味着它可以是constantor a register with optional shift(来源:https ://www.keil.com/support/man/docs/armasm/armasm_dom1361289851539.htm )

所以这样的事情会起作用:

#define orr_test(ptr) ({                       \
  uint64_t __result;                    \
  asm volatile (\
    "orr …
Run Code Online (Sandbox Code Playgroud)

c assembly arm inline-assembly armv8

8
推荐指数
1
解决办法
205
查看次数

Armv8 的 Linux 系统调用约定

有谁知道在哪里可以找到 ArmV8 中 Linux 系统调用的约定?必须传入什么寄存器参数以及返回值存储在哪里。

system-calls armv8

7
推荐指数
1
解决办法
3527
查看次数

ARMv8.3 rcpc的含义

ARMv8.3 引入了新指令:LDAPR。

当 STLR 后跟 LDAR 到不同的地址时,这两个不能重新排序,因此称为 RCsc(释放一致顺序一致)。

当 STLR 后跟 LDAPR 到不同的地址时,这 2 个地址可以重新排序。这称为RCpc(发布一致处理器一致)。

我的问题是PC部分。

PC 是 TSO 的松弛,其中 TSO 是多副本原子,而 PC 是非多副本原子。

ARMv8的内存模型已改进为多副本原子,因为没有供应商创建过非多副本原子微体系结构,这使得内存模型更加复杂。

所以我遇到了矛盾。

关键问题是:每个存储(包括宽松的存储)都是多副本原子的吗?

如果是这样,那么 rcpc 的 PC 部分对我来说没有意义,因为 PC 是非多副本原子的。由于 ARM 过去是非多副本原子的,它是否可能是一个遗留名称?

PC有多种定义;所以也许这就是原因。

arm cpu-architecture memory-model memory-barriers armv8

7
推荐指数
1
解决办法
1192
查看次数

为什么hint::spin_loop在aarch64上使用ISB?

其中有std::hint一个函数,其文档spin_loop中具有以下定义:

\n
\n

发出机器指令,向处理器发出信号,表明它正在忙等待自旋循环中运行 (\xe2\x80\x9cspin lock\xe2\x80\x9d)。

\n

在接收到自旋循环信号后,处理器可以通过例如节省功率或切换超线程来优化其行为。

\n
\n

根据目标架构,这会编译为

\n\n

最后一个让我有点头晕()。我认为这ISB是一个冗长的操作,这意味着,如果在自旋锁中使用,线程在尝试检测锁是否再次打开时会有点滞后,但除此之外几乎没有任何利润。

\n

ISB SY在 aarch64 上使用in 代替 a NOPin spin 循环有什么优点?

\n

assembly spinlock rust arm64 armv8

7
推荐指数
1
解决办法
1108
查看次数

ARMv8 向后兼容 ARMv7(Snapdragon 820 与 Cortex-A15)

我看到 ARMv8 只是 ARMv7 架构的扩展,所有在 ARMv7 上编译的代码都应该在 ARMv8 上运行。我对 ARMv8 到 ARMv7 的向后兼容性感兴趣。在 ARMv8 上编译的代码能否在 ARMv7 上运行?

我有一个特别感兴趣的案例:我想在Nvidia Jetson TK1(NVIDIA Cortex-A15 CPU)上运行为OnePlus 3 智能手机(Qualcomm MSM8996 Snapdragon 820 CPU)编译的comma.ai 的 Openpilot 视觉二进制文件。有远见的人会在 Jetson 上运行吗?

编辑:可能有比 CPU 兼容性更多的问题,因为 Visiond 可能在该手机上大量使用 GPU。可能取决于他们是否使用一些标准的并行化方式(OpenCL、NEON 等)或者是否有一些用于 Snapdragons GPU 的自定义代码。即使使用 OpenCL,在不同硬件上兼容的可能性也可能很低。

arm cpu-architecture backwards-compatibility binary-compatibility armv8

6
推荐指数
1
解决办法
3772
查看次数

ARM 中 TPIDR_EL0/TPIDR_EL1 等线程 ID 寄存器的用途是什么?

根据ARM 文档,线程 ID 寄存器类似于TPIDR_EL0TPIDR_EL1

提供存储软件线程和进程 ID 的位置,以用于操作系统管理目的。这些寄存器对处理器行为没有影响。

为什么有人想要将线程 ID 存储在特殊寄存器中?ARM 处理器是否要求线程在内存中拥有特殊的结构,就像 MMU 一样?线程对于 ARM 来说是特殊的东西吗?ARM 期望在某个地方找到它吗?或者我可以在不使用这个寄存器的情况下(有效地)实现线程吗?

我这么问是因为我在 Fuchsia OS 的 Zircon 内核上找到了这段代码:

static inline void arch_set_current_thread(Thread* t) {
  __arm_wsr64("tpidr_el1", (uint64_t)&t->arch_.thread_pointer_location);
  __isb(ARM_MB_SY);
}
Run Code Online (Sandbox Code Playgroud)

在启动时,它创建一个线程并将其指针存储在tpidr_el1

cpu kernel arm armv8 fuchsia

6
推荐指数
1
解决办法
5180
查看次数