1313
1414#include < device_manager.h>
1515#include < Drivers.h>
16+ #include < generic_syscall.h>
17+ #include < kernel.h>
1618#include < malloc.h>
19+ #include < random_defs.h>
1720#include < string.h>
1821#include < util/AutoLock.h>
1922
@@ -103,6 +106,33 @@ random_control(void *cookie, uint32 op, void *arg, size_t length)
103106}
104107
105108
109+ static status_t
110+ random_generic_syscall (const char * subsystem, uint32 function, void * buffer,
111+ size_t bufferSize)
112+ {
113+ switch (function) {
114+ case RANDOM_GET_ENTROPY:
115+ {
116+ random_get_entropy_args args;
117+ if (bufferSize != sizeof (args) || !IS_USER_ADDRESS (buffer))
118+ return B_BAD_VALUE;
119+
120+ if (user_memcpy (&args, buffer, sizeof (args)) != B_OK)
121+ return B_BAD_ADDRESS;
122+ if (!IS_USER_ADDRESS (args.buffer ))
123+ return B_BAD_ADDRESS;
124+
125+ status_t result = random_read (NULL , 0 , args.buffer , &args.length );
126+ if (result < 0 )
127+ return result;
128+
129+ return user_memcpy (buffer, &args, sizeof (args));
130+ }
131+ }
132+ return B_BAD_HANDLER;
133+ }
134+
135+
106136static status_t
107137random_close (void *cookie)
108138{
@@ -197,6 +227,8 @@ random_init_driver(device_node *node, void **cookie)
197227
198228 info->node = node;
199229
230+ register_generic_syscall (RANDOM_SYSCALLS, random_generic_syscall, 1 , 0 );
231+
200232 *cookie = info;
201233 return B_OK;
202234}
@@ -207,6 +239,8 @@ random_uninit_driver(void *_cookie)
207239{
208240 CALLED ();
209241
242+ unregister_generic_syscall (RANDOM_SYSCALLS, 1 );
243+
210244 RANDOM_UNINIT ();
211245
212246 mutex_destroy (&sRandomLock );
0 commit comments