#!/usr/local/bin/cbsd
#v12.1.1
MYARG=""
MYOPTARG="ver stable rev scmbase dst apply_cbsd_patch apply_cbsd_vesa_fb apply_cbsd_9p_patch apply_cbsd_vxlan_patch apply_cbsd_lro_patch apply_cbsd_iov_patch"
MYDESC="Apply CBSD patch for FreeBSD source tree in $srcdir"
ADDHELP="ver=head for current.\n\
stable=1 for STABLE_X\n\
rev=XXX where XXX - svn revision\n\
scmbase - alternative svn base URL\n\
dst - alternative dst dir\n\
apply_cbsd_patch=[1,0] overwrite srcup.conf settings\n\
apply_cbsd_vesa_fb=[1,0]  overwrite srcup.conf settings\n\
apply_cbsd_9p_patch=[1,0]  overwrite srcup.conf settings\n\
apply_cbsd_vxlan_patch=[1,0] overwrite srcup.conf settings\n\
apply_cbsd_lro_patch=[1,0] overwrite srcup.conf settings\n\
apply_cbsd_iov_patch=[1,0] overwrite srcup.conf settings\n"

. ${subrdir}/nc.subr

. ${cbsdinit}

[ -n "${apply_cbsd_patch}" ] && oapply_cbsd_patch="${apply_cbsd_patch}"
[ -n "${apply_cbsd_vesa_fb}" ] && oapply_cbsd_vesa_fb="${apply_cbsd_vesa_fb}"
[ -n "${apply_cbsd_9p_patch}" ] && oapply_cbsd_9p_patch="${apply_cbsd_9p_patch}"
[ -n "${apply_cbsd_vxlan_patch}" ] && oapply_cbsd_vxlan_patch="${apply_cbsd_vxlan_patch}"
[ -n "${apply_cbsd_lro_patch}" ] && oapply_cbsd_lro_patch="${apply_cbsd_lro_patch}"
[ -n "${apply_cbsd_iov_patch}" ] && oapply_cbsd_iov_patch="${apply_cbsd_iov_patch}"

apply_cbsd_patch=0
apply_cbsd_vesa_fb=0
apply_cbsd_9p_patch=0
apply_cbsd_vxlan_patch=0
apply_cbsd_lro_patch=0
apply_cbsd_iov_patch=0

readconf srcup.conf

over="${ver}"
oarch="${arch}"
# restore args value
[ -n "${oapply_cbsd_patch}" ] && apply_cbsd_patch="${oapply_cbsd_patch}"
[ -n "${oapply_cbsd_vesa_fb}" ] && apply_cbsd_vesa_fb="${apply_cbsd_vesa_fb}"
[ -n "${oapply_cbsd_9p_patch}" ] && apply_cbsd_9p_patch="${oapply_cbsd_9p_patch}"
[ -n "${oapply_cbsd_vxlan_patch}" ] && apply_cbsd_vxlan_patch="${oapply_cbsd_vxlan_patch}"
[ -n "${oapply_cbsd_lro_patch}" ] && apply_cbsd_lro_patch="${oapply_cbsd_lro_patch}"
[ -n "${oapply_cbsd_iov_patch}" ] && apply_cbsd_iov_patch="${oapply_cbsd_iov_patch}"

patch_kmem110()
{
	local _dir="kmem-11.0"
	set +e
	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	set -e
}

patch_kmem111()
{
	local _dir="kmem-11.1"
	set +e
	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${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 < ${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 "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c
	fi

	if [ -f "${dst}/sys/dev/drm/drmP.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h
	fi

	if [ -f "${dst}/sys/dev/drm2/drmP.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h
	fi

	if [ -f "${dst}/sys/sys/jail.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h
	fi

	if [ -f "${dst}/sys/sys/priv.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h
	fi

	if [ -f "${dst}/sys/dev/drm/drm_os_freebsd.h" ]; then
		[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${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 < ${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 "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c" ] && cd ${dst}/sys/kern/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-kern-kern_jail.c

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h" ] && cd ${dst}/sys/dev/drm/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm-drmP.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h" ] && cd ${dst}/sys/dev/drm2/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-dev-drm2-drm_os_freebsd.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-jail.h

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-11x-sys-sys-priv.h" ] && cd ${dst}/sys/sys/ && patch --check -N < ${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 < ${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 "${distdir}/upgrade/patch/${_dir}/patch-13x-usr.sbin-bhyve-pci_fbuf.c" ] && cd ${dst}/usr.sbin/bhyve/ && patch --check -N < ${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 < ${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 "${distdir}/upgrade/patch/${_dir}/patch-sys-net-if_vxlan.c" ] && cd ${dst}/sys/net && patch --check -N < ${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 < ${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 "${distdir}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-net_backends.c" ] && cd ${dst}/usr.sbin/bhyve && patch --check -N < ${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 < ${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 "${distdir}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-block_if.h" ] && cd ${dst}/usr.sbin/bhyve && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-block_if.h
	[ -r "${distdir}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-virtio.c" ] && cd ${dst}/usr.sbin/bhyve && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-usr-sbin-bhyve-virtio.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 "${distdir}/upgrade/patch/${_dir}/patch-${_myver}-etc-mtree-BSD.include.dist" ] && cd ${dst}/etc/mtree/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-${_myver}-etc-mtree-BSD.include.dist

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-${_myver}-lib-Makefile" ] && cd ${dst}/lib/ && patch --check -N < ${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 < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-${_myver}-lib-lib9p-Makefile
	fi

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-bsd.libnames.mk" ] && cd ${dst}/share/mk/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-bsd.libnames.mk

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-src.libnames.mk" ] && cd ${dst}/share/mk/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-${_myver}-share-mk-src.libnames.mk

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-Makefile" ] && cd ${dst}/usr.sbin/bhyve/ && patch --check -N < ${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 < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-pci_virtio_9p.c
	fi

	[ -f "${distdir}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-virtio.h" ] && cd ${dst}/usr.sbin/bhyve/ && patch --check -N < ${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 < ${distdir}/upgrade/patch/${_dir}/patch-${_myver}-usr.sbin-bhyve-virtio.h

	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
}

### MAIN ###
. ${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}${CBSD_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_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

exit 0
