Add IPC Syscall for Android x86

编译ALSA时会需要用到几个Android没有的IPC。

 (Travis.Yang原創,如果覺得本文對你有用,請留言支持,一起探討學習。轉載請保留此行,謝謝~^_^)

bionic/
libc/Android.mk
----------------------------------------------------------------------------------------------------------------------------
ifeq ($(TARGET_ARCH),x86)
libc_common_src_files += \
       arch-x86/bionic/ipc_sysv.c \
----------------------------------------------------------------------------------------------------------------------------

bionic/libc/arch-x86/syscalls.mk
----------------------------------------------------------------------------------------------------------------------------
syscall_src += arch-x86/syscalls/ipc.S
----------------------------------------------------------------------------------------------------------------------------

bionic/libc/include/sys/linux-syscalls.h
----------------------------------------------------------------------------------------------------------------------------
#define __NR_ipc (__NR_SYSCALL_BASE + 117)
----------------------------------------------------------------------------------------------------------------------------

bionic/libc/include/sys/linux-unistd.h
----------------------------------------------------------------------------------------------------------------------------
int ipc (unsigned int call, int first, int second, int third, void* ptr, long fifth);
----------------------------------------------------------------------------------------------------------------------------

bionic/libc/arch-x86/bionic/ipc_sysv.c
----------------------------------------------------------------------------------------------------------------------------
#include <stdarg.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <asm-generic/ipc.h>

extern int ipc (unsigned int call, int first, int second, int third, void* ptr, long fifth);

int semctl (int  semid, int  semnum, int  cmd, ...)
{
    union semun arg;
    va_list ap;

    va_start(ap, cmd);

   
    arg.buf = NULL;
    switch (cmd) {
        case SETVAL:
        case GETALL:
        case SETALL:
        case IPC_STAT:
        case IPC_SET:
        case SEM_STAT:
        case IPC_INFO:
        case SEM_INFO:
            va_start(ap, cmd);
            arg = va_arg (ap, union semun);
            va_end(ap);
            break;
    }

    va_end(ap);

    return ipc(SEMCTL, semid, semnum, cmd, &arg, (long)NULL);
}

int semget (key_t  key, int  nsems, int  semflg)
{
    return ipc(SEMGET, key, nsems, semflg, (void*)NULL, (long)NULL);
}

int semop (int  semid, struct sembuf*  sops, size_t  nsops)
{
    return ipc(SEMOP, semid, (int)nsops, 0, sops, (long)NULL);
}

void* shmat (int  shmid, const void*  shmaddr, int  shmflg)
{
    int rval;
    unsigned long raddr;

    rval = ipc(SHMAT, shmid, shmflg, (int)&raddr, (void*)shmaddr, (long)NULL);
    if (rval < 0)
        return (char *)rval;

    return (char *)raddr;
}

int shmctl (int  shmid, int  cmd, struct shmid_ds*  buf)
{
    return ipc(SHMCTL, shmid, cmd, 0, buf, (long)NULL);
}
int shmdt (const void*  shmaddr)
{
    return ipc(SHMDT, 0, 0, 0, (void*)shmaddr, (long)NULL);
}

int shmget (key_t  key, size_t  size, int  shmflg)
{
    return ipc(SHMGET, key, size, shmflg, (void*)NULL, (long)NULL);
}

int msgctl (int  msqid, int  cmd, struct msqid_ds *buf)
{
    return ipc(MSGCTL, msqid, cmd, 0, buf, (long)NULL);
}

int msgget (key_t  key, int  msgflg)
{
    return ipc(MSGGET, key, msgflg, 0, NULL, (long)NULL);
}

int msgrcv (int  msqid, void*  msgp, size_t  msgsz, long int  msgtyp, int  msgflg)
{
    struct ipc_kludge tmp;

    tmp.msgp = msgp;
    tmp.msgtyp = msgtyp;

    return ipc(MSGRCV, msqid, msgsz, msgflg, &tmp, (long)NULL);
}

int msgsnd (int  msqid, const void* msgp, size_t  msgsz, int  msgflg)
{
    return ipc(MSGSND, msqid, msgsz, msgflg, (void*)msgp, (long)NULL);
}

----------------------------------------------------------------------------------------------------------------------------

bionic/libc/arch-x86/syscalls/ipc.S
----------------------------------------------------------------------------------------------------------------------------
#include <sys/linux-syscalls.h>

    .text
    .type ipc, @function
    .globl ipc
    .align 4

ipc:
    pushl   �x
    pushl   �x
    pushl   �x
    pushl   %esi
    pushl   �i
    pushl   �p
    mov     28(%esp), �x
    mov     32(%esp), �x
    mov     36(%esp), �x
    mov     40(%esp), %esi
    mov     44(%esp), �i
    mov     48(%esp), �p
    movl    $__NR_ipc, �x
    int     $0x80
    cmpl    $-129, �x
    jb      1f
    negl    �x
    pushl   �x
    call    __set_errno
    addl    $4, %esp
    orl     $-1, �x
1:
    popl    �p
    popl    �i
    popl    %esi
    popl    �x
    popl    �x
    popl    �x
    ret
----------------------------------------------------------------------------------------------------------------------------

bionic/libc/include/sys/sem.h
----------------------------------------------------------------------------------------------------------------------------
#ifndef _SYS_SEM_H
#define _SYS_SEM_H

#include <sys/ipc.h>
#include <linux/sem.h>

__BEGIN_DECLS

extern int semctl (int __semid, int __semnum, int __cmd, ...);
extern int semget (key_t __key, int __nsems, int __semflg);
extern int semop (int __semid, struct sembuf *__sops, size_t __nsops);

__END_DECLS

#endif
----------------------------------------------------------------------------------------------------------------------------
 (Travis.Yang原創,如果覺得本文對你有用,請留言支持,一起探討學習。轉載請保留此行,謝謝~^_^)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值