gpt4 book ai didi

c++ - ARM 系统调用作为 C++ 模板

转载 作者:太空狗 更新时间:2023-10-29 20:40:48 28 4
gpt4 key购买 nike

我需要在我的 newlib stub 中调用一些系统调用,而当前的实现使用 C 宏,随着时间的推移,这些宏变得不可读且看起来很糟糕。 (而且我讨厌宏...)但是,我使用 C++ 模板的实现仅适用于一个参数:

template <int nr, typename RETTYPE, typename PARAM1> 
inline RETTYPE syscall(PARAM1 p1)
{
register PARAM1 r0 asm("r0") = p1;
asm volatile("svc %[nr]\n"
: "=r" (r0)
: [nr] "i" (nr), "r" (r0)
: "memory", "r1", "r2", "r3", "r12", "lr");
return (RETTYPE) r0;
}

现在我可以调用malloc 使用

void *ptr = syscall<SYS_MALLOC, void*>(0x1000);

分配 0x1000 字节。

我对四个参数的实现:

template <int nr, typename RETTYPE, typename PARAM1, typename PARAM2, typename PARAM3, typename PARAM4> 
inline RETTYPE syscall(PARAM1 p1, PARAM2 p2, PARAM3 p3, PARAM4 p4)
{
register PARAM1 r0 asm("r0") = p1;
register PARAM2 r1 asm("r1") = p2;
register PARAM3 r2 asm("r2") = p3;
register PARAM4 r3 asm("r3") = p4;

asm volatile("svc %[nr]\n"
: "=r" (r0)
: [nr] "i" (nr), "r" (r0), "r" (r1), "r" (r2), "r" (r3)
: "memory", "r12", "lr");

return (RETTYPE) r0;
}

不起作用,“swi”指令中寄存器的内容是任意的。不知何故,GCC 不再尊重“注册”变量。例子:我在svc指令处设置断点并执行

syscall<FWRITE, int>(ptr, 1, len, f)

但是不知何故 r0 被设置为 1 而 r1 被设置为 ptr...我也尝试过不优化编译,只是寄存器的顺序改变了一点,但它仍然是错误的顺序。我知道我可以执行“mov r0, %[param1]”等操作,但这会阻止优化并因此导致代码变慢。

这是 GCC (4.8.2) 中的错误还是我忽略了什么?

最佳答案

这是 bug 33661 ,这是相当古老的。几年前我自己遇到过。

关于c++ - ARM 系统调用作为 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22618412/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com