免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1788 | 回复: 2
打印 上一主题 下一主题

linux 驱动程序 call convention 如何设置 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-06 11:13 |只看该作者 |倒序浏览
Hi,各位好:
遇到问题像大家请教:

              1.在linux驱动中需要调用 一个VC编译的Bin 文件中的函数,该Bin中的函数是用 _cdecl 的方式(堆栈)传参数
              2.而我发现 我们在liunx 内核态的函数都用 fastcall(寄存器传参数),导致调用失败
              3.请问下, 如何才能 在 make  linux 驱动的时候 指定  call convention???
        谢谢,盼指点

论坛徽章:
0
2 [报告]
发表于 2012-07-07 15:13 |只看该作者

对自己的bin中的函数做封装比较好,比如有如下函数
long fun(long a, long b, long c);
可以这样实现,后续你的driver调用
fun_wrap就可以了
  1. long fun_wrap(long a, long b, long c)
  2. {
  3.     long addr_of_fun = ....;
  4.     long rc;

  5.     asm (   "pushq %[c]\n\t"
  6.             "pushq %[b]\n\t"
  7.             "pushq %[a]\n\t"
  8.             "callq *%%rax\n\t"
  9.             "addq $24, %%rsp\n\t"
  10.             : "=a"(rc)
  11.             : "0"(addr_of_fun), [c]"m"(c), [b]"m"(b), [a]"m"(a)
  12.             : "memory", "cc"
  13.         );

  14.     return rc;
  15. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-07-12 11:54 |只看该作者
回复 2# sanbiangongzi


    Hi,您好,我的问题已经解决啦,, 在 我的Linux driver 中的函数加上 声明 __attribute__((regparm(0))) 即可实现强制传参数的方式改变为 堆栈
    谢谢您的回复!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP