Chinaunix首页 | 论坛 | 博客
  • 博客访问: 27252
  • 博文数量: 7
  • 博客积分: 244
  • 博客等级: 入伍新兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-29 06:53
文章分类
文章存档

2010年(7)

最近访客

分类:

2010-05-08 19:06:05

/*
 * Cut-paste/written by Hyouck Kim, peakhunt@yahoo.com, 2003
 *
 * A simple system call stuff for msgqToFd()
 *
 */
#include
#include
#include
#include

/*
 * following macros are copied from glibc source.
 * the exact location is sysdeps/unix/sysv/linux/i386/i386/sysdep.h
 */
/* We need some help from the assembler to generate optimal code.  We
   define some macros here which later will be used.  */
asm (".L__X'%ebx = 1\n\t"
     ".L__X'%ecx = 2\n\t"
     ".L__X'%edx = 2\n\t"
     ".L__X'%eax = 3\n\t"
     ".L__X'%esi = 3\n\t"
     ".L__X'%edi = 3\n\t"
     ".L__X'%ebp = 3\n\t"
     ".L__X'%esp = 3\n\t"
     ".macro bpushl name reg\n\t"
     ".if 1 - \\name\n\t"
     ".if 2 - \\name\n\t"
     "pushl %ebx\n\t"
     ".else\n\t"
     "xchgl \\reg, %ebx\n\t"
     ".endif\n\t"
     ".endif\n\t"
     ".endm\n\t"
     ".macro bpopl name reg\n\t"
     ".if 1 - \\name\n\t"
     ".if 2 - \\name\n\t"
     "popl %ebx\n\t"
     ".else\n\t"
     "xchgl \\reg, %ebx\n\t"
     ".endif\n\t"
     ".endif\n\t"
     ".endm\n\t"
     ".macro bmovl name reg\n\t"
     ".if 1 - \\name\n\t"
     ".if 2 - \\name\n\t"
     "movl \\reg, %ebx\n\t"
     ".endif\n\t"
     ".endif\n\t"
     ".endm\n\t");


#define INLINE_SYSCALL(name, nr, args...) \
  ({               \
    unsigned int resultvar;            \
    asm volatile (             \
    LOADARGS_##nr             \
    "movl %1, %%eax\n\t"            \
    "int $0x80\n\t"             \
    RESTOREARGS_##nr             \
    : "=a" (resultvar)             \
    : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc");        \
    if (resultvar >= 0xfffff001)           \
      {               \
 __set_errno (-resultvar);           \
 resultvar = 0xffffffff;            \
      }               \
    (int) resultvar; })

#define LOADARGS_0
#define LOADARGS_1 \
    "bpushl .L__X'%k2, %k2\n\t"            \
    "bmovl .L__X'%k2, %k2\n\t"
#define LOADARGS_2 LOADARGS_1
#define LOADARGS_3 LOADARGS_1
#define LOADARGS_4 LOADARGS_1
#define LOADARGS_5 LOADARGS_1

#define RESTOREARGS_0
#define RESTOREARGS_1 \
    "bpopl .L__X'%k2, %k2\n\t"
#define RESTOREARGS_2 RESTOREARGS_1
#define RESTOREARGS_3 RESTOREARGS_1
#define RESTOREARGS_4 RESTOREARGS_1
#define RESTOREARGS_5 RESTOREARGS_1

#define ASMFMT_0()
#define ASMFMT_1(arg1) \
 , "acdSD" (arg1)
#define ASMFMT_2(arg1, arg2) \
 , "adCD" (arg1), "c" (arg2)
#define ASMFMT_3(arg1, arg2, arg3) \
 , "aCD" (arg1), "c" (arg2), "d" (arg3)
#define ASMFMT_4(arg1, arg2, arg3, arg4) \
 , "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
#define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
 , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)

/* from include/errno.h of glibc */
#  define __set_errno(val) (errno = (val))

/* END OF MACRO COPY */


int
msgqToFd(key_t key)
{
   /*
    * ipc : IPC system call number (__NR_ipc)
    *       include/asm/unistd.h
    * 5   : number of arguments
    * 25  : sub-system call number for msgqToFd.
    *       please look at include/i386/ipc.h and
    *       arch/i386/kernel/sys_i386.c
    */
   return INLINE_SYSCALL(ipc, 5, 25, key, 0, 0, NULL);
}
阅读(1455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~