From 753ddd31060c96dab660fc1b5898027fd1743a2a Mon Sep 17 00:00:00 2001 From: Romain Dolbeau Date: Sat, 9 Jan 2021 11:48:27 -0500 Subject: [PATCH] DMA for cbc decrypt --- NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c | 90 +++++++++++++++++++++++- NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h | 1 + sbus-to-ztex-gateware/sbus_fsm.vhd | 7 +- 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c index c14b251..d98188b 100644 --- a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c +++ b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.c @@ -1083,7 +1083,7 @@ rdfpga_encdec_aes128cbc(struct rdfpga_softc *sw, const u_int8_t thesid, struct c */ idat = ((char *)uio->uio_iov[ind].iov_base) + k; - if (!ctx->cbc) { + if (!ctx->cbc && (crd->crd_flags & CRD_F_ENCRYPT)) { if (rdfpga_rijndael128_writeivforcbc(sw->sessions[thesid].sw_kschedule, ivp)) { aprint_error_dev(sw->sc_dev, "rdfpga_rijndael128_crypt: stuck\n"); } else { @@ -1146,6 +1146,94 @@ rdfpga_encdec_aes128cbc(struct rdfpga_softc *sw, const u_int8_t thesid, struct c bus_dmamem_unmap(sw->sc_dmatag, kvap, RDFPGA_VAL_DMA_MAX_SZ); bus_dmamem_free(sw->sc_dmatag, &segs, 1); + idat += tocopy; + count += tocopy; + k += tocopy; + i -= tocopy; + } +/* ********************************************************************************** */ + if (!(crd->crd_flags & CRD_F_ENCRYPT) && ((uio->uio_iov[ind].iov_len - k) >= 32)) { + bus_dma_segment_t segs; + int rsegs; + size_t tocopy = uio->uio_iov[ind].iov_len - k; + uint64_t ctrl; + /* int error; */ + + tocopy &= ~(size_t)0x0F; + if (tocopy > RDFPGA_VAL_DMA_MAX_SZ) + tocopy = RDFPGA_VAL_DMA_MAX_SZ; + + /* aprint_normal_dev(sw->sc_dev, "AES DMA: %zd @ %p (%d) [from %d]\n", tocopy, idat, ind, k); */ + + if (bus_dmamem_alloc(sw->sc_dmatag, RDFPGA_VAL_DMA_MAX_SZ, 64, 64, &segs, 1, &rsegs, BUS_DMA_NOWAIT | BUS_DMA_STREAMING)) { + aprint_error_dev(sw->sc_dev, "cannot allocate DVMA memory"); + goto afterdma; + } + void* kvap; + if (bus_dmamem_map(sw->sc_dmatag, &segs, 1, RDFPGA_VAL_DMA_MAX_SZ, &kvap, BUS_DMA_NOWAIT)) { + aprint_error_dev(sw->sc_dev, "cannot allocate DVMA address"); + bus_dmamem_free(sw->sc_dmatag, &segs, 1); + goto afterdma; + } + if (bus_dmamap_load(sw->sc_dmatag, sw->sc_dmamap, kvap, RDFPGA_VAL_DMA_MAX_SZ, /* kernel space */ NULL, + BUS_DMA_NOWAIT | BUS_DMA_STREAMING | BUS_DMA_WRITE | BUS_DMA_READ)) { + aprint_error_dev(sw->sc_dev, "cannot load dma map"); + bus_dmamem_unmap(sw->sc_dmatag, kvap, RDFPGA_VAL_DMA_MAX_SZ); + bus_dmamem_free(sw->sc_dmatag, &segs, 1); + goto afterdma; + } + /* if ((error = uiomove(kvap, tocopy, uio)) != 0) { */ + /* aprint_error_dev(sw->sc_dev, "cannot copy from uio space"); */ + /* bus_dmamap_unload(sw->sc_dmatag, sw->sc_dmamap); */ + /* bus_dmamem_unmap(sw->sc_dmatag, kvap, RDFPGA_VAL_DMA_MAX_SZ); */ + /* bus_dmamem_free(sw->sc_dmatag, &segs, 1); */ + /* goto afterdma; */ + /* } */ + memcpy(kvap, idat, tocopy); + + bus_dmamap_sync(sw->sc_dmatag, sw->sc_dmamap, 0, tocopy, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); + /* start write */ + ctrl = ((uint64_t)(RDFPGA_MASK_DMA_CTRL_START | RDFPGA_MASK_DMA_CTRL_AES | RDFPGA_MASK_DMA_CTRL_DEC | ((tocopy/16)-1))) | ((uint64_t)(uint32_t)(sw->sc_dmamap->dm_segs[0].ds_addr)) << 32; + bus_space_write_8(sw->sc_bustag, sw->sc_bhregs, (RDFPGA_REG_DMAW_ADDR), ctrl); + /* start read */ + ctrl = ((uint64_t)(RDFPGA_MASK_DMA_CTRL_START | RDFPGA_MASK_DMA_CTRL_AES | RDFPGA_MASK_DMA_CTRL_DEC | ((tocopy/16)-1))) | ((uint64_t)(uint32_t)(sw->sc_dmamap->dm_segs[0].ds_addr)) << 32; + bus_space_write_8(sw->sc_bustag, sw->sc_bhregs, (RDFPGA_REG_DMA_ADDR), ctrl); + rdfpga_wait_dma_ready(sw, 50000); + bus_dmamap_sync(sw->sc_dmatag, sw->sc_dmamap, 0, tocopy, BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); + + //memcpy(idat, kvap, tocopy); + #if 0 + for (j = 0 ; j < blks ; j++) { + piv[j] = idat[(tocopy-1)-blks]; + } + for (j = tocopy-1 ; j >= blks ; j --) { + idat[j] = kvap[j] ^ idat[j - blks]; + } + for (j = 0 ; j < blks ; j++) { + idat[j] = kvap[j] ^ ivp[j]; + ivp[j] = piv[j]; + } + #else +#define u32blks ((blks)/sizeof(u_int32_t)) +#define p32(x) ((u_int32_t*)x) + for (j = 0 ; j < blks/sizeof(u_int32_t) ; j++) { + p32(piv)[j] = p32(idat)[(tocopy/sizeof(u_int32_t))-1-u32blks]; + } + for (j = (tocopy/sizeof(u_int32_t))-1 ; j >= u32blks ; j --) { + p32(idat)[j] = p32(kvap)[j] ^ p32(idat)[j - u32blks]; + } + for (j = 0 ; j < u32blks ; j++) { + p32(idat)[j] = p32(kvap)[j] ^ p32(ivp)[j]; + p32(ivp)[j] = p32(piv)[j]; + } +#undef p32 +#undef u32blks + #endif + + bus_dmamap_unload(sw->sc_dmatag, sw->sc_dmamap); + bus_dmamem_unmap(sw->sc_dmatag, kvap, RDFPGA_VAL_DMA_MAX_SZ); + bus_dmamem_free(sw->sc_dmatag, &segs, 1); + idat += tocopy; count += tocopy; k += tocopy; diff --git a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h index 81b5589..c021e9b 100644 --- a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h +++ b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga.h @@ -80,6 +80,7 @@ struct rdfpga_softc { #define RDFPGA_MASK_DMA_CTRL_GCM 0x08000000 #define RDFPGA_MASK_DMA_CTRL_AES 0x04000000 #define RDFPGA_MASK_DMA_CTRL_CBC 0x02000000 +#define RDFPGA_MASK_DMA_CTRL_DEC 0x01000000 #define RDFPGA_MASK_DMA_CTRL_BLKCNT 0x00000FFF #define RDFPGA_VAL_DMA_MAX_BLKCNT 4096 #define RDFPGA_VAL_DMA_MAX_SZ (RDFPGA_VAL_DMA_MAX_BLKCNT*16) diff --git a/sbus-to-ztex-gateware/sbus_fsm.vhd b/sbus-to-ztex-gateware/sbus_fsm.vhd index 4579950..2a2529c 100644 --- a/sbus-to-ztex-gateware/sbus_fsm.vhd +++ b/sbus-to-ztex-gateware/sbus_fsm.vhd @@ -120,6 +120,7 @@ ENTITY SBusFSM is constant DMA_CTRL_GCM_IDX : integer := 27; constant DMA_CTRL_AES_IDX : integer := 26; constant DMA_CTRL_CBC_IDX : integer := 25; + constant DMA_CTRL_DEC_IDX : integer := 24; constant AES128_CTRL_START_IDX : integer := 31; constant AES128_CTRL_BUSY_IDX : integer := 30; @@ -1134,9 +1135,9 @@ BEGIN fifo_toaes_din <= '0' & -- !iskey '0' & -- keylen, ignored - '1' & -- encdec, enc for now + (NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- encdec '0' & -- cbc - '1' & -- internal cbc + (NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- internal cbc; HACKISH - enable for encrypt x"00000000000000000000000000000000" & REGISTERS(REG_INDEX_AES128_DATA1) & REGISTERS(REG_INDEX_AES128_DATA2) & REGISTERS(REG_INDEX_AES128_DATA3) & BUF_DATA_I; @@ -1145,7 +1146,7 @@ BEGIN fifo_toaes_din <= '0' & -- !iskey '0' & -- keylen, ignored - '1' & -- encdec, enc for now + (NOT REGISTERS(dma_ctrl_idx)(DMA_CTRL_DEC_IDX)) & -- encdec '0' & -- cbc '0' & -- internal cbc x"00000000000000000000000000000000" &