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 --- |