1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
/*
* SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len,
unsigned long, mode, unsigned long __user *, nmask,
unsigned long, maxnode, unsigned, flags)
*/
#include <linux/mempolicy.h>
#include "arch.h"
#include "maps.h"
#include "random.h"
#include "sanitise.h"
#include "shm.h"
#include "utils.h" // page_size
#define MPOL_F_STATIC_NODES (1 << 15)
#define MPOL_F_RELATIVE_NODES (1 << 14)
static void sanitise_mbind(int childno)
{
unsigned long maxnode;
(void) common_set_mmap_ptr_len(childno);
retry_maxnode:
shm->a5[childno] &= ~((page_size * 8) - 1);
maxnode = shm->a5[childno];
if (maxnode < 2 || maxnode > (page_size * 8)) {
shm->a5[childno] = rand32();
goto retry_maxnode;
}
}
struct syscall syscall_mbind = {
.name = "mbind",
.num_args = 6,
.arg1name = "start",
.arg1type = ARG_MMAP,
.arg2name = "len",
.arg3name = "mode",
.arg3type = ARG_LIST,
.arg3list = {
.num = 4,
.values = { MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_PREFERRED },
},
.arg4name = "nmask",
.arg4type = ARG_ADDRESS,
.arg5name = "maxnode",
.arg5type = ARG_RANGE,
.low5range = 0,
.hi5range = 32,
.arg6name = "flags",
.arg6type = ARG_LIST,
.arg6list = {
.num = 2,
.values = { MPOL_F_STATIC_NODES, MPOL_F_RELATIVE_NODES },
},
.sanitise = sanitise_mbind,
.group = GROUP_VM,
};
|