Module Name: src Committed By: chs Date: Mon Nov 18 01:32:22 UTC 2013
Modified Files: src/sys/compat/linux/arch/amd64: linux_exec.h linux_exec_machdep.c src/sys/compat/linux/common: linux_exec.h linux_exec_elf32.c Log Message: implement AT_RANDOM. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/compat/linux/arch/amd64/linux_exec.h cvs rdiff -u -r1.19 -r1.20 \ src/sys/compat/linux/arch/amd64/linux_exec_machdep.c cvs rdiff -u -r1.48 -r1.49 src/sys/compat/linux/common/linux_exec.h cvs rdiff -u -r1.86 -r1.87 src/sys/compat/linux/common/linux_exec_elf32.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/arch/amd64/linux_exec.h diff -u src/sys/compat/linux/arch/amd64/linux_exec.h:1.4 src/sys/compat/linux/arch/amd64/linux_exec.h:1.5 --- src/sys/compat/linux/arch/amd64/linux_exec.h:1.4 Mon Aug 7 14:19:57 2006 +++ src/sys/compat/linux/arch/amd64/linux_exec.h Mon Nov 18 01:32:22 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.4 2006/08/07 14:19:57 manu Exp $ */ +/* $NetBSD: linux_exec.h,v 1.5 2013/11/18 01:32:22 chs Exp $ */ /*- * Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved. @@ -47,7 +47,7 @@ #define LINUX_USRSTACK32 0xc0000000 /* Counted from linux_exec_machdep.c */ -#define LINUX_ELF_AUX_ENTRIES 16 +#define LINUX_ELF_AUX_ENTRIES 17 /* Hardware platform identifier string */ #define LINUX_PLATFORM "x86_64" @@ -55,6 +55,7 @@ /* The extra data (ELF auxiliary table and platform name) on stack */ struct linux_extra_stack_data64 { Aux64Info ai[LINUX_ELF_AUX_ENTRIES]; + uint32_t randbytes[4]; char pad[1]; /*sizeof(long) - (sizeof(LINUX_PLATFORM) % sizeof(long))*/ char hw_platform[sizeof(LINUX_PLATFORM)]; }; Index: src/sys/compat/linux/arch/amd64/linux_exec_machdep.c diff -u src/sys/compat/linux/arch/amd64/linux_exec_machdep.c:1.19 src/sys/compat/linux/arch/amd64/linux_exec_machdep.c:1.20 --- src/sys/compat/linux/arch/amd64/linux_exec_machdep.c:1.19 Fri Feb 3 20:11:53 2012 +++ src/sys/compat/linux/arch/amd64/linux_exec_machdep.c Mon Nov 18 01:32:22 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec_machdep.c,v 1.19 2012/02/03 20:11:53 matt Exp $ */ +/* $NetBSD: linux_exec_machdep.c,v 1.20 2013/11/18 01:32:22 chs Exp $ */ /*- * Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_exec_machdep.c,v 1.19 2012/02/03 20:11:53 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_exec_machdep.c,v 1.20 2013/11/18 01:32:22 chs Exp $"); #define ELFSIZE 64 @@ -223,6 +223,13 @@ ELFNAME2(linux,copyargs)(struct lwp *l, esd.ai[i].a_type = LINUX_AT_PLATFORM; esd.ai[i++].a_v = (Elf_Addr)&esdp->hw_platform[0]; + esd.ai[i].a_type = LINUX_AT_RANDOM; + esd.ai[i++].a_v = (Elf_Addr)&esdp->randbytes[0]; + esd.randbytes[0] = random(); + esd.randbytes[1] = random(); + esd.randbytes[2] = random(); + esd.randbytes[3] = random(); + esd.ai[i].a_type = AT_NULL; esd.ai[i++].a_v = 0; Index: src/sys/compat/linux/common/linux_exec.h diff -u src/sys/compat/linux/common/linux_exec.h:1.48 src/sys/compat/linux/common/linux_exec.h:1.49 --- src/sys/compat/linux/common/linux_exec.h:1.48 Wed Jul 7 01:30:35 2010 +++ src/sys/compat/linux/common/linux_exec.h Mon Nov 18 01:32:22 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.h,v 1.48 2010/07/07 01:30:35 chs Exp $ */ +/* $NetBSD: linux_exec.h,v 1.49 2013/11/18 01:32:22 chs Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -82,7 +82,7 @@ #define LINUX_N_BSSADDR(x,m) (LINUX_N_DATADDR(x,m) + (x).a_data) #ifndef LINUX_MACHDEP_ELF_COPYARGS -#define LINUX_ELF_AUX_ENTRIES 13 /* we push 13 parameters */ +#define LINUX_ELF_AUX_ENTRIES 14 #endif /* @@ -96,6 +96,7 @@ #define LINUX_AT_HWCAP 16 /* arch dependent CPU capabilities */ #define LINUX_AT_CLKTCK 17 /* frequency times() increments */ #define LINUX_AT_SECURE 23 /* secure mode boolean */ +#define LINUX_AT_RANDOM 25 /* address of 16 random bytes */ #define LINUX_AT_SYSINFO 32 /* pointer to __kernel_vsyscall */ #define LINUX_AT_SYSINFO_EHDR 33 /* pointer to ELF header */ Index: src/sys/compat/linux/common/linux_exec_elf32.c diff -u src/sys/compat/linux/common/linux_exec_elf32.c:1.86 src/sys/compat/linux/common/linux_exec_elf32.c:1.87 --- src/sys/compat/linux/common/linux_exec_elf32.c:1.86 Sun Feb 12 16:34:10 2012 +++ src/sys/compat/linux/common/linux_exec_elf32.c Mon Nov 18 01:32:22 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec_elf32.c,v 1.86 2012/02/12 16:34:10 matt Exp $ */ +/* $NetBSD: linux_exec_elf32.c,v 1.87 2013/11/18 01:32:22 chs Exp $ */ /*- * Copyright (c) 1995, 1998, 2000, 2001 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_exec_elf32.c,v 1.86 2012/02/12 16:34:10 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_exec_elf32.c,v 1.87 2013/11/18 01:32:22 chs Exp $"); #ifndef ELFSIZE /* XXX should die */ @@ -402,6 +402,7 @@ ELFNAME2(linux,copyargs)(struct lwp *l, struct elf_args *ap; int error; struct vattr *vap; + uint32_t randbytes[4]; if ((error = copyargs(l, pack, arginfo, stackp, argp)) != 0) return error; @@ -474,10 +475,24 @@ ELFNAME2(linux,copyargs)(struct lwp *l, a->a_v = kauth_cred_getegid(l->l_cred); a++; + a->a_type = LINUX_AT_RANDOM; + a->a_v = (Elf_Addr)*stackp; + a++; + a->a_type = AT_NULL; a->a_v = 0; a++; + randbytes[0] = random(); + randbytes[1] = random(); + randbytes[2] = random(); + randbytes[3] = random(); + + len = sizeof(randbytes); + if ((error = copyout(randbytes, *stackp, len)) != 0) + return error; + *stackp += len; + len = (a - ai) * sizeof(AuxInfo); if ((error = copyout(ai, *stackp, len)) != 0) return error;