1# 2# Copyright (c) 2013 Patrick Kelsey. All rights reserved. 3# Copyright (C) 2017 THL A29 Limited, a Tencent company. 4# All rights reserved. 5# 6# Derived in part from libuinet's Makefile. 7# 8# Derived from FreeBSD auto-generated kernel Makefile and 9# machine-specific Makefile templates 10# 11 12TOPDIR?=${CURDIR}/.. 13S=${TOPDIR}/freebsd 14MACHINE_INCLUDES_ROOT:=${CURDIR}/machine_include 15OVERRIDE_INCLUDES_ROOT:=${CURDIR}/include 16X86_INCLUDES=0 17 18HOST_OS:=$(shell uname -s) 19#DEBUG=-O0 -gdwarf-2 -g3 20 21ifeq ($(FF_DPDK),) 22 FF_DPDK=${TOPDIR}/dpdk/x86_64-native-linuxapp-gcc 23endif 24 25DPDK_CFLAGS= -Wall -Werror -include ${FF_DPDK}/include/rte_config.h 26DPDK_CFLAGS+= -march=native -DRTE_MACHINE_CPUFLAG_SSE -DRTE_MACHINE_CPUFLAG_SSE2 -DRTE_MACHINE_CPUFLAG_SSE3 27DPDK_CFLAGS+= -DRTE_MACHINE_CPUFLAG_SSSE3 -DRTE_MACHINE_CPUFLAG_SSE4_1 -DRTE_MACHINE_CPUFLAG_SSE4_2 28DPDK_CFLAGS+= -DRTE_COMPILE_TIME_CPUFLAGS=RTE_CPUFLAG_SSE,RTE_CPUFLAG_SSE2,RTE_CPUFLAG_SSE3,RTE_CPUFLAG_SSSE3,RTE_CPUFLAG_SSE4_1,RTE_CPUFLAG_SSE4_2 29DPDK_CFLAGS+= -I${FF_DPDK}/include 30 31include ${TOPDIR}/mk/kern.pre.mk 32 33KERNPREINCLUDES:= ${INCLUDES} 34INCLUDES= -I${OVERRIDE_INCLUDES_ROOT} ${KERNPREINCLUDES} 35INCLUDES+= -I./machine_include 36INCLUDES+= -I./opt 37 38# Include search path for files that only include host OS headers 39HOST_INCLUDES= -I. 40ifndef DEBUG 41HOST_CFLAGS = -O2 -frename-registers -funswitch-loops -fweb 42else 43HOST_CFLAGS = ${DEBUG} 44endif 45HOST_CFLAGS+= ${DPDK_CFLAGS} 46HOST_C= ${CC} -c $(HOST_CFLAGS) ${HOST_INCLUDES} ${WERROR} ${PROF} $< 47 48 49ifneq ($(filter amd64 i386,${MACHINE_CPUARCH}),) 50X86_INCLUDES=1 51endif 52 53 54# 55# Distilled from FreeBSD src/sys/conf/Makefile.amd64 56# 57ifeq (${MACHINE_CPUARCH},amd64) 58endif 59 60# 61# Distilled from FreeBSD src/sys/conf/Makefile.arm 62# 63ifeq (${MACHINE_CPUARCH},arm) 64 65ifneq (${COMPILER_TYPE},clang) 66CFLAGS += -mno-thumb-interwork 67endif 68 69endif 70 71 72# 73# Distilled from FreeBSD src/sys/conf/Makefile.i386 74# 75ifeq (${MACHINE_CPUARCH},i386) 76MACHINE=i386 77endif 78 79 80# 81# Distilled from FreeBSD src/sys/conf/Makefile.mips 82# 83ifeq (${MACHINE_CPUARCH},mips) 84 85# We default to the MIPS32 ISA, if none specified in the 86# kernel configuration file. 87ARCH_FLAGS?=-march=mips32 88 89HACK_EXTRA_FLAGS=-shared 90 91CFLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS) 92HACK_EXTRA_FLAGS+=${EXTRA_FLAGS} $(ARCH_FLAGS) 93endif 94 95CFLAGS+= -DFSTACK 96 97# add for LVS tcp option toa, disabled by default 98# CFLAGS+= -DLVS_TCPOPT_TOA 99 100VPATH+= $S/${MACHINE_CPUARCH}/${MACHINE_CPUARCH} 101VPATH+= $S/kern 102VPATH+= $S/crypto 103VPATH+= $S/crypto/aesni 104VPATH+= $S/crypto/blowfish 105VPATH+= $S/crypto/camellia 106VPATH+= $S/crypto/des 107VPATH+= $S/crypto/rijndael 108VPATH+= $S/crypto/sha2 109VPATH+= $S/crypto/siphash 110VPATH+= $S/net 111VPATH+= $S/netinet 112VPATH+= $S/netinet/cc 113VPATH+= $S/netipsec 114VPATH+= $S/opencrypto 115VPATH+= $S/vm 116VPATH+= $S/libkern 117 118 119FF_SRCS+= \ 120 ff_compat.c \ 121 ff_glue.c \ 122 ff_freebsd_init.c \ 123 ff_init_main.c \ 124 ff_kern_condvar.c \ 125 ff_kern_environment.c \ 126 ff_kern_intr.c \ 127 ff_kern_subr.c \ 128 ff_kern_synch.c \ 129 ff_kern_timeout.c \ 130 ff_lock.c \ 131 ff_syscall_wrapper.c \ 132 ff_subr_prf.c \ 133 ff_vfs_ops.c \ 134 ff_veth.c \ 135 ff_route.c 136 137FF_HOST_SRCS+= \ 138 ff_host_interface.c \ 139 ff_config.c \ 140 ff_ini_parser.c \ 141 ff_dpdk_if.c \ 142 ff_dpdk_kni.c \ 143 ff_dpdk_pcap.c \ 144 ff_epoll.c \ 145 ff_init.c 146 147ifdef FF_IPSEC 148CRYPTO_ASM_SRCS+= \ 149 aesencdec_${MACHINE_CPUARCH}.S \ 150 aeskeys_${MACHINE_CPUARCH}.S 151 152CRYPTO_SRCS+= \ 153 aesni.c \ 154 aesni_wrap.c \ 155 bf_ecb.c \ 156 bf_enc.c \ 157 bf_skey.c \ 158 camellia.c \ 159 camellia-api.c \ 160 des_ecb.c \ 161 des_enc.c \ 162 des_setkey.c \ 163 rijndael-alg-fst.c \ 164 rijndael-api.c \ 165 sha1.c \ 166 sha256c.c \ 167 sha512c.c \ 168 siphash.c 169else 170CRYPTO_SRCS+= \ 171 sha1.c \ 172 siphash.c 173endif 174 175KERN_SRCS+= \ 176 kern_descrip.c \ 177 kern_event.c \ 178 kern_fail.c \ 179 kern_khelp.c \ 180 kern_hhook.c \ 181 kern_linker.c \ 182 kern_mbuf.c \ 183 kern_module.c \ 184 kern_mtxpool.c \ 185 kern_ntptime.c \ 186 kern_osd.c \ 187 kern_sysctl.c \ 188 kern_tc.c \ 189 kern_uuid.c \ 190 link_elf.c \ 191 md5c.c \ 192 subr_capability.c \ 193 subr_counter.c \ 194 subr_eventhandler.c \ 195 subr_kobj.c \ 196 subr_lock.c \ 197 subr_module.c \ 198 subr_param.c \ 199 subr_pcpu.c \ 200 subr_sbuf.c \ 201 subr_taskqueue.c \ 202 subr_unit.c \ 203 sys_capability.c \ 204 sys_generic.c \ 205 sys_socket.c \ 206 uipc_accf.c \ 207 uipc_mbuf.c \ 208 uipc_mbuf2.c \ 209 uipc_domain.c \ 210 uipc_sockbuf.c \ 211 uipc_socket.c \ 212 uipc_syscalls.c 213 214 215KERN_MHEADERS+= \ 216 bus_if.m \ 217 device_if.m \ 218 linker_if.m 219 220 221KERN_MSRCS+= \ 222 linker_if.m 223 224 225LIBKERN_SRCS+= \ 226 bcd.c \ 227 inet_ntoa.c \ 228 jenkins_hash.c \ 229 strlcpy.c \ 230 strnlen.c 231 232 233MACHINE_SRCS+= \ 234 in_cksum.c 235 236 237NET_SRCS+= \ 238 bpf.c \ 239 bridgestp.c \ 240 if.c \ 241 if_bridge.c \ 242 if_clone.c \ 243 if_dead.c \ 244 if_ethersubr.c \ 245 if_loop.c \ 246 if_llatbl.c \ 247 in_fib.c \ 248 in_gif.c \ 249 ip_reass.c \ 250 if_vlan.c \ 251 if_vxlan.c \ 252 netisr.c \ 253 pfil.c \ 254 radix.c \ 255 raw_cb.c \ 256 raw_usrreq.c \ 257 route.c \ 258 rtsock.c 259 260 261NETINET_SRCS+= \ 262 ip_carp.c \ 263 if_ether.c \ 264 if_gif.c \ 265 igmp.c \ 266 in.c \ 267 in_mcast.c \ 268 in_pcb.c \ 269 in_proto.c \ 270 in_rmx.c \ 271 ip_ecn.c \ 272 ip_encap.c \ 273 ip_fastfwd.c \ 274 ip_icmp.c \ 275 ip_id.c \ 276 ip_input.c \ 277 ip_mroute.c \ 278 ip_options.c \ 279 ip_output.c \ 280 raw_ip.c \ 281 tcp_debug.c \ 282 tcp_fastopen.c \ 283 tcp_hostcache.c \ 284 tcp_input.c \ 285 tcp_lro.c \ 286 tcp_offload.c \ 287 tcp_output.c \ 288 tcp_reass.c \ 289 tcp_sack.c \ 290 tcp_subr.c \ 291 tcp_syncache.c \ 292 tcp_timer.c \ 293 tcp_timewait.c \ 294 tcp_usrreq.c \ 295 udp_usrreq.c \ 296 cc.c \ 297 cc_newreno.c \ 298 cc_htcp.c \ 299 cc_cubic.c 300 301ifdef FF_IPSEC 302NETINET_SRCS+= \ 303 ip_ipsec.c 304endif 305 306 307ifdef FF_IPSEC 308NETIPSEC_SRCS+= \ 309 ipsec.c \ 310 ipsec_input.c \ 311 ipsec_mbuf.c \ 312 ipsec_output.c \ 313 key.c \ 314 key_debug.c \ 315 keysock.c \ 316 xform_ah.c \ 317 xform_esp.c \ 318 xform_ipcomp.c 319endif 320 321# only if TCP_SIGNTAURE is defined 322#xform_tcp.c 323 324NETINET6_SRCS+= 325 326 327ifdef FF_IPSEC 328OPENCRYPTO_SRCS+= \ 329 cast.c \ 330 criov.c \ 331 crypto.c \ 332 cryptosoft.c \ 333 deflate.c \ 334 rmd160.c \ 335 skipjack.c \ 336 xform.c 337endif 338 339# cryptodev.c 340 341OPENCRYPTO_MHEADERS= cryptodev_if.m 342OPENCRYPTO_MSRCS= cryptodev_if.m 343 344VM_SRCS+= \ 345 uma_core.c 346 347 348MHEADERS= $(patsubst %.m,%.h,${KERN_MHEADERS}) 349MHEADERS+= vnode_if.h vnode_if_newproto.h vnode_if_typedef.h 350MHEADERS+= $(patsubst %.m,%.h,${OPENCRYPTO_MHEADERS}) 351 352MSRCS= $(patsubst %.m,%.c,${KERN_MSRCS}) 353MSRCS+= $(patsubst %.m,%.c,${OPENCRYPTO_MSRCS}) 354 355ASM_SRCS = ${CRYPTO_ASM_SRCS} 356 357SRCS= ${FF_SRCS} ${CRYPTO_SRCS} ${KERN_SRCS} ${LIBKERN_SRCS} ${MACHINE_SRCS} 358SRCS+= ${MSRCS} ${NET_SRCS} ${NETINET_SRCS} ${NETINET6_SRCS} ${NETIPSEC_SRCS} ${OPENCRYPTO_SRCS} ${VM_SRCS} 359 360# If witness is enabled. 361# SRCS+= ${KERN_WITNESS_SRCS} 362 363HOST_SRCS = ${FF_HOST_SRCS} 364 365ASM_OBJS+= $(patsubst %.S,%.o,${ASM_SRCS}) 366OBJS+= $(patsubst %.c,%.o,${SRCS}) 367HOST_OBJS+= $(patsubst %.c,%.o,${HOST_SRCS}) 368 369all: libfstack.a 370 371# 372# The library is built by first incrementally linking all the object 373# to resolve internal references. Then, all symbols are made local. 374# Then, only the symbols that are part of the API are made 375# externally available. 376# 377libfstack.a: machine_includes ff_api.symlist ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} 378 ${LD} -r -o $*.ro ${ASM_OBJS} ${OBJS} 379 nm $*.ro | grep -v ' U ' | cut -d ' ' -f 3 > $*_localize_list.tmp 380 objcopy --localize-symbols=$*_localize_list.tmp $*.ro 381 rm $*_localize_list.tmp 382 objcopy --globalize-symbols=ff_api.symlist $*.ro 383 rm -f $@ 384 ar -cqs $@ $*.ro ${HOST_OBJS} 385 rm -f $*.ro 386 387${HOST_OBJS}: %.o: %.c 388 ${HOST_C} 389 390${ASM_OBJS}: %.o: %.S ${IMACROS_FILE} 391 ${NORMAL_S} 392 393${OBJS}: %.o: %.c ${IMACROS_FILE} 394 ${NORMAL_C} 395 396 397.SUFFIXES: .m 398 399.m.c: 400 ${AWK} -f $S/tools/makeobjops.awk $< -c 401 402.m.h: 403 ${AWK} -f $S/tools/makeobjops.awk $< -h 404 405.PHONY: clean 406clean: 407 rm -f libfstack.a 408 rm -f ${MHEADERS} ${MSRCS} ${HOST_OBJS} ${ASM_OBJS} ${OBJS} ${PROGRAM} ${IMACROS_FILE} 409 rm -rf ${MACHINE_INCLUDES_ROOT} 410 411 412.PHONY: machine_includes 413machine_includes: 414 @rm -rf ${MACHINE_INCLUDES_ROOT} 415 @mkdir -p ${MACHINE_INCLUDES_ROOT}/machine 416 @cp -r $S/${MACHINE_CPUARCH}/include/* ${MACHINE_INCLUDES_ROOT}/machine 417 @if [ "${X86_INCLUDES}" != "0" ]; then \ 418 mkdir -p ${MACHINE_INCLUDES_ROOT}/x86; \ 419 cp -r $S/x86/include/* ${MACHINE_INCLUDES_ROOT}/x86; \ 420 fi 421 422# 423# Distilled from FreeBSD src/sys/conf/kern.post.mk 424# 425vnode_if.h vnode_if_newproto.h vnode_if_typedef.h: $S/tools/vnode_if.awk \ 426 $S/kern/vnode_if.src 427vnode_if.h: vnode_if_newproto.h vnode_if_typedef.h 428 ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -h 429vnode_if_newproto.h: 430 ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -p 431vnode_if_typedef.h: 432 ${AWK} -f $S/tools/vnode_if.awk $S/kern/vnode_if.src -q 433 434include ${TOPDIR}/mk/kern.mk 435 436