PERFORCE change 124342 for review
Maxim Zhuravlev
thioretic at FreeBSD.org
Mon Jul 30 10:34:56 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=124342
Change 124342 by thioretic at thioretic on 2007/07/30 10:34:47
IFC
Affected files ...
.. //depot/projects/soc2007/thioretic_gidl/amd64/isa/clock.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_machdep.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_proto.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_syscall.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_sysent.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_sysvec.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/amd64/linux32/syscalls.master#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linprocfs/linprocfs.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linux/linux_file.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linux/linux_getcwd.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linux/linux_misc.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linux/linux_signal.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linux/linux_signal.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linux/linux_socket.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linux/linux_stats.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/compat/linux/linux_uid16.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/conf/NOTES#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/conf/files#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/conf/options#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/contrib/pf/net/pf.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/contrib/pf/net/pf_norm.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/acpica/acpi_hpet.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/ata/ata-all.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/ata/ata-chipset.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/ata/ata-disk.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/bce/if_bce.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/firewire/firewire.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/ixgb/if_ixgb.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/kbdmux/kbdmux.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/msk/if_msk.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/msk/if_mskreg.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/nge/if_nge.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/re/if_re.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/rp/rp.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/sound/pci/hda/hdac.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/sound/pci/hda/hdac_private.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/sound/pci/ich.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/sound/pcm/ac97_patch.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/sound/pcm/dsp.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/speaker/spkr.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/stge/if_stge.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/txp/if_txp.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/dev/vge/if_vge.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/fs/msdosfs/msdosfs_vfsops.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/fs/msdosfs/msdosfs_vnops.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/fs/ntfs/ntfs_subr.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/fs/ntfs/ntfs_subr.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/fs/ntfs/ntfs_vnops.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/fs/udf/udf_vnops.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/gnu/fs/ext2fs/ext2_vfsops.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/cpufreq/smist.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/isa/clock.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/linux/imgact_linux.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/linux/linux.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/linux/linux_machdep.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/linux/linux_proto.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/linux/linux_syscall.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/linux/linux_sysent.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/linux/linux_sysvec.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/i386/linux/syscalls.master#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/kern/kern_descrip.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/kern/kern_exec.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/kern/kern_fork.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/kern/kern_resource.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/modules/acpi/Makefile#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/modules/acpi/acpi/Makefile#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/modules/acpi/acpi_video/Makefile#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/modules/i2c/controllers/alpm/Makefile#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/modules/i2c/controllers/viapm/Makefile#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/modules/msdosfs/Makefile#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/net/bridgestp.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/net/ieee8023ad_lacp.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/net/ieee8023ad_lacp.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/net/if.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/net/if_lagg.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/net/if_lagg.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/net/if_tap.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/net/if_var.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netgraph/ng_l2tp.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netgraph/ng_mppc.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netgraph/ng_nat.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netgraph/ng_nat.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netgraph/ng_ppp.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netgraph/ng_pptpgre.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netinet/in.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netinet/in_var.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/netinet/tcp_hostcache.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/nfsclient/nfs_bio.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/nfsclient/nfs_socket.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/pci/if_rlreg.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/pci/if_ste.c#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/sys/socketvar.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/sys/syscallsubr.h#2 integrate
.. //depot/projects/soc2007/thioretic_gidl/ufs/ffs/ffs_vnops.c#2 integrate
Differences ...
==== //depot/projects/soc2007/thioretic_gidl/amd64/isa/clock.c#2 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/isa/clock.c,v 1.221.2.1 2005/07/18 19:52:04 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/isa/clock.c,v 1.221.2.2 2007/06/29 21:05:27 jhb Exp $");
/*
* Routines to handle clock hardware.
@@ -61,6 +61,7 @@
#include <sys/kernel.h>
#include <sys/limits.h>
#include <sys/module.h>
+#include <sys/sched.h>
#include <sys/sysctl.h>
#include <sys/cons.h>
#include <sys/power.h>
@@ -269,7 +270,21 @@
int getit_calls = 1;
int n1;
static int state = 0;
+#endif
+ if (tsc_freq != 0 && !tsc_is_broken) {
+ uint64_t start, end, now;
+
+ sched_pin();
+ start = rdtsc();
+ end = start + (tsc_freq * n) / 1000000;
+ do {
+ now = rdtsc();
+ } while (now < end || (now > start && end < start));
+ sched_unpin();
+ return;
+ }
+#ifdef DELAYDEBUG
if (state == 0) {
state = 1;
for (n1 = 1; n1 <= 10000000; n1 *= 10)
==== //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux.h#2 (text+ko) ====
@@ -8,7 +8,7 @@
* 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
+ * notice, this list of conditions and the following disclaimer
* in this position and unchanged.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
@@ -27,13 +27,11 @@
* (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: src/sys/amd64/linux32/linux.h,v 1.1 2004/08/16 07:55:06 tjr Exp $
+ * $FreeBSD: src/sys/amd64/linux32/linux.h,v 1.1.8.3 2007/07/08 12:20:35 netchild Exp $
*/
-#ifndef _AMD64_LINUX_LINUX_H_
-#define _AMD64_LINUX_LINUX_H_
-
-#include <sys/signal.h> /* for sigval union */
+#ifndef _AMD64_LINUX_H_
+#define _AMD64_LINUX_H_
#include <amd64/linux32/linux32_syscall.h>
@@ -41,20 +39,20 @@
* debugging support
*/
extern u_char linux_debug_map[];
-#define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
-#define ARGS(nm, fmt) "linux(%ld): "#nm"("fmt")\n", (long)td->td_proc->p_pid
-#define LMSG(fmt) "linux(%ld): "fmt"\n", (long)td->td_proc->p_pid
+#define ldebug(name) isclr(linux_debug_map, LINUX_SYS_linux_ ## name)
+#define ARGS(nm, fmt) "linux(%ld): "#nm"("fmt")\n", (long)td->td_proc->p_pid
+#define LMSG(fmt) "linux(%ld): "fmt"\n", (long)td->td_proc->p_pid
#ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_LINUX);
#endif
-#define LINUX32_USRSTACK ((1ul << 32) - PAGE_SIZE)
+#define LINUX32_USRSTACK ((1ul << 32) - PAGE_SIZE)
/* XXX 16 = sizeof(linux32_ps_strings) */
-#define LINUX32_PS_STRINGS (LINUX32_USRSTACK - 16)
-#define LINUX32_MAXDSIZ (512*1024*1024) /* 512MB */
-#define LINUX32_MAXSSIZ (64*1024*1024) /* 64MB */
-#define LINUX32_MAXVMEM 0 /* Unlimited */
+#define LINUX32_PS_STRINGS (LINUX32_USRSTACK - 16)
+#define LINUX32_MAXDSIZ (512 * 1024 * 1024) /* 512MB */
+#define LINUX32_MAXSSIZ (64 * 1024 * 1024) /* 64MB */
+#define LINUX32_MAXVMEM 0 /* Unlimited */
#define PTRIN(v) (void *)(uintptr_t)(v)
#define PTROUT(v) (l_uintptr_t)(uintptr_t)(v)
@@ -134,7 +132,7 @@
#define LINUX_RLIMIT_NPROC 6
#define LINUX_RLIMIT_NOFILE 7
#define LINUX_RLIMIT_MEMLOCK 8
-#define LINUX_RLIMIT_AS 9 /* address space limit */
+#define LINUX_RLIMIT_AS 9 /* Address space limit */
#define LINUX_RLIM_NLIMITS 10
@@ -169,12 +167,21 @@
#define LINUX_MAP_ANON 0x0020
#define LINUX_MAP_GROWSDOWN 0x0100
+struct l_mmap_argv {
+ l_uintptr_t addr;
+ l_size_t len;
+ l_int prot;
+ l_int flags;
+ l_int fd;
+ l_off_t pgoff;
+} __packed;
+
/*
* stat family of syscalls
*/
struct l_timespec {
- l_ulong tv_sec;
- l_ulong tv_nsec;
+ l_time_t tv_sec;
+ l_long tv_nsec;
} __packed;
struct l_newstat {
@@ -197,6 +204,24 @@
l_ulong __unused5;
} __packed;
+struct l_stat {
+ l_ushort st_dev;
+ l_ulong st_ino;
+ l_ushort st_mode;
+ l_ushort st_nlink;
+ l_ushort st_uid;
+ l_ushort st_gid;
+ l_ushort st_rdev;
+ l_long st_size;
+ struct l_timespec st_atimespec;
+ struct l_timespec st_mtimespec;
+ struct l_timespec st_ctimespec;
+ l_long st_blksize;
+ l_long st_blocks;
+ l_ulong st_flags;
+ l_ulong st_gen;
+};
+
struct l_stat64 {
l_ushort st_dev;
u_char __pad0[10];
@@ -290,9 +315,9 @@
#define LINUX_SIGADDSET(set, sig) SIGADDSET(set, sig)
/* sigaltstack */
-#define LINUX_MINSIGSTKSZ 2048
-#define LINUX_SS_ONSTACK 1
-#define LINUX_SS_DISABLE 2
+#define LINUX_MINSIGSTKSZ 2048
+#define LINUX_SS_ONSTACK 1
+#define LINUX_SS_DISABLE 2
int linux_to_bsd_sigaltstack(int lsa);
int bsd_to_linux_sigaltstack(int bsa);
@@ -355,11 +380,16 @@
l_uintptr_t uc_link;
l_stack_t uc_stack;
struct l_sigcontext uc_mcontext;
- l_sigset_t uc_sigmask;
+ l_sigset_t uc_sigmask;
} __packed;
-#define LINUX_SI_MAX_SIZE 128
-#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
+#define LINUX_SI_MAX_SIZE 128
+#define LINUX_SI_PAD_SIZE ((LINUX_SI_MAX_SIZE/sizeof(l_int)) - 3)
+
+union l_sigval {
+ l_int sival_int;
+ l_uintptr_t sival_ptr;
+};
typedef struct l_siginfo {
l_int lsi_signo;
@@ -381,7 +411,7 @@
struct {
l_pid_t _pid; /* sender's pid */
l_uid16_t _uid; /* sender's uid */
- union sigval _sigval;
+ union l_sigval _sigval;
} __packed _rt;
struct {
@@ -393,41 +423,41 @@
} __packed _sigchld;
struct {
- l_uintptr_t _addr; /* faulting insn/memory ref. */
+ l_uintptr_t _addr; /* Faulting insn/memory ref. */
} __packed _sigfault;
struct {
- l_int _band; /* POLL_IN,POLL_OUT,POLL_MSG */
+ l_int _band; /* POLL_IN,POLL_OUT,POLL_MSG */
l_int _fd;
} __packed _sigpoll;
} _sifields;
} __packed l_siginfo_t;
-#define lsi_pid _sifields._kill._pid
-#define lsi_uid _sifields._kill._uid
-#define lsi_status _sifields._sigchld._status
-#define lsi_utime _sifields._sigchld._utime
-#define lsi_stime _sifields._sigchld._stime
-#define lsi_value _sifields._rt._sigval
-#define lsi_int _sifields._rt._sigval.sival_int
-#define lsi_ptr _sifields._rt._sigval.sival_ptr
-#define lsi_addr _sifields._sigfault._addr
-#define lsi_band _sifields._sigpoll._band
-#define lsi_fd _sifields._sigpoll._fd
+#define lsi_pid _sifields._kill._pid
+#define lsi_uid _sifields._kill._uid
+#define lsi_status _sifields._sigchld._status
+#define lsi_utime _sifields._sigchld._utime
+#define lsi_stime _sifields._sigchld._stime
+#define lsi_value _sifields._rt._sigval
+#define lsi_int _sifields._rt._sigval.sival_int
+#define lsi_ptr _sifields._rt._sigval.sival_ptr
+#define lsi_addr _sifields._sigfault._addr
+#define lsi_band _sifields._sigpoll._band
+#define lsi_fd _sifields._sigpoll._fd
struct l_fpreg {
- u_int16_t significand[4];
- u_int16_t exponent;
+ u_int16_t significand[4];
+ u_int16_t exponent;
} __packed;
struct l_fpxreg {
- u_int16_t significand[4];
- u_int16_t exponent;
- u_int16_t padding[3];
+ u_int16_t significand[4];
+ u_int16_t exponent;
+ u_int16_t padding[3];
} __packed;
struct l_xmmreg {
- u_int32_t element[4];
+ u_int32_t element[4];
} __packed;
struct l_fpstate {
@@ -441,13 +471,13 @@
u_int32_t datasel;
struct l_fpreg _st[8];
u_int16_t status;
- u_int16_t magic; /* 0xffff = regular FPU data */
+ u_int16_t magic; /* 0xffff = regular FPU data */
/* FXSR FPU environment */
- u_int32_t _fxsr_env[6]; /* env is ignored */
+ u_int32_t _fxsr_env[6]; /* env is ignored. */
u_int32_t mxcsr;
u_int32_t reserved;
- struct l_fpxreg _fxsr_st[8]; /* reg data is ignored */
+ struct l_fpxreg _fxsr_st[8]; /* reg data is ignored. */
struct l_xmmreg _xmm[8];
u_int32_t padding[56];
} __packed;
@@ -497,18 +527,24 @@
/*
* open/fcntl flags
*/
-#define LINUX_O_RDONLY 00
-#define LINUX_O_WRONLY 01
-#define LINUX_O_RDWR 02
-#define LINUX_O_CREAT 0100
-#define LINUX_O_EXCL 0200
-#define LINUX_O_NOCTTY 0400
-#define LINUX_O_TRUNC 01000
-#define LINUX_O_APPEND 02000
-#define LINUX_O_NONBLOCK 04000
+#define LINUX_O_RDONLY 00000000
+#define LINUX_O_WRONLY 00000001
+#define LINUX_O_RDWR 00000002
+#define LINUX_O_ACCMODE 00000003
+#define LINUX_O_CREAT 00000100
+#define LINUX_O_EXCL 00000200
+#define LINUX_O_NOCTTY 00000400
+#define LINUX_O_TRUNC 00001000
+#define LINUX_O_APPEND 00002000
+#define LINUX_O_NONBLOCK 00004000
#define LINUX_O_NDELAY LINUX_O_NONBLOCK
-#define LINUX_O_SYNC 010000
-#define LINUX_FASYNC 020000
+#define LINUX_O_SYNC 00010000
+#define LINUX_FASYNC 00020000
+#define LINUX_O_DIRECT 00040000 /* Direct disk access hint */
+#define LINUX_O_LARGEFILE 00100000
+#define LINUX_O_DIRECTORY 00200000 /* Must be a directory */
+#define LINUX_O_NOFOLLOW 00400000 /* Do not follow links */
+#define LINUX_O_NOATIME 01000000
#define LINUX_F_DUPFD 0
#define LINUX_F_GETFD 1
@@ -529,15 +565,17 @@
#define LINUX_F_WRLCK 1
#define LINUX_F_UNLCK 2
+#define LINUX_AT_FDCWD -100
+
/*
* mount flags
*/
-#define LINUX_MS_RDONLY 0x0001
-#define LINUX_MS_NOSUID 0x0002
-#define LINUX_MS_NODEV 0x0004
-#define LINUX_MS_NOEXEC 0x0008
-#define LINUX_MS_REMOUNT 0x0020
-
+#define LINUX_MS_RDONLY 0x0001
+#define LINUX_MS_NOSUID 0x0002
+#define LINUX_MS_NODEV 0x0004
+#define LINUX_MS_NOEXEC 0x0008
+#define LINUX_MS_REMOUNT 0x0020
+
/*
* SystemV IPC defines
*/
@@ -635,6 +673,13 @@
#define LINUX_SO_NO_CHECK 11
#define LINUX_SO_PRIORITY 12
#define LINUX_SO_LINGER 13
+#define LINUX_SO_PEERCRED 17
+#define LINUX_SO_RCVLOWAT 18
+#define LINUX_SO_SNDLOWAT 19
+#define LINUX_SO_RCVTIMEO 20
+#define LINUX_SO_SNDTIMEO 21
+#define LINUX_SO_TIMESTAMP 29
+#define LINUX_SO_ACCEPTCONN 30
#define LINUX_IP_TOS 1
#define LINUX_IP_TTL 2
@@ -684,7 +729,7 @@
} ifr_ifru;
} __packed;
-#define ifr_name ifr_ifrn.ifrn_name /* interface name */
+#define ifr_name ifr_ifrn.ifrn_name /* Interface name */
#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
struct l_ifconf {
@@ -719,4 +764,11 @@
l_short revents;
} __packed;
+#define LINUX_CLOCK_REALTIME 0
+#define LINUX_CLOCK_MONOTONIC 1
+#define LINUX_CLOCK_PROCESS_CPUTIME_ID 2
+#define LINUX_CLOCK_THREAD_CPUTIME_ID 3
+#define LINUX_CLOCK_REALTIME_HR 4
+#define LINUX_CLOCK_MONOTONIC_HR 5
+
#endif /* !_AMD64_LINUX_LINUX_H_ */
==== //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_machdep.c#2 (text+ko) ====
@@ -29,11 +29,13 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_machdep.c,v 1.10 2005/06/24 17:41:27 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_machdep.c,v 1.10.2.2 2007/07/08 12:20:35 netchild Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/systm.h>
+#include <sys/file.h>
+#include <sys/fcntl.h>
#include <sys/imgact.h>
#include <sys/lock.h>
#include <sys/malloc.h>
@@ -47,6 +49,7 @@
#include <sys/unistd.h>
#include <machine/frame.h>
+#include <machine/psl.h>
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -113,7 +116,7 @@
* Allocate temporary demand zeroed space for argument and
* environment strings
*/
- args->buf = (char *) kmem_alloc_wait(exec_map,
+ args->buf = (char *)kmem_alloc_wait(exec_map,
PATH_MAX + ARG_MAX + MAXSHELLCMDLEN);
if (args->buf == NULL)
return (ENOMEM);
@@ -130,7 +133,7 @@
copystr(fname, args->fname, PATH_MAX, &length) :
copyinstr(fname, args->fname, PATH_MAX, &length);
if (error != 0)
- return (error);
+ goto err_exit;
/*
* extract arguments first
@@ -139,22 +142,22 @@
for (;;) {
error = copyin(p32++, &arg, sizeof(arg));
if (error)
- return (error);
+ goto err_exit;
if (arg == 0)
break;
argp = PTRIN(arg);
error = copyinstr(argp, args->endp, args->stringspace, &length);
if (error) {
if (error == ENAMETOOLONG)
- return (E2BIG);
- else
- return (error);
+ error = E2BIG;
+
+ goto err_exit;
}
args->stringspace -= length;
args->endp += length;
args->argc++;
}
-
+
args->begin_envv = args->endp;
/*
@@ -165,7 +168,7 @@
for (;;) {
error = copyin(p32++, &arg, sizeof(arg));
if (error)
- return (error);
+ goto err_exit;
if (arg == 0)
break;
envp = PTRIN(arg);
@@ -173,9 +176,8 @@
&length);
if (error) {
if (error == ENAMETOOLONG)
- return (E2BIG);
- else
- return (error);
+ error = E2BIG;
+ goto err_exit;
}
args->stringspace -= length;
args->endp += length;
@@ -184,6 +186,12 @@
}
return (0);
+
+err_exit:
+ kmem_free_wakeup(exec_map, (vm_offset_t)args->buf,
+ PATH_MAX + ARG_MAX + MAXSHELLCMDLEN);
+ args->buf = NULL;
+ return (error);
}
int
@@ -229,7 +237,7 @@
if (iovcnt > UIO_MAXIOV)
return (EINVAL);
iovlen = iovcnt * sizeof(struct iovec);
- uio = malloc(iovlen + sizeof *uio, M_IOV, M_WAITOK);
+ uio = malloc(iovlen + sizeof(*uio), M_IOV, M_WAITOK);
iov = (struct iovec *)(uio + 1);
for (i = 0; i < iovcnt; i++) {
error = copyin(&iovp[i], &iov32, sizeof(struct iovec32));
@@ -539,16 +547,6 @@
return (0);
}
-/* XXX move */
-struct l_mmap_argv {
- l_ulong addr;
- l_ulong len;
- l_ulong prot;
- l_ulong flags;
- l_ulong fd;
- l_ulong pgoff;
-};
-
#define STACK_SIZE (2 * 1024 * 1024)
#define GUARD_SIZE (4 * PAGE_SIZE)
@@ -561,8 +559,8 @@
#ifdef DEBUG
if (ldebug(mmap2))
- printf(ARGS(mmap2, "%p, %d, %d, 0x%08x, %d, %d"),
- (void *)(intptr_t)args->addr, args->len, args->prot,
+ printf(ARGS(mmap2, "0x%08x, %d, %d, 0x%08x, %d, %d"),
+ args->addr, args->len, args->prot,
args->flags, args->fd, args->pgoff);
#endif
@@ -588,10 +586,9 @@
#ifdef DEBUG
if (ldebug(mmap))
- printf(ARGS(mmap, "%p, %d, %d, 0x%08x, %d, %d"),
- (void *)(intptr_t)linux_args.addr, linux_args.len,
- linux_args.prot, linux_args.flags, linux_args.fd,
- linux_args.pgoff);
+ printf(ARGS(mmap, "0x%08x, %d, %d, 0x%08x, %d, %d"),
+ linux_args.addr, linux_args.len, linux_args.prot,
+ linux_args.flags, linux_args.fd, linux_args.pgoff);
#endif
if ((linux_args.pgoff % PAGE_SIZE) != 0)
return (EINVAL);
@@ -614,9 +611,20 @@
off_t pos;
} */ bsd_args;
int error;
+ struct file *fp;
error = 0;
bsd_args.flags = 0;
+ fp = NULL;
+
+ /*
+ * Linux mmap(2):
+ * You must specify exactly one of MAP_SHARED and MAP_PRIVATE
+ */
+ if (! ((linux_args->flags & LINUX_MAP_SHARED) ^
+ (linux_args->flags & LINUX_MAP_PRIVATE)))
+ return (EINVAL);
+
if (linux_args->flags & LINUX_MAP_SHARED)
bsd_args.flags |= MAP_SHARED;
if (linux_args->flags & LINUX_MAP_PRIVATE)
@@ -627,23 +635,60 @@
bsd_args.flags |= MAP_ANON;
else
bsd_args.flags |= MAP_NOSYNC;
- if (linux_args->flags & LINUX_MAP_GROWSDOWN) {
+ if (linux_args->flags & LINUX_MAP_GROWSDOWN)
bsd_args.flags |= MAP_STACK;
- /* The linux MAP_GROWSDOWN option does not limit auto
+ /*
+ * PROT_READ, PROT_WRITE, or PROT_EXEC implies PROT_READ and PROT_EXEC
+ * on Linux/i386. We do this to ensure maximum compatibility.
+ * Linux/ia64 does the same in i386 emulation mode.
+ */
+ bsd_args.prot = linux_args->prot;
+ if (bsd_args.prot & (PROT_READ | PROT_WRITE | PROT_EXEC))
+ bsd_args.prot |= PROT_READ | PROT_EXEC;
+
+ /* Linux does not check file descriptor when MAP_ANONYMOUS is set. */
+ bsd_args.fd = (bsd_args.flags & MAP_ANON) ? -1 : linux_args->fd;
+ if (bsd_args.fd != -1) {
+ /*
+ * Linux follows Solaris mmap(2) description:
+ * The file descriptor fildes is opened with
+ * read permission, regardless of the
+ * protection options specified.
+ */
+
+ if ((error = fget(td, bsd_args.fd, &fp)) != 0)
+ return (error);
+ if (fp->f_type != DTYPE_VNODE) {
+ fdrop(fp, td);
+ return (EINVAL);
+ }
+
+ /* Linux mmap() just fails for O_WRONLY files */
+ if (!(fp->f_flag & FREAD)) {
+ fdrop(fp, td);
+ return (EACCES);
+ }
+
+ fdrop(fp, td);
+ }
+
+ if (linux_args->flags & LINUX_MAP_GROWSDOWN) {
+ /*
+ * The Linux MAP_GROWSDOWN option does not limit auto
* growth of the region. Linux mmap with this option
* takes as addr the inital BOS, and as len, the initial
* region size. It can then grow down from addr without
- * limit. However, linux threads has an implicit internal
+ * limit. However, Linux threads has an implicit internal
* limit to stack size of STACK_SIZE. Its just not
- * enforced explicitly in linux. But, here we impose
+ * enforced explicitly in Linux. But, here we impose
* a limit of (STACK_SIZE - GUARD_SIZE) on the stack
* region, since we can do this with our mmap.
*
* Our mmap with MAP_STACK takes addr as the maximum
* downsize limit on BOS, and as len the max size of
- * the region. It them maps the top SGROWSIZ bytes,
- * and autgrows the region down, up to the limit
+ * the region. It then maps the top SGROWSIZ bytes,
+ * and auto grows the region down, up to the limit
* in addr.
*
* If we don't use the MAP_STACK option, the effect
@@ -651,13 +696,10 @@
* fixed size of (STACK_SIZE - GUARD_SIZE).
*/
- /* This gives us TOS */
- bsd_args.addr = (caddr_t)PTRIN(linux_args->addr) +
- linux_args->len;
-
- if ((caddr_t)PTRIN(bsd_args.addr) >
+ if ((caddr_t)PTRIN(linux_args->addr) + linux_args->len >
p->p_vmspace->vm_maxsaddr) {
- /* Some linux apps will attempt to mmap
+ /*
+ * Some Linux apps will attempt to mmap
* thread stacks near the top of their
* address space. If their TOS is greater
* than vm_maxsaddr, vm_map_growstack()
@@ -673,8 +715,7 @@
* mmap's return value.
*/
PROC_LOCK(p);
- p->p_vmspace->vm_maxsaddr =
- (char *)LINUX32_USRSTACK -
+ p->p_vmspace->vm_maxsaddr = (char *)LINUX32_USRSTACK -
lim_cur(p, RLIMIT_STACK);
PROC_UNLOCK(p);
}
@@ -685,28 +726,19 @@
else
bsd_args.len = STACK_SIZE - GUARD_SIZE;
- /* This gives us a new BOS. If we're using VM_STACK, then
+ /*
+ * This gives us a new BOS. If we're using VM_STACK, then
* mmap will just map the top SGROWSIZ bytes, and let
* the stack grow down to the limit at BOS. If we're
* not using VM_STACK we map the full stack, since we
* don't have a way to autogrow it.
*/
- bsd_args.addr -= bsd_args.len;
+ bsd_args.addr = (caddr_t)PTRIN(linux_args->addr) -
+ bsd_args.len;
} else {
bsd_args.addr = (caddr_t)PTRIN(linux_args->addr);
bsd_args.len = linux_args->len;
}
- /*
- * XXX i386 Linux always emulator forces PROT_READ on (why?)
- * so we do the same. We add PROT_EXEC to work around buggy
- * applications (e.g. Java) that take advantage of the fact
- * that execute permissions are not enforced by x86 CPUs.
- */
- bsd_args.prot = linux_args->prot | PROT_EXEC | PROT_READ;
- if (linux_args->flags & LINUX_MAP_ANON)
- bsd_args.fd = -1;
- else
- bsd_args.fd = linux_args->fd;
bsd_args.pos = (off_t)linux_args->pgoff * PAGE_SIZE;
bsd_args.pad = 0;
@@ -727,6 +759,36 @@
}
int
+linux_mprotect(struct thread *td, struct linux_mprotect_args *uap)
+{
+ struct mprotect_args bsd_args;
+
+ bsd_args.addr = uap->addr;
+ bsd_args.len = uap->len;
+ bsd_args.prot = uap->prot;
+ if (bsd_args.prot & (PROT_READ | PROT_WRITE | PROT_EXEC))
+ bsd_args.prot |= PROT_READ | PROT_EXEC;
+ return (mprotect(td, &bsd_args));
+}
+
+int
+linux_iopl(struct thread *td, struct linux_iopl_args *args)
+{
+ int error;
+
+ if (args->level < 0 || args->level > 3)
+ return (EINVAL);
+ if ((error = suser(td)) != 0)
+ return (error);
+ if ((error = securelevel_gt(td->td_ucred, 0)) != 0)
+ return (error);
+ td->td_frame->tf_rflags = (td->td_frame->tf_rflags & ~PSL_IOPL) |
+ (args->level * (PSL_IOPL / 3));
+
+ return (0);
+}
+
+int
linux_pipe(struct thread *td, struct linux_pipe_args *args)
{
int pip[2];
@@ -797,7 +859,7 @@
}
/*
- * Linux has two extra args, restart and oldmask. We dont use these,
+ * Linux has two extra args, restart and oldmask. We don't use these,
* but it seems that "restart" is actually a context pointer that
* enables the signal to happen with a different register set.
*/
@@ -1002,16 +1064,3 @@
return (copyout(&ts32, uap->interval, sizeof(ts32)));
}
-int
-linux_mprotect(struct thread *td, struct linux_mprotect_args *uap)
-{
- struct mprotect_args bsd_args;
-
- bsd_args.addr = uap->addr;
- bsd_args.len = uap->len;
- bsd_args.prot = uap->prot;
- /* XXX PROT_READ implies PROT_EXEC; see linux_mmap_common(). */
- if ((bsd_args.prot & PROT_READ) != 0)
- bsd_args.prot |= PROT_EXEC;
- return (mprotect(td, &bsd_args));
-}
==== //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_proto.h#2 (text+ko) ====
@@ -2,8 +2,8 @@
* System call prototypes.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.5.2.1 2005/07/20 17:43:52 jhb Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.1 2005/07/20 17:42:14 jhb Exp
+ * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.5.2.2 2007/07/08 12:23:37 netchild Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.2 2007/07/08 12:20:35 netchild Exp
*/
#ifndef _LINUX_SYSPROTO_H_
@@ -323,6 +323,9 @@
struct linux_uname_args {
register_t dummy;
};
+struct linux_iopl_args {
+ char level_l_[PADL_(l_ulong)]; l_ulong level; char level_r_[PADR_(l_ulong)];
+};
struct linux_vhangup_args {
register_t dummy;
};
@@ -765,6 +768,7 @@
int linux_newlstat(struct thread *, struct linux_newlstat_args *);
int linux_newfstat(struct thread *, struct linux_newfstat_args *);
int linux_uname(struct thread *, struct linux_uname_args *);
+int linux_iopl(struct thread *, struct linux_iopl_args *);
int linux_vhangup(struct thread *, struct linux_vhangup_args *);
int linux_wait4(struct thread *, struct linux_wait4_args *);
int linux_swapoff(struct thread *, struct linux_swapoff_args *);
==== //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_syscall.h#2 (text+ko) ====
@@ -2,8 +2,8 @@
* System call numbers.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.5.2.1 2005/07/20 17:43:52 jhb Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.1 2005/07/20 17:42:14 jhb Exp
+ * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.5.2.2 2007/07/08 12:23:37 netchild Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.2 2007/07/08 12:20:35 netchild Exp
*/
#define LINUX_SYS_exit 1
@@ -101,6 +101,7 @@
#define LINUX_SYS_linux_newlstat 107
#define LINUX_SYS_linux_newfstat 108
#define LINUX_SYS_linux_uname 109
+#define LINUX_SYS_linux_iopl 110
#define LINUX_SYS_linux_vhangup 111
#define LINUX_SYS_linux_wait4 114
#define LINUX_SYS_linux_swapoff 115
==== //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_sysent.c#2 (text+ko) ====
@@ -2,8 +2,8 @@
* System call switch table.
*
* DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.5.2.1 2005/07/20 17:43:52 jhb Exp $
- * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.1 2005/07/20 17:42:14 jhb Exp
+ * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.5.2.2 2007/07/08 12:23:37 netchild Exp $
+ * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.2 2007/07/08 12:20:35 netchild Exp
*/
#include <bsm/audit_kevents.h>
@@ -130,7 +130,7 @@
{ SYF_MPSAFE | AS(linux_newlstat_args), (sy_call_t *)linux_newlstat, AUE_NULL }, /* 107 = linux_newlstat */
{ SYF_MPSAFE | AS(linux_newfstat_args), (sy_call_t *)linux_newfstat, AUE_NULL }, /* 108 = linux_newfstat */
{ SYF_MPSAFE | 0, (sy_call_t *)linux_uname, AUE_NULL }, /* 109 = linux_uname */
- { 0, (sy_call_t *)nosys, AUE_NULL }, /* 110 = iopl */
+ { SYF_MPSAFE | AS(linux_iopl_args), (sy_call_t *)linux_iopl, AUE_NULL }, /* 110 = linux_iopl */
{ SYF_MPSAFE | 0, (sy_call_t *)linux_vhangup, AUE_NULL }, /* 111 = linux_vhangup */
{ 0, (sy_call_t *)nosys, AUE_NULL }, /* 112 = idle */
{ 0, (sy_call_t *)nosys, AUE_NULL }, /* 113 = vm86old */
==== //depot/projects/soc2007/thioretic_gidl/amd64/linux32/linux32_sysvec.c#2 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.7.2.5 2007/05/23 18:24:42 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.7.2.9 2007/07/08 12:20:35 netchild Exp $");
/* XXX we use functions that might not exist. */
#include "opt_compat.h"
@@ -142,7 +142,8 @@
-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
-110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
-116, -66, -6, -6, -6, -6, -6, -37, -38, -9,
- -6, -6, -43, -42, -75, -6, -84
+ -6, -6, -43, -42, -75,-125, -84, -95, -16, -74,
+ -72, -67, -71
};
int bsd_to_linux_signal[LINUX_SIGTBLSZ] = {
@@ -327,7 +328,7 @@
/* Fill in POSIX parts */
frame.sf_si.lsi_signo = sig;
frame.sf_si.lsi_code = code;
- frame.sf_si.lsi_addr = PTROUT(regs->tf_err);
+ frame.sf_si.lsi_addr = PTROUT(regs->tf_addr);
/*
* Build the signal context to be used by sigreturn.
@@ -399,6 +400,7 @@
td->td_pcb->pcb_ds = _udatasel;
load_es(_udatasel);
td->td_pcb->pcb_es = _udatasel;
+ /* leave user %fs and %gs untouched */
PROC_LOCK(p);
mtx_lock(&psp->ps_mtx);
}
@@ -516,6 +518,7 @@
td->td_pcb->pcb_ds = _udatasel;
load_es(_udatasel);
td->td_pcb->pcb_es = _udatasel;
+ /* leave user %fs and %gs untouched */
PROC_LOCK(p);
mtx_lock(&psp->ps_mtx);
}
@@ -972,7 +975,7 @@
struct sysentvec elf_linux_sysvec = {
LINUX_SYS_MAXSYSCALL,
linux_sysent,
- 0xff,
+ 0,
LINUX_SIGTBLSZ,
bsd_to_linux_signal,
ELAST + 1,
==== //depot/projects/soc2007/thioretic_gidl/amd64/linux32/syscalls.master#2 (text+ko) ====
@@ -1,4 +1,4 @@
- $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.1 2005/07/20 17:42:14 jhb Exp $
+ $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.4.2.2 2007/07/08 12:20:35 netchild Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
; System call name/number master file (or rather, slave, from LINUX).
@@ -201,7 +201,7 @@
108 AUE_NULL MSTD { int linux_newfstat(l_uint fd, \
struct l_newstat *buf); }
109 AUE_NULL MSTD { int linux_uname(void); }
-110 AUE_NULL UNIMPL iopl
+110 AUE_NULL MSTD { int linux_iopl(l_ulong level); }
111 AUE_NULL MSTD { int linux_vhangup(void); }
112 AUE_NULL UNIMPL idle
113 AUE_NULL UNIMPL vm86old
==== //depot/projects/soc2007/thioretic_gidl/compat/linprocfs/linprocfs.c#2 (text+ko) ====
@@ -40,7 +40,7 @@
*/
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list