diff --git a/stand/kboot/host_syscall.h b/stand/kboot/host_syscall.h index f6f22a736d53..b7861e1af6f1 100644 --- a/stand/kboot/host_syscall.h +++ b/stand/kboot/host_syscall.h @@ -1,61 +1,73 @@ /*- * Copyright (C) 2014 Nathan Whitehorn * 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 AUTHOR ``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 TOOLS GMBH 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. * * $FreeBSD$ */ #ifndef _HOST_SYSCALL_H #define _HOST_SYSCALL_H #include long host_syscall(int number, ...); -ssize_t host_read(int fd, void *buf, size_t nbyte); -ssize_t host_write(int fd, const void *buf, size_t nbyte); -int host_open(const char *path, int flags, int mode); -ssize_t host_llseek(int fd, int32_t offset_high, int32_t offset_lo, uint64_t *result, int whence); -int host_close(int fd); -void *host_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t off); -#define host_getmem(size) host_mmap(0, size, 3 /* RW */, 0x22 /* ANON */, -1, 0); +/* + * Data types + */ struct old_utsname { char sysname[65]; char nodename[65]; char release[65]; char version[65]; char machine[65]; }; -int host_uname(struct old_utsname *); + struct host_timeval { time_t tv_sec; long tv_usec; }; + +/* + * System Calls + */ +int host_close(int fd); +int host_getdents(int fd, void *dirp, int count); int host_gettimeofday(struct host_timeval *a, void *b); -int host_select(int nfds, long *readfds, long *writefds, long *exceptfds, - struct host_timeval *timeout); int kexec_load(uint32_t start, int nsegs, uint32_t segs); +ssize_t host_llseek(int fd, int32_t offset_high, int32_t offset_lo, uint64_t *result, int whence); +void *host_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t off); +int host_open(const char *path, int flags, int mode); +ssize_t host_read(int fd, void *buf, size_t nbyte); int host_reboot(int, int, int, uintptr_t); -int host_getdents(int fd, void *dirp, int count); +int host_select(int nfds, long *readfds, long *writefds, long *exceptfds, + struct host_timeval *timeout); +int host_uname(struct old_utsname *); +ssize_t host_write(int fd, const void *buf, size_t nbyte); + +/* + * Wrappers / one-liners + */ +#define host_getmem(size) host_mmap(0, size, 3 /* RW */, 0x22 /* ANON */, -1, 0); #endif diff --git a/stand/kboot/host_syscalls.c b/stand/kboot/host_syscalls.c index fd14095d7d68..3a5cdd7d8ea4 100644 --- a/stand/kboot/host_syscalls.c +++ b/stand/kboot/host_syscalls.c @@ -1,86 +1,91 @@ #include "host_syscall.h" #include "syscall_nr.h" #include -ssize_t -host_read(int fd, void *buf, size_t nbyte) +/* + * Various trivial wrappers for Linux system calls. Please keep sorted + * alphabetically. + */ + +int +host_close(int fd) { - return host_syscall(SYS_read, fd, (uintptr_t)buf, nbyte); - /* XXX original overrode errors */ + return host_syscall(SYS_close, fd); } -ssize_t -host_write(int fd, const void *buf, size_t nbyte) +int +host_getdents(int fd, void *dirp, int count) { - return host_syscall(SYS_write, fd, (uintptr_t)buf, nbyte); + return host_syscall(SYS_getdents, fd, (uintptr_t)dirp, count); } - + int -host_open(const char *path, int flags, int mode) +host_gettimeofday(struct host_timeval *a, void *b) { - return host_syscall(SYS_open, (uintptr_t)path, flags, mode); - /* XXX original overrode errors */ + return host_syscall(SYS_gettimeofday, (uintptr_t)a, (uintptr_t)b); +} + +int +kexec_load(uint32_t start, int nsegs, uint32_t segs) +{ + return host_syscall(SYS_kexec_load, start, nsegs, segs, KEXEC_ARCH << 16); } ssize_t host_llseek(int fd, int32_t offset_high, int32_t offset_lo, uint64_t *result, int whence) { #ifdef SYS_llseek return host_syscall(SYS_llseek, fd, offset_high, offset_lo, (uintptr_t)result, whence); #else int64_t rv = host_syscall(SYS_lseek, fd, (int64_t)((uint64_t)offset_high << 32 | (uint32_t)offset_lo), whence); if (rv > 0) *result = (uint64_t)rv; return (rv); #endif } -int -host_close(int fd) -{ - return host_syscall(SYS_close, fd); -} - void * host_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t off) { return (void *)host_syscall(SYS_mmap, (uintptr_t)addr, len, prot, flags, fd, off); } int -host_uname(struct old_utsname *uts) +host_open(const char *path, int flags, int mode) { - return host_syscall(SYS_uname, (uintptr_t)uts); + return host_syscall(SYS_open, (uintptr_t)path, flags, mode); + /* XXX original overrode errors */ } -int -host_gettimeofday(struct host_timeval *a, void *b) +ssize_t +host_read(int fd, void *buf, size_t nbyte) { - return host_syscall(SYS_gettimeofday, (uintptr_t)a, (uintptr_t)b); + return host_syscall(SYS_read, fd, (uintptr_t)buf, nbyte); + /* XXX original overrode errors */ } int -host_select(int nfds, long *readfds, long *writefds, long *exceptfds, - struct host_timeval *timeout) +host_reboot(int magic1, int magic2, int cmd, uintptr_t arg) { - return host_syscall(SYS_select, nfds, (uintptr_t)readfds, (uintptr_t)writefds, (uintptr_t)exceptfds, (uintptr_t)timeout, 0); + return host_syscall(SYS_reboot, magic1, magic2, cmd, arg); } int -kexec_load(uint32_t start, int nsegs, uint32_t segs) +host_select(int nfds, long *readfds, long *writefds, long *exceptfds, + struct host_timeval *timeout) { - return host_syscall(SYS_kexec_load, start, nsegs, segs, KEXEC_ARCH << 16); + return host_syscall(SYS_select, nfds, (uintptr_t)readfds, (uintptr_t)writefds, (uintptr_t)exceptfds, (uintptr_t)timeout, 0); } int -host_reboot(int magic1, int magic2, int cmd, uintptr_t arg) +host_uname(struct old_utsname *uts) { - return host_syscall(SYS_reboot, magic1, magic2, cmd, arg); + return host_syscall(SYS_uname, (uintptr_t)uts); } -int -host_getdents(int fd, void *dirp, int count) +ssize_t +host_write(int fd, const void *buf, size_t nbyte) { - return host_syscall(SYS_getdents, fd, (uintptr_t)dirp, count); + return host_syscall(SYS_write, fd, (uintptr_t)buf, nbyte); }