in progress commit (in syscall at do_fork)

This commit is contained in:
tehzz 2020-04-22 23:21:07 -04:00
parent b9997601e7
commit 49833bdadb
18 changed files with 1779 additions and 5017 deletions

View File

@ -134,8 +134,9 @@ endif #CONFIG_BSD_USER
ifdef CONFIG_DARWIN_USER ifdef CONFIG_DARWIN_USER
QEMU_CFLAGS+=-I$(SRC_PATH)/darwin-user -I$(SRC_PATH)/darwin-user/$(TARGET_ABI_DIR) \ QEMU_CFLAGS+=-I$(SRC_PATH)/darwin-user/$(TARGET_ABI_DIR) \
-I$(SRC_PATH)/darwin-user/$(HOST_VARIANT_DIR) -I$(SRC_PATH)/darwin-user/host/$(ARCH) \
-I$(SRC_PATH)/darwin-user
obj-y += darwin-user/ obj-y += darwin-user/
obj-y += gdbstub.o obj-y += gdbstub.o

View File

@ -430,7 +430,8 @@ static void page_init(void)
#else #else
FILE *f; FILE *f;
last_brk = (unsigned long)sbrk(0); // depreciated in osx, but value is not used?
//last_brk = (unsigned long)sbrk(0);
f = fopen("/compat/linux/proc/self/maps", "r"); f = fopen("/compat/linux/proc/self/maps", "r");
if (f) { if (f) {

View File

@ -244,6 +244,11 @@ int cpu_signal_handler(int host_signum, void *pinfo,
#define TRAP_sig(context) ((context)->sc_trapno) #define TRAP_sig(context) ((context)->sc_trapno)
#define ERROR_sig(context) ((context)->sc_err) #define ERROR_sig(context) ((context)->sc_err)
#define MASK_sig(context) ((context)->sc_mask) #define MASK_sig(context) ((context)->sc_mask)
#elif defined(__APPLE__)
#define PC_sig(context) ((context)->uc_mcontext->__ss.__rip)
#define TRAP_sig(context) ((context)->uc_mcontext->__es.__trapno)
#define ERROR_sig(context) ((context)->uc_mcontext->__es.__err)
#define MASK_sig(context) ((context)->uc_sigmask)
#elif defined(__FreeBSD__) || defined(__DragonFly__) #elif defined(__FreeBSD__) || defined(__DragonFly__)
#include <ucontext.h> #include <ucontext.h>

View File

@ -155,7 +155,7 @@
#define TARGET_EREMDEV 142 /* Error 142 */ #define TARGET_EREMDEV 142 /* Error 142 */
#define TARGET_ECANCELED 158 /* AIO operation canceled */ #define TARGET_ECANCELED 158 /* AIO operation canceled */
#else #else /* !(defined TARGET_ABI_IRIX || defined TARGET_ABI_SOLARIS) */
#define TARGET_EPERM 1 /* Operation not permitted */ #define TARGET_EPERM 1 /* Operation not permitted */
#define TARGET_ENOENT 2 /* No such file or directory */ #define TARGET_ENOENT 2 /* No such file or directory */
#define TARGET_ESRCH 3 /* No such process */ #define TARGET_ESRCH 3 /* No such process */
@ -294,7 +294,7 @@
#define TARGET_ERFKILL 132 /* Operation not possible due to RF-kill */ #define TARGET_ERFKILL 132 /* Operation not possible due to RF-kill */
#define TARGET_EHWPOISON 133 /* Memory page has hardware error */ #define TARGET_EHWPOISON 133 /* Memory page has hardware error */
#endif #endif /* defined TARGET_ABI_IRIX || defined TARGET_ABI_SOLARIS */
/* QEMU internal, not visible to the guest. This is returned when a /* QEMU internal, not visible to the guest. This is returned when a
* system call should be restarted, to tell the main loop that it * system call should be restarted, to tell the main loop that it

View File

@ -0,0 +1,40 @@
/*
* hostdep.h : things which are dependent on the host architecture
*
* * Written by Peter Maydell <peter.maydell@linaro.org>
*
* Copyright (C) 2016 Linaro Limited
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/
#ifndef X86_64_HOSTDEP_H
#define X86_64_HOSTDEP_H
/* Turn off safe-syscall for now ... */
// /* We have a safe-syscall.inc.S */
// #define HAVE_SAFE_SYSCALL
//
// #ifndef __ASSEMBLER__
//
// /* These are defined by the safe-syscall.inc.S file */
// extern char safe_syscall_start[];
// extern char safe_syscall_end[];
//
// /* Adjust the signal context to rewind out of safe-syscall if we're in it */
// static inline void rewind_if_in_safe_syscall(void *puc)
// {
// ucontext_t *uc = puc;
// greg_t *pcreg = &uc->uc_mcontext.gregs[REG_RIP];
//
// if (*pcreg > (uintptr_t)safe_syscall_start
// && *pcreg < (uintptr_t)safe_syscall_end) {
// *pcreg = (uintptr_t)safe_syscall_start;
// }
// }
//
// #endif /* __ASSEMBLER__ */
#endif

View File

@ -0,0 +1,91 @@
/*
* safe-syscall.inc.S : host-specific assembly fragment
* to handle signals occurring at the same time as system calls.
* This is intended to be included by linux-user/safe-syscall.S
*
* Copyright (C) 2015 Timothy Edward Baldwin <T.E.Baldwin99@members.leeds.ac.uk>
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/
.global safe_syscall_base
.global safe_syscall_start
.global safe_syscall_end
.type safe_syscall_base, @function
/* This is the entry point for making a system call. The calling
* convention here is that of a C varargs function with the
* first argument an 'int *' to the signal_pending flag, the
* second one the system call number (as a 'long'), and all further
* arguments being syscall arguments (also 'long').
* We return a long which is the syscall's return value, which
* may be negative-errno on failure. Conversion to the
* -1-and-errno-set convention is done by the calling wrapper.
*/
safe_syscall_base:
.cfi_startproc
/* This saves a frame pointer and aligns the stack for the syscall.
* (It's unclear if the syscall ABI has the same stack alignment
* requirements as the userspace function call ABI, but better safe than
* sorry. Appendix A2 of http://www.x86-64.org/documentation/abi.pdf
* does not list any ABI differences regarding stack alignment.)
*/
push %rbp
.cfi_adjust_cfa_offset 8
.cfi_rel_offset rbp, 0
/* The syscall calling convention isn't the same as the
* C one:
* we enter with rdi == *signal_pending
* rsi == syscall number
* rdx, rcx, r8, r9, (stack), (stack) == syscall arguments
* and return the result in rax
* and the syscall instruction needs
* rax == syscall number
* rdi, rsi, rdx, r10, r8, r9 == syscall arguments
* and returns the result in rax
* Shuffle everything around appropriately.
* Note that syscall will trash rcx and r11.
*/
mov %rsi, %rax /* syscall number */
mov %rdi, %rbp /* signal_pending pointer */
/* and the syscall arguments */
mov %rdx, %rdi
mov %rcx, %rsi
mov %r8, %rdx
mov %r9, %r10
mov 16(%rsp), %r8
mov 24(%rsp), %r9
/* This next sequence of code works in conjunction with the
* rewind_if_safe_syscall_function(). If a signal is taken
* and the interrupted PC is anywhere between 'safe_syscall_start'
* and 'safe_syscall_end' then we rewind it to 'safe_syscall_start'.
* The code sequence must therefore be able to cope with this, and
* the syscall instruction must be the final one in the sequence.
*/
safe_syscall_start:
/* if signal_pending is non-zero, don't do the call */
cmpl $0, (%rbp)
jnz 1f
syscall
safe_syscall_end:
/* code path for having successfully executed the syscall */
pop %rbp
.cfi_remember_state
.cfi_def_cfa_offset 8
.cfi_restore rbp
ret
1:
/* code path when we didn't execute the syscall */
.cfi_restore_state
mov $-TARGET_ERESTARTSYS, %rax
pop %rbp
.cfi_def_cfa_offset 8
.cfi_restore rbp
ret
.cfi_endproc
.size safe_syscall_base, .-safe_syscall_base

View File

@ -1,66 +1,71 @@
/* emulated ioctl list */ /* emulated ioctl list */
// https://stackoverflow.com/questions/41906713/is-there-a-way-to-determine-if-stdin-is-a-tty-through-a-system-call
// But in BSD flavors (as OS X) it is TIOCGETA, not TCGETS
// defined in 'sys/ttycom.h'
#ifdef TARGET_ABI_IRIX #ifdef TARGET_ABI_IRIX
IOCTL_MAP(TCNGETS, TCGETS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios))) IOCTL_MAP(TCNGETS, TIOCGETA, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL_MAP(TCNSETS, TCSETS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios))) IOCTL_MAP(TCNSETS, TIOCSETA, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL_MAP(TCNSETSF, TCSETSF, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios))) IOCTL_MAP(TCNSETSF, TIOCSETAF, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL_MAP(TCNSETSW, TCSETSW, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios))) IOCTL_MAP(TCNSETSW, TIOCSETAW, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
#endif #endif
// NOTE: the linux GETS takes *termios, while GETA takes *termio
IOCTL(TCGETS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios))) // darwin doesn't seem to have struct termio, so maybe convert if needed?
IOCTL(TCSETS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios))) IOCTL_MAP(TCGETS, TIOCGETA, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL(TCSETSF, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios))) IOCTL_MAP(TCSETS, TIOCSETA, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL(TCSETSW, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios))) IOCTL_MAP(TCSETSF, TIOCSETAF, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL_MAP(TCSETSW, TIOCSETAW, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL(TIOCGWINSZ, IOC_R, MK_PTR(MK_STRUCT(STRUCT_winsize))) IOCTL(TIOCGWINSZ, IOC_R, MK_PTR(MK_STRUCT(STRUCT_winsize)))
IOCTL(TIOCSWINSZ, IOC_W, MK_PTR(MK_STRUCT(STRUCT_winsize))) IOCTL(TIOCSWINSZ, IOC_W, MK_PTR(MK_STRUCT(STRUCT_winsize)))
IOCTL(FIONREAD, IOC_R, MK_PTR(TYPE_INT)) IOCTL(FIONREAD, IOC_R, MK_PTR(TYPE_INT))
IOCTL(TCGETA, IOC_R, MK_PTR(TYPE_INT)) IOCTL_MAP(TCGETA, TIOCGETA, IOC_R, MK_PTR(TYPE_INT))
IOCTL(TCSETA, IOC_W, MK_PTR(TYPE_INT)) IOCTL_MAP(TCSETA, TIOCSETA, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TCSETAW, IOC_W, MK_PTR(TYPE_INT)) IOCTL_MAP(TCSETAW, TIOCSETAW, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TCSETAF, IOC_W, MK_PTR(TYPE_INT)) IOCTL_MAP(TCSETAF, TIOCSETAF, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TCSBRK, 0, TYPE_INT) IOCTL_SPECIAL_MAP(TCSBRK, TIOCSBRK, 0, do_ioctl_tcsbrk, TYPE_INT) // tcsendbreak(fd, arg); these seem different than linux's?
IOCTL(TCSBRKP, 0, TYPE_INT) IOCTL_SPECIAL_MAP(TCSBRKP, TIOCSBRK, 0, do_ioctl_tcsbrk, TYPE_INT) // tcsendbreak(fd, arg) measured in deciseconds
IOCTL(TCXONC, 0, TYPE_INT) IOCTL_SPECIAL_MAP(TCXONC, 0, 0, do_ioctl_tcxonc, TYPE_INT) // Equivalent to tcflow(fd, arg)
IOCTL(TCFLSH, 0, TYPE_INT) IOCTL_SPECIAL_MAP(TCFLSH, 0, 0, do_ioctl_tcflsh, TYPE_INT) // Equivalent to tcflush(fd, arg)
IOCTL(TIOCEXCL, 0, TYPE_NULL) IOCTL(TIOCEXCL, 0, TYPE_NULL)
IOCTL(TIOCNXCL, 0, TYPE_NULL) IOCTL(TIOCNXCL, 0, TYPE_NULL)
IOCTL(TIOCSCTTY, 0, TYPE_INT) IOCTL(TIOCSCTTY, 0, TYPE_INT)
IOCTL(TIOCGPGRP, IOC_R, MK_PTR(TYPE_INT)) IOCTL(TIOCGPGRP, IOC_R, MK_PTR(TYPE_INT))
IOCTL(TIOCSPGRP, IOC_W, MK_PTR(TYPE_INT)) IOCTL(TIOCSPGRP, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCGSID, IOC_W, MK_PTR(TYPE_INT)) IOCTL_MAP(TIOCGSID, 0, IOC_W, MK_PTR(TYPE_INT)) // error out for now
IOCTL(TIOCOUTQ, IOC_R, MK_PTR(TYPE_INT)) IOCTL(TIOCOUTQ, IOC_R, MK_PTR(TYPE_INT))
IOCTL(TIOCSTI, IOC_W, MK_PTR(TYPE_INT)) IOCTL(TIOCSTI, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCMGET, IOC_R, MK_PTR(TYPE_INT)) IOCTL(TIOCMGET, IOC_R, MK_PTR(TYPE_INT))
IOCTL(TIOCMBIS, IOC_W, MK_PTR(TYPE_INT)) IOCTL(TIOCMBIS, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCMBIC, IOC_W, MK_PTR(TYPE_INT)) IOCTL(TIOCMBIC, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCMSET, IOC_W, MK_PTR(TYPE_INT)) IOCTL(TIOCMSET, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCGSOFTCAR, IOC_R, MK_PTR(TYPE_INT)) // IOCTL(TIOCGSOFTCAR, IOC_R, MK_PTR(TYPE_INT)) not actually defined in IRIX
IOCTL(TIOCSSOFTCAR, IOC_W, MK_PTR(TYPE_INT)) // IOCTL(TIOCSSOFTCAR, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCLINUX, IOC_R | IOC_W, MK_PTR(TYPE_INT)) // IOCTL(TIOCLINUX, IOC_R | IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCCONS, 0, TYPE_NULL) IOCTL(TIOCCONS, 0, TYPE_NULL)
IOCTL(TIOCGSERIAL, IOC_R, MK_PTR(TYPE_INT)) // IOCTL(TIOCGSERIAL, IOC_R, MK_PTR(TYPE_INT)) ibid
IOCTL(TIOCSSERIAL, IOC_W, MK_PTR(TYPE_INT)) // IOCTL(TIOCSSERIAL, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCPKT, IOC_W, MK_PTR(TYPE_INT)) IOCTL(TIOCPKT, IOC_W, MK_PTR(TYPE_INT))
IOCTL(FIONBIO, IOC_W, MK_PTR(TYPE_INT)) IOCTL(FIONBIO, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCNOTTY, 0, TYPE_NULL) IOCTL(TIOCNOTTY, 0, TYPE_NULL)
IOCTL(TIOCGETD, IOC_R, MK_PTR(TYPE_INT)) IOCTL(TIOCGETD, IOC_R, MK_PTR(TYPE_INT))
IOCTL(TIOCSETD, IOC_W, MK_PTR(TYPE_INT)) IOCTL(TIOCSETD, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCGPTN, IOC_R, MK_PTR(TYPE_INT)) IOCTL_MAP(TIOCGPTN, 0, IOC_R, MK_PTR(TYPE_INT)) // error out for now
IOCTL(TIOCSPTLCK, IOC_W, MK_PTR(TYPE_INT)) IOCTL_MAP(TIOCSPTLCK, 0, IOC_W, MK_PTR(TYPE_INT)) // error out for now
#if defined TIOCGPTPEER && defined TARGET_TIOCGPTPEER #if defined TIOCGPTPEER && defined TARGET_TIOCGPTPEER
IOCTL_SPECIAL(TIOCGPTPEER, 0, do_ioctl_tiocgptpeer, TYPE_INT) IOCTL_SPECIAL(TIOCGPTPEER, 0, do_ioctl_tiocgptpeer, TYPE_INT)
#endif #endif
IOCTL(FIOCLEX, 0, TYPE_NULL) IOCTL(FIOCLEX, 0, TYPE_NULL)
IOCTL(FIONCLEX, 0, TYPE_NULL) IOCTL(FIONCLEX, 0, TYPE_NULL)
IOCTL(FIOASYNC, IOC_W, MK_PTR(TYPE_INT)) IOCTL(FIOASYNC, IOC_W, MK_PTR(TYPE_INT))
IOCTL(TIOCGLCKTRMIOS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios))) // None of these are in Irix, so don't worry..
IOCTL(TIOCSLCKTRMIOS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios))) // IOCTL(TIOCGLCKTRMIOS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL(TIOCSERCONFIG, 0, TYPE_NULL) // IOCTL(TIOCSLCKTRMIOS, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios)))
IOCTL(TIOCSERGETLSR, IOC_R, MK_PTR(TYPE_INT)) // IOCTL(TIOCSERCONFIG, 0, TYPE_NULL)
IOCTL(TIOCSERGETMULTI, IOC_R, MK_PTR(MK_STRUCT(STRUCT_serial_multiport_struct))) // IOCTL(TIOCSERGETLSR, IOC_R, MK_PTR(TYPE_INT))
IOCTL(TIOCSERSETMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_serial_multiport_struct))) // IOCTL(TIOCSERGETMULTI, IOC_R, MK_PTR(MK_STRUCT(STRUCT_serial_multiport_struct)))
IOCTL(TIOCMIWAIT, 0, TYPE_INT) // IOCTL(TIOCSERSETMULTI, IOC_W, MK_PTR(MK_STRUCT(STRUCT_serial_multiport_struct)))
IOCTL(TIOCGICOUNT, IOC_R, MK_PTR(MK_STRUCT(STRUCT_serial_icounter_struct))) // IOCTL(TIOCMIWAIT, 0, TYPE_INT)
// IOCTL(TIOCGICOUNT, IOC_R, MK_PTR(MK_STRUCT(STRUCT_serial_icounter_struct)))
#if !defined(TARGET_ABI_IRIX) && !defined(TARGET_ABI_SOLARIS) #if !defined(TARGET_ABI_IRIX) && !defined(TARGET_ABI_SOLARIS)
IOCTL(KIOCSOUND, 0, TYPE_INT) IOCTL(KIOCSOUND, 0, TYPE_INT)
@ -137,6 +142,8 @@
#endif #endif
#endif #endif
// don't look to be in indy dump...
#ifndef TARGET_ABI_IRIX
IOCTL(FS_IOC_GETFLAGS, IOC_R, MK_PTR(TYPE_INT)) IOCTL(FS_IOC_GETFLAGS, IOC_R, MK_PTR(TYPE_INT))
IOCTL(FS_IOC_SETFLAGS, IOC_W, MK_PTR(TYPE_INT)) IOCTL(FS_IOC_SETFLAGS, IOC_W, MK_PTR(TYPE_INT))
@ -184,6 +191,8 @@
IOCTL(SIOCGPGRP, IOC_R, MK_PTR(TYPE_INT)) /* pid_t */ IOCTL(SIOCGPGRP, IOC_R, MK_PTR(TYPE_INT)) /* pid_t */
IOCTL(SIOCGSTAMP, IOC_R, MK_PTR(MK_STRUCT(STRUCT_timeval))) IOCTL(SIOCGSTAMP, IOC_R, MK_PTR(MK_STRUCT(STRUCT_timeval)))
IOCTL(SIOCGSTAMPNS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_timespec))) IOCTL(SIOCGSTAMPNS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_timespec)))
#endif
#ifdef TARGET_ABI_IRIX #ifdef TARGET_ABI_IRIX
IOCTL_MAP(SIOCNREAD, FIONREAD, IOC_R, MK_PTR(TYPE_INT)) IOCTL_MAP(SIOCNREAD, FIONREAD, IOC_R, MK_PTR(TYPE_INT))
#endif #endif

View File

@ -0,0 +1,19 @@
/* Irix resource limit values from sys/resource.h
* included in syscall_defs.h
* */
#define TARGET_RLIMIT_CPU 0 /* cpu time in milliseconds */
#define TARGET_RLIMIT_FSIZE 1 /* maximum file size */
#define TARGET_RLIMIT_DATA 2 /* data size */
#define TARGET_RLIMIT_STACK 3 /* stack size */
#define TARGET_RLIMIT_CORE 4 /* core file size */
#define TARGET_RLIMIT_NOFILE 5 /* file descriptors */
#define TARGET_RLIMIT_VMEM 6 /* maximum mapped memory */
#define TARGET_RLIMIT_RSS 7 /* resident set size */
#define TARGET_RLIMIT_AS TARGET_RLIMIT_VMEM
#define TARGETRLIM_NLIMITS 8 /* number of resource limits */
// TODO: set these according to bits in long (32 vs 64)?
#define TARGET_RLIM_INFINITY 0x7fffffff
#define TARGET_RLIM64_INFINITY 0x7fffffffffffffffull

View File

@ -1,6 +1,8 @@
#ifndef IRIX_TARGET_SYSCALL_H #ifndef IRIX_TARGET_SYSCALL_H
#define IRIX_TARGET_SYSCALL_H #define IRIX_TARGET_SYSCALL_H
#include "cpu.h"
/* this struct defines the way the registers are stored on the /* this struct defines the way the registers are stored on the
stack during a system call. */ stack during a system call. */
@ -27,4 +29,30 @@ static inline abi_ulong target_shmlba(CPUMIPSState *env)
return 0x40000; return 0x40000;
} }
/* IRIX sys/types.h */
typedef uint32_t target_ino_t;
typedef abi_long target_off_t;
/* IRIX sys/dirent.h */
struct target_dirent {
target_ino_t d_ino;
target_off_t d_off;
abi_ushort d_reclen;
char d_name[1];
};
/* size of struct target_dirent without the name array */
#define target_dirent_len (offsetof(struct target_dirent, d_name));
/* IRIX sys/types.h */
typedef uint64_t target_ino64_t;
typedef uint64_t target_off64_t;
/* IRIX sys/dirent.h */
struct target_dirent64 {
target_ino64_t d_ino;
target_off64_t d_off;
abi_ushort d_reclen;
char d_name[1];
};
#endif #endif

View File

@ -14,6 +14,13 @@ struct target_termios {
unsigned char c_cc[TARGET_NCCS]; /* control characters */ unsigned char c_cc[TARGET_NCCS]; /* control characters */
}; };
struct target_winsize {
abi_ushort ws_row; /* rows, in characters*/
abi_ushort ws_col; /* columns, in character */
abi_ushort ws_xpixel; /* horizontal size, pixels */
abi_ushort ws_ypixel; /* vertical size, pixels */
};
/* c_iflag bits */ /* c_iflag bits */
#define TARGET_IGNBRK 0000001 #define TARGET_IGNBRK 0000001
#define TARGET_BRKINT 0000002 #define TARGET_BRKINT 0000002
@ -199,8 +206,8 @@ struct target_termios {
#define TARGET_TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ #define TARGET_TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */
#define TARGET_TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ #define TARGET_TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */
/* #define TIOCPKT_IOCTL 0x40 state change of pty driver */ /* #define TIOCPKT_IOCTL 0x40 state change of pty driver */
#define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct winsize) /* set window size */ #define TARGET_TIOCSWINSZ TARGET_IOW('t', 103, struct target_winsize) /* set window size */
#define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct winsize) /* get window size */ #define TARGET_TIOCGWINSZ TARGET_IOR('t', 104, struct target_winsize) /* get window size */
#define TARGET_TIOCNOTTY 0x5471 /* void tty association */ #define TARGET_TIOCNOTTY 0x5471 /* void tty association */
#define TARGET_TIOCSETD 0x7401 #define TARGET_TIOCSETD 0x7401
#define TARGET_TIOCGETD 0x7400 #define TARGET_TIOCGETD 0x7400

File diff suppressed because it is too large Load Diff

View File

@ -500,7 +500,7 @@ static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
((hptr), (x)), (void)0) ((hptr), (x)), (void)0)
#define __get_user_e(x, hptr, e) \ #define __get_user_e(x, hptr, e) \
((x) = (typeof(*hptr))( \ ((x) = (__typeof__(*(hptr)))( \
__builtin_choose_expr(sizeof(*(hptr)) == 1, ldub_p, \ __builtin_choose_expr(sizeof(*(hptr)) == 1, ldub_p, \
__builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \ __builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \
__builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \ __builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \

File diff suppressed because it is too large Load Diff

View File

@ -389,23 +389,6 @@ struct kernel_statfs {
int f_spare[6]; int f_spare[6];
}; };
struct target_dirent {
abi_long d_ino;
abi_long d_off;
unsigned short d_reclen;
char d_name[];
};
struct target_dirent64 {
uint64_t d_ino;
int64_t d_off;
unsigned short d_reclen;
#if !defined TARGET_ABI_IRIX && !defined TARGET_ABI_SOLARIS
unsigned char d_type;
#endif
char d_name[256];
};
/* mostly generic signal stuff */ /* mostly generic signal stuff */
#define TARGET_SIG_DFL ((abi_long)0) /* default signal handling */ #define TARGET_SIG_DFL ((abi_long)0) /* default signal handling */
@ -1004,54 +987,56 @@ struct target_rlimit {
abi_ulong rlim_max; abi_ulong rlim_max;
}; };
#if defined(TARGET_ALPHA) #include "syscall_rlimit.h"
#define TARGET_RLIM_INFINITY 0x7fffffffffffffffull
#elif defined(TARGET_MIPS) || (defined(TARGET_SPARC) && TARGET_ABI_BITS == 32)
#define TARGET_RLIM_INFINITY 0x7fffffffUL
#define TARGET_RLIM64_INFINITY 0x7fffffffffffffffull
#else
#define TARGET_RLIM_INFINITY ((abi_ulong)-1)
#define TARGET_RLIM64_INFINITY ((uint64_t)-1)
#endif
#if defined(TARGET_MIPS) || defined(TARGET_ABI_SOLARIS) // #if defined(TARGET_ALPHA)
#define TARGET_RLIMIT_CPU 0 // #define TARGET_RLIM_INFINITY 0x7fffffffffffffffull
#define TARGET_RLIMIT_FSIZE 1 // #elif defined(TARGET_MIPS) || (defined(TARGET_SPARC) && TARGET_ABI_BITS == 32)
#define TARGET_RLIMIT_DATA 2 // #define TARGET_RLIM_INFINITY 0x7fffffffUL
#define TARGET_RLIMIT_STACK 3 // #define TARGET_RLIM64_INFINITY 0x7fffffffffffffffull
#define TARGET_RLIMIT_CORE 4 // #else
#define TARGET_RLIMIT_RSS 7 // #define TARGET_RLIM_INFINITY ((abi_ulong)-1)
#define TARGET_RLIMIT_NPROC 8 // #define TARGET_RLIM64_INFINITY ((uint64_t)-1)
#define TARGET_RLIMIT_NOFILE 5 // #endif
#define TARGET_RLIMIT_MEMLOCK 9 //
#define TARGET_RLIMIT_AS 6 // #if defined(TARGET_MIPS) || defined(TARGET_ABI_SOLARIS)
#define TARGET_RLIMIT_LOCKS 10 // #define TARGET_RLIMIT_CPU 0
#define TARGET_RLIMIT_SIGPENDING 11 // #define TARGET_RLIMIT_FSIZE 1
#define TARGET_RLIMIT_MSGQUEUE 12 // #define TARGET_RLIMIT_DATA 2
#define TARGET_RLIMIT_NICE 13 // #define TARGET_RLIMIT_STACK 3
#define TARGET_RLIMIT_RTPRIO 14 // #define TARGET_RLIMIT_CORE 4
#else // #define TARGET_RLIMIT_RSS 7
#define TARGET_RLIMIT_CPU 0 // #define TARGET_RLIMIT_NPROC 8
#define TARGET_RLIMIT_FSIZE 1 // #define TARGET_RLIMIT_NOFILE 5
#define TARGET_RLIMIT_DATA 2 // #define TARGET_RLIMIT_MEMLOCK 9
#define TARGET_RLIMIT_STACK 3 // #define TARGET_RLIMIT_AS 6
#define TARGET_RLIMIT_CORE 4 // #define TARGET_RLIMIT_LOCKS 10
#define TARGET_RLIMIT_RSS 5 // #define TARGET_RLIMIT_SIGPENDING 11
#if defined(TARGET_SPARC) // #define TARGET_RLIMIT_MSGQUEUE 12
#define TARGET_RLIMIT_NOFILE 6 // #define TARGET_RLIMIT_NICE 13
#define TARGET_RLIMIT_NPROC 7 // #define TARGET_RLIMIT_RTPRIO 14
#else // #else
#define TARGET_RLIMIT_NPROC 6 // #define TARGET_RLIMIT_CPU 0
#define TARGET_RLIMIT_NOFILE 7 // #define TARGET_RLIMIT_FSIZE 1
#endif // #define TARGET_RLIMIT_DATA 2
#define TARGET_RLIMIT_MEMLOCK 8 // #define TARGET_RLIMIT_STACK 3
#define TARGET_RLIMIT_AS 9 // #define TARGET_RLIMIT_CORE 4
#define TARGET_RLIMIT_LOCKS 10 // #define TARGET_RLIMIT_RSS 5
#define TARGET_RLIMIT_SIGPENDING 11 // #if defined(TARGET_SPARC)
#define TARGET_RLIMIT_MSGQUEUE 12 // #define TARGET_RLIMIT_NOFILE 6
#define TARGET_RLIMIT_NICE 13 // #define TARGET_RLIMIT_NPROC 7
#define TARGET_RLIMIT_RTPRIO 14 // #else
#endif // #define TARGET_RLIMIT_NPROC 6
// #define TARGET_RLIMIT_NOFILE 7
// #endif
// #define TARGET_RLIMIT_MEMLOCK 8
// #define TARGET_RLIMIT_AS 9
// #define TARGET_RLIMIT_LOCKS 10
// #define TARGET_RLIMIT_SIGPENDING 11
// #define TARGET_RLIMIT_MSGQUEUE 12
// #define TARGET_RLIMIT_NICE 13
// #define TARGET_RLIMIT_RTPRIO 14
// #endif
struct target_pollfd { struct target_pollfd {
int fd; /* file descriptor */ int fd; /* file descriptor */
@ -1400,13 +1385,6 @@ struct target_termio {
unsigned char c_cc[TARGET_NCC]; /* control characters */ unsigned char c_cc[TARGET_NCC]; /* control characters */
}; };
struct target_winsize {
unsigned short ws_row;
unsigned short ws_col;
unsigned short ws_xpixel;
unsigned short ws_ypixel;
};
#include "termbits.h" #include "termbits.h"
#if defined(TARGET_MIPS) #if defined(TARGET_MIPS)
@ -2541,6 +2519,8 @@ struct target_statfs64 {
uint64_t f_files; uint64_t f_files;
uint64_t f_ffree; uint64_t f_ffree;
uint64_t f_bavail; uint64_t f_bavail;
/* Linux specials */
target_fsid_t f_fsid; target_fsid_t f_fsid;
uint32_t f_namelen; uint32_t f_namelen;
uint32_t f_spare[6]; uint32_t f_spare[6];

View File

@ -30,8 +30,9 @@ STRUCT(ifmap,
/* Spare 3 bytes */ /* Spare 3 bytes */
TYPE_CHAR, TYPE_CHAR, TYPE_CHAR) TYPE_CHAR, TYPE_CHAR, TYPE_CHAR)
/* Remove if structs for darwing */
/* The *_ifreq_list arrays deal with the fact that struct ifreq has unions */ /* The *_ifreq_list arrays deal with the fact that struct ifreq has unions */
/*
STRUCT(sockaddr_ifreq, STRUCT(sockaddr_ifreq,
MK_ARRAY(TYPE_CHAR, IFNAMSIZ), MK_STRUCT(STRUCT_sockaddr)) MK_ARRAY(TYPE_CHAR, IFNAMSIZ), MK_STRUCT(STRUCT_sockaddr))
@ -53,13 +54,13 @@ STRUCT(ptr_ifreq,
STRUCT(ifconf, STRUCT(ifconf,
TYPE_INT, TYPE_PTRVOID) TYPE_INT, TYPE_PTRVOID)
STRUCT(arpreq, STRUCT(arpreq,
MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), TYPE_INT, MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), TYPE_INT, MK_STRUCT(STRUCT_sockaddr),
MK_ARRAY(TYPE_CHAR, 16)) MK_ARRAY(TYPE_CHAR, 16))
STRUCT(arpreq_old, STRUCT(arpreq_old,
MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), TYPE_INT, MK_STRUCT(STRUCT_sockaddr)) MK_STRUCT(STRUCT_sockaddr), MK_STRUCT(STRUCT_sockaddr), TYPE_INT, MK_STRUCT(STRUCT_sockaddr))
*/
STRUCT(cdrom_read_audio, STRUCT(cdrom_read_audio,
TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_INT, TYPE_PTRVOID, TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_CHAR, TYPE_INT, TYPE_PTRVOID,
@ -254,15 +255,16 @@ STRUCT(fiemap,
TYPE_INT, /* fm_extent_count */ TYPE_INT, /* fm_extent_count */
TYPE_INT) /* fm_reserved */ TYPE_INT) /* fm_reserved */
STRUCT(blkpg_partition, // Removed; not needed for Irix
TYPE_LONGLONG, /* start */ // STRUCT(blkpg_partition,
TYPE_LONGLONG, /* length */ // TYPE_LONGLONG, /* start */
TYPE_INT, /* pno */ // TYPE_LONGLONG, /* length */
MK_ARRAY(TYPE_CHAR, BLKPG_DEVNAMELTH), /* devname */ // TYPE_INT, /* pno */
MK_ARRAY(TYPE_CHAR, BLKPG_VOLNAMELTH)) /* volname */ // MK_ARRAY(TYPE_CHAR, BLKPG_DEVNAMELTH), /* devname */
// MK_ARRAY(TYPE_CHAR, BLKPG_VOLNAMELTH)) /* volname */
STRUCT(blkpg_ioctl_arg, // STRUCT(blkpg_ioctl_arg,
TYPE_INT, /* op */ // TYPE_INT, /* op */
TYPE_INT, /* flags */ // TYPE_INT, /* flags */
TYPE_INT, /* datalen */ // TYPE_INT, /* datalen */
TYPE_PTRVOID) /* data */ // TYPE_PTRVOID) /* data */

View File

@ -72,33 +72,24 @@ const char *cpu_to_uname_machine(void *cpu_env)
#define COPY_UTSNAME_FIELD(dest, src) \ #define COPY_UTSNAME_FIELD(dest, src) \
do { \ do { \
/* __NEW_UTS_LEN doesn't include terminating null */ \ /* _SYS_NAMELEN does include terminating null */ \
(void) strncpy((dest), (src), __NEW_UTS_LEN); \ (void) strncpy((dest), (src), _SYS_NAMELEN); \
(dest)[__NEW_UTS_LEN] = '\0'; \
} while (0) } while (0)
int sys_uname(struct new_utsname *buf) int sys_uname(struct utsname *buf)
{ {
struct utsname uts_buf; struct utsname uts_buf;
if (uname(&uts_buf) < 0) if (uname(&uts_buf) < 0)
return (-1); return (-1);
/* /* Just in case these have some differences */
* Just in case these have some differences, we
* translate utsname to new_utsname (which is the
* struct linux kernel uses).
*/
memset(buf, 0, sizeof(*buf)); memset(buf, 0, sizeof(*buf));
COPY_UTSNAME_FIELD(buf->sysname, uts_buf.sysname); COPY_UTSNAME_FIELD(buf->sysname, uts_buf.sysname);
COPY_UTSNAME_FIELD(buf->nodename, uts_buf.nodename); COPY_UTSNAME_FIELD(buf->nodename, uts_buf.nodename);
COPY_UTSNAME_FIELD(buf->release, uts_buf.release); COPY_UTSNAME_FIELD(buf->release, uts_buf.release);
COPY_UTSNAME_FIELD(buf->version, uts_buf.version); COPY_UTSNAME_FIELD(buf->version, uts_buf.version);
COPY_UTSNAME_FIELD(buf->machine, uts_buf.machine); COPY_UTSNAME_FIELD(buf->machine, uts_buf.machine);
#ifdef _GNU_SOURCE
COPY_UTSNAME_FIELD(buf->domainname, uts_buf.domainname);
#endif
return (0); return (0);
#undef COPY_UTSNAME_FIELD #undef COPY_UTSNAME_FIELD

View File

@ -2,9 +2,8 @@
#define UNAME_H #define UNAME_H
#include <sys/utsname.h> #include <sys/utsname.h>
#include <linux/utsname.h>
const char *cpu_to_uname_machine(void *cpu_env); const char *cpu_to_uname_machine(void *cpu_env);
int sys_uname(struct new_utsname *buf); int sys_uname(struct utsname *buf);
#endif /* UNAME_H */ #endif /* UNAME_H */