aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/safe
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2018-07-18 00:56:25 +0000
committerConrad Meyer <cem@FreeBSD.org>2018-07-18 00:56:25 +0000
commit1b0909d51a8aa8b5ec5a61c2dc1a69642976a732 (patch)
treeb9c915e7d2ca9312b6f83308f05040a78875b6d7 /sys/dev/safe
parent38b42191fb8cbdf348508c72b504e0dc3da1b53c (diff)
Notes
Diffstat (limited to 'sys/dev/safe')
-rw-r--r--sys/dev/safe/safe.c86
-rw-r--r--sys/dev/safe/safevar.h9
2 files changed, 13 insertions, 82 deletions
diff --git a/sys/dev/safe/safe.c b/sys/dev/safe/safe.c
index 83b22d8d89ee..a1673c9cd60f 100644
--- a/sys/dev/safe/safe.c
+++ b/sys/dev/safe/safe.c
@@ -88,8 +88,7 @@ static int safe_suspend(device_t);
static int safe_resume(device_t);
static int safe_shutdown(device_t);
-static int safe_newsession(device_t, u_int32_t *, struct cryptoini *);
-static int safe_freesession(device_t, u_int64_t);
+static int safe_newsession(device_t, crypto_session_t, struct cryptoini *);
static int safe_process(device_t, struct cryptop *, int);
static device_method_t safe_methods[] = {
@@ -103,7 +102,6 @@ static device_method_t safe_methods[] = {
/* crypto device methods */
DEVMETHOD(cryptodev_newsession, safe_newsession),
- DEVMETHOD(cryptodev_freesession,safe_freesession),
DEVMETHOD(cryptodev_process, safe_process),
DEVMETHOD_END
@@ -266,7 +264,8 @@ safe_attach(device_t dev)
goto bad2;
}
- sc->sc_cid = crypto_get_driverid(dev, CRYPTOCAP_F_HARDWARE);
+ sc->sc_cid = crypto_get_driverid(dev, sizeof(struct safe_session),
+ CRYPTOCAP_F_HARDWARE);
if (sc->sc_cid < 0) {
device_printf(dev, "could not get crypto driver id\n");
goto bad3;
@@ -698,14 +697,13 @@ safe_setup_mackey(struct safe_session *ses, int algo, caddr_t key, int klen)
* id on successful allocation.
*/
static int
-safe_newsession(device_t dev, u_int32_t *sidp, struct cryptoini *cri)
+safe_newsession(device_t dev, crypto_session_t cses, struct cryptoini *cri)
{
struct safe_softc *sc = device_get_softc(dev);
struct cryptoini *c, *encini = NULL, *macini = NULL;
struct safe_session *ses = NULL;
- int sesn;
- if (sidp == NULL || cri == NULL || sc == NULL)
+ if (cri == NULL || sc == NULL)
return (EINVAL);
for (c = cri; c != NULL; c = c->cri_next) {
@@ -746,41 +744,7 @@ safe_newsession(device_t dev, u_int32_t *sidp, struct cryptoini *cri)
}
}
- if (sc->sc_sessions == NULL) {
- ses = sc->sc_sessions = (struct safe_session *)malloc(
- sizeof(struct safe_session), M_DEVBUF, M_NOWAIT);
- if (ses == NULL)
- return (ENOMEM);
- sesn = 0;
- sc->sc_nsessions = 1;
- } else {
- for (sesn = 0; sesn < sc->sc_nsessions; sesn++) {
- if (sc->sc_sessions[sesn].ses_used == 0) {
- ses = &sc->sc_sessions[sesn];
- break;
- }
- }
-
- if (ses == NULL) {
- sesn = sc->sc_nsessions;
- ses = (struct safe_session *)malloc((sesn + 1) *
- sizeof(struct safe_session), M_DEVBUF, M_NOWAIT);
- if (ses == NULL)
- return (ENOMEM);
- bcopy(sc->sc_sessions, ses, sesn *
- sizeof(struct safe_session));
- bzero(sc->sc_sessions, sesn *
- sizeof(struct safe_session));
- free(sc->sc_sessions, M_DEVBUF);
- sc->sc_sessions = ses;
- ses = &sc->sc_sessions[sesn];
- sc->sc_nsessions++;
- }
- }
-
- bzero(ses, sizeof(struct safe_session));
- ses->ses_used = 1;
-
+ ses = crypto_get_driver_session(cses);
if (encini) {
/* get an IV */
/* XXX may read fewer than requested */
@@ -806,32 +770,9 @@ safe_newsession(device_t dev, u_int32_t *sidp, struct cryptoini *cri)
}
}
- *sidp = SAFE_SID(device_get_unit(sc->sc_dev), sesn);
return (0);
}
-/*
- * Deallocate a session.
- */
-static int
-safe_freesession(device_t dev, u_int64_t tid)
-{
- struct safe_softc *sc = device_get_softc(dev);
- int session, ret;
- u_int32_t sid = ((u_int32_t) tid) & 0xffffffff;
-
- if (sc == NULL)
- return (EINVAL);
-
- session = SAFE_SESSION(sid);
- if (session < sc->sc_nsessions) {
- bzero(&sc->sc_sessions[session], sizeof(sc->sc_sessions[session]));
- ret = 0;
- } else
- ret = EINVAL;
- return (ret);
-}
-
static void
safe_op_cb(void *arg, bus_dma_segment_t *seg, int nsegs, bus_size_t mapsize, int error)
{
@@ -865,10 +806,6 @@ safe_process(device_t dev, struct cryptop *crp, int hint)
safestats.st_invalid++;
return (EINVAL);
}
- if (SAFE_SESSION(crp->crp_sid) >= sc->sc_nsessions) {
- safestats.st_badsession++;
- return (EINVAL);
- }
mtx_lock(&sc->sc_ringmtx);
if (sc->sc_front == sc->sc_back && sc->sc_nqchip != 0) {
@@ -885,7 +822,6 @@ safe_process(device_t dev, struct cryptop *crp, int hint)
re->re_sa.sa_staterec = staterec; /* restore */
re->re_crp = crp;
- re->re_sesn = SAFE_SESSION(crp->crp_sid);
if (crp->crp_flags & CRYPTO_F_IMBUF) {
re->re_src_m = (struct mbuf *)crp->crp_buf;
@@ -900,7 +836,7 @@ safe_process(device_t dev, struct cryptop *crp, int hint)
}
sa = &re->re_sa;
- ses = &sc->sc_sessions[re->re_sesn];
+ ses = crypto_get_driver_session(crp->crp_session);
crd1 = crp->crp_desc;
if (crd1 == NULL) {
@@ -1501,8 +1437,11 @@ static void
safe_callback(struct safe_softc *sc, struct safe_ringentry *re)
{
struct cryptop *crp = (struct cryptop *)re->re_crp;
+ struct safe_session *ses;
struct cryptodesc *crd;
+ ses = crypto_get_driver_session(crp->crp_session);
+
safestats.st_opackets++;
safestats.st_obytes += re->re_dst.mapsize;
@@ -1548,7 +1487,7 @@ safe_callback(struct safe_softc *sc, struct safe_ringentry *re)
continue;
crypto_copydata(crp->crp_flags, crp->crp_buf,
crd->crd_skip + crd->crd_len - ivsize, ivsize,
- (caddr_t)sc->sc_sessions[re->re_sesn].ses_iv);
+ (caddr_t)ses->ses_iv);
break;
}
}
@@ -1573,8 +1512,7 @@ safe_callback(struct safe_softc *sc, struct safe_ringentry *re)
bswap32(re->re_sastate.sa_saved_indigest[2]);
}
crypto_copyback(crp->crp_flags, crp->crp_buf,
- crd->crd_inject,
- sc->sc_sessions[re->re_sesn].ses_mlen,
+ crd->crd_inject, ses->ses_mlen,
(caddr_t)re->re_sastate.sa_saved_indigest);
break;
}
diff --git a/sys/dev/safe/safevar.h b/sys/dev/safe/safevar.h
index 6386e9b71daf..024d00564562 100644
--- a/sys/dev/safe/safevar.h
+++ b/sys/dev/safe/safevar.h
@@ -47,10 +47,6 @@
#define SAFE_RNG_MAXBUFSIZ 128 /* 32-bit words */
-#define SAFE_CARD(sid) (((sid) & 0xf0000000) >> 28)
-#define SAFE_SESSION(sid) ( (sid) & 0x0fffffff)
-#define SAFE_SID(crd, sesn) (((crd) << 28) | ((sesn) & 0x0fffffff))
-
#define SAFE_DEF_RTY 0xff /* PCI Retry Timeout */
#define SAFE_DEF_TOUT 0xff /* PCI TRDY Timeout */
#define SAFE_DEF_CACHELINE 0x01 /* Cache Line setting */
@@ -114,7 +110,7 @@ struct safe_ringentry {
struct safe_operand re_src; /* source operand */
struct safe_operand re_dst; /* destination operand */
- int re_sesn; /* crypto session ID */
+ int unused;
int re_flags;
#define SAFE_QFLAGS_COPYOUTIV 0x1 /* copy back on completion */
#define SAFE_QFLAGS_COPYOUTICV 0x2 /* copy back on completion */
@@ -137,7 +133,6 @@ struct safe_ringentry {
struct rndstate_test;
struct safe_session {
- u_int32_t ses_used;
u_int32_t ses_klen; /* key length in bits */
u_int32_t ses_key[8]; /* DES/3DES/AES key */
u_int32_t ses_mlen; /* hmac length in bytes */
@@ -177,8 +172,6 @@ struct safe_softc {
struct safe_pdesc *sc_dpringtop; /* dest particle ring top */
struct safe_pdesc *sc_dpfree; /* next free dest particle */
struct safe_dma_alloc sc_dpalloc; /* dst particle ring state */
- int sc_nsessions; /* # of sessions */
- struct safe_session *sc_sessions; /* sessions */
struct callout sc_rngto; /* rng timeout */
struct rndtest_state *sc_rndtest; /* RNG test state */