1a9643ea8Slogwang /*
2a9643ea8Slogwang * Copyright (c) 2010 Kip Macy. All rights reserved.
32317ada5Sfengbojiang * Copyright (C) 2017-2021 THL A29 Limited, a Tencent company.
4a9643ea8Slogwang * All rights reserved.
5a9643ea8Slogwang *
6a9643ea8Slogwang * Redistribution and use in source and binary forms, with or without
7a9643ea8Slogwang * modification, are permitted provided that the following conditions are met:
8a9643ea8Slogwang *
9a9643ea8Slogwang * 1. Redistributions of source code must retain the above copyright notice, this
10a9643ea8Slogwang * list of conditions and the following disclaimer.
11a9643ea8Slogwang * 2. Redistributions in binary form must reproduce the above copyright notice,
12a9643ea8Slogwang * this list of conditions and the following disclaimer in the documentation
13a9643ea8Slogwang * and/or other materials provided with the distribution.
14a9643ea8Slogwang *
15a9643ea8Slogwang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16a9643ea8Slogwang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17a9643ea8Slogwang * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18a9643ea8Slogwang * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19a9643ea8Slogwang * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20a9643ea8Slogwang * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21a9643ea8Slogwang * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22a9643ea8Slogwang * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23a9643ea8Slogwang * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24a9643ea8Slogwang * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25a9643ea8Slogwang *
26a9643ea8Slogwang * Derived in part from libplebnet's pn_compat.c.
27a9643ea8Slogwang *
28a9643ea8Slogwang */
29a9643ea8Slogwang
30a9643ea8Slogwang #include <sys/param.h>
31a9643ea8Slogwang #include <sys/kernel.h>
32a9643ea8Slogwang #include <sys/kthread.h>
33a9643ea8Slogwang #include <sys/refcount.h>
34a9643ea8Slogwang #include <sys/stat.h>
35a9643ea8Slogwang #include <sys/stdint.h>
36a9643ea8Slogwang #include <sys/time.h>
37a9643ea8Slogwang #include <sys/ucred.h>
38a9643ea8Slogwang #include <sys/uio.h>
39a9643ea8Slogwang #include <sys/proc.h>
40a9643ea8Slogwang #include <sys/tty.h>
41a9643ea8Slogwang #include <sys/sx.h>
42a9643ea8Slogwang #include <sys/linker.h>
43a9643ea8Slogwang #include <sys/racct.h>
44a9643ea8Slogwang #include <sys/malloc.h>
45a9643ea8Slogwang #include <sys/syscallsubr.h>
46a9643ea8Slogwang #include <sys/libkern.h>
47a9643ea8Slogwang #include <sys/random.h>
48a9643ea8Slogwang #include <sys/mman.h>
49a9643ea8Slogwang #include <sys/vdso.h>
50a9643ea8Slogwang
51a9643ea8Slogwang #include <machine/elf.h>
52a9643ea8Slogwang #include <machine/md_var.h>
53a9643ea8Slogwang
54a9643ea8Slogwang #include "ff_host_interface.h"
55a9643ea8Slogwang
56a9643ea8Slogwang TAILQ_HEAD(prisonlist, prison);
57a9643ea8Slogwang
58a9643ea8Slogwang __thread struct thread *pcurthread;
59a9643ea8Slogwang
60a9643ea8Slogwang struct cdev;
61a9643ea8Slogwang struct vnode *rootvnode;
62a9643ea8Slogwang extern struct proc proc0;
63a9643ea8Slogwang struct proclist allproc;
64a9643ea8Slogwang struct sx allproc_lock;
65a9643ea8Slogwang struct sx allprison_lock;
66a9643ea8Slogwang struct prisonlist allprison;
67a9643ea8Slogwang
68a9643ea8Slogwang MALLOC_DEFINE(M_FADVISE, "fadvise", "posix_fadvise(2) information");
69a9643ea8Slogwang int async_io_version;
70*c8e9b02cSdingyuan extern unsigned int rand_r(unsigned int *seed);
71*c8e9b02cSdingyuan unsigned int seed = 0;
72a9643ea8Slogwang
73a9643ea8Slogwang #define M_ZERO 0x0100 /* bzero the allocation */
74a9643ea8Slogwang
75a9643ea8Slogwang int vttoif_tab[10] = {
76a9643ea8Slogwang 0, S_IFREG, S_IFDIR, S_IFBLK, S_IFCHR, S_IFLNK,
77a9643ea8Slogwang S_IFSOCK, S_IFIFO, S_IFMT, S_IFMT
78a9643ea8Slogwang };
79a9643ea8Slogwang
80a9643ea8Slogwang void ff_init_thread0(void);
81a9643ea8Slogwang
82a9643ea8Slogwang void
resettodr(void)83a9643ea8Slogwang resettodr(void)
84a9643ea8Slogwang {
85a9643ea8Slogwang
86a9643ea8Slogwang }
87a9643ea8Slogwang
88a9643ea8Slogwang void
ff_init_thread0(void)89a9643ea8Slogwang ff_init_thread0(void)
90a9643ea8Slogwang {
91a9643ea8Slogwang pcurthread = &thread0;
92a9643ea8Slogwang }
93a9643ea8Slogwang
94a9643ea8Slogwang int
kproc_kthread_add(void (* start_routine)(void *),void * arg,struct proc ** p,struct thread ** tdp,int flags,int pages,const char * procname,const char * str,...)95a9643ea8Slogwang kproc_kthread_add(void (*start_routine)(void *), void *arg,
96a9643ea8Slogwang struct proc **p, struct thread **tdp,
97a9643ea8Slogwang int flags, int pages,
98a9643ea8Slogwang const char *procname, const char *str, ...)
99a9643ea8Slogwang {
100a9643ea8Slogwang return 0;
101a9643ea8Slogwang }
102a9643ea8Slogwang
103a9643ea8Slogwang int
kthread_add(void (* start_routine)(void *),void * arg,struct proc * p,struct thread ** tdp,int flags,int pages,const char * str,...)104a9643ea8Slogwang kthread_add(void (*start_routine)(void *), void *arg, struct proc *p,
105a9643ea8Slogwang struct thread **tdp, int flags, int pages,
106a9643ea8Slogwang const char *str, ...)
107a9643ea8Slogwang {
108a9643ea8Slogwang return 0;
109a9643ea8Slogwang }
110a9643ea8Slogwang
111a9643ea8Slogwang void
kthread_exit(void)112a9643ea8Slogwang kthread_exit(void)
113a9643ea8Slogwang {
114a9643ea8Slogwang panic("kthread_exit unsupported");
115a9643ea8Slogwang }
116a9643ea8Slogwang
117a9643ea8Slogwang void
tdsignal(struct thread * td,int sig)118a9643ea8Slogwang tdsignal(struct thread *td, int sig)
119a9643ea8Slogwang {
120a9643ea8Slogwang return;
121a9643ea8Slogwang }
122a9643ea8Slogwang
123a9643ea8Slogwang dev_t
tty_udev(struct tty * tp)124a9643ea8Slogwang tty_udev(struct tty *tp)
125a9643ea8Slogwang {
126a9643ea8Slogwang return (NODEV);
127a9643ea8Slogwang }
128a9643ea8Slogwang
129a9643ea8Slogwang int
p_candebug(struct thread * td,struct proc * p)130a9643ea8Slogwang p_candebug(struct thread *td, struct proc *p)
131a9643ea8Slogwang {
132a9643ea8Slogwang return (0);
133a9643ea8Slogwang }
134a9643ea8Slogwang
135a9643ea8Slogwang const char *
devtoname(struct cdev * dev)136a9643ea8Slogwang devtoname(struct cdev *dev)
137a9643ea8Slogwang {
138a9643ea8Slogwang return (NULL);
139a9643ea8Slogwang }
140a9643ea8Slogwang
141a9643ea8Slogwang #ifdef RACCT
142a9643ea8Slogwang uint64_t
racct_get_limit(struct proc * p,int resource)143a9643ea8Slogwang racct_get_limit(struct proc *p, int resource)
144a9643ea8Slogwang {
145a9643ea8Slogwang return (UINT64_MAX);
146a9643ea8Slogwang }
147a9643ea8Slogwang #endif
148a9643ea8Slogwang
149a9643ea8Slogwang int
kern_openat(struct thread * td,int fd,const char * path,enum uio_seg pathseg,int flags,int mode)15022ce4affSfengbojiang kern_openat(struct thread *td, int fd, const char *path, enum uio_seg pathseg,
151a9643ea8Slogwang int flags, int mode)
152a9643ea8Slogwang {
153a9643ea8Slogwang return (-1);
154a9643ea8Slogwang }
155a9643ea8Slogwang
156a9643ea8Slogwang /* Process one elf relocation with addend. */
157a9643ea8Slogwang static int
elf_reloc_internal(linker_file_t lf,Elf_Addr relocbase,const void * data,int type,int local,elf_lookup_fn lookup)158a9643ea8Slogwang elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data,
159a9643ea8Slogwang int type, int local, elf_lookup_fn lookup)
160a9643ea8Slogwang {
161a9643ea8Slogwang Elf64_Addr *where, val;
162a9643ea8Slogwang Elf32_Addr *where32, val32;
163a9643ea8Slogwang Elf_Addr addr;
164a9643ea8Slogwang Elf_Addr addend;
165a9643ea8Slogwang Elf_Size rtype, symidx;
166a9643ea8Slogwang const Elf_Rel *rel;
167a9643ea8Slogwang const Elf_Rela *rela;
168a9643ea8Slogwang int error;
169a9643ea8Slogwang
170a9643ea8Slogwang switch (type) {
171a9643ea8Slogwang case ELF_RELOC_REL:
172a9643ea8Slogwang rel = (const Elf_Rel *)data;
173a9643ea8Slogwang where = (Elf_Addr *) (relocbase + rel->r_offset);
174a9643ea8Slogwang rtype = ELF_R_TYPE(rel->r_info);
175a9643ea8Slogwang symidx = ELF_R_SYM(rel->r_info);
176a9643ea8Slogwang /* Addend is 32 bit on 32 bit relocs */
177a9643ea8Slogwang switch (rtype) {
178a9643ea8Slogwang case R_X86_64_PC32:
179a9643ea8Slogwang case R_X86_64_32S:
180a9643ea8Slogwang addend = *(Elf32_Addr *)where;
181a9643ea8Slogwang break;
182a9643ea8Slogwang default:
183a9643ea8Slogwang addend = *where;
184a9643ea8Slogwang break;
185a9643ea8Slogwang }
186a9643ea8Slogwang break;
187a9643ea8Slogwang case ELF_RELOC_RELA:
188a9643ea8Slogwang rela = (const Elf_Rela *)data;
189a9643ea8Slogwang where = (Elf_Addr *) (relocbase + rela->r_offset);
190a9643ea8Slogwang addend = rela->r_addend;
191a9643ea8Slogwang rtype = ELF_R_TYPE(rela->r_info);
192a9643ea8Slogwang symidx = ELF_R_SYM(rela->r_info);
193a9643ea8Slogwang break;
194a9643ea8Slogwang default:
195a9643ea8Slogwang panic("unknown reloc type %d\n", type);
196a9643ea8Slogwang }
197a9643ea8Slogwang
198a9643ea8Slogwang switch (rtype) {
199a9643ea8Slogwang case R_X86_64_NONE: /* none */
200a9643ea8Slogwang break;
201a9643ea8Slogwang
202a9643ea8Slogwang case R_X86_64_64: /* S + A */
203a9643ea8Slogwang error = lookup(lf, symidx, 1, &addr);
204a9643ea8Slogwang val = addr + addend;
205a9643ea8Slogwang if (error != 0)
206a9643ea8Slogwang return -1;
207a9643ea8Slogwang if (*where != val)
208a9643ea8Slogwang *where = val;
209a9643ea8Slogwang break;
210a9643ea8Slogwang
211a9643ea8Slogwang case R_X86_64_PC32: /* S + A - P */
212a9643ea8Slogwang error = lookup(lf, symidx, 1, &addr);
213a9643ea8Slogwang where32 = (Elf32_Addr *)where;
214a9643ea8Slogwang val32 = (Elf32_Addr)(addr + addend - (Elf_Addr)where);
215a9643ea8Slogwang if (error != 0)
216a9643ea8Slogwang return -1;
217a9643ea8Slogwang if (*where32 != val32)
218a9643ea8Slogwang *where32 = val32;
219a9643ea8Slogwang break;
220a9643ea8Slogwang
221a9643ea8Slogwang case R_X86_64_32S: /* S + A sign extend */
222a9643ea8Slogwang error = lookup(lf, symidx, 1, &addr);
223a9643ea8Slogwang val32 = (Elf32_Addr)(addr + addend);
224a9643ea8Slogwang where32 = (Elf32_Addr *)where;
225a9643ea8Slogwang if (error != 0)
226a9643ea8Slogwang return -1;
227a9643ea8Slogwang if (*where32 != val32)
228a9643ea8Slogwang *where32 = val32;
229a9643ea8Slogwang break;
230a9643ea8Slogwang
231a9643ea8Slogwang case R_X86_64_COPY: /* none */
232a9643ea8Slogwang /*
233a9643ea8Slogwang * There shouldn't be copy relocations in kernel
234a9643ea8Slogwang * objects.
235a9643ea8Slogwang */
236a9643ea8Slogwang printf("kldload: unexpected R_COPY relocation\n");
237a9643ea8Slogwang return -1;
238a9643ea8Slogwang break;
239a9643ea8Slogwang
240a9643ea8Slogwang case R_X86_64_GLOB_DAT: /* S */
241a9643ea8Slogwang case R_X86_64_JMP_SLOT: /* XXX need addend + offset */
242a9643ea8Slogwang error = lookup(lf, symidx, 1, &addr);
243a9643ea8Slogwang if (error != 0)
244a9643ea8Slogwang return -1;
245a9643ea8Slogwang if (*where != addr)
246a9643ea8Slogwang *where = addr;
247a9643ea8Slogwang break;
248a9643ea8Slogwang
249a9643ea8Slogwang case R_X86_64_RELATIVE: /* B + A */
250a9643ea8Slogwang addr = relocbase + addend;
251a9643ea8Slogwang val = addr;
252a9643ea8Slogwang if (*where != val)
253a9643ea8Slogwang *where = val;
254a9643ea8Slogwang break;
255a9643ea8Slogwang
256a9643ea8Slogwang default:
257a9643ea8Slogwang printf("kldload: unexpected relocation type %ld\n",
258a9643ea8Slogwang rtype);
259a9643ea8Slogwang return -1;
260a9643ea8Slogwang }
261a9643ea8Slogwang return(0);
262a9643ea8Slogwang }
263a9643ea8Slogwang
264a9643ea8Slogwang int
elf_reloc(linker_file_t lf,Elf_Addr relocbase,const void * data,int type,elf_lookup_fn lookup)265a9643ea8Slogwang elf_reloc(linker_file_t lf, Elf_Addr relocbase, const void *data, int type,
266a9643ea8Slogwang elf_lookup_fn lookup)
267a9643ea8Slogwang {
268a9643ea8Slogwang return (elf_reloc_internal(lf, relocbase, data, type, 0, lookup));
269a9643ea8Slogwang }
270a9643ea8Slogwang
271a9643ea8Slogwang int
elf_reloc_local(linker_file_t lf,Elf_Addr relocbase,const void * data,int type,elf_lookup_fn lookup)272a9643ea8Slogwang elf_reloc_local(linker_file_t lf, Elf_Addr relocbase, const void *data,
273a9643ea8Slogwang int type, elf_lookup_fn lookup)
274a9643ea8Slogwang {
275a9643ea8Slogwang return (elf_reloc_internal(lf, relocbase, data, type, 1, lookup));
276a9643ea8Slogwang }
277a9643ea8Slogwang
278a9643ea8Slogwang int
elf_cpu_load_file(linker_file_t lf __unused)279a9643ea8Slogwang elf_cpu_load_file(linker_file_t lf __unused)
280a9643ea8Slogwang {
281a9643ea8Slogwang return (0);
282a9643ea8Slogwang }
283a9643ea8Slogwang
284a9643ea8Slogwang int
elf_cpu_unload_file(linker_file_t lf __unused)285a9643ea8Slogwang elf_cpu_unload_file(linker_file_t lf __unused)
286a9643ea8Slogwang {
287a9643ea8Slogwang return (0);
288a9643ea8Slogwang }
289a9643ea8Slogwang
290a9643ea8Slogwang void
arc4rand(void * ptr,unsigned int len,int reseed)291a9643ea8Slogwang arc4rand(void *ptr, unsigned int len, int reseed)
292a9643ea8Slogwang {
293a9643ea8Slogwang ff_arc4rand(ptr, len, reseed);
294a9643ea8Slogwang }
295a9643ea8Slogwang
296a9643ea8Slogwang uint32_t
arc4random(void)297a9643ea8Slogwang arc4random(void)
298a9643ea8Slogwang {
299*c8e9b02cSdingyuan if (seed == 0) {
300*c8e9b02cSdingyuan seed = ff_arc4random();
301*c8e9b02cSdingyuan }
302*c8e9b02cSdingyuan return (uint32_t)rand_r(&seed);
303a9643ea8Slogwang }
304a9643ea8Slogwang
30522ce4affSfengbojiang #if 0
306a9643ea8Slogwang void
307a9643ea8Slogwang random_harvest_queue(const void *entropy, u_int size,
30822ce4affSfengbojiang enum random_entropy_source origin)
309a9643ea8Slogwang {
310a9643ea8Slogwang ;
311a9643ea8Slogwang }
31222ce4affSfengbojiang #endif
313a9643ea8Slogwang
31422ce4affSfengbojiang void
read_random(void * buf,u_int count)315a9643ea8Slogwang read_random(void *buf, u_int count)
316a9643ea8Slogwang {
317a9643ea8Slogwang arc4rand(buf, count, 0);
31822ce4affSfengbojiang }
31922ce4affSfengbojiang
32022ce4affSfengbojiang void
arc4random_buf(void * ptr,size_t len)32122ce4affSfengbojiang arc4random_buf(void *ptr, size_t len)
32222ce4affSfengbojiang {
32322ce4affSfengbojiang arc4rand(ptr, len, 0);
324a9643ea8Slogwang }
325a9643ea8Slogwang
326a9643ea8Slogwang int
fubyte(volatile const void * base)327a9643ea8Slogwang fubyte(volatile const void *base)
328a9643ea8Slogwang {
329a9643ea8Slogwang return (*(volatile const uint8_t *)base);
330a9643ea8Slogwang }
331a9643ea8Slogwang
33220a9422eSlogwang int
fueword(volatile const void * base,long * val)33320a9422eSlogwang fueword(volatile const void *base, long *val)
33420a9422eSlogwang {
33520a9422eSlogwang *val = (*(volatile const long *)base);
33620a9422eSlogwang return 0;
33720a9422eSlogwang }
33820a9422eSlogwang
339a9643ea8Slogwang void
timekeep_push_vdso(void)340a9643ea8Slogwang timekeep_push_vdso(void)
341a9643ea8Slogwang {
342a9643ea8Slogwang ;
343a9643ea8Slogwang }
344a9643ea8Slogwang
345a9643ea8Slogwang uint32_t
cpu_fill_vdso_timehands(struct vdso_timehands * vdso_th,struct timecounter * tc)346a9643ea8Slogwang cpu_fill_vdso_timehands(struct vdso_timehands *vdso_th, struct timecounter *tc)
347a9643ea8Slogwang {
348a9643ea8Slogwang return (0);
349a9643ea8Slogwang }
350a9643ea8Slogwang
351