<p dir="ltr">Hi</p>
<p dir="ltr">I have already tried that value by checking in forums but got the same error.</p>
<div class="gmail_quote">On Jun 22, 2016 9:46 PM, &quot;Navin P.S&quot; &lt;<a href="mailto:navinp1912@gmail.com">navinp1912@gmail.com</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Wed, Jun 22, 2016 at 8:28 PM, Avantika Rawat &lt;<a href="mailto:avani.rawat@gmail.com">avani.rawat@gmail.com</a>&gt; wrote:<br>
&gt; Hi ,<br>
&gt;<br>
&gt; Thanks for the link but i am getting &quot;Function not implemented&quot; error.<br>
&gt; I have added a custom syscall in kernel for testing, getting similar<br>
&gt; error for that also. I am working on  3.10.20 Kernel and MIPS<br>
&gt; architecture. Pasting the kernel changes done to spport getrandom<br>
&gt; syscall in 3.10.20 kernel. Can someone please help me here that what<br>
&gt; needs to be done.<br>
&gt;<br>
&gt; --- linux-3.10.20/arch/x86/syscalls/syscall_32.tbl 2016-06-15<br>
&gt; 11:51:27.950025308 +0530<br>
&gt; +++ linux-3.10.20_mod/arch/x86/syscalls/syscall_32.tbl 2016-06-15<br>
&gt; 11:48:02.222020102 +0530<br>
&gt; @@ -358,3 +358,4 @@<br>
&gt;  349 i386 kcmp sys_kcmp<br>
&gt;  350 i386 finit_module sys_finit_module<br>
&gt;  351 i386 msa sys_msa<br>
&gt; +352 i386    getrandom           sys_getrandom<br>
&gt; --- linux-3.10.20/arch/x86/syscalls/syscall_64.tbl 2016-06-15<br>
&gt; 11:51:27.950025308 +0530<br>
&gt; +++ linux-3.10.20_mod/arch/x86/syscalls/syscall_64.tbl 2016-06-15<br>
&gt; 11:48:16.118020453 +0530<br>
&gt; @@ -321,6 +321,7 @@<br>
&gt;  312 common kcmp sys_kcmp<br>
&gt;  313 common finit_module sys_finit_module<br>
&gt;  314 common msa sys_msa<br>
&gt; +315 common getrandom sys_getrandom<br>
&gt;<br>
&gt;  #<br>
&gt;  # x32-specific system call numbers start at 512 to avoid cache impact<br>
&gt; --- linux-3.10.20/drivers/char/random.c 2016-06-15 11:51:27.998025309 +0530<br>
&gt; +++ linux-3.10.20_mod/drivers/char/random.c 2016-06-15 11:48:34.774020925 +0530<br>
&gt; @@ -265,6 +265,8 @@<br>
&gt;  #include &lt;asm/irq.h&gt;<br>
&gt;  #include &lt;asm/irq_regs.h&gt;<br>
&gt;  #include &lt;asm/io.h&gt;<br>
&gt; +#include &lt;linux/syscalls.h&gt;<br>
&gt; +#include &lt;linux/completion.h&gt;<br>
&gt;<br>
&gt;  #define CREATE_TRACE_POINTS<br>
&gt;  #include &lt;trace/events/random.h&gt;<br>
&gt; @@ -397,6 +399,7 @@ static struct poolinfo {<br>
&gt;   */<br>
&gt;  static DECLARE_WAIT_QUEUE_HEAD(random_read_wait);<br>
&gt;  static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);<br>
&gt; +static DECLARE_WAIT_QUEUE_HEAD(urandom_init_wait);<br>
&gt;  static struct fasync_struct *fasync;<br>
&gt;<br>
&gt;  static bool debug;<br>
&gt; @@ -1018,13 +1021,14 @@ static ssize_t extract_entropy_user(stru<br>
&gt;  {<br>
&gt;   ssize_t ret = 0, i;<br>
&gt;   __u8 tmp[EXTRACT_SIZE];<br>
&gt; +    int large_request = (nbytes &gt; 256);<br>
&gt;<br>
&gt;   trace_extract_entropy_user(r-&gt;name, nbytes, r-&gt;entropy_count, _RET_IP_);<br>
&gt;   xfer_secondary_pool(r, nbytes);<br>
&gt;   nbytes = account(r, nbytes, 0, 0);<br>
&gt;<br>
&gt;   while (nbytes) {<br>
&gt; - if (need_resched()) {<br>
&gt; +        if (large_request &amp;&amp; need_resched()) {<br>
&gt;   if (signal_pending(current)) {<br>
&gt;   if (ret == 0)<br>
&gt;   ret = -ERESTARTSYS;<br>
&gt; @@ -1158,7 +1162,7 @@ void rand_initialize_disk(struct gendisk<br>
&gt;  #endif<br>
&gt;<br>
&gt;  static ssize_t<br>
&gt; -random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)<br>
&gt; +_random_read(int nonblock, char __user *buf, size_t nbytes)<br>
&gt;  {<br>
&gt;   ssize_t n, retval = 0, count = 0;<br>
&gt;<br>
&gt; @@ -1183,7 +1187,7 @@ random_read(struct file *file, char __us<br>
&gt;    n*8, (nbytes-n)*8);<br>
&gt;<br>
&gt;   if (n == 0) {<br>
&gt; - if (file-&gt;f_flags &amp; O_NONBLOCK) {<br>
&gt; + if (nonblock) {<br>
&gt;   retval = -EAGAIN;<br>
&gt;   break;<br>
&gt;   }<br>
&gt; @@ -1215,6 +1219,13 @@ random_read(struct file *file, char __us<br>
&gt;  }<br>
&gt;<br>
&gt;  static ssize_t<br>
&gt; +random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)<br>
&gt; +    {<br>
&gt; +    return _random_read(file-&gt;f_flags &amp; O_NONBLOCK, buf, nbytes);<br>
&gt; +    }<br>
&gt; +<br>
&gt; +<br>
&gt; +static ssize_t<br>
&gt;  urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)<br>
&gt;  {<br>
&gt;   return extract_entropy_user(&amp;nonblocking_pool, buf, nbytes);<br>
&gt; @@ -1340,6 +1351,29 @@ const struct file_operations urandom_fop<br>
&gt;   .llseek = noop_llseek,<br>
&gt;  };<br>
&gt;<br>
&gt; +SYSCALL_DEFINE3 (getrandom, char __user *, buf, size_t, count,<br>
&gt; + unsigned int, flags)<br>
&gt; +    {<br>
&gt; +    if (flags &amp; ~(GRND_NONBLOCK|GRND_RANDOM))<br>
&gt; +        return -EINVAL;<br>
&gt; +<br>
&gt; +    if (count &gt; INT_MAX)<br>
&gt; +        count = INT_MAX;<br>
&gt; +<br>
&gt; +    if (flags &amp; GRND_RANDOM)<br>
&gt; +        return _random_read(flags &amp; GRND_NONBLOCK, buf, count);<br>
&gt; +<br>
&gt; +    if (unlikely(nonblocking_pool.initialized == 0)) {<br>
&gt; +        if (flags &amp; GRND_NONBLOCK)<br>
&gt; +            return -EAGAIN;<br>
&gt; +        wait_event_interruptible(urandom_init_wait,<br>
&gt; +                                 nonblocking_pool.initialized);<br>
&gt; +        if (signal_pending(current))<br>
&gt; +            return -ERESTARTSYS;<br>
&gt; +    }<br>
&gt; +    return urandom_read(NULL, buf, count, NULL);<br>
&gt; +    }<br>
&gt; +<br>
&gt;  /***************************************************************<br>
&gt;   * Random UUID interface<br>
&gt;   *<br>
&gt; --- linux-3.10.20/include/linux/syscalls.h 2016-06-15 11:51:28.246025315 +0530<br>
&gt; +++ linux-3.10.20_mod/include/linux/syscalls.h 2016-06-15<br>
&gt; 11:49:11.918021865 +0530<br>
&gt; @@ -852,4 +852,6 @@ asmlinkage long sys_process_vm_writev(pi<br>
&gt;  asmlinkage long sys_kcmp(pid_t pid1, pid_t pid2, int type,<br>
&gt;   unsigned long idx1, unsigned long idx2);<br>
&gt;  asmlinkage long sys_finit_module(int fd, const char __user *uargs, int flags);<br>
&gt; +asmlinkage long sys_getrandom(char __user *buf, size_t count,<br>
&gt; +      unsigned int flags);<br>
&gt;  #endif<br>
&gt; --- linux-3.10.20/include/uapi/asm-generic/unistd.h 2016-06-15<br>
&gt; 11:51:28.258025315 +0530<br>
&gt; +++ linux-3.10.20_mod/include/uapi/asm-generic/unistd.h 2016-06-15<br>
&gt; 11:49:32.558022388 +0530<br>
&gt; @@ -694,9 +694,11 @@ __SYSCALL(__NR_kcmp, sys_kcmp)<br>
&gt;  __SYSCALL(__NR_finit_module, sys_finit_module)<br>
&gt;  #define __NR_msa 274<br>
&gt;  __SYSCALL(__NR_msa, sys_msa)<br>
&gt; +#define __NR_getrandom 275<br>
&gt; +__SYSCALL(__NR_getrandom, sys_getrandom)<br>
&gt;<br>
&gt;  #undef __NR_syscalls<br>
&gt; -#define __NR_syscalls 275<br>
&gt; +#define __NR_syscalls 276<br>
&gt;<br>
&gt;  /*<br>
&gt;   * All syscalls below here should go away really,<br>
&gt; --- linux-3.10.20/include/uapi/linux/random.h 2013-11-21<br>
&gt; 01:58:01.000000000 +0530<br>
&gt; +++ linux-3.10.20_mod/include/uapi/linux/random.h 2016-06-15<br>
&gt; 11:50:06.350023243 +0530<br>
&gt; @@ -40,6 +40,15 @@ struct rand_pool_info {<br>
&gt;   __u32 buf[0];<br>
&gt;  };<br>
&gt;<br>
&gt; +/*<br>
&gt; + * Flags for getrandom(2)<br>
&gt; + *<br>
&gt; + * GRND_NONBLOCK Don&#39;t block and return EAGAIN instead<br>
&gt; + * GRND_RANDOM Use the /dev/random pool instead of /dev/urandom<br>
&gt; + */<br>
&gt; +#define GRND_NONBLOCK 0x0001<br>
&gt; +#define GRND_RANDOM 0x0002<br>
&gt; +<br>
&gt;  struct rnd_state {<br>
&gt;   __u32 s1, s2, s3;<br>
&gt;  };<br>
&gt;<br>
&gt;<br>
&gt; On Wed, Jun 22, 2016 at 12:40 AM, Manuel Pégourié-Gonnard<br>
&gt; &lt;<a href="mailto:mpg@elzevir.fr">mpg@elzevir.fr</a>&gt; wrote:<br>
&gt;&gt; Hi,<br>
&gt;&gt;<br>
&gt;&gt; Maybe your unistd.h comes from an older kernel? That would explain why<br>
&gt;&gt; it doesn&#39;t define that symbol.<br>
&gt;&gt;<br>
&gt;&gt; Here [1] is some code using that syscall successfully, you can see it<br>
&gt;&gt; looks a lot like Sayutin&#39;s code, except it does a few more compile-time<br>
&gt;&gt; and runtime checks to fallback on using /dev/urandom if necessary.<br>
&gt;&gt;<br>
&gt;&gt; [1]:<br>
&gt;&gt; <a href="https://github.com/ARMmbed/mbedtls/blob/dd9895d8101f17ce804830472cbb140eba1c46a0/library/entropy_poll.c#L85" rel="noreferrer" target="_blank">https://github.com/ARMmbed/mbedtls/blob/dd9895d8101f17ce804830472cbb140eba1c46a0/library/entropy_poll.c#L85</a><br>
&gt;&gt;<br>
&gt;&gt; Manuel.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On 21/06/2016 15:41, Avantika Rawat wrote:<br>
&gt;&gt;&gt; Hi,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Thanks for the suggestion but i am getting following error<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;  error: &#39;SYS_getrandom&#39; undeclared (first use in this function)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; then i have replaced the SYS_getrandom by 275 in syscall(275, -- args--);<br>
&gt;&gt;&gt; as 275 is the  __NR_getrandom defines in unistd.h file,  but it is<br>
&gt;&gt;&gt; returning -1.<br>
&gt;&gt;&gt; Can somebody tell me what i am missing here??<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;  . Also in /proc/kallsyms it is showing two syscalls added for getrandom<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ffffffff80417a38 T SyS_getrandom<br>
&gt;&gt;&gt; ffffffff80417a38 T sys_getrandom<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Sat, Jun 18, 2016 at 7:12 PM, Sayutin Dmitry &lt;<a href="mailto:cdkrot@yandex.ru">cdkrot@yandex.ru</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt; Well, in fact it is not hard.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Just use syscall(2) provided by libc.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; You need to provide to this function syscall id and syscall args.<br>
&gt;&gt;&gt;&gt; Syscall id can be retrieved from macro constant<br>
&gt;&gt;&gt;&gt; Should look something like:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; #define _GNU_SOURCE<br>
&gt;&gt;&gt;&gt; #include &lt;unistd.h&gt;<br>
&gt;&gt;&gt;&gt; #include &lt;sys/syscall.h&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; syscall(SYS_getrandom, -- your - args - here --);<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; It returns long value - the result of syscall.<br>
&gt;&gt;&gt;&gt; If it is between [-4095; -1] then it is negated errno, otherways it is return value.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; 18.06.2016, 16:32, &quot;Anoop&quot; &lt;<a href="mailto:anoop.chargotra@gmail.com">anoop.chargotra@gmail.com</a>&gt;:<br>
&gt;&gt;&gt;&gt;&gt; Hi Avantika,<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; On Sat, Jun 18, 2016 at 5:32 PM, Avantika Rawat &lt;<a href="mailto:avani.rawat@gmail.com">avani.rawat@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt;&gt;&gt;  Hi ALL,<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;  I am trying to use getrandom syscall in kernel 3.10.20 by following this<br>
&gt;&gt;&gt;&gt;&gt;&gt;  link<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;  <a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c6e9d6f38894798696f23c8084ca7edbf16ee895" rel="noreferrer" target="_blank">https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c6e9d6f38894798696f23c8084ca7edbf16ee895</a><br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;  i have compiled the kernel and now want to call the getrandom syscall from<br>
&gt;&gt;&gt;&gt;&gt;&gt;  userspace to generate random numbers. But i am getting following error while<br>
&gt;&gt;&gt;&gt;&gt;&gt;  calling the getrandom () from userspace.<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;  (.text.startup+0x18): undefined reference to `getrandom&#39;<br>
&gt;&gt;&gt;&gt;&gt;&gt;  (.text.startup+0x1c): undefined reference to `getrandom&#39;<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Your user space program will not know where &#39;getrandom&#39; is defined<br>
&gt;&gt;&gt;&gt;&gt; unless it&#39;s in the C library. You need to research more on how to call<br>
&gt;&gt;&gt;&gt;&gt; custom system calls.<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; -Anoop<br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;  --<br>
&gt;&gt;&gt;&gt;&gt;&gt;  Regards,<br>
&gt;&gt;&gt;&gt;&gt;&gt;  Avantika Rawat<br>
&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt;&gt;  _______________________________________________<br>
&gt;&gt;&gt;&gt;&gt;&gt;  Kernelnewbies mailing list<br>
&gt;&gt;&gt;&gt;&gt;&gt;  <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt;&gt;&gt;&gt;&gt;&gt;  <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" rel="noreferrer" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt;&gt; Kernelnewbies mailing list<br>
&gt;&gt;&gt;&gt;&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt;&gt;&gt;&gt;&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" rel="noreferrer" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; -----<br>
&gt;&gt;&gt;&gt; Sayutin Dmitry &lt;<a href="mailto:cdkrot@yandex.com">cdkrot@yandex.com</a>&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Regards,<br>
&gt; Avantika Rawat<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Kernelnewbies mailing list<br>
&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" rel="noreferrer" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
<br>
I think you need to 352 or 315 ie the values from .tbl (so 315 if you<br>
are calling on a x64 kernel or 352 if you are calling x86 kernel). The<br>
275 is for the uapi but syscall accepts the 315 value on a x64.<br>
<br>
 Please try with 315 and 352 after running your modified kernel and<br>
report back. Atleast that is the way it worked for me on a 4.x kernel.<br>
Ideally uapi is for userspace like glibc and they come man 3 where as<br>
the syscall is (man 2) ie system call.<br>
<br>
--<br>
-- Navin<br>
</blockquote></div>