【问题标题】:Atomic compare and exchange in arm assembly臂组件中的原子比较和交换
【发布时间】:2023-03-24 03:31:01
【问题描述】:

我正在尝试为 ARMV7 编译 arm 内联汇编代码以进行原子比较和交换,基本上我已经从 ARM linux 内核复制了代码,但不知何故它无法编译。它给出了以下错误

错误:拇指条件指令应该在 IT 块中 -- strexeq r5,r1,[r3]。下面是代码

static inline int
dfp_atomic32_cmpset(volatile uint32_t *dst, uint32_t exp, uint32_t src)
{

        unsigned long oldval, res;

        smp_mb();

        do {
                __asm__ __volatile__("@ dfp_atomic32_cmpset\n"
                "ldrex  %1, [%3]\n"
                "mov    %0, #0\n"
                "teq    %1, %4\n"
                "strexeq %0, %5, [%3]\n"
                    : "=&r" (res), "=&r" (oldval), "+Qo" (*dst)
                    : "r" (dst), "Ir" (exp), "r" (src)
                    : "cc");
        } while (res);

        smp_mb();

        return oldval;
}

知道这个错误是什么意思吗?

【问题讨论】:

  • 是的,我想通了,但不是 IT EQ,而是我在 gcc 汇编程序级别使用作弊。即 Wa,-mimplicit-it=always,除了兼容性之外,你觉得这有什么问题吗?
  • 其实我在发布问题后就想出了答案,我有点急于找出答案;-)。错误是由于“在 Thumb-2 中,大多数指令没有内置条件代码(条件分支除外)。相反,有条件执行的短指令序列可以在特殊“IT 指令”之前这个网站解释得很好wiki.ubuntu.com/ARM/Thumb2PortingHowto#Types。顺便说一句,我仍然想接受你的回答,让我弄清楚如何接受;-)
  • 我知道这听起来像是破纪录,但是...ARM 非常明确地声明芯片供应商不必支持独占访问 (strex/ldrex)。 Linux 经常将 ARM 细节弄错,特别是作为一般规则使用错误的原子(strex/ldrex vs swp)。请注意这一点,尤其是如果您要更换芯片。
  • @dwelch:我正在寻找快速原子操作来构建高度优化的多线程安全库,这绝对是性能和可移植性之间的折衷。
  • 当然,没关系,strex/ldrex 用于独占访问多核 arm 芯片中的共享内存范围。

标签: linux assembly arm


【解决方案1】:

需要添加IT EQ指令;请参阅 Ubuntu wiki 上的 Thumb2 porting。您正在复制 ARM 代码并尝试在 thumb2 模式下使用它。所有 ARM 指令都是有条件的,IT EQARM 模式下的幻象(不需要)。在 Thumb2 模式下,您必须通知进程应根据以下说明测试哪个条件。

gcc 内联可能不适用于-mimplicit-it;特别是因为编译器需要猜测操作码的数量才能使其成为自己的代码。即,计算分支大小等。

【讨论】:

  • strex/ldrex to i/o registers 在这个问题的标题上有一些很好的信息,这有点误导,因为这个问题实际上是关于 ARM/Thumb2 汇编程序兼容性的。
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多