Date: Tue, 28 Apr 2020 00:44:05 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r360419 - in projects/nfs-over-tls/sys: amd64/amd64 arm64/arm64 arm64/rockchip bsm cam/ata cam/nvme cam/scsi cddl/contrib/opensolaris/uts/common/fs/zfs compat/freebsd32 conf crypto/ccp ... Message-ID: <202004280044.03S0i5PR013992@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Tue Apr 28 00:44:05 2020 New Revision: 360419 URL: https://svnweb.freebsd.org/changeset/base/360419 Log: Merge in an up to date kernel from head. Deleted: projects/nfs-over-tls/sys/riscv/conf/GENERICSF Modified: projects/nfs-over-tls/sys/amd64/amd64/minidump_machdep.c projects/nfs-over-tls/sys/arm64/arm64/minidump_machdep.c projects/nfs-over-tls/sys/arm64/rockchip/rk805.c projects/nfs-over-tls/sys/arm64/rockchip/rk_pinctrl.c projects/nfs-over-tls/sys/arm64/rockchip/rk_tsadc.c projects/nfs-over-tls/sys/bsm/audit_kevents.h projects/nfs-over-tls/sys/cam/ata/ata_da.c projects/nfs-over-tls/sys/cam/nvme/nvme_da.c projects/nfs-over-tls/sys/cam/scsi/scsi_da.c projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c projects/nfs-over-tls/sys/compat/freebsd32/freebsd32_sysent.c projects/nfs-over-tls/sys/compat/freebsd32/syscalls.master projects/nfs-over-tls/sys/conf/Makefile.riscv projects/nfs-over-tls/sys/conf/kern.mk projects/nfs-over-tls/sys/crypto/ccp/ccp.c projects/nfs-over-tls/sys/dev/acpica/acpi_ec.c projects/nfs-over-tls/sys/dev/acpica/acpi_video.c projects/nfs-over-tls/sys/dev/atkbdc/psm.c projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tom.c projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tom.h projects/nfs-over-tls/sys/dev/hwpmc/hwpmc_intel.c projects/nfs-over-tls/sys/dev/ichiic/ig4_acpi.c projects/nfs-over-tls/sys/dev/ichiic/ig4_pci.c projects/nfs-over-tls/sys/dev/iicbus/acpi_iicbus.c projects/nfs-over-tls/sys/dev/iscsi_initiator/isc_subr.c projects/nfs-over-tls/sys/dev/iwm/if_iwm.c projects/nfs-over-tls/sys/dev/mlx5/mlx5_en/en.h projects/nfs-over-tls/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c projects/nfs-over-tls/sys/dev/mlx5/mlx5_en/mlx5_en_main.c projects/nfs-over-tls/sys/dev/mlx5/mlx5_ifc.h projects/nfs-over-tls/sys/dev/pci/pci_host_generic_fdt.c projects/nfs-over-tls/sys/dev/sound/pci/hda/hdac.c projects/nfs-over-tls/sys/fs/fifofs/fifo_vnops.c projects/nfs-over-tls/sys/fs/nfs/nfs_commonsubs.c projects/nfs-over-tls/sys/fs/nfs/nfskpiport.h projects/nfs-over-tls/sys/fs/nfsserver/nfs_nfsdport.c projects/nfs-over-tls/sys/geom/geom.h projects/nfs-over-tls/sys/i386/i386/minidump_machdep_base.c projects/nfs-over-tls/sys/kern/init_sysent.c projects/nfs-over-tls/sys/kern/kern_descrip.c projects/nfs-over-tls/sys/kern/kern_mib.c projects/nfs-over-tls/sys/kern/kern_shutdown.c projects/nfs-over-tls/sys/kern/kern_thread.c projects/nfs-over-tls/sys/kern/sys_pipe.c projects/nfs-over-tls/sys/kern/syscalls.master projects/nfs-over-tls/sys/kern/uipc_ktls.c projects/nfs-over-tls/sys/kern/uipc_socket.c projects/nfs-over-tls/sys/kern/vfs_mountroot.c projects/nfs-over-tls/sys/mips/mips/pmap.c projects/nfs-over-tls/sys/net/debugnet.c projects/nfs-over-tls/sys/net/if_bridge.c projects/nfs-over-tls/sys/net/ifdi_if.m projects/nfs-over-tls/sys/net/iflib.c projects/nfs-over-tls/sys/net/iflib.h projects/nfs-over-tls/sys/net/radix_mpath.c projects/nfs-over-tls/sys/net/route.c projects/nfs-over-tls/sys/net/route.h projects/nfs-over-tls/sys/net/route_var.h projects/nfs-over-tls/sys/net/rtsock.c projects/nfs-over-tls/sys/net80211/ieee80211_mesh.c projects/nfs-over-tls/sys/netgraph/ng_eiface.c projects/nfs-over-tls/sys/netinet/in_fib.c projects/nfs-over-tls/sys/netinet/in_fib.h projects/nfs-over-tls/sys/netinet/ip_input.c projects/nfs-over-tls/sys/netinet/ip_output.c projects/nfs-over-tls/sys/netinet/sctp_asconf.c projects/nfs-over-tls/sys/netinet/sctp_os_bsd.h projects/nfs-over-tls/sys/netinet/sctp_output.c projects/nfs-over-tls/sys/netinet/sctp_pcb.c projects/nfs-over-tls/sys/netinet/sctp_structs.h projects/nfs-over-tls/sys/netinet/sctp_timer.c projects/nfs-over-tls/sys/netinet/sctp_var.h projects/nfs-over-tls/sys/netinet/tcp.h projects/nfs-over-tls/sys/netinet/tcp_log_buf.h projects/nfs-over-tls/sys/netinet/tcp_offload.c projects/nfs-over-tls/sys/netinet/tcp_offload.h projects/nfs-over-tls/sys/netinet/tcp_output.c projects/nfs-over-tls/sys/netinet/tcp_stacks/bbr.c projects/nfs-over-tls/sys/netinet/tcp_stacks/rack.c projects/nfs-over-tls/sys/netinet/tcp_subr.c projects/nfs-over-tls/sys/netinet/tcp_usrreq.c projects/nfs-over-tls/sys/netinet/tcp_var.h projects/nfs-over-tls/sys/netinet/toecore.c projects/nfs-over-tls/sys/netinet/toecore.h projects/nfs-over-tls/sys/netinet/udp_usrreq.c projects/nfs-over-tls/sys/netinet6/in6.h projects/nfs-over-tls/sys/netinet6/in6_fib.c projects/nfs-over-tls/sys/netinet6/in6_fib.h projects/nfs-over-tls/sys/netinet6/in6_pcb.c projects/nfs-over-tls/sys/netinet6/in6_src.c projects/nfs-over-tls/sys/netinet6/ip6_output.c projects/nfs-over-tls/sys/netinet6/ip6_var.h projects/nfs-over-tls/sys/netinet6/nd6.c projects/nfs-over-tls/sys/netinet6/nd6.h projects/nfs-over-tls/sys/netinet6/nd6_rtr.c projects/nfs-over-tls/sys/netpfil/pf/pf_ioctl.c projects/nfs-over-tls/sys/netpfil/pf/pf_norm.c projects/nfs-over-tls/sys/nlm/nlm_prot_impl.c projects/nfs-over-tls/sys/powerpc/powerpc/minidump_machdep.c projects/nfs-over-tls/sys/riscv/include/param.h projects/nfs-over-tls/sys/riscv/riscv/elf_machdep.c projects/nfs-over-tls/sys/sys/filedesc.h projects/nfs-over-tls/sys/sys/kdb.h projects/nfs-over-tls/sys/sys/ktls.h projects/nfs-over-tls/sys/sys/param.h projects/nfs-over-tls/sys/sys/proc.h projects/nfs-over-tls/sys/sys/sysent.h projects/nfs-over-tls/sys/sys/sysproto.h projects/nfs-over-tls/sys/vm/vm_extern.h projects/nfs-over-tls/sys/vm/vm_glue.c projects/nfs-over-tls/sys/vm/vm_kern.h projects/nfs-over-tls/sys/vm/vm_swapout.c projects/nfs-over-tls/sys/x86/x86/cpu_machdep.c Directory Properties: projects/nfs-over-tls/sys/ (props changed) projects/nfs-over-tls/sys/cddl/contrib/opensolaris/ (props changed) Modified: projects/nfs-over-tls/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- projects/nfs-over-tls/sys/amd64/amd64/minidump_machdep.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/amd64/amd64/minidump_machdep.c Tue Apr 28 00:44:05 2020 (r360419) @@ -409,7 +409,6 @@ minidumpsys(struct dumperinfo *di) } /* Dump memory chunks */ - /* XXX cluster it up and use blk_dump() */ for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { bits = vm_page_dump[i]; while (bits) { Modified: projects/nfs-over-tls/sys/arm64/arm64/minidump_machdep.c ============================================================================== --- projects/nfs-over-tls/sys/arm64/arm64/minidump_machdep.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/arm64/arm64/minidump_machdep.c Tue Apr 28 00:44:05 2020 (r360419) @@ -34,8 +34,6 @@ __FBSDID("$FreeBSD$"); #include "opt_watchdog.h" -#include "opt_watchdog.h" - #include <sys/param.h> #include <sys/systm.h> #include <sys/conf.h> @@ -68,7 +66,7 @@ static size_t fragsz; static void *dump_va; static size_t counter, progress, dumpsize; -static uint64_t tmpbuffer[PAGE_SIZE / sizeof(uint64_t)]; +static uint64_t tmpbuffer[Ln_ENTRIES]; CTASSERT(sizeof(*vm_page_dump) == 8); @@ -210,16 +208,14 @@ blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t int minidumpsys(struct dumperinfo *di) { + struct minidumphdr mdhdr; pd_entry_t *l0, *l1, *l2; pt_entry_t *l3; - uint32_t pmapsize; vm_offset_t va; vm_paddr_t pa; - int error; uint64_t bits; - int i, bit; - int retry_count; - struct minidumphdr mdhdr; + uint32_t pmapsize; + int bit, error, i, j, retry_count; retry_count = 0; retry: @@ -231,11 +227,15 @@ minidumpsys(struct dumperinfo *di) if (!pmap_get_tables(pmap_kernel(), va, &l0, &l1, &l2, &l3)) continue; - /* We should always be using the l2 table for kvm */ - if (l2 == NULL) - continue; - - if ((*l2 & ATTR_DESCR_MASK) == L2_BLOCK) { + if ((*l1 & ATTR_DESCR_MASK) == L1_BLOCK) { + pa = *l1 & ~ATTR_MASK; + for (i = 0; i < Ln_ENTRIES * Ln_ENTRIES; + i++, pa += PAGE_SIZE) + if (is_dumpable(pa)) + dump_add_page(pa); + pmapsize += (Ln_ENTRIES - 1) * PAGE_SIZE; + va += L1_SIZE - L2_SIZE; + } else if ((*l2 & ATTR_DESCR_MASK) == L2_BLOCK) { pa = *l2 & ~ATTR_MASK; for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) { if (is_dumpable(pa)) @@ -327,25 +327,31 @@ minidumpsys(struct dumperinfo *di) error = blk_flush(di); if (error) goto fail; - } else if (l2 == NULL) { + } else if ((*l1 & ATTR_DESCR_MASK) == L1_BLOCK) { + /* + * Handle a 1GB block mapping: write out 512 fake L2 + * pages. + */ pa = (*l1 & ~ATTR_MASK) | (va & L1_OFFSET); - /* Generate fake l3 entries based upon the l1 entry */ for (i = 0; i < Ln_ENTRIES; i++) { - tmpbuffer[i] = pa + (i * PAGE_SIZE) | - ATTR_DEFAULT | L3_PAGE; + for (j = 0; j < Ln_ENTRIES; j++) { + tmpbuffer[j] = pa + i * L2_SIZE + + j * PAGE_SIZE | ATTR_DEFAULT | + L3_PAGE; + } + error = blk_write(di, (char *)&tmpbuffer, 0, + PAGE_SIZE); + if (error) + goto fail; } - /* We always write a page, even if it is zero */ - error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE); - if (error) - goto fail; /* flush, in case we reuse tmpbuffer in the same block*/ error = blk_flush(di); if (error) goto fail; bzero(&tmpbuffer, sizeof(tmpbuffer)); + va += L1_SIZE - L2_SIZE; } else if ((*l2 & ATTR_DESCR_MASK) == L2_BLOCK) { - /* TODO: Handle an invalid L2 entry */ pa = (*l2 & ~ATTR_MASK) | (va & L2_OFFSET); /* Generate fake l3 entries based upon the l1 entry */ @@ -353,7 +359,6 @@ minidumpsys(struct dumperinfo *di) tmpbuffer[i] = pa + (i * PAGE_SIZE) | ATTR_DEFAULT | L3_PAGE; } - /* We always write a page, even if it is zero */ error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE); if (error) goto fail; @@ -366,7 +371,6 @@ minidumpsys(struct dumperinfo *di) } else { pa = *l2 & ~ATTR_MASK; - /* We always write a page, even if it is zero */ error = blk_write(di, NULL, pa, PAGE_SIZE); if (error) goto fail; @@ -374,7 +378,6 @@ minidumpsys(struct dumperinfo *di) } /* Dump memory chunks */ - /* XXX cluster it up and use blk_dump() */ for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { bits = vm_page_dump[i]; while (bits) { Modified: projects/nfs-over-tls/sys/arm64/rockchip/rk805.c ============================================================================== --- projects/nfs-over-tls/sys/arm64/rockchip/rk805.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/arm64/rockchip/rk805.c Tue Apr 28 00:44:05 2020 (r360419) @@ -85,6 +85,11 @@ struct rk805_reg_sc { struct regnode_std_param *param; }; +struct reg_list { + TAILQ_ENTRY(reg_list) next; + struct rk805_reg_sc *reg; +}; + struct rk805_softc { device_t dev; struct mtx mtx; @@ -93,7 +98,7 @@ struct rk805_softc { struct intr_config_hook intr_hook; enum rk_pmic_type type; - struct rk805_reg_sc **regs; + TAILQ_HEAD(, reg_list) regs; int nregs; }; @@ -619,6 +624,7 @@ rk805_attach(device_t dev) struct rk805_softc *sc; struct rk805_reg_sc *reg; struct rk805_regdef *regdefs; + struct reg_list *regp; phandle_t rnode, child; int i; @@ -645,8 +651,7 @@ rk805_attach(device_t dev) return (ENXIO); } - sc->regs = malloc(sizeof(struct rk805_reg_sc *) * sc->nregs, - M_RK805_REG, M_WAITOK | M_ZERO); + TAILQ_INIT(&sc->regs); rnode = ofw_bus_find_child(ofw_bus_get_node(dev), "regulators"); if (rnode > 0) { @@ -655,6 +660,8 @@ rk805_attach(device_t dev) regdefs[i].name); if (child == 0) continue; + if (OF_hasprop(child, "regulator-name") != 1) + continue; reg = rk805_reg_attach(dev, child, ®defs[i]); if (reg == NULL) { device_printf(dev, @@ -662,7 +669,9 @@ rk805_attach(device_t dev) regdefs[i].name); continue; } - sc->regs[i] = reg; + regp = malloc(sizeof(*regp), M_DEVBUF, M_WAITOK | M_ZERO); + regp->reg = reg; + TAILQ_INSERT_TAIL(&sc->regs, regp, next); if (bootverbose) device_printf(dev, "Regulator %s attached\n", regdefs[i].name); @@ -685,13 +694,13 @@ rk805_map(device_t dev, phandle_t xref, int ncells, pcell_t *cells, intptr_t *id) { struct rk805_softc *sc; - int i; + struct reg_list *regp; sc = device_get_softc(dev); - for (i = 0; i < sc->nregs; i++) { - if (sc->regs[i]->xref == xref) { - *id = sc->regs[i]->def->id; + TAILQ_FOREACH(regp, &sc->regs, next) { + if (regp->reg->xref == xref) { + *id = regp->reg->def->id; return (0); } } Modified: projects/nfs-over-tls/sys/arm64/rockchip/rk_pinctrl.c ============================================================================== --- projects/nfs-over-tls/sys/arm64/rockchip/rk_pinctrl.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/arm64/rockchip/rk_pinctrl.c Tue Apr 28 00:44:05 2020 (r360419) @@ -932,7 +932,28 @@ rk_pinctrl_configure_pin(struct rk_pinctrl_softc *sc, /* Find syscon */ syscon = sc->conf->get_syscon(sc, bank); - /* Parse pin function */ + /* Setup GPIO properties first */ + rv = rk_pinctrl_handle_io(sc, pin_conf, bank, pin); + + /* Then pin pull-up/down */ + bias = sc->conf->parse_bias(pin_conf, bank); + if (bias >= 0) { + reg = sc->conf->get_pd_offset(sc, bank); + reg += bank * 0x10 + ((pin / 8) * 0x4); + bit = (pin % 8) * 2; + mask = (0x3 << bit); + SYSCON_MODIFY_4(syscon, reg, mask, bias << bit | (mask << 16)); + } + + /* Then drive strength */ + rv = rk_pinctrl_parse_drive(sc, pin_conf, bank, subbank, &drive, ®); + if (rv == 0) { + bit = (pin % 8) * 2; + mask = (0x3 << bit); + SYSCON_MODIFY_4(syscon, reg, mask, drive << bit | (mask << 16)); + } + + /* Finally set the pin function */ reg = sc->conf->iomux_conf[i].offset; switch (sc->conf->iomux_conf[i].nbits) { case 4: @@ -966,28 +987,6 @@ rk_pinctrl_configure_pin(struct rk_pinctrl_softc *sc, * without hi-word write mask. */ SYSCON_MODIFY_4(syscon, reg, mask, function << bit | (mask << 16)); - - /* Pull-Up/Down */ - bias = sc->conf->parse_bias(pin_conf, bank); - if (bias >= 0) { - reg = sc->conf->get_pd_offset(sc, bank); - - reg += bank * 0x10 + ((pin / 8) * 0x4); - bit = (pin % 8) * 2; - mask = (0x3 << bit); - SYSCON_MODIFY_4(syscon, reg, mask, bias << bit | (mask << 16)); - } - - /* Drive Strength */ - rv = rk_pinctrl_parse_drive(sc, pin_conf, bank, subbank, &drive, ®); - if (rv == 0) { - bit = (pin % 8) * 2; - mask = (0x3 << bit); - SYSCON_MODIFY_4(syscon, reg, mask, drive << bit | (mask << 16)); - } - - /* Input/Outpot + default level */ - rv = rk_pinctrl_handle_io(sc, pin_conf, bank, pin); } static int Modified: projects/nfs-over-tls/sys/arm64/rockchip/rk_tsadc.c ============================================================================== --- projects/nfs-over-tls/sys/arm64/rockchip/rk_tsadc.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/arm64/rockchip/rk_tsadc.c Tue Apr 28 00:44:05 2020 (r360419) @@ -98,24 +98,19 @@ struct tsensor { int channel; }; -enum tsadc_type { - RK_TSADC_V2, - RK_TSADC_V3 -}; - struct rk_calib_entry { uint32_t raw; int temp; }; struct tsadc_calib_info { - bool decrement_mode; struct rk_calib_entry *table; int nentries; }; struct tsadc_conf { - enum tsadc_type type; + int use_syscon; + int q_sel_ntc; int shutdown_temp; int shutdown_mode; int shutdown_pol; @@ -188,7 +183,8 @@ struct tsensor rk3288_tsensors[] = { }; struct tsadc_conf rk3288_tsadc_conf = { - .type = RK_TSADC_V2, + .use_syscon = 0, + .q_sel_ntc = 0, .shutdown_temp = 95000, .shutdown_mode = 1, /* GPIO */ .shutdown_pol = 0, /* Low */ @@ -241,7 +237,8 @@ static struct tsensor rk3328_tsensors[] = { }; static struct tsadc_conf rk3328_tsadc_conf = { - .type = RK_TSADC_V3, + .use_syscon = 0, + .q_sel_ntc = 1, .shutdown_temp = 95000, .shutdown_mode = 0, /* CRU */ .shutdown_pol = 0, /* Low */ @@ -296,7 +293,8 @@ static struct tsensor rk3399_tsensors[] = { }; static struct tsadc_conf rk3399_tsadc_conf = { - .type = RK_TSADC_V3, + .use_syscon = 1, + .q_sel_ntc = 1, .shutdown_temp = 95000, .shutdown_mode = 1, /* GPIO */ .shutdown_pol = 0, /* Low */ @@ -444,11 +442,11 @@ tsadc_init(struct tsadc_softc *sc) val |= TSADC_AUTO_CON_POL_HI; else val &= ~TSADC_AUTO_CON_POL_HI; - if (sc->conf->type == RK_TSADC_V3) + if (sc->conf->q_sel_ntc) val |= TSADC_AUTO_Q_SEL; WR4(sc, TSADC_AUTO_CON, val); - if (sc->conf->type == RK_TSADC_V2) { + if (!sc->conf->use_syscon) { /* V2 init */ WR4(sc, TSADC_AUTO_PERIOD, 250); /* 250 ms */ WR4(sc, TSADC_AUTO_PERIOD_HT, 50); /* 50 ms */ Modified: projects/nfs-over-tls/sys/bsm/audit_kevents.h ============================================================================== --- projects/nfs-over-tls/sys/bsm/audit_kevents.h Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/bsm/audit_kevents.h Tue Apr 28 00:44:05 2020 (r360419) @@ -658,6 +658,7 @@ #define AUE_EXECVEAT 43262 /* FreeBSD/Linux. */ #define AUE_SHMRENAME 43263 /* FreeBSD-specific. */ #define AUE_REALPATHAT 43264 /* FreeBSD-specific. */ +#define AUE_CLOSERANGE 43265 /* FreeBSD-specific. */ /* * Darwin BSM uses a number of AUE_O_* definitions, which are aliased to the Modified: projects/nfs-over-tls/sys/cam/ata/ata_da.c ============================================================================== --- projects/nfs-over-tls/sys/cam/ata/ata_da.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/cam/ata/ata_da.c Tue Apr 28 00:44:05 2020 (r360419) @@ -109,8 +109,37 @@ typedef enum { ADA_FLAG_ANNOUNCED = 0x00100000, ADA_FLAG_DIRTY = 0x00200000, ADA_FLAG_CAN_NCQ_TRIM = 0x00400000, /* CAN_TRIM also set */ - ADA_FLAG_PIM_ATA_EXT = 0x00800000 + ADA_FLAG_PIM_ATA_EXT = 0x00800000, + ADA_FLAG_UNMAPPEDIO = 0x01000000, + ADA_FLAG_ROTATING = 0x02000000 } ada_flags; +#define ADA_FLAG_STRING \ + "\020" \ + "\002CAN_48BIT" \ + "\003CAN_FLUSHCACHE" \ + "\004CAN_NCQ" \ + "\005CAN_DMA" \ + "\006NEED_OTAG" \ + "\007WAS_OTAG" \ + "\010CAN_TRIM" \ + "\011OPEN" \ + "\012SCTX_INIT" \ + "\013CAN_CFA" \ + "\014CAN_POWERMGT" \ + "\015CAN_DMA48" \ + "\016CAN_LOG" \ + "\017CAN_IDLOG" \ + "\020CAN_SUPCAP" \ + "\021CAN_ZONE" \ + "\022CAN_WCACHE" \ + "\023CAN_RAHEAD" \ + "\024PROBED" \ + "\025ANNOUNCED" \ + "\026DIRTY" \ + "\027CAN_NCQ_TRIM" \ + "\030PIM_ATA_EXT" \ + "\031UNMAPPEDIO" \ + "\032ROTATING" typedef enum { ADA_Q_NONE = 0x00, @@ -239,8 +268,6 @@ struct ada_softc { int trim_max_ranges; int read_ahead; int write_cache; - int unmappedio; - int rotating; #ifdef CAM_TEST_FAILURE int force_read_error; int force_write_error; @@ -806,8 +833,10 @@ static periph_oninv_t adaoninvalidate; static periph_dtor_t adacleanup; static void adaasync(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg); -static int adazonemodesysctl(SYSCTL_HANDLER_ARGS); +static int adabitsysctl(SYSCTL_HANDLER_ARGS); +static int adaflagssysctl(SYSCTL_HANDLER_ARGS); static int adazonesupsysctl(SYSCTL_HANDLER_ARGS); +static int adazonesupsysctl(SYSCTL_HANDLER_ARGS); static void adasysctlinit(void *context, int pending); static int adagetattr(struct bio *bp); static void adasetflags(struct ada_softc *softc, @@ -1488,12 +1517,6 @@ adasysctlinit(void *context, int pending) SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "write_cache", CTLFLAG_RW | CTLFLAG_MPSAFE, &softc->write_cache, 0, "Enable disk write cache."); - SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), - OID_AUTO, "unmapped_io", CTLFLAG_RD | CTLFLAG_MPSAFE, - &softc->unmappedio, 0, "Unmapped I/O leaf"); - SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), - OID_AUTO, "rotating", CTLFLAG_RD | CTLFLAG_MPSAFE, - &softc->rotating, 0, "Rotating media"); SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "zone_mode", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, @@ -1518,6 +1541,18 @@ adasysctlinit(void *context, int pending) SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "max_seq_zones", CTLFLAG_RD, &softc->max_seq_zones, "Maximum Number of Open Sequential Write Required Zones"); + SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), + OID_AUTO, "flags", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, + softc, 0, adaflagssysctl, "A", + "Flags for drive"); + SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), + OID_AUTO, "unmapped_io", CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, + &softc->flags, (u_int)ADA_FLAG_UNMAPPEDIO, adabitsysctl, "I", + "Unmapped I/O support *DEPRECATED* gone in FreeBSD 14"); + SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), + OID_AUTO, "rotating", CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, + &softc->flags, (u_int)ADA_FLAG_ROTATING, adabitsysctl, "I", + "Rotating media *DEPRECATED* gone in FreeBSD 14"); #ifdef CAM_TEST_FAILURE /* @@ -1626,6 +1661,39 @@ adadeletemethodsysctl(SYSCTL_HANDLER_ARGS) return (EINVAL); } +static int +adabitsysctl(SYSCTL_HANDLER_ARGS) +{ + u_int *flags = arg1; + u_int test = arg2; + int tmpout, error; + + tmpout = !!(*flags & test); + error = SYSCTL_OUT(req, &tmpout, sizeof(tmpout)); + if (error || !req->newptr) + return (error); + + return (EPERM); +} + +static int +adaflagssysctl(SYSCTL_HANDLER_ARGS) +{ + struct sbuf sbuf; + struct ada_softc *softc = arg1; + int error; + + sbuf_new_for_sysctl(&sbuf, NULL, 0, req); + if (softc->flags != 0) + sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, ADA_FLAG_STRING); + else + sbuf_printf(&sbuf, "0"); + error = sbuf_finish(&sbuf); + sbuf_delete(&sbuf); + + return (error); +} + static void adasetflags(struct ada_softc *softc, struct ccb_getdev *cgd) { @@ -1807,11 +1875,12 @@ adaregister(struct cam_periph *periph, void *arg) /* Disable queue sorting for non-rotational media by default. */ if (cgd->ident_data.media_rotation_rate == ATA_RATE_NON_ROTATING) { - softc->rotating = 0; + softc->flags &= ~ADA_FLAG_ROTATING; } else { - softc->rotating = 1; + softc->flags |= ADA_FLAG_ROTATING; } - cam_iosched_set_sort_queue(softc->cam_iosched, softc->rotating ? -1 : 0); + cam_iosched_set_sort_queue(softc->cam_iosched, + (softc->flags & ADA_FLAG_ROTATING) ? -1 : 0); softc->disk = disk_alloc(); adasetgeom(softc, cgd); softc->disk->d_devstat = devstat_new_entry(periph->periph_name, @@ -3411,7 +3480,7 @@ adasetgeom(struct ada_softc *softc, struct ccb_getdev softc->disk->d_delmaxsize = maxio; if ((softc->cpi.hba_misc & PIM_UNMAPPED) != 0) { d_flags |= DISKFLAG_UNMAPPED_BIO; - softc->unmappedio = 1; + softc->flags |= ADA_FLAG_UNMAPPEDIO; } softc->disk->d_flags = d_flags; strlcpy(softc->disk->d_descr, cgd->ident_data.model, Modified: projects/nfs-over-tls/sys/cam/nvme/nvme_da.c ============================================================================== --- projects/nfs-over-tls/sys/cam/nvme/nvme_da.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/cam/nvme/nvme_da.c Tue Apr 28 00:44:05 2020 (r360419) @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$"); #include <sys/cons.h> #include <sys/proc.h> #include <sys/reboot.h> +#include <sys/sbuf.h> #include <geom/geom.h> #include <geom/geom_disk.h> #endif /* _KERNEL */ @@ -75,6 +76,11 @@ typedef enum { NDA_FLAG_DIRTY = 0x0002, NDA_FLAG_SCTX_INIT = 0x0004, } nda_flags; +#define NDA_FLAG_STRING \ + "\020" \ + "\001OPEN" \ + "\002DIRTY" \ + "\003SCTX_INIT" typedef enum { NDA_Q_4K = 0x01, @@ -144,6 +150,7 @@ static periph_init_t ndainit; static void ndaasync(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg); static void ndasysctlinit(void *context, int pending); +static int ndaflagssysctl(SYSCTL_HANDLER_ARGS); static periph_ctor_t ndaregister; static periph_dtor_t ndacleanup; static periph_start_t ndastart; @@ -659,6 +666,11 @@ ndasysctlinit(void *context, int pending) OID_AUTO, "rotating", CTLFLAG_RD, &nda_rotating_media, 1, "Rotating media"); + SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), + OID_AUTO, "flags", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, + softc, 0, ndaflagssysctl, "A", + "Flags for drive"); + #ifdef CAM_IO_STATS softc->sysctl_stats_tree = SYSCTL_ADD_NODE(&softc->sysctl_stats_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "stats", @@ -696,6 +708,24 @@ ndasysctlinit(void *context, int pending) softc->sysctl_tree); cam_periph_release(periph); +} + +static int +ndaflagssysctl(SYSCTL_HANDLER_ARGS) +{ + struct sbuf sbuf; + struct nda_softc *softc = arg1; + int error; + + sbuf_new_for_sysctl(&sbuf, NULL, 0, req); + if (softc->flags != 0) + sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, NDA_FLAG_STRING); + else + sbuf_printf(&sbuf, "0"); + error = sbuf_finish(&sbuf); + sbuf_delete(&sbuf); + + return (error); } static int Modified: projects/nfs-over-tls/sys/cam/scsi/scsi_da.c ============================================================================== --- projects/nfs-over-tls/sys/cam/scsi/scsi_da.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/cam/scsi/scsi_da.c Tue Apr 28 00:44:05 2020 (r360419) @@ -342,7 +342,7 @@ struct da_softc { LIST_HEAD(, ccb_hdr) pending_ccbs; int refcount; /* Active xpt_action() calls */ da_state state; - u_int flags; + da_flags flags; da_quirks quirks; int minimum_cmd_size; int error_inject; @@ -2646,7 +2646,7 @@ daflagssysctl(SYSCTL_HANDLER_ARGS) sbuf_new_for_sysctl(&sbuf, NULL, 0, req); if (softc->flags != 0) - sbuf_printf(&sbuf, "0x%b", softc->flags, DA_FLAG_STRING); + sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, DA_FLAG_STRING); else sbuf_printf(&sbuf, "0"); error = sbuf_finish(&sbuf); Modified: projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c ============================================================================== --- projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c Tue Apr 28 00:44:05 2020 (r360419) @@ -973,18 +973,22 @@ static void vdev_geom_close(vdev_t *vd) { struct g_consumer *cp; + int locked; cp = vd->vdev_tsd; DROP_GIANT(); - g_topology_lock(); + locked = g_topology_locked(); + if (!locked) + g_topology_lock(); if (!vd->vdev_reopening || (cp != NULL && ((cp->flags & G_CF_ORPHAN) != 0 || (cp->provider != NULL && cp->provider->error != 0)))) vdev_geom_close_locked(vd); - g_topology_unlock(); + if (!locked) + g_topology_unlock(); PICKUP_GIANT(); } Modified: projects/nfs-over-tls/sys/compat/freebsd32/freebsd32_sysent.c ============================================================================== --- projects/nfs-over-tls/sys/compat/freebsd32/freebsd32_sysent.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/compat/freebsd32/freebsd32_sysent.c Tue Apr 28 00:44:05 2020 (r360419) @@ -664,5 +664,5 @@ struct sysent freebsd32_sysent[] = { { AS(shm_rename_args), (sy_call_t *)sys_shm_rename, AUE_SHMRENAME, NULL, 0, 0, 0, SY_THR_STATIC }, /* 572 = shm_rename */ { AS(sigfastblock_args), (sy_call_t *)sys_sigfastblock, AUE_NULL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 573 = sigfastblock */ { AS(__realpathat_args), (sy_call_t *)sys___realpathat, AUE_REALPATHAT, NULL, 0, 0, 0, SY_THR_STATIC }, /* 574 = __realpathat */ - { AS(close_range_args), (sy_call_t *)sys_close_range, AUE_NULL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 575 = close_range */ + { AS(close_range_args), (sy_call_t *)sys_close_range, AUE_CLOSERANGE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 575 = close_range */ }; Modified: projects/nfs-over-tls/sys/compat/freebsd32/syscalls.master ============================================================================== --- projects/nfs-over-tls/sys/compat/freebsd32/syscalls.master Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/compat/freebsd32/syscalls.master Tue Apr 28 00:44:05 2020 (r360419) @@ -1162,7 +1162,7 @@ 573 AUE_NULL NOPROTO { int sigfastblock(int cmd, uint32_t *ptr); } 574 AUE_REALPATHAT NOPROTO { int __realpathat(int fd, const char *path, \ char *buf, size_t size, int flags); } -575 AUE_NULL NOPROTO { int close_range(u_int lowfd, u_int highfd, \ +575 AUE_CLOSERANGE NOPROTO { int close_range(u_int lowfd, u_int highfd, \ int flags); } ; vim: syntax=off Modified: projects/nfs-over-tls/sys/conf/Makefile.riscv ============================================================================== --- projects/nfs-over-tls/sys/conf/Makefile.riscv Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/conf/Makefile.riscv Tue Apr 28 00:44:05 2020 (r360419) @@ -19,7 +19,7 @@ # # Which version of config(8) is required. -%VERSREQ= 600017 +%VERSREQ= 600012 .if !defined(S) S= ../../.. Modified: projects/nfs-over-tls/sys/conf/kern.mk ============================================================================== --- projects/nfs-over-tls/sys/conf/kern.mk Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/conf/kern.mk Tue Apr 28 00:44:05 2020 (r360419) @@ -150,11 +150,7 @@ INLINE_LIMIT?= 8000 # code model as "medium" and "medany" respectively. # .if ${MACHINE_CPUARCH} == "riscv" -.if ${MACHINE_ARCH:Mriscv*sf} -CFLAGS+= -march=rv64imac -.else CFLAGS+= -march=rv64imafdc -.endif CFLAGS+= -mabi=lp64 CFLAGS.clang+= -mcmodel=medium CFLAGS.gcc+= -mcmodel=medany Modified: projects/nfs-over-tls/sys/crypto/ccp/ccp.c ============================================================================== --- projects/nfs-over-tls/sys/crypto/ccp/ccp.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/crypto/ccp/ccp.c Tue Apr 28 00:44:05 2020 (r360419) @@ -78,6 +78,7 @@ static struct pciid { } ccp_ids[] = { { 0x14561022, "AMD CCP-5a" }, { 0x14681022, "AMD CCP-5b" }, + { 0x15df1022, "AMD CCP-5a" }, }; static struct random_source random_ccp = { Modified: projects/nfs-over-tls/sys/dev/acpica/acpi_ec.c ============================================================================== --- projects/nfs-over-tls/sys/dev/acpica/acpi_ec.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/dev/acpica/acpi_ec.c Tue Apr 28 00:44:05 2020 (r360419) @@ -443,6 +443,8 @@ acpi_ec_probe(device_t dev) if (buf.Pointer) AcpiOsFree(buf.Pointer); + + ret = rc; out: if (ret <= 0) { snprintf(desc, sizeof(desc), "Embedded Controller: GPE %#x%s%s", Modified: projects/nfs-over-tls/sys/dev/acpica/acpi_video.c ============================================================================== --- projects/nfs-over-tls/sys/dev/acpica/acpi_video.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/dev/acpica/acpi_video.c Tue Apr 28 00:44:05 2020 (r360419) @@ -642,7 +642,10 @@ acpi_video_vo_destroy(struct acpi_video_output *vo) switch (vo->adr & DOD_DEVID_MASK) { case DOD_DEVID_MONITOR: - voqh = &crt_units; + if ((vo->adr & DOD_DEVID_MASK_FULL) == DOD_DEVID_LCD) + voqh = &lcd_units; + else + voqh = &crt_units; break; case DOD_DEVID_TV: voqh = &tv_units; Modified: projects/nfs-over-tls/sys/dev/atkbdc/psm.c ============================================================================== --- projects/nfs-over-tls/sys/dev/atkbdc/psm.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/dev/atkbdc/psm.c Tue Apr 28 00:44:05 2020 (r360419) @@ -3371,7 +3371,7 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, evdev_push_rel(sc->evdev_r, REL_X, *x); evdev_push_rel(sc->evdev_r, REL_Y, -*y); evdev_push_mouse_btn(sc->evdev_r, - guest_buttons); + guest_buttons | sc->extended_buttons); evdev_sync(sc->evdev_r); } #endif Modified: projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c ============================================================================== --- projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c Tue Apr 28 00:44:05 2020 (r360419) @@ -812,11 +812,11 @@ ktls_setup_keys(struct tlspcb *tlsp, const struct ktls if (tlsp->enc_mode == SCMD_CIPH_MODE_AES_GCM) { memcpy(khdr->txsalt, tls->params.iv, SALT_SIZE); t4_init_gmac_hash(tls->params.cipher_key, - tls->params.cipher_key_len * 8, + tls->params.cipher_key_len, (char *)key + tls->params.cipher_key_len); } else { t4_init_hmac_digest(axf, partial_digest_len, - tls->params.auth_key, tls->params.auth_key_len * 8, + tls->params.auth_key, tls->params.auth_key_len, (char *)key + tls->params.cipher_key_len); } Modified: projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c ============================================================================== --- projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c Tue Apr 28 00:06:49 2020 (r360418) +++ projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c Tue Apr 28 00:44:05 2020 (r360419) @@ -379,7 +379,7 @@ prepare_rxkey_wr(struct tls_keyctx *kwr, struct tls_ke int proto_ver = kctx->proto_ver; kwr->u.rxhdr.flitcnt_hmacctrl = - ((kctx->tx_key_info_size >> 4) << 3) | kctx->hmac_ctrl; + ((kctx->rx_key_info_size >> 4) << 3) | kctx->hmac_ctrl; kwr->u.rxhdr.protover_ciphmode = V_TLS_KEYCTX_TX_WR_PROTOVER(get_proto_ver(proto_ver)) | @@ -408,7 +408,7 @@ prepare_rxkey_wr(struct tls_keyctx *kwr, struct tls_ke (IPAD_SIZE + OPAD_SIZE)); } else { memcpy(kwr->keys.edkey, kctx->rx.key, - (kctx->tx_key_info_size - SALT_SIZE)); + (kctx->rx_key_info_size - SALT_SIZE)); memcpy(kwr->u.rxhdr.rxsalt, kctx->rx.salt, SALT_SIZE); } } @@ -674,6 +674,13 @@ program_key_context(struct tcpcb *tp, struct toepcb *t if ((G_KEY_GET_LOC(k_ctx->l_p_key) == KEY_WRITE_RX) || (tls_ofld->key_location == TLS_SFO_WR_CONTEXTLOC_DDR)) { + + /* + * XXX: The userland library sets tx_key_info_size, not + * rx_key_info_size. + */ + k_ctx->rx_key_info_size = k_ctx->tx_key_info_size; + error = tls_program_key_id(toep, k_ctx); if (error) { /* XXX: Only clear quiesce for KEY_WRITE_RX? */ @@ -866,31 +873,37 @@ t4_ctloutput_tls(struct socket *so, struct sockopt *so #ifdef KERN_TLS static void -init_ktls_key_context(struct ktls_session *tls, struct tls_key_context *k_ctx) +init_ktls_key_context(struct ktls_session *tls, struct tls_key_context *k_ctx, + int direction) { struct auth_hash *axf; - u_int mac_key_size; - char *hash; + u_int key_info_size, mac_key_size; + char *hash, *key; - k_ctx->l_p_key = V_KEY_GET_LOC(KEY_WRITE_TX); - if (tls->params.tls_vminor == TLS_MINOR_VER_ONE) - k_ctx->proto_ver = SCMD_PROTO_VERSION_TLS_1_1; - else - k_ctx->proto_ver = SCMD_PROTO_VERSION_TLS_1_2; + k_ctx->l_p_key = V_KEY_GET_LOC(direction == KTLS_TX ? KEY_WRITE_TX : + KEY_WRITE_RX); + k_ctx->proto_ver = tls->params.tls_vmajor << 8 | tls->params.tls_vminor; k_ctx->cipher_secret_size = tls->params.cipher_key_len; - k_ctx->tx_key_info_size = sizeof(struct tx_keyctx_hdr) + + key_info_size = sizeof(struct tx_keyctx_hdr) + k_ctx->cipher_secret_size; - memcpy(k_ctx->tx.key, tls->params.cipher_key, - tls->params.cipher_key_len); - hash = k_ctx->tx.key + tls->params.cipher_key_len; + if (direction == KTLS_TX) + key = k_ctx->tx.key; + else + key = k_ctx->rx.key; + memcpy(key, tls->params.cipher_key, tls->params.cipher_key_len); + hash = key + tls->params.cipher_key_len; if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) { k_ctx->state.auth_mode = SCMD_AUTH_MODE_GHASH; k_ctx->state.enc_mode = SCMD_CIPH_MODE_AES_GCM; k_ctx->iv_size = 4; k_ctx->mac_first = 0; k_ctx->hmac_ctrl = SCMD_HMAC_CTRL_NOP; - k_ctx->tx_key_info_size += GMAC_BLOCK_LEN; - memcpy(k_ctx->tx.salt, tls->params.iv, SALT_SIZE); + key_info_size += GMAC_BLOCK_LEN; + k_ctx->mac_secret_size = 0; + if (direction == KTLS_TX) + memcpy(k_ctx->tx.salt, tls->params.iv, SALT_SIZE); + else + memcpy(k_ctx->rx.salt, tls->params.iv, SALT_SIZE); t4_init_gmac_hash(tls->params.cipher_key, tls->params.cipher_key_len, hash); } else { @@ -917,29 +930,38 @@ init_ktls_key_context(struct ktls_session *tls, struct k_ctx->iv_size = 8; /* for CBC, iv is 16B, unit of 2B */ k_ctx->mac_first = 1; k_ctx->hmac_ctrl = SCMD_HMAC_CTRL_NO_TRUNC; - k_ctx->tx_key_info_size += roundup2(mac_key_size, 16) * 2; + key_info_size += roundup2(mac_key_size, 16) * 2; k_ctx->mac_secret_size = mac_key_size; t4_init_hmac_digest(axf, mac_key_size, tls->params.auth_key, tls->params.auth_key_len, hash); } + if (direction == KTLS_TX) + k_ctx->tx_key_info_size = key_info_size; + else + k_ctx->rx_key_info_size = key_info_size; k_ctx->frag_size = tls->params.max_frame_len; k_ctx->iv_ctrl = 1; } int -tls_alloc_ktls(struct toepcb *toep, struct ktls_session *tls) +tls_alloc_ktls(struct toepcb *toep, struct ktls_session *tls, int direction) { + struct adapter *sc = td_adapter(toep->td); struct tls_key_context *k_ctx; - int error; + int error, key_offset; if (toep->tls.mode == TLS_MODE_TLSOM) return (EINVAL); if (!can_tls_offload(td_adapter(toep->td))) return (EINVAL); switch (ulp_mode(toep)) { + case ULP_MODE_TLS: + break; case ULP_MODE_NONE: case ULP_MODE_TCPDDP: + if (direction != KTLS_TX) + return (EINVAL); break; default: return (EINVAL); @@ -987,48 +1009,81 @@ tls_alloc_ktls(struct toepcb *toep, struct ktls_sessio tls->params.tls_vminor > TLS_MINOR_VER_TWO) return (EPROTONOSUPPORT); + /* Bail if we already have a key. */ + if (direction == KTLS_TX) { + if (toep->tls.tx_key_addr != -1) + return (EOPNOTSUPP); + } else { + if (toep->tls.rx_key_addr != -1) + return (EOPNOTSUPP); + } + /* * XXX: This assumes no key renegotation. If KTLS ever supports * that we will want to allocate TLS sessions dynamically rather * than as a static member of toep. */ k_ctx = &toep->tls.k_ctx; - init_ktls_key_context(tls, k_ctx); + init_ktls_key_context(tls, k_ctx, direction); - toep->tls.scmd0.seqno_numivs = - (V_SCMD_SEQ_NO_CTRL(3) | - V_SCMD_PROTO_VERSION(k_ctx->proto_ver) | - V_SCMD_ENC_DEC_CTRL(SCMD_ENCDECCTRL_ENCRYPT) | - V_SCMD_CIPH_AUTH_SEQ_CTRL((k_ctx->mac_first == 0)) | - V_SCMD_CIPH_MODE(k_ctx->state.enc_mode) | - V_SCMD_AUTH_MODE(k_ctx->state.auth_mode) | - V_SCMD_HMAC_CTRL(k_ctx->hmac_ctrl) | - V_SCMD_IV_SIZE(k_ctx->iv_size)); + error = tls_program_key_id(toep, k_ctx); + if (error) + return (error); - toep->tls.scmd0.ivgen_hdrlen = - (V_SCMD_IV_GEN_CTRL(k_ctx->iv_ctrl) | - V_SCMD_KEY_CTX_INLINE(0) | - V_SCMD_TLS_FRAG_ENABLE(1)); + if (direction == KTLS_TX) { + toep->tls.scmd0.seqno_numivs = + (V_SCMD_SEQ_NO_CTRL(3) | + V_SCMD_PROTO_VERSION(get_proto_ver(k_ctx->proto_ver)) | + V_SCMD_ENC_DEC_CTRL(SCMD_ENCDECCTRL_ENCRYPT) | + V_SCMD_CIPH_AUTH_SEQ_CTRL((k_ctx->mac_first == 0)) | + V_SCMD_CIPH_MODE(k_ctx->state.enc_mode) | + V_SCMD_AUTH_MODE(k_ctx->state.auth_mode) | + V_SCMD_HMAC_CTRL(k_ctx->hmac_ctrl) | + V_SCMD_IV_SIZE(k_ctx->iv_size)); - if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) - toep->tls.iv_len = 8; - else - toep->tls.iv_len = AES_BLOCK_LEN; + toep->tls.scmd0.ivgen_hdrlen = + (V_SCMD_IV_GEN_CTRL(k_ctx->iv_ctrl) | + V_SCMD_KEY_CTX_INLINE(0) | + V_SCMD_TLS_FRAG_ENABLE(1)); - toep->tls.mac_length = k_ctx->mac_secret_size; + if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) + toep->tls.iv_len = 8; + else + toep->tls.iv_len = AES_BLOCK_LEN; - toep->tls.tx_key_addr = -1; + toep->tls.mac_length = k_ctx->mac_secret_size; - error = tls_program_key_id(toep, k_ctx); - if (error) - return (error); + toep->tls.fcplenmax = get_tp_plen_max(&toep->tls); + toep->tls.expn_per_ulp = tls->params.tls_hlen + + tls->params.tls_tlen; + toep->tls.pdus_per_ulp = 1; + toep->tls.adjusted_plen = toep->tls.expn_per_ulp + + toep->tls.k_ctx.frag_size; + } else { + /* Stop timer on handshake completion */ + tls_stop_handshake_timer(toep); - toep->tls.fcplenmax = get_tp_plen_max(&toep->tls); - toep->tls.expn_per_ulp = tls->params.tls_hlen + tls->params.tls_tlen; - toep->tls.pdus_per_ulp = 1; - toep->tls.adjusted_plen = toep->tls.expn_per_ulp + - toep->tls.k_ctx.frag_size; + toep->flags &= ~TPF_FORCE_CREDITS; + /* + * RX key tags are an index into the key portion of MA + * memory stored as an offset from the base address in + * units of 64 bytes. + */ + key_offset = toep->tls.rx_key_addr - sc->vres.key.start; + t4_set_tls_keyid(toep, key_offset / 64); + t4_set_tls_tcb_field(toep, W_TCB_ULP_RAW, + V_TCB_ULP_RAW(M_TCB_ULP_RAW), + V_TCB_ULP_RAW((V_TF_TLS_KEY_SIZE(3) | + V_TF_TLS_CONTROL(1) | + V_TF_TLS_ACTIVE(1) | + V_TF_TLS_ENABLE(1)))); + t4_set_tls_tcb_field(toep, W_TCB_TLS_SEQ, + V_TCB_TLS_SEQ(M_TCB_TLS_SEQ), + V_TCB_TLS_SEQ(0)); + t4_clear_rx_quiesce(toep); + } + toep->tls.mode = TLS_MODE_KTLS; return (0); @@ -1671,7 +1726,7 @@ t4_push_ktls(struct adapter *sc, struct toepcb *toep, ("%s: flowc_wr not sent for tid %u.", __func__, toep->tid)); KASSERT(ulp_mode(toep) == ULP_MODE_NONE || - ulp_mode(toep) == ULP_MODE_TCPDDP, + ulp_mode(toep) == ULP_MODE_TCPDDP || ulp_mode(toep) == ULP_MODE_TLS, ("%s: ulp_mode %u for toep %p", __func__, ulp_mode(toep), toep)); KASSERT(tls_tx_key(toep), ("%s: TX key not set for toep %p", __func__, toep)); @@ -1956,6 +2011,10 @@ do_rx_tls_cmp(struct sge_iq *iq, const struct rss_head struct socket *so; struct sockbuf *sb; struct mbuf *tls_data; +#ifdef KERN_TLS + struct tls_get_record *tgr; + struct mbuf *control; +#endif int len, pdu_length, rx_credits; KASSERT(toep->tid == tid, ("%s: toep tid/atid mismatch", __func__)); @@ -1982,6 +2041,7 @@ do_rx_tls_cmp(struct sge_iq *iq, const struct rss_head pdu_length = G_CPL_RX_TLS_CMP_PDULENGTH(be32toh(cpl->pdulength_length)); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202004280044.03S0i5PR013992>