Deleted Added
full compact
padlock.c (215864) padlock.c (230426)
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>
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 $");
28__FBSDID("$FreeBSD: head/sys/crypto/via/padlock.c 230426 2012-01-21 17:45:27Z 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);
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 fpu_kern_free_ctx(ses->ses_fpu_ctx);
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 }
160 free(ses, M_PADLOCK);
161 }
162 rw_destroy(&sc->sc_sessions_lock);
163 crypto_unregister_all(sc->sc_cid);
164 return (0);
165}
166
167static int

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

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

--- 140 unchanged lines hidden ---