mirror of https://github.com/F-Stack/f-stack.git
132 lines
3.9 KiB
C
132 lines
3.9 KiB
C
/*
|
|
* 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 <sys/cdefs.h>
|
|
#include <sys/param.h>
|
|
#include <sys/pcpu.h>
|
|
#include <sys/systm.h>
|
|
#include <sys/proc.h>
|
|
#include <sys/lock.h>
|
|
#include <sys/sx.h>
|
|
#include <sys/vmmeter.h>
|
|
#include <sys/cpuset.h>
|
|
#include <sys/sysctl.h>
|
|
#include <sys/filedesc.h>
|
|
|
|
#include <vm/uma.h>
|
|
#include <vm/uma_int.h>
|
|
#include <vm/vm.h>
|
|
#include <vm/vm_extern.h>
|
|
|
|
#include "ff_host_interface.h"
|
|
#include "ff_api.h"
|
|
#include "ff_config.h"
|
|
|
|
unsigned int sleep(unsigned int seconds);
|
|
|
|
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);
|
|
}
|