#!/usr/local/bin/cbsd
#v12.1.1
CIXARG=
CIXOPTARG="dst ver"
# apply_cbsd_patch apply_cbsd_vesa_fb apply_cbsd_9p_patch apply_cbsd_vxlan_patch apply_cbsd_lro_patch apply_cbsd_iov_patch apply_cbsd_bhyve_usb_passthru_patch"
MYDESC="Apply CBSD patch for FreeBSD source tree in $srcdir"
ADDHELP="

${H3_COLOR}Description${N0_COLOR}:

Apply CBSD patches ( optional extensions )

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}dst=${N0_COLOR}     - alternative dst dir;
 ${N2_COLOR}ver=${N0_COLOR}     - alternative source version;

${H3_COLOR}Examples${N0_COLOR}:

  # cbsd srcpatch
  # cbsd srcpatch bhyve_slow

${H3_COLOR}See also${N0_COLOR}:

 cbsd srcup --help
 cbsd sources --help
 cbsd bases --help
 cbsd buildworld --help

"

. ${subrdir}/nc.subr
. ${tools}
cixinit

readconf srcup.conf

patch_kmem110()
{
	local _dir="kmem-11.0"
	set +e
	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-kern-kern_jail.c patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm-drmP.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm2-drm_os_freebsd.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-sys-jail.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-sys-priv.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	set -e
}

patch_kmem111()
{
	local _dir="kmem-11.1"
	set +e
	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-kern-kern_jail.c patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm-drmP.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm2-drm_os_freebsd.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-sys-jail.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-sys-priv.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	set -e
}

patch_kmem120()
{
	local _dir="kmem-12.0"
	set +e

	if [ -f "${dst}/sys/kern/kern_jail.c" ]; then
		[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c > /dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-kern-kern_jail.c patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c
	fi

	if [ -f "${dst}/sys/dev/drm/drmP.h" ]; then
		[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h > /dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm-drmP.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h
	fi

	if [ -f "${dst}/sys/dev/drm2/drmP.h" ]; then
		[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h > /dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm2-drm_os_freebsd.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h
	fi

	if [ -f "${dst}/sys/sys/jail.h" ]; then
		[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h >/dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-sys-jail.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h
	fi

	if [ -f "${dst}/sys/sys/priv.h" ]; then
		[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h >/dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-sys-priv.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	fi

	if [ -f "${dst}/sys/dev/drm/drm_os_freebsd.h" ]; then
		[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drm_os_freebsd.h >/dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm-drm_os_freebsd.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drm_os_freebsd.h
	fi

	set -e
}

patch_kmem102()
{
	local _dir="kmem-10.2"
	set +e
	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-kern-kern_jail.c patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm-drmP.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-dev-drm2-drm_os_freebsd.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-sys-jail.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h >/dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-11x-sys-sys-priv.h patch for: ${N2_COLOR}allow_kmem${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	set -e
}

patch_vesa_fb()
{
	local _dir="bhyve-vesa-fb-13.0"
	set +e

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-13x-usr.sbin-bhyve-pci_fbuf.c" ] && cd ${dst}/usr.sbin/bhyve/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-13x-usr.sbin-bhyve-pci_fbuf.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-13x-usr.sbin-bhyve-pci_fbuf.c patch for: ${N2_COLOR}vesa_fb${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-13x-usr.sbin-bhyve-pci_fbuf.c
	set -e
}

patch_vxlan()
{
	local _dir
	set +e

	case "${ver}" in
		13*)
			_myver="13x"
			_dir="vxlan-13.0"
			;;
		14*)
			_myver="14x"
			_dir="vxlan-14.0"
			;;
		15*)
			_myver="15x"
			_dir="vxlan-15.0"
			;;
		*)
			${ECHO} "${N1_COLOR}vxlan patchset for ${N2_COLOR}${ver}${N1_COLOR} unsupported${N0_COLOR}"
			return 0
			;;
	esac

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-sys-net-if_vxlan.c" ] && cd ${dst}/sys/net && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-sys-net-if_vxlan.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-sys-net-if_vxlan.c patch for: ${N2_COLOR}vxlan${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-sys-net-if_vxlan.c
	set -e
}

patch_lro()
{
	local _dir
	set +e

	case "${ver}" in
		13*)
			_myver="13x"
			_dir="lro-13.0"
			;;
		14*)
			_myver="14x"
			_dir="lro-14.0"
			;;
		15*)
			_myver="15x"
			_dir="lro-15.0"
			;;
		*)
			${ECHO} "${N1_COLOR}lro patchset for ${N2_COLOR}${ver}${N1_COLOR} unsupported${N0_COLOR}"
			return 0
			;;
	esac

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-net_backends.c" ] && cd ${dst}/usr.sbin/bhyve && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-net_backends.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-usr-sbin-bhyve-net_backends.c patch for: ${N2_COLOR}lro${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-net_backends.c
	set -e
}

patch_iov()
{
	local _dir
	set +e

	case "${ver}" in
		13*)
			_myver="13x"
			_dir="iov-13.0"
			;;
		14*)
			_myver="14x"
			_dir="iov-14.0"
			;;
		15*)
			_myver="15x"
			_dir="iov-15.0"
			;;
		*)
			${ECHO} "${N1_COLOR}iov patchset for ${N2_COLOR}${ver}${N1_COLOR} unsupported${N0_COLOR}"
			return 0
			;;
	esac

	[ -r "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-block_if.h" ] && cd ${dst}/usr.sbin/bhyve && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-block_if.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-usr-sbin-bhyve-block_if.h patch for: ${N2_COLOR}iov${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-block_if.h
	[ -r "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-virtio.c" ] && cd ${dst}/usr.sbin/bhyve && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-virtio.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-usr-sbin-bhyve-virtio.c patch for: ${N2_COLOR}iov${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-virtio.c
	set -e
}

patch_bhyve_slow()
{
	local _dir
	set +e

	case "${ver}" in
		15*)
			_myver="15x"
			_dir="bhyve_slow-16.0"
			;;
		16*)
			_myver="16x"
			_dir="bhyve_slow-15.0"
			;;
		*)
			${ECHO} "${N1_COLOR}bhyve_slow patchset for ${N2_COLOR}${ver}${N1_COLOR} unsupported${N0_COLOR}"
			return 0
			;;
	esac

	[ -r "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-16x-sys-amd64-vmm-vmm.c" ] && cd ${dst}/sys/amd64/vmm && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-16x-sys-amd64-vmm-vmm.c > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-16x-sys-amd64-vmm-vmm.c patch for: ${N2_COLOR}bhyve_slow${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-16x-sys-amd64-vmm-vmm.c
	set -e
}

patch_9p()
{
	local _dir _myver=
	set +e

	if [ ! -r ${dst}/contrib/lib9p/Makefile ]; then
		# upstream here: https://github.com/freenas/lib9p
		${ECHO} "${N1_COLOR}clone https://github.com/cbsd/lib9p.git into ${N2_COLOR}${dst}/contrib/libp9${N0_COLOR}"
		git clone https://github.com/cbsd/lib9p.git ${dst}/contrib/lib9p
		/bin/rm -rf ${dst}/contrib/lib9p/.git
	fi

	case "${ver}" in
		12*)
			_myver="12x"
			_dir="p9-12.0"
			;;
		13*)
			_myver="13x"
			_dir="p9-13.0"
			;;
		*)
			${ECHO} "${N1_COLOR}9p patchset for ${N2_COLOR}${ver}${N1_COLOR} unsupported${N0_COLOR}"
			return 0
			;;
	esac

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-etc-mtree-BSD.include.dist" ] && cd ${dst}/etc/mtree/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-etc-mtree-BSD.include.dist > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-${_myver}-etc-mtree-BSD.include.dist patch for: ${N2_COLOR}p9${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-etc-mtree-BSD.include.dist

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-lib-Makefile" ] && cd ${dst}/lib/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-lib-Makefile > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-${_myver}-lib-Makefile patch for: ${N2_COLOR}p9${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-lib-Makefile

	[ ! -d ${dst}/lib/lib9p ] && mkdir -p ${dst}/lib/lib9p

	if [ ! -r ${dst}/lib/lib9p/Makefile ]; then
		cd ${dst}/lib/lib9p/
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-${_myver}-lib-lib9p-Makefile for: ${N2_COLOR}p9${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-lib-lib9p-Makefile
	fi

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-bsd.libnames.mk" ] && cd ${dst}/share/mk/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-bsd.libnames.mk > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-${_myver}-share-mk-bsd.libnames.mk patch for: ${N2_COLOR}p9${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-bsd.libnames.mk

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-src.libnames.mk" ] && cd ${dst}/share/mk/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-src.libnames.mk > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-${_myver}-share-mk-src.libnames.mk patch for: ${N2_COLOR}p9${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-src.libnames.mk

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-Makefile" ] && cd ${dst}/usr.sbin/bhyve/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-Makefile > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-${_myver}-usr.sbin-bhyve-Makefile patch for: ${N2_COLOR}p9${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-Makefile

	if [ ! -r ${dst}/usr.sbin/bhyve/pci_virtio_9p.c ]; then
		cd ${dst}/usr.sbin/bhyve
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-${_myver}-lib-lib9p-Makefile for: ${N2_COLOR}p9${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-pci_virtio_9p.c
	fi

	[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-virtio.h" ] && cd ${dst}/usr.sbin/bhyve/ && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-virtio.h > /dev/null 2>&1
	[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply patch-${_myver}-usr.sbin-bhyve-virtio.h patch for: ${N2_COLOR}p9${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-virtio.h

	set -e
}

##
patch_bhyve_usb_passthru()
{
	local _dir
	set +e

	case "${ver}" in
		14*)
			_myver="14x"
			_dir="bhyve-usb_passthru-14.0"
			;;
		15*)
			_myver="15x"
			_dir="bhyve-usb_passthru-15.0"
			;;
		*)
			${ECHO} "${N1_COLOR}bhyve_usb_passthru patchset for ${N2_COLOR}${ver}${N1_COLOR} unsupported${N0_COLOR}"
			return 0
			;;
	esac

	for i in patch-${_myver}-usr.sbin-bhyve-Makefile patch-${_myver}-usr.sbin-bhyve-Makefile.depend patch-${_myver}-usr.sbin-bhyve-pci_xhci.c patch-${_myver}-usr.sbin-bhyve-usb_emul.c patch-${_myver}-usr.sbin-bhyve-usb_emul.h patch-${_myver}-usr.sbin-bhyve-usb_mouse.c patch-${_myver}-usr.sbin-bhyve-usb_passthru.c; do
		[ -f "${CIX_DISTDIR}/upgrade/patch/${_dir}/${i}" ] && cd ${dst}/usr.sbin/bhyve && patch --check -N < ${CIX_DISTDIR}/upgrade/patch/${_dir}/${i} > /dev/null 2>&1
		[ $? -eq 0 ] && $ECHO "${N1_COLOR}apply ${i} patch for: ${N2_COLOR}bhyve_usb_passthru${N0_COLOR}" && patch < ${CIX_DISTDIR}/upgrade/patch/${_dir}/${i}
	done

	set -e
}

apply_cbsd_patchset()
{
	case "${ver}" in
		10.0)
			${ECHO} "${N1_COLOR}kmem patchset for ${N2_COLOR}${ver}${N1_COLOR} unsupported${N0_COLOR}"
			return 0
			;;
		10.1)
			${ECHO} "${N1_COLOR}kmem patchset for ${N2_COLOR}${ver}${N1_COLOR} unsupported${N0_COLOR}"
			return 0
			;;
		10.2)
			# support for FreeBSD 10.2+
			patch_kmem102
			;;
		10*)
			# support for FreeBSD 10.2+
			patch_kmem102
			;;
		11.0)
			patch_kmem110
			;;
		11.1)
			patch_kmem111
			;;
		12*)
			patch_kmem120
			;;
	esac

	return 0
}

patches_list()
{
	${FIND_CMD} ${CIX_DISTDIR}/upgrade/patch -mindepth 1 -maxdepth 1 -type d | while read _f; do
		_patch_name="${_f##*/}"
		_wver_name="${_patch_name%-*}"
		echo "${_wver_name}"
	done | ${SORT_CMD} -u
}


### MAIN ###
if [ -z "${CIX_OTHER_ARGS}" ]; then
	patches_list
	exit
fi

for i in ${CIX_OTHER_ARGS}; do
	eval apply_cbsd_${i}=1
done

. ${subrdir}/build.subr
readconf buildworld.conf
. ${subrdir}/universe.subr

init_target_arch
init_srcdir
init_supported_arch

set +e
. ${subrdir}/build.subr
set -e

if [ -n "${dst}" ]; then
	#dst="${srcdir}/src_${ver}/src"
	[ ! -d "${dst}" ] && err 1 "${N1_COLOR}${CIX_APP}: no such dir: ${N2_COLOR}${dst}${N0_COLOR}"
else
	dst="${SRC_DIR}"
fi

#if [ "${apply_cbsd_patch}" = "1" ]; then
#	apply_cbsd_patchset
#else
#	${ECHO} "${N1_COLOR}Skip for additional CBSD patchset: ${N2_COLOR}apply_cbsd_patch${N1_COLOR} set to ${N2_COLOR}0${N0_COLOR}"
#fi

if [ "${apply_cbsd_9p_patch}" = "1" ]; then
	${ECHO} "${N1_COLOR}apply p9 patch${N0_COLOR}"
	patch_9p
fi
if [ "${apply_cbsd_vesa_fb}" = "1" ]; then
	${ECHO} "${N1_COLOR}apply vesa_fb patch${N0_COLOR}"
	patch_vesa_fb
fi
if [ "${apply_cbsd_vxlan_patch}" = "1" ]; then
	${ECHO} "${N1_COLOR}apply vxlan patch${N0_COLOR}"
	patch_vxlan
fi
if [ "${apply_cbsd_bhyve_usb_passthru_patch}" = "1" ]; then
	${ECHO} "${N1_COLOR}apply bhyve_usb_passthru patch${N0_COLOR}"
	patch_bhyve_usb_passthru
fi
if [ "${apply_cbsd_lro_patch}" = "1" ]; then
	${ECHO} "${N1_COLOR}apply lro patch${N0_COLOR}"
	patch_lro
fi
if [ "${apply_cbsd_iov_patch}" = "1" ]; then
	${ECHO} "${N1_COLOR}apply iov patch${N0_COLOR}"
	patch_iov
fi
if [ "${apply_cbsd_bhyve_slow}" = "1" ]; then
	${ECHO} "${N1_COLOR}apply bhyve_slow patch${N0_COLOR}"
	patch_bhyve_slow
fi

exit 0
