ARM syscall作为C ++模板 [英] ARM syscall as c++ template

查看:116
本文介绍了ARM syscall作为C ++模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在我的newlib存根中调用一些系统调用,并且当前的实现使用C宏,随着时间的流逝,它们变得不可读且糟糕透顶. (我讨厌宏...) 但是,我使用C ++模板的实现仅适用于一个参数:

I need to call some syscalls in my newlib stubs and the current implementation uses C macros which got unreadable and awful looking over time. (And I hate macros...) However, my implementation with C++ templates does only work for one parameter:

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;
}

现在我可以打电话给使用

Now I can call e.g. malloc using

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

分配0x1000字节.

to allocate 0x1000 bytes.

我对四个参数的实现:

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指令上设置了一个断点并执行

doesn't work, the content of the registers at the "swi" instruction is arbitrary. Somehow GCC doesn't respect the "register" variables anymore. Example: I set a breakpoint at the svc instruction and execute

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

但是以某种方式将r0设置为1,将r1设置为ptr ... 我还尝试了不进行优化的编译,只是寄存器的顺序有所改变,但这仍然是错误的顺序.我知道我可以执行"mov r0,%[param1]"等操作,但这会阻止优化,因此会导致代码变慢.

But somehow r0 is set to 1 and r1 to ptr... I also tried compiling without optimizations, just the order of the registers changed a bit, but it's still the wrong order. I know I could do "mov r0, %[param1]" etc. but that would prevent optimizations and therefore result in slower code.

这是GCC(4.8.2)中的错误还是我忽略了某些内容?

Is it a bug in GCC (4.8.2) or did I overlooking something?

推荐答案

这是错误33661 ,它已经很老了.几年前我自己遇到的.

This is bug 33661, which is rather old. I encountered it myself several years ago.

这篇关于ARM syscall作为C ++模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆