shmget: add "shmflg" checks for SHM_HUGE*

This commit is contained in:
NAKAMURA Gou
2016-03-17 21:47:47 +09:00
parent d65135c040
commit 48167d3223
5 changed files with 39 additions and 5 deletions

View File

@@ -13,6 +13,11 @@
#ifndef HEADER_ARCH_SHM_H
#define HEADER_ARCH_SHM_H
/* shmflg */
#define SHM_HUGE_SHIFT 26
#define SHM_HUGE_2MB (21 << SHM_HUGE_SHIFT)
#define SHM_HUGE_1GB (30 << SHM_HUGE_SHIFT)
struct ipc_perm {
key_t key;
uid_t uid;

View File

@@ -1332,13 +1332,33 @@ SYSCALL_DECLARE(shmget)
{
const key_t key = ihk_mc_syscall_arg0(ctx);
const size_t size = ihk_mc_syscall_arg1(ctx);
const int shmflg = ihk_mc_syscall_arg2(ctx);
const int shmflg0 = ihk_mc_syscall_arg2(ctx);
int shmid;
int error;
int shmflg = shmflg0;
dkprintf("shmget(%#lx,%#lx,%#x)\n", key, size, shmflg);
dkprintf("shmget(%#lx,%#lx,%#x)\n", key, size, shmflg0);
if (shmflg & SHM_HUGETLB) {
switch (shmflg & (0x3F << SHM_HUGE_SHIFT)) {
case 0:
shmflg |= SHM_HUGE_2MB; /* default hugepage size */
break;
case SHM_HUGE_2MB:
case SHM_HUGE_1GB:
break;
default:
error = -EINVAL;
goto out;
}
}
shmid = do_shmget(key, size, shmflg);
dkprintf("shmget(%#lx,%#lx,%#x): %d\n", key, size, shmflg, shmid);
return shmid;
error = 0;
out:
dkprintf("shmget(%#lx,%#lx,%#x): %d %d\n", key, size, shmflg0, error, shmid);
return (error)?: shmid;
} /* sys_shmget() */