#       $NetBSD: Makefile.rumpkern,v 1.192 2024/12/22 23:24:20 riastradh Exp $
#

IOCONFDIR:=     ${.PARSEDIR}
IOCONF=         MAINBUS.ioconf

LIB=            rump
COMMENT=        Rump kernel base

MAN=            rump.3 rump_lwproc.3

PATH:   ${RUMPTOP}/librump/rumpkern                             \
       ${RUMPTOP}/librump/rumpkern/arch/generic                \
       ${RUMPTOP}/../kern                                      \
       ${RUMPTOP}/../uvm                                       \
       ${RUMPTOP}/../conf                                      \
       ${RUMPTOP}/../dev                                       \
       ${RUMPTOP}/../crypto/blake2                             \
       ${RUMPTOP}/../crypto/chacha                             \
       ${RUMPTOP}/../crypto/cprng_fast                         \
       ${RUMPTOP}/../crypto/nist_hash_drbg                     \
       ${RUMPTOP}/../secmodel                                  \
       ${RUMPTOP}/../secmodel/extensions                       \
       ${RUMPTOP}/../secmodel/suser                            \
       ${RUMPTOP}/../compat/common

#
# Source modules, first the ones specifically implemented for librump.
#
SRCS+=  rump.c rumpcopy.c cons.c emul.c etfs_wrap.c intr.c      \
       lwproc.c klock.c kobj_rename.c ltsleep.c scheduler.c    \
       signals.c sleepq.c threads.c vm.c hyperentropy.c        \
       accessors.c

SRCS+=  rump_autoconf.c rumpkern_syscalls.c

# autogenerated into the correct namespace
RUMPOBJ_NORENAME= rump_syscalls.o rump_syscalls.pico rump_syscalls.po

ifdef RUMP_KERNEL_IS_LIBC
CPPFLAGS+= -DRUMP_KERNEL_IS_LIBC
endif

# Multiprocessor or uniprocessor locking.  TODO: select right
# locking at runtime.
if ${RUMP_LOCKS_UP:Uno} == "yes"
SRCS+=  locks_up.c
else
SRCS+=  locks.c
endif

vers.c: ${RUMPTOP}/../conf/newvers.sh ${RUMPTOP}/../conf/osrelease.sh \
               ${RUMPTOP}/../sys/param.h ${_NETBSD_VERSION_DEPENDS}
       ${_MKMSG_CREATE} vers.c
       ${HOST_SH} ${RUMPTOP}/../conf/newvers.sh -i RUMP-ROAST -n -R
SRCS+=          vers.c
CLEANFILES+=    vers.c version

# autogenerated
#
SRCS+=  rump_syscalls.c rumpkern_if_wrappers.c

# "auto"generated
SRCS+=  devsw.c

#
# std kernel sources
#
# sys/kern
SRCS+=  init_sysctl_base.c      \
       compat_stub.c           \
       kern_auth.c             \
       kern_cfglock.c          \
       kern_clock.c            \
       kern_descrip.c          \
       kern_entropy.c          \
       kern_event.c            \
       kern_hook.c             \
       kern_ksyms.c            \
       kern_malloc.c           \
       kern_module.c           \
       kern_module_hook.c      \
       kern_mutex_obj.c        \
       kern_ntptime.c          \
       kern_proc.c             \
       kern_prot.c             \
       kern_rate.c             \
       kern_reboot.c           \
       kern_resource.c         \
       kern_rwlock_obj.c       \
       kern_scdebug.c          \
       kern_stub.c             \
       kern_ssp.c              \
       kern_syscall.c          \
       kern_sysctl.c           \
       kern_tc.c               \
       kern_threadpool.c       \
       kern_time.c             \
       kern_timeout.c          \
       kern_uidinfo.c          \
       param.c                 \
       subr_autoconf.c         \
       subr_callback.c         \
       subr_copy.c             \
       subr_cprng.c            \
       subr_cpu.c              \
       subr_device.c           \
       subr_devsw.c            \
       subr_evcnt.c            \
       subr_extent.c           \
       subr_hash.c             \
       subr_humanize.c         \
       subr_iostat.c           \
       subr_kcpuset.c          \
       subr_kmem.c             \
       subr_kobj.c             \
       subr_localcount.c       \
       subr_log.c              \
       subr_lwp_specificdata.c \
       subr_once.c             \
       subr_pcq.c              \
       subr_percpu.c           \
       subr_pool.c             \
       subr_prf.c              \
       subr_pserialize.c       \
       subr_psref.c            \
       subr_specificdata.c     \
       subr_time.c             \
       subr_time_arith.c       \
       subr_thmap.c            \
       subr_vmem.c             \
       subr_workqueue.c        \
       subr_xcall.c            \
       sys_descrip.c           \
       sys_generic.c           \
       sys_getrandom.c         \
       sys_module.c            \
       sys_pipe.c              \
       sys_select.c            \
       syscalls.c              \
       uipc_sem.c

# sys/uvm
SRCS+=  uvm_aobj.c uvm_readahead.c uvm_object.c uvm_swapstub.c
SRCS+=  uvm_page_array.c uvm_page_status.c

# 4.4BSD secmodel.  selection is hardcoded for now
SRCS+=  secmodel.c
SRCS+=  secmodel_suser.c
SRCS+=  secmodel_extensions.c
SRCS+=  secmodel_extensions_rump.c      # stubs

# sys/dev
SRCS+=  clock_subr.c

# sys/crypto
# Note: these are here only for cprng.  More crypto algos for drivers
# are available from the rumpkern_crypto component
SRCS+=  nist_hash_drbg.c
SRCS+=  cprng_fast.c
SRCS+=  chacha_impl.c
SRCS+=  chacha_ref.c
SRCS+=  chacha_selftest.c

# BLAKE2
# for hash_address
SRCS+=  blake2s.c

include "${RUMPTOP}/Makefile.rump"
include <bsd.own.mk>

# compat
if !empty(RUMP_NBCOMPAT:M50)
SRCS+=  kern_select_50.c
SRCS+=  kern_time_50.c
SRCS+=  rndpseudo_50.c
endif


ifdef RUMP_LOCKDEBUG
SRCS+=          subr_lockdebug.c
endif

if ${RUMP_KTRACE} == "yes"
SRCS+=          kern_ktrace.c
endif

CPPFLAGS+=      -I${RUMPTOP}/librump/rumpkern
AFLAGS+=        -D_LOCORE -Wa,--fatal-warnings

#
# If archdir exists, it is required to provide:
# 1) kobj_reloc() and kobj_machdep()
# 2) rump_cpu_bootstrap()
# 3) ...?
# 4) PROFIT!
#

#
# Check if we are building compat.  In compat mode we need to provide
# the kernel of our compat target (amd64->i386 & sparc64->sparc), so
# take MD stuff from the right arch.
#
if defined(COMPAT_MACHINE_CPU) \
   && exists(${RUMPTOP}/librump/rumpkern/arch/${COMPAT_MACHINE_CPU})
ARCHDIR=        ${RUMPTOP}/librump/rumpkern/arch/${COMPAT_MACHINE_CPU}
LIBKERN_ARCH=   ${COMPAT_MACHINE_CPU}
elif defined(MLIBDIR)
ARCHDIR=        ${RUMPTOP}/librump/rumpkern/arch/${MLIBDIR}
LIBKERN_ARCH=   ${MLIBDIR}
elif exists(${RUMPTOP}/librump/rumpkern/arch/${MACHINE_CPU})
ARCHDIR=        ${RUMPTOP}/librump/rumpkern/arch/${MACHINE_CPU}
else
ARCHDIR=        ${RUMPTOP}/librump/rumpkern/arch/${MACHINE_ARCH}
endif
if !exists(${ARCHDIR})
ARCHDIR=        ${RUMPTOP}/librump/rumpkern/arch/generic
endif

include "${ARCHDIR}/Makefile.inc"
PATH:   ${ARCHDIR}

if ${MACHINE} == "sun3"
CPPFLAGS+=      -Dsun3
endif

# include libkern source files
KERNDIR=${RUMPTOP}/../lib/libkern
if "${_RUMP_NATIVEABI}" == "yes"
KERNMISCCPPFLAGS+=      -D_RUMPKERNEL
endif
include "${RUMPTOP}/../lib/libkern/Makefile.libkern"

# Some architectures require a little special massage with atomic
# compare-and-swap.  This is because the kernel version is using
# instructions or routines unavailable to us in userspace.
#
if (${MACHINE_CPU} == "arm" && "${FEAT_LDREX}" != "yes") \
   || ${MACHINE_ARCH} == "coldfire" || ${MACHINE_CPU} == "hppa" \
   || ${MACHINE_CPU} == "mips" || ${MACHINE_CPU} == "sh3" \
   || ${MACHINE_ARCH} == "vax" || ${MACHINE_ARCH} == "m68000"
CPPFLAGS+=      -I${RUMPTOP}/../../common/lib/libc/atomic
SRCS+=          atomic_cas_generic.c
#SRCS+=         rump_atomic_cas_up.c
endif

COPTS.if_ethersubr.c+=          ${CC_WNO_CAST_FUNCTION_TYPE}
COPTS.kern_hook.c+=             ${CC_WNO_CAST_FUNCTION_TYPE}
COPTS.subr_vmem.c+=             ${CC_WNO_CAST_FUNCTION_TYPE}
COPTS.subr_pool.c+=             ${CC_WNO_CAST_FUNCTION_TYPE}
COPTS.rump.c+=                  ${CC_WNO_CAST_FUNCTION_TYPE}

include <bsd.lib.mk>
include <bsd.klinks.mk>