/* * Copyright (c) 2010 Kip Macy All rights reserved. * Copyright (C) 2017 THL A29 Limited, a Tencent company. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Derived in part from libplebnet's pn_init.c. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ff_host_interface.h" #include "ff_api.h" #include "ff_config.h" int ff_freebsd_init(void); extern void mutex_init(void); extern void mi_startup(void); extern void uma_startup(void *, int); extern void uma_startup2(void); extern void ff_init_thread0(void); struct sx proctree_lock; struct pcpu *pcpup; struct uma_page_head *uma_page_slab_hash; int uma_page_mask; extern cpuset_t all_cpus; long physmem; int ff_freebsd_init(void) { int boot_pages; unsigned int num_hash_buckets; char tmpbuf[32] = {0}; void *bootmem; int error; snprintf(tmpbuf, sizeof(tmpbuf), "%u", ff_global_cfg.freebsd.hz); error = kern_setenv("kern.hz", tmpbuf); if (error != 0) { panic("kern_setenv failed: kern.hz=%s\n", tmpbuf); } struct ff_freebsd_cfg *cur; cur = ff_global_cfg.freebsd.boot; while (cur) { error = kern_setenv(cur->name, cur->str); if (error != 0) { printf("kern_setenv failed: %s=%s\n", cur->name, cur->str); } cur = cur->next; } physmem = ff_global_cfg.freebsd.physmem; pcpup = malloc(sizeof(struct pcpu), M_DEVBUF, M_ZERO); pcpu_init(pcpup, 0, sizeof(struct pcpu)); CPU_SET(0, &all_cpus); ff_init_thread0(); boot_pages = 16; bootmem = (void *)kmem_malloc(NULL, boot_pages*PAGE_SIZE, M_ZERO); uma_startup(bootmem, boot_pages); uma_startup2(); num_hash_buckets = 8192; uma_page_slab_hash = (struct uma_page_head *)kmem_malloc(NULL, sizeof(struct uma_page)*num_hash_buckets, M_ZERO); uma_page_mask = num_hash_buckets - 1; mutex_init(); mi_startup(); sx_init(&proctree_lock, "proctree"); ff_fdused_range(ff_global_cfg.freebsd.fd_reserve); cur = ff_global_cfg.freebsd.sysctl; while (cur) { error = kernel_sysctlbyname(curthread, cur->name, NULL, NULL, cur->value, cur->vlen, NULL, 0); if (error != 0) { printf("kernel_sysctlbyname failed: %s=%s, error:%d\n", cur->name, cur->str, error); } cur = cur->next; } return (0); }