]> git.proxmox.com Git - mirror_zfs.git/commitdiff
FreeBSD: make adjustments for the standalone environment
authorWarner Losh <imp@bsdimp.com>
Wed, 14 Oct 2020 04:05:49 +0000 (22:05 -0600)
committerGitHub <noreply@github.com>
Wed, 14 Oct 2020 04:05:49 +0000 (21:05 -0700)
In FreeBSD, there are three compile environments that are supported:
user land, the kernel and the bootloader / standalone. Adjust the
headers to compile in the standalone environment. Limit kernel-only
items from view when _STANDALONE is defined.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Signed-off-by: Warner Losh <imp@FreeBSD.org>
Closes #10998

20 files changed:
include/os/freebsd/linux/compiler.h
include/os/freebsd/spl/rpc/xdr.h
include/os/freebsd/spl/sys/atomic.h
include/os/freebsd/spl/sys/byteorder.h
include/os/freebsd/spl/sys/ccompile.h
include/os/freebsd/spl/sys/cmn_err.h
include/os/freebsd/spl/sys/condvar.h
include/os/freebsd/spl/sys/kmem.h
include/os/freebsd/spl/sys/kmem_cache.h
include/os/freebsd/spl/sys/kstat.h
include/os/freebsd/spl/sys/proc.h
include/os/freebsd/spl/sys/procfs_list.h
include/os/freebsd/spl/sys/sig.h
include/os/freebsd/spl/sys/sysmacros.h
include/os/freebsd/spl/sys/taskq.h
include/os/freebsd/spl/sys/uio.h
include/sys/nvpair.h
include/sys/zfs_context.h
lib/libspl/include/os/freebsd/sys/param.h
module/os/freebsd/spl/list.c

index d76050378e83ef15041aca87e7a4c61e1fa4b397..05e93efa64d73644704339523f96b39747ea3a28 100644 (file)
@@ -68,7 +68,7 @@
 #define        noinline                        __noinline
 #define        ____cacheline_aligned           __aligned(CACHE_LINE_SIZE)
 
-#ifndef _KERNEL
+#if !defined(_KERNEL) && !defined(_STANDALONE)
 #define        likely(x)                       __builtin_expect(!!(x), 1)
 #define        unlikely(x)                     __builtin_expect(!!(x), 0)
 #endif
index 59d5e425bedbb1749c5ca18ba3c06df52e634c61..c98466e9d16a1ee5ac706bd8de4c4350ab4d3692 100644 (file)
@@ -33,7 +33,7 @@
 #include <rpc/types.h>
 #include_next <rpc/xdr.h>
 
-#ifndef _KERNEL
+#if !defined(_KERNEL) && !defined(_STANDALONE)
 
 #include <assert.h>
 
@@ -66,6 +66,6 @@ xdrmem_control(XDR *xdrs, int request, void *info)
            xdrmem_control((xdrs), (req), (op)) :                       \
            (*(xdrs)->x_ops->x_control)(xdrs, req, op))
 
-#endif /* !_KERNEL */
+#endif /* !_KERNEL && !_STANDALONE */
 
 #endif /* !_OPENSOLARIS_RPC_XDR_H_ */
index 4227e5f7d3ec45808b0667bd8760d2d916e594c3..1a68bfc4de23cffa0492b2717c52ac38ff76076d 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef _OPENSOLARIS_SYS_ATOMIC_H_
 #define        _OPENSOLARIS_SYS_ATOMIC_H_
 
+#ifndef _STANDALONE
+
 #include <sys/types.h>
 #include <machine/atomic.h>
 
@@ -179,4 +181,13 @@ atomic_cas_ptr(volatile void *target, void *cmp,  void *newval)
 }
 #endif /* !defined(COMPAT_32BIT) && defined(__LP64__) */
 
+#else /* _STANDALONE */
+/*
+ * sometimes atomic_add_64 is defined, sometimes not, but the
+ * following is always right for the boot loader.
+ */
+#undef atomic_add_64
+#define        atomic_add_64(ptr, val) *(ptr) += val
+#endif /* !_STANDALONE */
+
 #endif /* !_OPENSOLARIS_SYS_ATOMIC_H_ */
index ae767242bd18415c04b14ae4f70ac0aac431745c..0b3d01eb3759eb6e17f34d7660fb57a9802e2b11 100644 (file)
 #define        BE_64(x)        BSWAP_64(x)
 #endif
 
+#if !defined(_STANDALONE)
 #if BYTE_ORDER == _BIG_ENDIAN
 #define        htonll(x)       BMASK_64(x)
 #define        ntohll(x)       BMASK_64(x)
-#else
+#else /* BYTE_ORDER == _LITTLE_ENDIAN */
 #ifndef __LP64__
 static __inline__ uint64_t
 htonll(uint64_t n)
@@ -96,11 +97,12 @@ ntohll(uint64_t n)
 {
        return ((((uint64_t)ntohl(n)) << 32) + ntohl(n >> 32));
 }
-#else
+#else  /* !__LP64__ */
 #define        htonll(x)       BSWAP_64(x)
 #define        ntohll(x)       BSWAP_64(x)
-#endif
-#endif
+#endif /* __LP64__ */
+#endif /* BYTE_ORDER */
+#endif /* _STANDALONE */
 
 #define        BE_IN32(xa)     htonl(*((uint32_t *)(void *)(xa)))
 
index bffe6d21e31df918946fa70d8c0edc8e9c3fb70e..cf1e0a8a637650f1b1afd2b7d909c8e7d32ee103 100644 (file)
@@ -113,9 +113,9 @@ extern "C" {
 #define        __VPRINTFLIKE(__n)      __sun_attr__((__VPRINTFLIKE__(__n)))
 #define        __KPRINTFLIKE(__n)      __sun_attr__((__KPRINTFLIKE__(__n)))
 #define        __KVPRINTFLIKE(__n)     __sun_attr__((__KVPRINTFLIKE__(__n)))
-#ifdef _KERNEL
+#if    defined(_KERNEL) || defined(_STANDALONE)
 #define        __NORETURN              __sun_attr__((__noreturn__))
-#endif
+#endif /* _KERNEL || _STANDALONE */
 #define        __CONST                 __sun_attr__((__const__))
 #define        __PURE                  __sun_attr__((__pure__))
 
@@ -174,7 +174,7 @@ typedef int enum_t;
 #define        __exit
 #endif
 
-#ifdef _KERNEL
+#if defined(_KERNEL) || defined(_STANDALONE)
 #define        param_set_charp(a, b) (0)
 #define        ATTR_UID AT_UID
 #define        ATTR_GID AT_GID
@@ -183,9 +183,15 @@ typedef int enum_t;
 #define        ATTR_CTIME      AT_CTIME
 #define        ATTR_MTIME      AT_MTIME
 #define        ATTR_ATIME      AT_ATIME
+#if defined(_STANDALONE)
+#define        vmem_free kmem_free
+#define        vmem_zalloc kmem_zalloc
+#define        vmem_alloc kmem_zalloc
+#else
 #define        vmem_free zfs_kmem_free
 #define        vmem_zalloc(size, flags) zfs_kmem_alloc(size, flags | M_ZERO)
 #define        vmem_alloc zfs_kmem_alloc
+#endif
 #define        MUTEX_NOLOCKDEP 0
 #define        RW_NOLOCKDEP 0
 
index 00d686439f9483eed9633fe37115f9514bbcb681..ba4cff37d5f3041b6a05822af255d3e6063a12ad 100644 (file)
@@ -52,42 +52,33 @@ extern "C" {
 /*PRINTFLIKE2*/
 extern void cmn_err(int, const char *, ...)
     __KPRINTFLIKE(2);
-#pragma rarely_called(cmn_err)
 
 extern void vzcmn_err(zoneid_t, int, const char *, __va_list)
     __KVPRINTFLIKE(3);
-#pragma rarely_called(vzcmn_err)
 
 extern void vcmn_err(int, const char *, __va_list)
     __KVPRINTFLIKE(2);
-#pragma rarely_called(vcmn_err)
 
 /*PRINTFLIKE3*/
 extern void zcmn_err(zoneid_t, int, const char *, ...)
     __KPRINTFLIKE(3);
-#pragma rarely_called(zcmn_err)
 
 extern void vzprintf(zoneid_t, const char *, __va_list)
     __KVPRINTFLIKE(2);
-#pragma rarely_called(vzprintf)
 
 /*PRINTFLIKE2*/
 extern void zprintf(zoneid_t, const char *, ...)
     __KPRINTFLIKE(2);
-#pragma rarely_called(zprintf)
 
 extern void vuprintf(const char *, __va_list)
     __KVPRINTFLIKE(1);
-#pragma rarely_called(vuprintf)
 
 /*PRINTFLIKE1*/
 extern void panic(const char *, ...)
     __KPRINTFLIKE(1) __NORETURN;
-#pragma rarely_called(panic)
 
 extern void vpanic(const char *, __va_list)
     __KVPRINTFLIKE(1) __NORETURN;
-#pragma rarely_called(vpanic)
 
 #endif /* !_ASM */
 
index a634ab6b6807d424a9abf18bbd7833cf19a42f2b..9b1893bcb84ca46c92a90552fceca8a1a825205c 100644 (file)
@@ -36,6 +36,7 @@
 #include <sys/spl_condvar.h>
 #include <sys/mutex.h>
 #include <sys/time.h>
+#include <sys/errno.h>
 
 /*
  * cv_timedwait() is similar to cv_wait() except that it additionally expects
index 28c65e74a250c22fb011b2dc2893fa99c4433bef..dc3b4f5d787721277a530d5e49fed3258d160f53 100644 (file)
@@ -29,6 +29,7 @@
 #ifndef _OPENSOLARIS_SYS_KMEM_H_
 #define        _OPENSOLARIS_SYS_KMEM_H_
 
+#ifdef _KERNEL
 #include <sys/param.h>
 #include <sys/malloc.h>
 #include <sys/vmem.h>
@@ -93,5 +94,14 @@ void *calloc(size_t n, size_t s);
        zfs_kmem_alloc((size), (kmflags) | M_ZERO)
 #define        kmem_free(buf, size)            zfs_kmem_free((buf), (size))
 
+#endif /* _KERNEL */
+
+#ifdef _STANDALONE
+/*
+ * At the moment, we just need it for the type. We redirect the alloc/free
+ * routines to the usual Free and Malloc in that environment.
+ */
+typedef int kmem_cache_t;
+#endif /* _STANDALONE */
 
 #endif /* _OPENSOLARIS_SYS_KMEM_H_ */
index d8e0349e4ca39aa926ec8edf5394f0068e54afdc..9eec3b4585cbe2b8dbe262f0ad60e8779bdedae2 100644 (file)
@@ -30,6 +30,7 @@
 #ifndef _SPL_KMEM_CACHE_H
 #define        _SPL_KMEM_CACHE_H
 
+#ifdef _KERNEL
 #include <sys/taskq.h>
 
 /* kmem move callback return values */
@@ -46,4 +47,6 @@ extern void spl_kmem_cache_set_move(kmem_cache_t *,
 
 #define        kmem_cache_set_move(skc, move)  spl_kmem_cache_set_move(skc, move)
 
+#endif /* _KERNEL */
+
 #endif
index b0a1c96893edeb611c1b880f02a8ba01461f020b..f5157c7f4fe3f2bd50dbda1b000612e03dda3715 100644 (file)
 
 #ifndef _SPL_KSTAT_H
 #define        _SPL_KSTAT_H
+
 #include <sys/types.h>
+#ifndef _STANDALONE
 #include <sys/sysctl.h>
+#endif
 struct list_head {};
 #include <sys/mutex.h>
 #include <sys/proc.h>
@@ -128,9 +131,10 @@ struct kstat_s {
        kstat_raw_ops_t ks_raw_ops;             /* ops table for raw type */
        char            *ks_raw_buf;            /* buf used for raw ops */
        size_t          ks_raw_bufsize;         /* size of raw ops buffer */
+#ifndef _STANDALONE
        struct sysctl_ctx_list ks_sysctl_ctx;
        struct sysctl_oid *ks_sysctl_root;
-
+#endif /* _STANDALONE */
 };
 
 typedef struct kstat_named_s {
@@ -215,10 +219,16 @@ extern void kstat_runq_exit(kstat_io_t *);
     __kstat_set_seq_raw_ops(k, h, d, a)
 #define        kstat_set_raw_ops(k, h, d, a) \
     __kstat_set_raw_ops(k, h, d, a)
+#ifndef _STANDALONE
 #define        kstat_create(m, i, n, c, t, s, f) \
     __kstat_create(m, i, n, c, t, s, f)
 
 #define        kstat_install(k)                __kstat_install(k)
 #define        kstat_delete(k)                 __kstat_delete(k)
+#else
+#define        kstat_create(m, i, n, c, t, s, f)       ((kstat_t *)0)
+#define        kstat_install(k)
+#define        kstat_delete(k)
+#endif
 
 #endif  /* _SPL_KSTAT_H */
index a455cfbab66f8aad7ec27ab0a21732a5c7c7e8ce..8583df509b5527ee337a53f061a31d3ab6af8887 100644 (file)
@@ -41,7 +41,7 @@
 #include <sys/kmem.h>
 #include <sys/malloc.h>
 
-
+#ifdef _KERNEL
 #define        CPU             curcpu
 #define        minclsyspri     PRIBIO
 #define        defclsyspri minclsyspri
@@ -111,4 +111,5 @@ zfs_proc_is_caller(proc_t *p)
        return (p == curproc);
 }
 
+#endif /* _KERNEL */
 #endif /* _OPENSOLARIS_SYS_PROC_H_ */
index da13f0387cb59fde5009a9d3bd1bad2a00bbb428..4bc603756ea4333a2975cc09d76412da29e18b35 100644 (file)
@@ -25,6 +25,8 @@
 #ifndef        _SPL_PROCFS_LIST_H
 #define        _SPL_PROCFS_LIST_H
 
+#ifndef _STANDALONE
+
 #include <sys/kstat.h>
 #include <sys/mutex.h>
 
@@ -64,4 +66,8 @@ void procfs_list_uninstall(procfs_list_t *procfs_list);
 void procfs_list_destroy(procfs_list_t *procfs_list);
 void procfs_list_add(procfs_list_t *procfs_list, void *p);
 
+#else
+typedef int procfs_list_t;
+#endif /* !_STANDALONE */
+
 #endif /* _SPL_PROCFS_LIST_H */
index 426a9e827ecb445e333f216aee51ef05d9d312f7..a4d440d38326d6d83beef65d886ec1c1bad042fa 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef _OPENSOLARIS_SYS_SIG_H_
 #define        _OPENSOLARIS_SYS_SIG_H_
 
+#ifndef _STANDALONE
+
 #include_next <sys/signal.h>
 #include <sys/param.h>
 #include <sys/lock.h>
@@ -62,4 +64,7 @@ issig(int why)
        }
        return (0);
 }
+
+#endif /* !_STANDALONE */
+
 #endif /* _OPENSOLARIS_SYS_SIG_H_ */
index 5afca10447e7ddc2317d3783c7259ebbc455a89e..2d0164cb129fb9c53a087448c6c874be5f3879f8 100644 (file)
@@ -31,6 +31,7 @@
 #define        _SYS_SYSMACROS_H
 
 #include <sys/param.h>
+#include <sys/systm.h>
 #include <sys/isa_defs.h>
 #include <sys/libkern.h>
 #include <sys/zone.h>
@@ -71,7 +72,11 @@ extern "C" {
 #define        DIV_ROUND_UP(n, d)      (((n) + (d) - 1) / (d))
 #endif
 
+#ifdef _STANDALONE
+#define        boot_ncpus 1
+#else /* _STANDALONE */
 #define        boot_ncpus mp_ncpus
+#endif /* _STANDALONE */
 #define        kpreempt_disable() critical_enter()
 #define        kpreempt_enable() critical_exit()
 #define        CPU_SEQID curcpu
@@ -319,7 +324,7 @@ extern unsigned char bcd_to_byte[256];
 
 /* avoid any possibility of clashing with <stddef.h> version */
 
-#define        offsetof(s, m)  ((size_t)(&(((s *)0)->m)))
+#define        offsetof(type, field)   __offsetof(type, field)
 #endif
 
 /*
index 200f9e838b8dfb9b9856b0e05eeecd8509c9229f..3040549e043de2ffdee1b333ac0cf45d8928d3bc 100644 (file)
@@ -26,6 +26,8 @@
 #ifndef        _SYS_TASKQ_H
 #define        _SYS_TASKQ_H
 
+#ifdef _KERNEL
+
 #include <sys/types.h>
 #include <sys/proc.h>
 #include <sys/taskqueue.h>
@@ -112,4 +114,11 @@ void       taskq_resume(taskq_t *);
 }
 #endif
 
+#endif /* _KERNEL */
+
+#ifdef _STANDALONE
+typedef int taskq_ent_t;
+#define        taskq_init_ent(x)
+#endif /* _STANDALONE */
+
 #endif /* _SYS_TASKQ_H */
index 2b4357a30b0927a0259b40968bc7dc6881e32938..cb577df105e908b02dad1d4b404b4cce7e65f1e8 100644 (file)
@@ -29,6 +29,8 @@
 #ifndef _OPENSOLARIS_SYS_UIO_H_
 #define        _OPENSOLARIS_SYS_UIO_H_
 
+#ifndef _STANDALONE
+
 #include_next <sys/uio.h>
 #include <sys/_uio.h>
 #include <sys/debug.h>
@@ -107,4 +109,6 @@ uio_index_at_offset(uio_t *uio, offset_t off, uint_t *vec_idx)
        return (off);
 }
 
+#endif /* !_STANDALONE */
+
 #endif /* !_OPENSOLARIS_SYS_UIO_H_ */
index e8567933d2bc8659339231c1edb919d179414149..b0be8bd7ada1a8a547be72fc64e5fd426d245424 100644 (file)
@@ -62,7 +62,7 @@ typedef enum {
        DATA_TYPE_UINT8,
        DATA_TYPE_BOOLEAN_ARRAY,
        DATA_TYPE_INT8_ARRAY,
-#if !defined(_KERNEL)
+#if !defined(_KERNEL) && !defined(_STANDALONE)
        DATA_TYPE_UINT8_ARRAY,
        DATA_TYPE_DOUBLE
 #else
@@ -191,7 +191,7 @@ int nvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint_t);
 int nvlist_add_string_array(nvlist_t *, const char *, char *const *, uint_t);
 int nvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t);
 int nvlist_add_hrtime(nvlist_t *, const char *, hrtime_t);
-#if !defined(_KERNEL)
+#if !defined(_KERNEL) && !defined(_STANDALONE)
 int nvlist_add_double(nvlist_t *, const char *, double);
 #endif
 
@@ -228,7 +228,7 @@ int nvlist_lookup_nvlist_array(nvlist_t *, const char *,
     nvlist_t ***, uint_t *);
 int nvlist_lookup_hrtime(nvlist_t *, const char *, hrtime_t *);
 int nvlist_lookup_pairs(nvlist_t *, int, ...);
-#if !defined(_KERNEL)
+#if !defined(_KERNEL) && !defined(_STANDALONE)
 int nvlist_lookup_double(nvlist_t *, const char *, double *);
 #endif
 
@@ -269,7 +269,7 @@ int nvpair_value_uint64_array(nvpair_t *, uint64_t **, uint_t *);
 int nvpair_value_string_array(nvpair_t *, char ***, uint_t *);
 int nvpair_value_nvlist_array(nvpair_t *, nvlist_t ***, uint_t *);
 int nvpair_value_hrtime(nvpair_t *, hrtime_t *);
-#if !defined(_KERNEL)
+#if !defined(_KERNEL) && !defined(_STANDALONE)
 int nvpair_value_double(nvpair_t *, double *);
 #endif
 
index d9f5ed580ef167f0cc89b32288d3dfa3ddfd7e52..9f637036ee714d74a46d8ca7d32b4eecc4243f32 100644 (file)
 extern "C" {
 #endif
 
-#ifdef __KERNEL__
+/*
+ * This code compiles in three different contexts. When __KERNEL__ is defined,
+ * the code uses "unix-like" kernel interfaces. When _STANDALONE is defined, the
+ * code is running in a reduced capacity environment of the boot loader which is
+ * generally a subset of both POSIX and kernel interfaces (with a few unique
+ * interfaces too). When neither are defined, it's in a userland POSIX or
+ * similar environment.
+ */
+#if defined(__KERNEL__) || defined(_STANDALONE)
 #include <sys/note.h>
 #include <sys/types.h>
 #include <sys/atomic.h>
@@ -65,7 +73,7 @@ extern "C" {
 #include <sys/procfs_list.h>
 #include <sys/mod.h>
 #include <sys/zfs_context_os.h>
-#else /* _KERNEL */
+#else /* _KERNEL || _STANDALONE */
 
 #define        _SYS_MUTEX_H
 #define        _SYS_RWLOCK_H
@@ -759,7 +767,7 @@ extern int kmem_cache_reap_active(void);
 #define        __init
 #define        __exit
 
-#endif /* _KERNEL */
+#endif  /* _KERNEL || _STANDALONE */
 
 #ifdef __cplusplus
 };
index 7c23b670591a2250a18c02282da9e689455722c6..cb5260ea3d7e75935c61b7e00b12518698d9f5e0 100644 (file)
  */
 #define        MAXNAMELEN      256
 
-#ifndef IN_BASE
-#define        UID_NOBODY      60001           /* user ID no body */
-#define        GID_NOBODY      UID_NOBODY
-#endif
 #define        UID_NOACCESS    60002           /* user ID no access */
 
 #define        MAXUID          UINT32_MAX      /* max user id */
index 8796be4a98fb584c6715c42434311eec887f0dbc..0f5ae629126ced200caebedbe44fc17f7dcefe06 100644 (file)
  * Generic doubly-linked list implementation
  */
 
+#include <sys/param.h>
 #include <sys/list.h>
 #include <sys/list_impl.h>
 #include <sys/types.h>
-#include <sys/sysmacros.h>
 #include <sys/debug.h>
 
 #define        list_d2l(a, obj) ((list_node_t *)(((char *)obj) + (a)->list_offset))