00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <types.h>
00031 #include <kern/errno.h>
00032 #include <kern/fcntl.h>
00033 #include <lib.h>
00034 #include <uio.h>
00035 #include <vfs.h>
00036 #include <generic/random.h>
00037 #include "autoconf.h"
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 static struct random_softc *the_random = NULL;
00051
00052
00053
00054
00055
00056 static
00057 int
00058 randopen(struct device *dev, int openflags)
00059 {
00060 (void)dev;
00061
00062 if (openflags != O_RDONLY) {
00063 return EIO;
00064 }
00065
00066 return 0;
00067 }
00068
00069
00070
00071
00072 static
00073 int
00074 randclose(struct device *dev)
00075 {
00076 (void)dev;
00077 return 0;
00078 }
00079
00080
00081
00082
00083 static
00084 int
00085 randio(struct device *dev, struct uio *uio)
00086 {
00087 struct random_softc *rs = dev->d_data;
00088
00089 if (uio->uio_rw != UIO_READ) {
00090 return EIO;
00091 }
00092
00093 return rs->rs_read(rs->rs_devdata, uio);
00094 }
00095
00096
00097
00098
00099 static
00100 int
00101 randioctl(struct device *dev, int op, userptr_t data)
00102 {
00103
00104
00105
00106 (void)dev;
00107 (void)op;
00108 (void)data;
00109 return EIOCTL;
00110 }
00111
00112
00113
00114
00115 int
00116 config_random(struct random_softc *rs, int unit)
00117 {
00118 int result;
00119
00120
00121 if (unit!=0) {
00122 return ENODEV;
00123 }
00124
00125 KASSERT(the_random==NULL);
00126 the_random = rs;
00127
00128 rs->rs_dev.d_open = randopen;
00129 rs->rs_dev.d_close = randclose;
00130 rs->rs_dev.d_io = randio;
00131 rs->rs_dev.d_ioctl = randioctl;
00132 rs->rs_dev.d_blocks = 0;
00133 rs->rs_dev.d_blocksize = 1;
00134 rs->rs_dev.d_data = rs;
00135
00136
00137 result = vfs_adddev("random", &rs->rs_dev, 0);
00138 if (result) {
00139 return result;
00140 }
00141
00142 return 0;
00143 }
00144
00145
00146
00147
00148
00149
00150 uint32_t
00151 random(void)
00152 {
00153 if (the_random==NULL) {
00154 panic("No random device\n");
00155 }
00156 return the_random->rs_random(the_random->rs_devdata);
00157 }
00158
00159 uint32_t
00160 randmax(void)
00161 {
00162 if (the_random==NULL) {
00163 panic("No random device\n");
00164 }
00165 return the_random->rs_randmax(the_random->rs_devdata);
00166 }