On Fri, Nov 16, 2012 at 3:56 AM, Rich Felker <[email protected]> wrote: > On Tue, Nov 13, 2012 at 11:31:54AM +0000, Markos Chandras wrote: >> From: Markos Chandras <[email protected]> >> >> New architectures don't define ARCH_WANT_IPC_PARSE_VERSION in their kernel. >> This means that every cmd passed to semctl,msgctl and shmctl is IPC_64 by >> default. We need to prevent uClibc from XOR'ing this flag to the cmd >> otherwise >> it will break the syscalls in the kernel. >> >> Signed-off-by: Markos Chandras <[email protected]> >> --- >> extra/Configs/Config.in.arch | 9 +++++++++ >> libc/misc/sysvipc/ipc.h | 8 ++++++++ >> libc/misc/sysvipc/msgq.c | 3 ++- >> libc/misc/sysvipc/sem.c | 4 +++- >> libc/misc/sysvipc/shm.c | 4 +++- >> 5 files changed, 25 insertions(+), 3 deletions(-) >> >> diff --git a/extra/Configs/Config.in.arch b/extra/Configs/Config.in.arch >> index ec541f4..f985472 100644 >> --- a/extra/Configs/Config.in.arch >> +++ b/extra/Configs/Config.in.arch >> @@ -42,6 +42,15 @@ if ARCH_USE_MMU >> comment "Using ELF file format" >> endif >> >> +config ARCH_HAS_NO_OLD_IPC >> + bool "Disable support for the old IPC interface" >> + default n >> + help >> + New architectures do not define the ARCH_WANT_IPC_PARSE_VERSION >> + in their kernel, which means they have no support for the old IPC >> + interface. For these architectures, these symbol must be defined >> + in order to have functional semctl, shmctl and msgctl system calls >> + > > Why is this a configure option? It's constant for a given arch... > >> config UCLIBC_SHARED_FLAT_ID >> int "Shared library ID" >> default 1 >> diff --git a/libc/misc/sysvipc/ipc.h b/libc/misc/sysvipc/ipc.h >> index 339d136..9f664f4 100644 >> --- a/libc/misc/sysvipc/ipc.h >> +++ b/libc/misc/sysvipc/ipc.h >> @@ -9,6 +9,14 @@ >> # define __IPC_64 0x0 >> #endif >> >> +/* New architectures don't have the OLD_IPC interface */ >> +#ifdef __ARCH_HAS_NO_OLD_IPC__ >> +#define PROCESS_IPC_CMD(cmd) >> +#else >> +#define PROCESS_IPC_CMD(cmd) \ >> + { int *p = &cmd; *p = (*p) | __IPC_64; } >> +#endif >> + >> #ifdef __NR_ipc >> >> /* The actual system call: all functions are multiplexed by this. */ >> diff --git a/libc/misc/sysvipc/msgq.c b/libc/misc/sysvipc/msgq.c >> index 185cd26..0523a10 100644 >> --- a/libc/misc/sysvipc/msgq.c >> +++ b/libc/misc/sysvipc/msgq.c >> @@ -18,7 +18,8 @@ static __inline__ _syscall3(int, __libc_msgctl, int, >> msqid, int, cmd, struct msq >> int msgctl(int msqid, int cmd, struct msqid_ds *buf) >> { >> #ifdef __NR_msgctl >> - return __libc_msgctl(msqid, cmd | __IPC_64, buf); >> + PROCESS_IPC_CMD(cmd) >> + return __libc_msgctl(msqid, cmd, buf); > > Wouldn't it be a lot easier just to define __IPC_64 to 0 on archs that > don't use it? > > Rich > _______________________________________________ > uClibc mailing list > [email protected] > http://lists.busybox.net/mailman/listinfo/uclibc
Hi Rich, Well yes, it's also possible to check for the given architecture on libc/misc/sysvipc/ipc.h. However, none of the architectures that don't support the old interface are present in uClibc so I will have to drop this patch until at least one of them is merged. -- Regards, Markos _______________________________________________ uClibc mailing list [email protected] http://lists.busybox.net/mailman/listinfo/uclibc
