1/* $NetBSD: rnd.h,v 1.4 2015/04/14 12:19:57 riastradh Exp $ */
2
3/*-
4 * Copyright (c) 1997,2011 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Michael Graff <explorer@flame.org>. This code uses ideas and
9 * algorithms from the Linux driver written by Ted Ts'o.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#ifndef _COMPAT_SYS_RND_H_
34#define _COMPAT_SYS_RND_H_
35
36#if defined(_KERNEL_OPT)
37#include "opt_compat_netbsd.h"
38#include "opt_compat_netbsd32.h"
39#endif
40
41#include <sys/types.h>
42#include <sys/ioctl.h>
43
44#ifdef COMPAT_NETBSD32
45#include <compat/netbsd32/netbsd32.h>
46#endif /* COMPAT_NETBSD32 */
47
48#include <sys/rndio.h>
49
50/*
51 * NetBSD-5 used "void *state" in the rndsource_t struct. rndsource_t
52 * was used in rnstat_t and rnstat_name_t, which were used by
53 * the NetBSD-5 RNDGETSRCNUM and RNDGETSRCNAME ioctls.
54 *
55 */
56
57/* Sanitized random source view for userspace. */
58typedef struct {
59 char name[16]; /* device name */
60 uint32_t unused_time; /* was: last time recorded */
61 uint32_t unused_delta; /* was: last delta value */
62 uint32_t unused_delta2; /* was: last delta2 value */
63 uint32_t total; /* entropy from this source */
64 uint32_t type; /* type */
65 uint32_t flags; /* flags */
66 void *unused_state; /* was: internal state */
67} rndsource50_t;
68
69#ifdef COMPAT_NETBSD32
70typedef struct {
71 char name[16]; /* device name */
72 uint32_t unused_time; /* was: last time recorded */
73 uint32_t unused_delta; /* was: last delta value */
74 uint32_t unused_delta2; /* was: last delta2 value */
75 uint32_t total; /* entropy from this source */
76 uint32_t type; /* type */
77 uint32_t flags; /* flags */
78 netbsd32_voidp unused_state; /* was: internal state */
79} rndsource50_32_t;
80#endif /* COMPAT_NETBSD32 */
81
82/*
83 * NetBSD-5 defined RND_MAXSTATCOUNT as 10. We define RND_MAXSTATCOUNT50
84 * here, and check that the native RND_MAXSTATCOUNT is not smaller.
85 */
86#define RND_MAXSTATCOUNT50 10 /* 10 sources at once max */
87#if (RND_MAXSTATCOUNT50 > RND_MAXSTATCOUNT)
88 #error "RND_MAXSTATCOUNT50 is too large"
89#endif
90
91/*
92 * return "count" random entries, starting at "start"
93 */
94typedef struct {
95 uint32_t start;
96 uint32_t count;
97 rndsource50_t source[RND_MAXSTATCOUNT50];
98} rndstat50_t;
99
100#ifdef COMPAT_NETBSD32
101typedef struct {
102 uint32_t start;
103 uint32_t count;
104 rndsource50_32_t source[RND_MAXSTATCOUNT50];
105} rndstat50_32_t;
106#endif /* COMPAT_NETBSD32 */
107
108/*
109 * return information on a specific source by name
110 */
111typedef struct {
112 char name[16];
113 rndsource50_t source;
114} rndstat_name50_t;
115
116#ifdef COMPAT_NETBSD32
117typedef struct {
118 char name[16];
119 rndsource50_32_t source;
120} rndstat_name50_32_t;
121#endif /* COMPAT_NETBSD32 */
122
123/*
124 * NetBSD-5 defined RND_POOLWORDS as 128. In NetBSD-6, the value
125 * exposed to userland via the rnddata_t type was renamed to
126 * RND_SAVEWORDS. As long as RND_SAVEWORDS remains equal to 128, then
127 * rnddata_t (used by ioctl RNDADDATA), and rndpoolstat_t (used by ioctl
128 * RNDGETPOOLSTAT) remain ABI compatible without any extra effort, even
129 * though the declarations in the source code have changed.
130 */
131#if (RND_SAVEWORDS != 128)
132 #error "RND_SAVEWORDS must be 128 for NetBSD-5 compatibility"
133#endif
134
135/*
136 * Compatibility with NetBSD-5 ioctls.
137 */
138#ifdef _KERNEL
139int compat_50_rnd_ioctl(struct file *, u_long, void *);
140#endif
141
142#define RNDGETSRCNUM50 _IOWR('R', 102, rndstat50_t)
143#define RNDGETSRCNAME50 _IOWR('R', 103, rndstat_name50_t)
144
145#ifdef COMPAT_NETBSD32
146#define RNDGETSRCNUM50_32 _IOWR('R', 102, rndstat50_32_t)
147#define RNDGETSRCNAME50_32 _IOWR('R', 103, rndstat_name50_32_t)
148#endif /* COMPAT_NETBSD32 */
149
150#endif /* !_COMPAT_SYS_RND_H_ */
151