Deleted Added
sdiff udiff text old ( 215864 ) new ( 230426 )
full compact
1/*-
2 * Copyright (c) 2005-2008 Pawel Jakub Dawidek <pjd@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/crypto/via/padlock.c 215864 2010-11-26 14:35:20Z kib $");
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/kernel.h>
33#include <sys/module.h>
34#include <sys/lock.h>
35#include <sys/rwlock.h>
36#include <sys/malloc.h>

--- 114 unchanged lines hidden (view full) ---

151 rw_wunlock(&sc->sc_sessions_lock);
152 device_printf(dev,
153 "Cannot detach, sessions still active.\n");
154 return (EBUSY);
155 }
156 }
157 while ((ses = TAILQ_FIRST(&sc->sc_sessions)) != NULL) {
158 TAILQ_REMOVE(&sc->sc_sessions, ses, ses_next);
159 free(ses, M_PADLOCK);
160 }
161 rw_destroy(&sc->sc_sessions_lock);
162 crypto_unregister_all(sc->sc_cid);
163 return (0);
164}
165
166static int

--- 50 unchanged lines hidden (view full) ---

217 */
218 ses = TAILQ_FIRST(&sc->sc_sessions);
219 if (ses == NULL || ses->ses_used) {
220 ses = malloc(sizeof(*ses), M_PADLOCK, M_NOWAIT | M_ZERO);
221 if (ses == NULL) {
222 rw_wunlock(&sc->sc_sessions_lock);
223 return (ENOMEM);
224 }
225 ses->ses_id = sc->sc_sid++;
226 } else {
227 TAILQ_REMOVE(&sc->sc_sessions, ses, ses_next);
228 }
229 ses->ses_used = 1;
230 TAILQ_INSERT_TAIL(&sc->sc_sessions, ses, ses_next);
231 rw_wunlock(&sc->sc_sessions_lock);
232
233 error = padlock_cipher_setup(ses, encini);
234 if (error != 0) {
235 padlock_freesession_one(sc, ses, 0);
236 return (error);
237 }
238
239 if (macini != NULL) {
240 td = curthread;
241 if (!is_fpu_kern_thread(0)) {
242 error = fpu_kern_enter(td, &ses->ses_fpu_ctx,
243 FPU_KERN_NORMAL);
244 saved_ctx = 1;
245 } else {
246 error = 0;
247 saved_ctx = 0;
248 }
249 if (error == 0) {
250 error = padlock_hash_setup(ses, macini);
251 if (saved_ctx)
252 fpu_kern_leave(td, &ses->ses_fpu_ctx);
253 }
254 if (error != 0) {
255 padlock_freesession_one(sc, ses, 0);
256 return (error);
257 }
258 }
259
260 *sidp = ses->ses_id;
261 return (0);
262}
263
264static void
265padlock_freesession_one(struct padlock_softc *sc, struct padlock_session *ses,
266 int locked)
267{
268 uint32_t sid = ses->ses_id;
269
270 if (!locked)
271 rw_wlock(&sc->sc_sessions_lock);
272 TAILQ_REMOVE(&sc->sc_sessions, ses, ses_next);
273 padlock_hash_free(ses);
274 bzero(ses, sizeof(*ses));
275 ses->ses_used = 0;
276 ses->ses_id = sid;
277 TAILQ_INSERT_HEAD(&sc->sc_sessions, ses, ses_next);
278 if (!locked)
279 rw_wunlock(&sc->sc_sessions_lock);
280}
281
282static int
283padlock_freesession(device_t dev, uint64_t tid)
284{

--- 140 unchanged lines hidden ---