]> git.neil.brown.name Git - history.git/commitdiff
Linux 2.2.15pre16 2.2.15pre16
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Fri, 23 Nov 2007 20:21:05 +0000 (15:21 -0500)
committerAlan Cox <alan@lxorguk.ukuu.org.uk>
Fri, 23 Nov 2007 20:21:05 +0000 (15:21 -0500)
o Fixes for i960 i2o problems (Boji Kannanthanam)
o Sparc/Glibc 2.1 fixes (Dave Miller)
o Get original 21041 tulips working with current
driver (old_tulip remains for now in case) (Jeff Garzik)
o Updated devices.txt (H Peter Anvin)
o EEPro100 ultra sparc support fixed (Dave Miller)
o Scott Murray moved (Scott Murray)
o Alpha FPU fixes (Richard Henderson)
o PCI configuration ioctls for Alpha (Richard Henderson)
o TCP socket hang on close fix (Dave Miller)
o Fix old_tulip doc error (Barry Nathan)
o Fix AMD cache setup (Dave Jones)
o Fix Cyrix cache reporting (Alan Cox)
o Fix eepro probe failure lockup (Francois Romieu)
o AF_UNIX socket crash fix (Alexey Kuznetsov)
o Fix ftp back masquerade vulnerability (Bjarni Einarsson)
o Fix security issues with exec and ELF loader (Nergal, Solar Designer,
 Alan Cox)
o ext2 and ufs directory handling fix (Al Viro)
o Allow syscall interception in ptrace (Jeff Dike)

53 files changed:
Documentation/devices.txt
Documentation/scsi-generic.txt [deleted file]
Documentation/sound/OPL3-SA2
Makefile
arch/alpha/kernel/bios32.c
arch/alpha/kernel/bios32.h
arch/alpha/kernel/core_apecs.c
arch/alpha/kernel/core_cia.c
arch/alpha/kernel/core_irongate.c
arch/alpha/kernel/core_lca.c
arch/alpha/kernel/core_mcpcia.c
arch/alpha/kernel/core_polaris.c
arch/alpha/kernel/core_pyxis.c
arch/alpha/kernel/core_t2.c
arch/alpha/kernel/core_tsunami.c
arch/alpha/kernel/entry.S
arch/alpha/kernel/osf_sys.c
arch/alpha/kernel/process.c
arch/alpha/kernel/ptrace.c
arch/alpha/kernel/sys_jensen.c
arch/alpha/math-emu/math.c
arch/alpha/math-emu/sfp-machine.h
arch/i386/kernel/entry.S
arch/i386/kernel/ptrace.c
arch/i386/kernel/setup.c
arch/sparc/kernel/sys_sparc.c
arch/sparc/kernel/systbls.S
arch/sparc64/kernel/sys_sparc.c
arch/sparc64/kernel/systbls.S
drivers/i2o/i2o_block.c
drivers/i2o/i2o_pci.c
drivers/net/eepro.c
drivers/net/eepro100.c
drivers/net/tulip.c
drivers/sound/opl3sa2.c
fs/binfmt_elf.c
fs/ext2/dir.c
fs/ufs/dir.c
include/asm-alpha/asm_offsets.h
include/asm-alpha/core_tsunami.h
include/asm-alpha/fpu.h
include/asm-alpha/gentrap.h
include/asm-alpha/hwrpb.h
include/asm-alpha/pci.h
include/asm-alpha/unistd.h
include/linux/i2o.h
include/linux/sched.h
kernel/ksyms.c
kernel/sys.c
kernel/sysctl.c
net/ipv4/ip_masq_ftp.c
net/ipv4/tcp.c
net/unix/af_unix.c

index 8255edec4dd8cae0f054a61bda3603196a6f1b1d..a11cd985932e7d55c792e12f4f327a583e0885da 100644 (file)
@@ -1,7 +1,8 @@
+
                       LINUX ALLOCATED DEVICES
             Maintained by H. Peter Anvin <hpa@zytor.com>
 
-                  Last revised: December 21, 1999
+                    Last revised: March 23, 2000
 
 This list is the Linux Device List, the official registry of allocated
 device numbers and /dev directory nodes for the Linux operating
@@ -20,6 +21,9 @@ Allocations marked (68k/Amiga) apply to Linux/68k on the Amiga
 platform only. Allocations marked (68k/Atari) apply to Linux/68k on
 the Atari platform only.
 
+The symbol {2.6} means the allocation is obsolete and scheduled for
+removal once kernel version 2.6 (or equivalent) is released.
+
 This document is in the public domain. The author requests, however,
 that semantically altered versions are not distributed without
 permission of the author, assuming the author can be contacted without
@@ -306,8 +310,9 @@ Your cooperation is appreciated.
                  9 = /dev/pc110pad     IBM PC-110 digitizer pad
                 10 = /dev/adbmouse     Apple Desktop Bus mouse
                 11 = /dev/vrtpanel     Vr41xx embedded touch panel
+                13 = /dev/vpcmouse     Connectix Virtual PC Mouse
                128 = /dev/beep         Fancy beep device
-               129 = /dev/modreq       Kernel module load request
+               129 = /dev/modreq       Kernel module load request {2.6}
                130 = /dev/watchdog     Watchdog timer port
                131 = /dev/temperature  Machine internal temperature
                132 = /dev/hwtrap       Hardware fault trap
@@ -320,7 +325,7 @@ Your cooperation is appreciated.
                142 = /dev/msr          x86 model-specific registers
                143 = /dev/pciconf      PCI configuration space
                144 = /dev/nvram        Non-volatile configuration RAM
-               145 = /dev/hfmodem      Soundcard shortwave modem control
+               145 = /dev/hfmodem      Soundcard shortwave modem control {2.6}
                146 = /dev/graphics     Linux/SGI graphics device
                147 = /dev/opengl       Linux/SGI OpenGL pipe
                148 = /dev/gfx          Linux/SGI graphics effects device
@@ -355,6 +360,10 @@ Your cooperation is appreciated.
                178 = /dev/jsflash      JavaStation OS flash SIMM
                179 = /dev/xsvc         High-speed shared-mem/semaphore service
                180 = /dev/vrbuttons    Vr41xx button input device
+               181 = /dev/toshiba      Toshiba laptop SMM support
+               182 = /dev/perfctr      Performance-monitoring counters
+               183 = /dev/intel_rng    Intel i8x0 random number generator
+               184 = /dev/cpu/microcode CPU microcode update interface
                240-255                 Reserved for local use
 
  11 char       Raw keyboard device
@@ -383,7 +392,7 @@ Your cooperation is appreciated.
                The device names specified are proposed -- if there
                are "standard" names for these devices, please let me know.
 
-    block      MSCDEX CD-ROM callback support
+    block      MSCDEX CD-ROM callback support {2.6}
                  0 = /dev/dos_cd0      First MSCDEX CD-ROM
                  1 = /dev/dos_cd1      Second MSCDEX CD-ROM
                    ...
@@ -410,7 +419,7 @@ Your cooperation is appreciated.
                  2 = /dev/midi00       First MIDI port
                  3 = /dev/dsp          Digital audio
                  4 = /dev/audio        Sun-compatible digital audio
-                 6 = /dev/sndstat      Sound card status information
+                 6 = /dev/sndstat      Sound card status information {2.6}
                  7 = /dev/audioctl     SPARC audio control device
                  8 = /dev/sequencer2   Sequencer -- alternate device
                 16 = /dev/mixer1       Second soundcard mixer control
@@ -421,7 +430,7 @@ Your cooperation is appreciated.
                 33 = /dev/patmgr1      Sequencer patch manager
                 34 = /dev/midi02       Third MIDI port
                 50 = /dev/midi03       Fourth MIDI port
-    block      BIOS harddrive callback support
+    block      BIOS harddrive callback support {2.6}
                  0 = /dev/dos_hda      First BIOS harddrive whole disk
                 64 = /dev/dos_hdb      Second BIOS harddrive whole disk
                128 = /dev/dos_hdc      Third BIOS harddrive whole disk
@@ -552,7 +561,7 @@ Your cooperation is appreciated.
                  2 = /dev/sbpcd2       Panasonic CD-ROM controller 0 unit 2
                  3 = /dev/sbpcd3       Panasonic CD-ROM controller 0 unit 3
 
- 26 char       Quanta WinVision frame grabber
+ 26 char       Quanta WinVision frame grabber {2.6}
                  0 = /dev/wvisfgrab    Quanta WinVision frame grabber
     block      Second Matsushita (Panasonic/SoundBlaster) CD-ROM
                  0 = /dev/sbpcd4       Panasonic CD-ROM controller 1 unit 0
@@ -779,7 +788,7 @@ Your cooperation is appreciated.
                      ...
     block      Reserved for Linux/AP+
 
- 40 char       Matrox Meteor frame grabber
+ 40 char       Matrox Meteor frame grabber {2.6}
                  0 = /dev/mmetfgrab    Matrox Meteor frame grabber
     block      Syquest EZ135 parallel port removable drive
                  0 = /dev/eza          Parallel EZ135 drive, whole disk
@@ -1267,7 +1276,7 @@ Your cooperation is appreciated.
                disks (see major number 3) except that the limit on
                partitions is 15.
 
- 83 char       Teletext/videotext interfaces
+ 83 char       Teletext/videotext interfaces {2.6}
                  0 = /dev/vtx          Teletext decoder
                 16 = /dev/vttuner      TV tuner on teletext interface
 
@@ -1406,7 +1415,7 @@ Your cooperation is appreciated.
                disks (see major number 3) except that the limit on
                partitions is 15.
 
- 93 char       IBM Smart Capture Card frame grabber
+ 93 char       IBM Smart Capture Card frame grabber {2.6}
                  0 = /dev/iscc0        First Smart Capture Card
                  1 = /dev/iscc1        Second Smart Capture Card
                    ...
@@ -1420,7 +1429,7 @@ Your cooperation is appreciated.
                    ...
                240 = /dev/nftlp        16th NTFL layer
 
- 94 char       miroVIDEO DC10/30 capture/playback device
+ 94 char       miroVIDEO DC10/30 capture/playback device {2.6}
                  0 = /dev/dcxx0        First capture card
                  1 = /dev/dcxx1        Second capture card
                    ...
@@ -1464,6 +1473,11 @@ Your cooperation is appreciated.
                These devices support the same API as the generic SCSI
                devices.
 
+    block      Packet writing for CD/DVD devices
+                 0 = /dev/pktcdvd0     First packet-writing module
+                 1 = /dev/pktcdvd1     Second packet-writing module
+                   ...
+
  98 char       Control and Measurement Device (comedi)
                  0 = /dev/comedi0      First comedi device
                  1 = /dev/comedi1      Second comedi device
@@ -1471,23 +1485,34 @@ Your cooperation is appreciated.
 
                See http://stm.lbl.gov/comedi or http://www.llp.fu-berlin.de/.
 
+    block      User-mode virtual block device
+                 0 = /dev/ubd0         First user-mode block device
+                 1 = /dev/ubd1         Second user-mode block device
+                   ...
+
+               This device is used by the user-mode virtual kernel port.
+
  99 char       Raw parallel ports
                  0 = /dev/parport0     First parallel port
                  1 = /dev/parport1     Second parallel port
                    ...
 
-100 char       POTS (analogue telephone) A/B port
+100 char       POTS (analogue telephone) A/B port {2.6}
                  0 = /dev/phone0       First telephone port
                  1 = /dev/phone1       Second telephone port
                    ...
 
+               The names have been reallocated to Telephony For
+               Linux, major 159.  All use of major 100 should be
+               considered legacy and deprecated.
+
 101 char       Motorola DSP 56xxx board
                  0 = /dev/mdspstat     Status information
                  1 = /dev/mdsp1        First DSP board I/O controls
                    ...
                 16 = /dev/mdsp16       16th DSP board I/O controls
 
-102 char       Philips SAA5249 Teletext signal decoder
+102 char       Philips SAA5249 Teletext signal decoder {2.6}
                  0 = /dev/tlk0         First Teletext decoder
                  1 = /dev/tlk1         Second Teletext decoder
                  2 = /dev/tlk2         Third Teletext decoder
@@ -1528,7 +1553,7 @@ Your cooperation is appreciated.
                  1 = /dev/srnd1        Second miroMEDIA Surround board
                    ...
 
-111 char       Philips SAA7146-based audio/video card
+111 char       Philips SAA7146-based audio/video card {2.6}
                  0 = /dev/av0          First A/V card
                  1 = /dev/av1          Second A/V card
                    ...
@@ -1564,7 +1589,7 @@ Your cooperation is appreciated.
 
                Plays music using IBM BASIC style strings.
 
-116 char       Advanced Linux System Driver (ALSA)
+116 char       Advanced Linux Sound Driver (ALSA)
 
 117 char       COSA/SRP synchronous serial card
                  0 = /dev/cosa0c0      1st board, 1st channel
@@ -1693,9 +1718,9 @@ Your cooperation is appreciated.
                  1 = /dev/gfax1        GammaLink channel 1
                    ...
 
-159 char       Quicknet Technologies Internet PhoneJack/LineJack
-                 0 = /dev/ixj0         First device
-                 1 = /dev/ixj1         Second device
+159 char       Telephony for Linux
+                 0 = /dev/phone0       First telephony device
+                 1 = /dev/phone1       Second telephony device
                    ...
 
 160 char       General Purpose Instrument Bus (GPIB)
@@ -1831,6 +1856,7 @@ Your cooperation is appreciated.
                 48 = /dev/usb/scanner0 First USB scanner
                    ...
                 63 = /dev/usb/scanner15 16th USB scanner
+                64 = /dev/usb/rio500   Diamond Rio 500
 
 181 char       Conrad Electronic parallel port radio clocks
                  0 = /dev/pcfclock0    First Conrad radio clock
@@ -1855,7 +1881,12 @@ Your cooperation is appreciated.
                  1 = /dev/pevss1       Second sender board
                    ...
 
-185 char       Reserved for InterMezzo high availability file system
+185 char       InterMezzo high availability file system
+                 0 = /dev/intermezzo0  First cache manager
+                 1 = /dev/intermezzo1  Second cache manager
+                   ...
+
+               See http://www.inter-mezzo.org/ for more information.
 
 186 char       Object-based storage control device
                  0 = /dev/obd0         First obd control device
@@ -1864,7 +1895,10 @@ Your cooperation is appreciated.
 
                See ftp://ftp.lustre.org/pub/obd for code and information.
 
-187 char       UNALLOCATED
+187 char       DESkey hardware encryption device
+                 0 = /dev/deskey0      First DES key
+                 1 = /dev/deskey1      Second DES key
+                   ...
 
 188 char       USB serial converters
                  0 = /dev/ttyUSB0      First USB serial converter
@@ -1881,7 +1915,37 @@ Your cooperation is appreciated.
                  1 = /dev/kctt1        Second KCT/T card
                    ...
 
-191-239                UNALLOCATED
+191 char       Reserved for PCMCIA
+
+192 char       Kernel profiling interface
+                 0 = /dev/profile      Profiling control device
+                 1 = /dev/profile0     Profiling device for CPU 0
+                 2 = /dev/profile1     Profiling device for CPU 1
+                   ...
+
+193 char       Kernel event-tracing interface
+                 0 = /dev/trace        Tracing control device
+                 1 = /dev/trace0       Tracing device for CPU 0
+                 2 = /dev/trace1       Tracing device for CPU 1
+                   ...
+
+194 char       linVideoStreams (LINVS)
+                 0 = /dev/mvideo/status0       Video compression status
+                 1 = /dev/mvideo/stream0       Video stream
+                 2 = /dev/mvideo/frame0        Single compressed frame
+                 3 = /dev/mvideo/rawframe0     Raw uncompressed frame
+                 4 = /dev/mvideo/codec0        Direct codec access
+                 5 = /dev/mvideo/video4linux0  Video4Linux compatibility
+
+                16 = /dev/mvideo/status1       Second device
+                   ...
+                32 = /dev/mvideo/status2       Third device
+                   ...
+                   ...
+               240 = /dev/mvideo/status15      16th device 
+                   ...
+
+195-239                UNALLOCATED
 
 240-254                LOCAL/EXPERIMENTAL USE
 
@@ -1910,7 +1974,6 @@ These links should exist on all systems:
 /dev/stderr    fd/2            symbolic        stderr file descriptor
 /dev/nfsd      socksys         symbolic        Required by iBCS-2
 /dev/X0R       null            symbolic        Required by iBCS-2
-/dev/i2o*      /dev/i2o/*      symbolic        Backward compatibility
 
 Note: /dev/X0R is <letter X>-<digit 0>-<letter R>.
 
@@ -1923,6 +1986,7 @@ It is recommended that these links exist on all systems:
 /dev/ftape     qft0            symbolic        Backward compatibility
 /dev/bttv0     video0          symbolic        Backward compatibility
 /dev/radio     radio0          symbolic        Backward compatibility
+/dev/i2o*      /dev/i2o/*      symbolic        Backward compatibility
 /dev/scd?      sr?             hard            Alternate SCSI CD-ROM name
 
        Locally defined links
diff --git a/Documentation/scsi-generic.txt b/Documentation/scsi-generic.txt
deleted file mode 100644 (file)
index 48ec05c..0000000
+++ /dev/null
@@ -1,785 +0,0 @@
-            Notes on Linux's SG driver version 2.1.36
-            -----------------------------------------
-                                                        20000110
-
-Introduction
-============
-The SCSI Generic driver (sg) is one of the four "high level" SCSI device
-drivers along with sd, st and sr (disk, tape and CDROM respectively). Sg
-is more generalized (but lower level) than its siblings and tends to be
-used on SCSI devices that don't fit into the already serviced categories.
-Thus sg is used for scanners, cd writers and reading audio cds digitally
-amongst other things.
-
-These are notes on the Linux SCSI generic packet device driver (sg)
-describing version 2.1.36 . The original driver was written by Lawrence
-Foard and remained in place with minimal changes since circa 1992.
-Version 2 of this driver remains backward compatible (binary and
-source **) with the original. It adds scatter gather, command queuing,
-per file descriptor sequencing, asynchronous notification and better
-error reporting.
-
-This is an abridged version of the sg documentation that is targeted
-at the linux/Documentation directory. The full document can be found
-at http://www.torque.net/sg/p/scsi-generic_long.txt .
-
-The interface and usage of the original sg driver have been documented
-by Heiko Eissfeldt in a HOWTO called SCSI-Programming-HOWTO. My copy
-of the document is version 1.5 dated 7th May 1996. It can found at
-ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO-SCSI-Programming-HOWTO .
-A copy of this document can be found at:
-http://www.torque.net/sg/p/original/HOWTO-SCSI-Programming-HOWTO.txt .
-
-** It is possible to write applications that perform differently
-depending on whether they are using the original or this version of
-the sg device driver. The author is not aware of any useful
-pre-existing applications that have problems with version 2.
-
-
-Architecture
-============
-The SCSI generic packet device driver (sg) is a character based device.
-It is one of the four high level device driver in the SCSI sub-system;
-the others are sd (for direct-access devices - disks), st (for tapes)
-and sr (for data cdroms). The other three devices are block devices.
-
-The unifying layer of the SCSI sub-system is the so-called mid-level.
-Below that are the "low level" drivers which are the drivers for the
-various adapters supported by Linux. Also at this level are pseudo
-adapter drivers such as ide-scsi which converts the SCSI protocol to
-ATAPI (which are similar to one another) for use by IDE devices.
-
-Since sg is a character device it supports the traditional Unix
-system calls of open(), close(), read(), write() and ioctl(). Two other
-related system calls: poll() and fcntl() are added to this list and
-how they interact with the sg device driver is documented later.
-
-An SG device is accessed by write()ing SCSI commands plus any associated
-outgoing data to it; the resulting status codes and any incoming data are
-then obtained by a read() call. The device can be opened O_NONBLOCK
-(non-blocking) and poll() used to monitor its progress. The device may be
-opened O_EXCL which excludes other "sg" users from this device (but not
-"sd", "st" or "sr" users). The buffer given to the write() call is made
-up as follows:
-        - struct sg_header image (see below)
-        - scsi command (6, 10 or 12 bytes long)
-        - data to be written to the device (if any)
-
-The buffer received from the corresponding read() call contains:
-        - struct sg_header image (check status/errors + sense_buffer)
-        - data read back from device (if any)
-
-The given SCSI command has its LUN field overwritten by the LUN value of
-the associated sg device that has been open()ed.
-
-SCSI commands are only attempted once (i.e. there are no internal
-retries). If appropriate (e.g. a SCSI READ) the data buffer is copied back
-to user space irrespective of the values of the various SCSI related
-error/status codes. [Some adapters that use an old error interface in
-the SCSI mid level ignore the retry count and retry certain errors.]
-
-
-sg_header
-=========
-This is the name of the control structure that conveys information
-about the length of data to be read/written by the associated SCSI
-command. It also conveys error and status information from the
-read() call. An instance of this structure is the first thing that
-is placed in the data buffers of both write() and read().
-
-In its original form it looked like this:
-struct sg_header {
-    int pack_len;
-    int reply_len;
-    int pack_id;
-    int result;
-    unsigned int twelve_byte:1;
-    unsigned int other_flags:31;
-    unsigned char sense_buffer[16];
-}; /* this structure is 36 bytes long */
-
-The 'pack_len' is bizarre and ends up having the 'reply_len' put in it
-(perhaps it had a use at some stage). Even though it looks like an
-input variable, it is not read by sg internally (only written).
-
-The 'reply_len' is the length of the data the corresponding read()
-will/should request (including the sg_header).
-
-The 'pack_id' is not acted upon by the sg device driver but is conveyed
-back to the corresponding read() so it can be used for sequencing by an
-application.
-
-The 'result' is also bizarre, turning certain types of host codes to 0 (no
-error), EBUSY or EIO. With better error reporting now available, the
-'result' is best ignored.
-
-The 'twelve_byte' field overrides the internal SCSI command length detection
-algorithm for group 6 and 7 commands (ie when 1st byte >= 0xc0) and forces
-a command length of 12 bytes.
-The command length detection algorithm is as follows:
-Group:  0    1    2    3    4    5    6    7
-Length: 6   10   10   12   12   12   10   10
-
-'other_flags' was originally documented as "not used" but some current
-applications assume it has 0 placed in it.
-
-The 'sense_buffer' is the first 16 bytes of SCSI sense buffer that is
-returned when the target returns a SCSI status code of CHECK_CONDITION
-or COMMAND_TERMINATED [or (driver_status & DRIVER_SENSE) is true]. This
-buffer should be at least 18 bytes long and arguably 32 bytes; unfortunately
-this is unlikely to happen in the 2.2.x series of kernels.
-
-
-The new sg_header offered in this driver is:
-#define SG_MAX_SENSE 16
-struct sg_header
-{
-    int pack_len;    /* [o] reply_len (ie useless) ignored as input */
-    int reply_len;   /* [i] max length of expected reply (inc. sg_header) */
-    int pack_id;     /* [io] id number of packet (use ints >= 0) */
-    int result;      /* [o] 0==ok, else (+ve) Unix errno (best ignored) */
-    unsigned int twelve_byte:1;
-        /* [i] Force 12 byte command length for group 6 & 7 commands  */
-    unsigned int target_status:5;   /* [o] scsi status from target */
-    unsigned int host_status:8;     /* [o] host status (see "DID" codes) */
-    unsigned int driver_status:8;   /* [o] driver status+suggestion */
-    unsigned int other_flags:10;    /* unused */
-    unsigned char sense_buffer[SG_MAX_SENSE]; /* [o] Output in 3 cases:
-           when target_status is CHECK_CONDITION or
-           when target_status is COMMAND_TERMINATED or
-           when (driver_status & DRIVER_SENSE) is true. */
-};      /* This structure is 36 bytes long on i386 */
-
-Firstly the new header is binary compatible with the original. This is
-important for keeping existing apps working without recompilation.
-
-Only those elements (or fields) that are new or in some way different
-from the original are documented below.
-
-'pack_id' becomes input to a read() when ioctl(sg_fd, SG_SET_FORCE_PACK_ID,
-&one) is active. A 'pack_id' of -1 is interpreted as fetch the oldest
-waiting packet; any other value will cause the read() to wait (or yield
-EAGAIN) until a packet with that 'pack_id' becomes available. In all cases
-the value of 'pack_id' available after a read() is the value given to that
-variable in the prior, corresponding write().
-
-The SCSI command length can now be given directly using the SG_NEXT_CMD_LEN
-ioctl().
-
-The 'target_status' field is always output and is the (masked and shifted
-1 bit right) SCSI status code from the target device. The allowable
-values are (found in <scsi/scsi.h>):
-/* N.B. 1 bit offset from usual SCSI status values */
-#define GOOD                 0x00
-#define CHECK_CONDITION      0x01
-#define CONDITION_GOOD       0x02
-#define BUSY                 0x04
-#define INTERMEDIATE_GOOD    0x08
-#define INTERMEDIATE_C_GOOD  0x0a
-#define RESERVATION_CONFLICT 0x0c
-#define COMMAND_TERMINATED   0x11
-#define QUEUE_FULL           0x14
-When the 'target_status' is CHECK_CONDITION or COMMAND_TERMINATED the
-'sense_buffer' is output. Note that when (driver_status & DRIVER_SENSE)
-is true then the 'sense_buffer' is also output (this seems to occur when
-the ide-scsi emulation is used). When the 'sense_buffer' is output the
-SCSI Sense Key can be found at (sense_buffer[2] & 0x0f) .
-
-The 'host_status' field is always output and has the following values
-whose "defines" are not visible outside the kernel. A copy of these
-defines can be found in sg_err.h (see the utilities section):
-#define DID_OK          0x00 /* NO error                                */
-#define DID_NO_CONNECT  0x01 /* Couldn't connect before timeout period  */
-#define DID_BUS_BUSY    0x02 /* BUS stayed busy through time out period */
-#define DID_TIME_OUT    0x03 /* TIMED OUT for other reason              */
-#define DID_BAD_TARGET  0x04 /* BAD target, device not responding?      */
-#define DID_ABORT       0x05 /* Told to abort for some other reason     */
-#define DID_PARITY      0x06 /* Parity error                            */
-#define DID_ERROR       0x07 /* Internal error [DMA underrun on aic7xxx]*/
-#define DID_RESET       0x08 /* Reset by somebody.                      */
-#define DID_BAD_INTR    0x09 /* Got an interrupt we weren't expecting.  */
-#define DID_PASSTHROUGH 0x0a /* Force command past mid-layer            */
-#define DID_SOFT_ERROR  0x0b /* The low level driver wants a retry      */
-
-The 'driver_status' field is always output. When ('driver_status' &
-DRIVER_SENSE) is true the 'sense_buffer' is also output. A copy of these
-defines can be found in sg_err.h (see the utilities section):
-#define DRIVER_OK           0x00 /* Typically no suggestion */
-#define DRIVER_BUSY         0x01
-#define DRIVER_SOFT         0x02
-#define DRIVER_MEDIA        0x03
-#define DRIVER_ERROR        0x04
-#define DRIVER_INVALID      0x05
-#define DRIVER_TIMEOUT      0x06
-#define DRIVER_HARD         0x07
-#define DRIVER_SENSE        0x08 /* Implies sense_buffer output */
-/* above status 'or'ed with one of the following suggestions */
-#define SUGGEST_RETRY       0x10
-#define SUGGEST_ABORT       0x20
-#define SUGGEST_REMAP       0x30
-#define SUGGEST_DIE         0x40
-#define SUGGEST_SENSE       0x80
-
-'other_flags' still remains as a 10 bit field (reduced from 31 bits), so
-code that places 0 in it will still be happy. It is not used.
-
-
-System Calls
-============
-What follows are descriptions of the characteristics of the standard
-Unix operating system calls when applied to a SCSI generic device
-using this version of the device driver.
-
-open(const char * filename, int flags)
---------------------------------------
-The filename should be an 'sg' device such as
-/dev/sg[a-z]
-/dev/sg[0,1,2,...]
-or a symbolic link to one of these. [Devfs has its own sub-directory for
-sg devices with entries like: /dev/sg/c1b2t3u4 .] It seems as though SCSI
-devices are allocated to sg minor numbers in the same order as they appear
-in 'cat /proc/scsi/scsi'. Sg is a "character" based Linux device driver.
-This means it has an open/close/read/write/ioctl type interface.
-
-Flags can be either O_RDONLY or O_RDWR or-ed with either
-O_EXCL          waits for other opens on sg device to be closed before
-                proceeding. If O_NONBLOCK is set then yields EBUSY when
-                someone else has the sg device open. The combination of
-                O_RDONLY and O_EXCL is disallowed.
-O_NONBLOCK      Sets non-blocking mode. Calls that would otherwise block
-                yield EAGAIN (eg read() ) or EBUSY (eg open() ).
-
-The original version of sg did not allow the O_RDONLY (yielding a EACCES
-error). This version allows it for accessing ioctls (e.g. doing an sg
-device scan with the SG_GET_SCSI_ID ioctl) but write()s will not be
-allowed. These flags are found in <fcntl.h> .
-
-By default, sequencing is per file descriptor in this version of sg. This
-means, for example that 2 processes can independently manipulate the same
-sg device at the same time. This may or may not make sense depending on
-the application: 2 processes (logically) reading from the same direct access
-device (ie a disk) is ok while running 2 instances of cd writing software
-on the same device at the same time probably wouldn't be a good idea. The
-previous version of sg supported only per device sequencing and this can
-still be selected with the SG_SET_MERGE_FD,1 ioctl().
-
-The driver will attempt to reserve SG_DEF_RESERVED_SIZE bytes (32KBytes in
-the current sg.h) on open(). The size of this reserved buffer can
-subsequently be modified with the SG_SET_RESERVED_SIZE ioctl(). In both
-cases these are requests subject to various dynamic constraints. The actual
-amount of memory obtained can be found by the SG_GET_RESERVED_SIZE ioctl().
-The reserved buffer will be used if:
-    -  it is not already in use (eg when command queuing is in use)
-    -  a write() does not call for a buffer size larger than the
-       reserved size.
-
-Returns a file descriptor if >= 0 , otherwise -1 implies an error.
-
-Error codes (value in 'errno' after -1 returned):
-EACCES          Either the user doesn't have appropriate permissions on
-                'filename' or attempted to use both O_RDONLY and O_EXCL
-EBUSY           O_NONBLOCK set and some user of this sg device has O_EXCL
-                set while someone is already using this device
-EINTR           while waiting for an "exclusive" lock to clear, a signal
-                is received, just try again ...
-ENODEV          sg not compiled into kernel or the kernel cannot find the
-                sg module (or it can't initialize itself (low memory??))
-ENOENT          given filename not found
-ENOMEM          An attempt to get memory to store this open's context
-                failed (this was _not_ a request to reserve DMA memory)
-ENXIO           either there is no attached device corresponding to given
-                filename or scsi sub-system is currently processing some
-                error (eg doing a device reset) or the sg driver/module
-                removed or corrupted
-
-
-write(int sg_fd, const void * buffer, size_t count)
----------------------------------------------------
-Even though sg is a character-based device driver it sends and receives
-packets to/from the associated scsi device. Write() is used to send a
-packet containing 2 mandatory parts and 1 optional part. The mandatory
-parts are:
-  - a control block (an instance of struct sg_header)
-  - a SCSI command (6, 10 or 12 bytes long)
-The optional part is:
-  - outgoing data (eg if a SCSI write command is being sent)
-These should appear as one contiguous string in the buffer given to
-write() in the above order with no pad characters.
-
-If a write() accepts this packet then at some later time the user should
-call a read() to get the result of the SCSI command. The previous sg
-driver enforced a strict write()/read()/write()/read() regime so that a
-second write() would block until first read() was finished. This sg
-driver relaxes that condition and thereby allows command queuing
-(limit is SG_MAX_QUEUE (16) outstanding packets per file descriptor).
-However, for backward compatibility, command queuing is turned off
-by default (#define SG_DEF_COMMAND_Q 0 in sg.h). This can be changed
-via the the SG_SET_COMMAND_Q ioctl() [or by recompiling after changing
-the above define to 1].
-
-In this sg driver a write() should return more or less immediately.
-
-Returns number of bytes written if > 0 , otherwise -1 implies an error.
-
-Error codes (value in 'errno' after -1 returned):
-EACCES          opened with RD_ONLY flag
-EAGAIN          SCSI mid-level out of command blocks (rare), try again.
-                This is more likely to happen when queuing commands,
-                so wait a bit (eg usleep(10000) ) before trying again
-EDOM            a) command queuing off: a packet is already queued
-                b) command queuing on: too many packets queued
-                   (SG_MAX_QUEUE exceeded)
-EFAULT          'buffer' for 'count' bytes is an invalid memory range
-EIO             a) incoming buffer too short. It should be at least
-                   (6 + sizeof(struct sg_header))==42 bytes long
-                b) SCSI command length given in SG_NEXT_CMD_LEN too long
-                c) reply_len negative
-ENOMEM          can't get memory for DMA. Take evasive action ...
-ENXIO           either scsi sub-system is currently processing some error
-                (eg doing a device reset) or the sg driver/module removed
-                or corrupted
-
-
-read(int sg_fd, void * buffer, size_t count)
---------------------------------------------
-Read() is used to receive a packet containing 1 mandatory part and 1
-optional part. The mandatory part is:
-  - a control block (an instance of struct sg_header)
-The optional part is:
-  - incoming data (eg if a SCSI read command was sent by earlier write() )
-The buffer given to a read() and its corresponding count should be
-sufficient to accommodate this packet to avoid truncation. Truncation occurs
-if count < sg_header::replylen .
-
-By default, read() will return the oldest packet queued up. If the
-SG_SET_FORCE_PACK_ID,1 ioctl() is active then read() will attempt to
-fetch the packet whose pack_id (given earlier to write()) matches the
-sg_header::pack_id given to this read(). If not available it will either
-wait or yield EAGAIN. As a special case, -1 in sg_header::pack_id given
-to read() will match the oldest packet.
-
-Returns number of bytes read if > 0 , otherwise -1 implies an error.
-Unfortunately the return value in the non-error case is simply the
-same as the count argument. It is not the actual number of bytes
-DMA-ed by the SCSI device. This driver is currently unable to provide
-such an underrun indication.
-
-If the SCSI device reports an error then a REQUEST SENSE is automatically
-done and the output is placed in the sense_buffer array which is in the
-control block. This action is sometimes called "auto-sense".
-
-Error codes (value in 'errno' after -1 returned):
-EAGAIN          either no waiting packet or requested packet is not
-                available while O_NONBLOCK flag was set
-EFAULT          'buffer' for 'count' bytes is an invalid memory range
-EINTR           while waiting for a packet, a signal is received, just
-                try again ...
-EIO             if the 'count' given to read() is < sizeof(struct sg_header)
-                and the 'result' element in sg_header is non-zero. Not a
-                recommended error reporting technique
-ENXIO           either scsi sub-system is currently processing some error
-                (eg doing a device reset) or the sg driver/module removed
-                or corrupted
-
-
-close(int sg_fd)
-----------------
-Preferably a close() should be done after all issued write()s have had
-their corresponding read() calls completed. Unfortunately this is not
-always possible. The semantics of close() in Unix are to return more
-or less immediately (ie not wait on any event) so the driver needs to
-arrange for an orderly cleanup of those packets that are still "in
-flight".
-
-A process that has an open file descriptor to an sg device may be aborted
-(eg by a kill signal). In this case, the kernel automatically calls close
-(which is called 'sg_release()' in the version 2 driver) to facilitate
-the cleanup mentioned above.
-
-A problem persists in version 2.1.36 if the sg driver is a module and is
-removed while packets are still "in flight".
-
-Returns 0 if successful, otherwise -1 implies an error.
-
-Error codes (value in 'errno' after -1 returned):
-ENXIO           sg driver/module removed or corrupted
-
-ioctl(int sg_fd, int command, ...)  [sg specific]
--------------------------------------------------
-Ken Thompson (or perhaps some other Unix luminary) described ioctl() as
-the "garbage bin of Unix". This driver compounds the situation by adding
-more ...
-If a ioctl command is not recognized by sg (and the various lower levels
-that it may pass the command on to) then the error EINVAL occurs. If an
-invalid address is given (in the 3rd argument) then the error EFAULT occurs.
-
-Those commands with an appended "+" are new in version 2.
-
-Those commands with an appended "W" are only accessible from file
-descriptors opened with O_RDWR. They will yield EACCES otherwise.
-
-SG_GET_TIMEOUT:
-Ignores its 3rd argument and _returns_ the timeout value (which will be
->= 0 ). The unit of this timeout is "jiffies" which are currently 10
-millisecond intervals on i386 (less on an alpha). Linux supplies
-a manifest constant HZ which is the number of "jiffies" in 1 second.
-
-SG_SET_TIMEOUT:
-Assumes 3rd argument points to an int containing the new timeout value
-for this file descriptor. The unit is a "jiffy". Packets that are
-already "in flight" will not be affected. The default value is set
-on open() and is SG_DEFAULT_TIMEOUT (defined in sg.h). This default is
-currently 1 minute and may not be long enough for formats. Negative
-values will yield an EIO error.
-
-SG_EMULATED_HOST:
-Assumes 3rd argument points to an int and outputs a flag indicating
-whether the host (adapter) is connected to a real SCSI bus or is an
-emulated one (eg ide-scsi device driver). A value of 1 means emulated
-while 0 is not.
-
-SG_SET_TRANSFORM  W:
-Only is meaningful when SG_EMULATED host has yielded 1 (i.e. the low-level
-is the ide-scsi device driver); otherwise an EINVAL error occurs. The
-default state is to _not_ transform SCSI commands to the corresponding
-ATAPI commands but pass them straight through as is. [Only certain classes
-of SCSI commands need to be transformed to their ATAPI equivalents.]
-The third argument is interpreted as an integer. When it is non-zero then
-a flag is set inside the ide-scsi driver that transforms subsequent
-commands sent to this driver. When zero is passed as the 3rd argument to
-this ioctl then the flag within the ide-scsi driver is cleared and
-subsequent commands are not transformed. Beware, this state will affect
-all devices (and hence all related sg file descriptors) associated with
-this ide-scsi "bus".
-
-SG_GET_TRANSFORM:
-Third argument is ignored. Only is meaningful when SG_EMULATED host has
-yielded 1 (ie the low-level is the ide-scsi device driver); otherwise
-an EINVAL error occurs. Returns 0 to indicate _not_ transforming SCSI
-to ATAPI commands (default). Returns 1 when it is transforming them.
-
-SG_SET_FORCE_LOW_DMA +:
-Assumes 3rd argument points to an int containing 0 or 1. 0 (default)
-means sg decides whether to use memory above 16 Mbyte level (on i386)
-based on the host adapter being used by this SCSI device. Typically
-PCI SCSI adapters will indicate they can DMA to the whole 32 bit address
-space.
-If 1 is given then the host adapter is overridden and only memory below
-the 16MB level is used for DMA. A requirement for this should be
-extremely rare. If the "reserved" buffer allocated on open() is not in
-use then it will be de-allocated and re-allocated under the 16MB level
-(and the latter operation could fail yielding ENOMEM).
-Only the current file descriptor is affected.
-
-SG_GET_LOW_DMA +:
-Assumes 3rd argument points to an int and places 0 or 1 in it. 0
-indicates the whole 32 bit address space is being used for DMA transfers
-on this file descriptor. 1 indicates the memory below the 16MB level
-(on i386) is being used (and this may be the case because the host
-adapters setting has been overridden by SG_SET_FORCE_LOW_DMA,1 .
-
-SG_GET_SCSI_ID +:
-Assumes 3rd argument is pointing to an object of type Sg_scsi_id (see
-sg.h) and populates it. That structure contains ints for host_no,
-channel, scsi_id, lun, scsi_type, allowable commands per lun and
-queue_depth. Most of this information is available from other sources
-(eg SCSI_IOCTL_GET_IDLUN and SCSI_IOCTL_GET_BUS_NUMBER) but tends to be
-awkward to collect.
-Allowable commands per lun and queue_depth give an insight to the
-command queuing capabilities of the adapters and the device. The latter
-overrides the former (logically) and the former is only of interest
-if it is equal to queue_depth which probably indicates the device
-does not support queueing commands (e.g. most scanners).
-
-SG_SET_FORCE_PACK_ID +:
-Assumes 3rd argument is pointing to an int. 0 (default) instructs read()
-to return the oldest (written) packet if multiple packets are
-waiting to be read (when command queuing is being used).
-1 instructs read() to view the sg_header::pack_id as input and return the
-oldest packet matching that pack_id or wait until it arrives (or yield
-EAGAIN if O_NONBLOCK is in force). As a special case the pack_id of -1
-given to read() in the mode will match the oldest packet.
-Only the current file descriptor is affected by this command.
-
-SG_GET_PACK_ID +:
-Assumes 3rd argument points to an int and places the pack_id of the
-oldest (written) packet in it. If no packet is waiting to be read then
-yields -1.
-
-SG_GET_NUM_WAITING +:
-Assumes 3rd argument points to an int and places the number of packets
-waiting to be read in it.
-
-SG_GET_SG_TABLESIZE +:
-Assumes 3rd argument points to an int and places the maximum number of
-scatter gather elements supported by the host adapter. 0 indicates that
-the adapter does support scatter gather.
-
-SG_SET_RESERVED_SIZE +W:
-Assumes 3rd argument is pointing to an int. That value will be used to
-request a new reserved buffer of that size. The previous reserved buffer
-is freed (if it is not in use; if it was in use -EBUSY is returned).
-A new reserved buffer is then allocated and its actual size can be found by
-calling the SG_GET_RESERVED_SIZE ioctl(). The reserved buffer is then used
-for DMA purposes by subsequent write() commands if it is not already in
-use and if the write() is not calling for a buffer size larger than that
-reserved. The reserved buffer may well be a series of kernel buffers if the
-adapter supports scatter-gather. Large buffers can be requested (eg 1 MB).
-
-SG_GET_RESERVED_SIZE +:
-Assumes 3rd argument points to an int and places the size in bytes of
-the reserved buffer from open() or the most recent SG_SET_RESERVED_SIZE
-ioctl() call on this fd.  The result can be 0 if memory is very tight. In
-this case it may not be wise to attempt something like burning a CD on
-this file descriptor.
-
-SG_SET_MERGE_FD +W:
-Assumes 3rd argument is pointing to an int. 0 (the default) causes all
-subsequent sequencing to be per file descriptor. 1 causes all subsequent
-sequencing to be per device. If this command tries to change the current
-state and there is one or more _other_ file descriptors using this sg
-device then an EBUSY error occurs. Per device sequencing was the original
-semantics and allowed, for example different processes to "share" the
-device, one perhaps write()ing with the other one read()ing. This command
-is supplied if anyone needs those semantics. Per file descriptor
-sequencing, perhaps with the use of the O_EXCL flag, seems more sensible.
-
-SG_GET_MERGE_FD +:
-Assumes 3rd argument points to an int and places 0 or 1 in it. 0 implies
-sequencing is per file descriptor. 1 implies sequencing is per device
-(original sg driver's semantics).
-
-SG_SET_COMMAND_Q +:
-Assumes 3rd argument is pointing to an int. 0 (current default, set by
-SG_DEF_COMMAND_Q in sg.h) disables command queuing. Attempts to write()
-a packet while one is already queued will result in a EDOM error.
-1 turns command queuing on.
-Changing the queuing state only affects write()s done after the change.
-Only the current file descriptor is affected by this command.
-
-SG_GET_COMMAND_Q +:
-Assumes 3rd argument points to an int and places 0 or 1 in it. 0 implies
-that command queuing is off on this file descriptor. 1 implies command
-queuing is on.
-
-SG_SET_UNDERRUN_FLAG +:
-Assumes 3rd argument is pointing to an int. 0 (current default, set by
-SG_DEF_UNDERRUN_FLAG in sg.h) requests underruns be ignored. 1 requests
-that underruns be flagged. [The only low level driver that acts on this
-at the moment is the aic7xxx which yields a DID_ERROR error on underrun.]
-Only the current file descriptor is affected by this command (unless
-"per device" sequencing has been selected).
-
-SG_GET_UNDERRUN_FLAG +:
-Assumes 3rd argument points to an int and places 0 or 1 in it. 0 implies
-that underruns are not being reported. 1 implies that underruns are being
-reported (see SG_SET_UNDERRUN_FLAG for more details).
-
-SG_NEXT_CMD_LEN +:
-Assumes 3rd argument is pointing to an int. The value of the int (if > 0)
-will be used as the SCSI command length of the next SCSI command sent to
-a write() on this fd. After that write() the SCSI command length logic is
-reset to use automatic length detection (ie depending on SCSI command group
-and the 'twelve_byte' field). If the current SCSI command length maximum of
-12 is exceeded then the affected write() will yield an EDOM error.
-Giving this ioctl() a value of 0 will set automatic length detection for
-the next write(). N.B. Only the following write() on this fd is affected by
-this ioctl().
-
-SG_GET_VERSION_NUM +:
-Assumes 3rd argument points to an int. The version number is then placed
-in that int. A sg version such as 2.1.36 will yield "20136" from this ioctl.
-
-SG_SCSI_RESET +:
-Assumes 3rd argument points to an int. Unfortunately doesn't currently
-do much (may in the future after other issues are resolved). Yields an
-EBUSY error if the SCSI bus or the associated device is being reset
-when this ioctl() is called, otherwise returns 0.
-
-SG_SET_DEBUG +:
-Assumes 3rd argument is pointing to an int. 0 (default) turns debugging
-off. Values > 0 cause the SCSI sense buffer to be decoded and output
-to the console/log when a SCSI device error occurs. Values > 8 cause
-the current sg device driver's state to be output to the console/log
-(this is a "one off" effect).
-If you need a _lot_ of the SCSI sub-system debug information (mainly from
-the mid-level) then try 'echo "scsi dump 0" > /proc/scsi/scsi' and lots of
-debug will appear in your console/log.
-
-
-poll(struct pollfd * udfds, unsigned int nfds, int timeout_ms)
---------------------------------------------------------------
-This is a native call in Linux 2.2 but most of its capabilities are available
-through the older select() call. Given a choice poll() should probably be
-used. Typically poll() is used when a sg scsi device is open()ed O_NONBLOCK
-for polling; and optionally with asynchronous notification as well using
-the fcntl() system call (below) and the SIGPOLL (aka SIGIO) signal.
-Only if something drastically is wrong (eg file handle gone stale) will
-POLLERR ever be set. POLLPRI, POLLHUP and POLLNVAL are never set.
-POLLIN is set when there is one or more packets waiting to be read.
-When POLLIN is set it implies that a read() will not block (nor yield
-EAGAIN in non-blocking mode) but return a packet immediately.
-POLLOUT (aka POLLWRNORM) is set when write() is able to accept a packet
-(ie will _not_ yield an EDOM error). The setting of POLLOUT is affected
-by the SG_SET_COMMAND_Q state: if the state is on then POLLOUT will remain
-set until the number of queued packets reaches SG_MAX_QUEUE, if the
-state is off then POLLOUT is only set when no packets are queued.
-Note that a packet can be queued after write()ing but not available to be
-read(); this typically happens when a SCSI read command is issued while
-the data is being retrieved.
-Poll() is per file descriptor unless SG_SET_MERGE_FD is set in which case
-it is per device.
-
-
-fcntl(int sg_fd, int cmd) or fcntl(int sg_fd, int cmd, long arg)
-----------------------------------------------------------------
-There are several uses for this system call in association with a sg
-file descriptor. The following pseudo code shows code that is useful for
-scanning the sg devices, taking care not to be caught in a wait for
-an O_EXCL lock by another process, and when the appropriate device is
-found, switching to normal blocked io. A working example of this logic
-is in the sg_scan utility program.
-
-open("/dev/sga", O_RDONLY | O_NONBLOCK)
-/* check device, EBUSY means some other process has O_EXCL lock on it */
-/* when the device you want is found then ... */
-flags = fcntl(sg_fd, F_GETFL)
-fcntl(sg_fd, F_SETFL, flags & (~ O_NONBLOCK))
-/* since, for simple apps, it is easier to use normal blocked io */
-
-
-Some work has to be done in Linux to set up for asynchronous notification.
-This is a non-blocking mode of operation in which, when the driver receives
-data back from a device so that a read() can be done, it sends a SIGPOLL
-(aka SIGIO) signal to the owning process. A working example of this logic
-is in the sg_poll test program.
-
-sigemptyset(&sig_set)
-sigaddset(&sig_set, SIGPOLL)
-sigaction(SIGPOLL, &s_action, 0)
-fcntl(sg_fd, F_SETOWN, getpid())
-flags = fcntl(sg_fd, F_GETFL);
-fcntl(sg_fd, F_SETFL, flags | O_ASYNC)
-
-
-Utility and Test Programs
-=========================
-See the README file in the sg_utils<date>.tgz tarball. Look on the
-http://www.torque.net/sg website for the latest version.
-
-Briefly, that tarball contains the following utilities:
-sg_dd512        'dd' like program that assumes 512 byte blocks size
-sg_dd2048       'dd' like program that assumes 2048 byte blocks size
-sg_dd2352       'dd' like program that assumes 2352 byte blocks size
-sgq_dd512       like 'sg_dd512' but does command queuing on "if"
-sgp_dd          probably the most flexible 'dd' variant. It uses POSIX
-                threads, block size set by "bs=..." plus other options.
-sg_scan         outputs information (optionally Inquiry) on SCSI devices
-sg_rbuf         tests SCSI bus transfer speed (without physical IO)
-sg_whoami       outputs info (optionally capacity) of given SCSI device
-sginfo          outputs "mode" information about SCSI devices (it is a
-                  re-port of the scsiinfo program onto the sg interface)
-
-It also contains the following test programs:
-sg_debug        outputs sg driver state to console/log file
-sg_poll         tests asynchronous notification
-sg_runt_ex      example run time selection program for application authors
-sg_simple1      example program first time users
-sg_simple2      like sg_simple1 but with more primitive error processing
-sg_inquiry      does a SCSI Inquiry command (from original HOWTO)
-sg_tst_med      checks presence of media (from original HOWTO)
-
-There are also 2 source files (sg_err.[hc]) for outputting and categorizing
-SCSI 2 errors and warnings. This code is used by most of the above
-utility and test programs.
-
-The following programs: sg_dd512, sg_dd2048, sg_dd2352, sg_scan, sg_runt_ex,
-sg_rbuf, sg_tst_med, sg_inquiry and sginfo, can be compiled either for this
-new sg driver _or_ the original sg driver (in 2.0 or 2.2 series kernels).
-sg_runt_ex can be run on 2.0, 2.2 or 2.3 series kernels even if it is
-compiled on a different series (eg compiled on 2.0, run on 2.2).
-
-
-Header files
-============
-User applications need to find the correct "sg.h" header file matching
-their kernel in order to write code using the sg device driver. This is
-sometimes more difficult than it should be. The correct "sg.h" will usually
-be found at /usr/src/linux/include/scsi/sg.h . Another important header
-file is "scsi.h" which will be in the same directory.
-
-When "#include <scsi/sg.h>" is written in an application then this refers
-to the file /usr/include/scsi/sg.h . A problem sometimes arises because
-the files in the /usr/include/scsi directory are controlled by the GNU
-library people who maintain glibc. Unfortunately these 2 versions of
-the sg.h header file are not always in sync. [This was the case in Redhat
-6.0 and 6.1 .] Glibc 2.1.3 and later versions should get this right.
-
-If this is a problem, the user may need to copy sg.h (and scsi.h) from
-the kernel source includes to /usr/include scsi. If the user can change
-the effected source code then another approach is to rely on the fact that
-/usr/src/linux is a symbolic link to /usr/src/linux/include/linux and
-change the sg.h include to look like:
-    #include <linux/../scsi/sg.h>
-This solution is used by the author of cdparanoia (Monty) in his application.
-
-[Former scsi generic documents suggested adding a symbolic link to
-bypass this problem but that is not popular with the glibc maintainers.
-I would like to thank Andreas Jaeger <aj@suse.de> for his contributions
-on this subject.]
-
-
-Extra information in scsi-generic_long.txt
-==========================================
-This document is an abridged form of a more comprehensive document called
-scsi-generic_long.txt (see www.torque.net/sg/p/scsi-generic_long.txt).
-
-The longer document contains additional sections on:
-   - memory issues
-   - ioctl()s in common with sd, st + sr
-   - distinguishing the original from the new driver
-   - SG_BIG_BUFF and friends
-   - shortcomings
-   - future directions
-   - an appendix with some SCSI 2 information in it
-
-
-References
-==========
-http://www.t10.org      Very important site for SCSI related information.
-                        Contains SCSI 2 and 3 draft standards.
-http://www.andante.org/scsi.html
-                        This is Eric Youngdale's site. Eric is primarily
-                        responsible for the Linux SCSI architecture and
-                        its mid-level implementation.
-http://www.kernel.dk    Jens Axboe's site for Linux cdrom matters including
-                        the SCSI "sr" driver.
-http://www.torque.net/sg
-                        My site with sg related information.
-newsgroup:linux-scsi@vger.rutgers.edu
-                        Newsgroup for Linux related SCSI matters
-/usr/src/linux/MAINTAINERS
-                        This is a file in the Linux kernel source that
-                        contains up to date information about who maintains
-                        what and where information can be found. Links to
-                        SCSI adapter information are also here.
-
-
-Conclusion
-==========
-The SCSI generic packet device driver attempts to make as few assumptions
-as possible about the device it is connected to while giving applications
-using it as much flexibility as possible on the SCSI command level. Sg
-needs to hide the "messy" kernel related details while protecting
-the integrity of the kernel against sg "abuse". Some of these aims are
-contradictory and some compromises need to be made. For example: should
-a sg based application be able to reset a SCSI bus when that could cause
-collateral damage to a disk holding the root file system? There is no
-easy answer to this and many other related questions.
-
-If you have any suggestion about sg (or improving (the accuracy of) this
-document) please contact me.
-
-
-Douglas Gilbert
-dgilbert@interlog.com
index a51a4aebbaadb70437bf6544c617afff1c5a4a77..11e00a60fc14dc739227842809002e282f864349 100644 (file)
@@ -1,7 +1,7 @@
 Documentation for the OPL3-SA2, SA3, and SAx driver (opl3sa2.o)
 ---------------------------------------------------------------
 
-Scott Murray, scottm@interlog.com
+Scott Murray, scott@spiteful.org
 January 5, 1999
 
 NOTE: All trade-marked terms mentioned below are properties of their
index 0606fdabc77130bf56486e9c2fa5f5b9be61a2f9..bfb55ec2e7e636125c571696f821d543c42d3843 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 2
 SUBLEVEL = 15
-EXTRAVERSION = pre15
+EXTRAVERSION = pre16
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
 
index 1d3117f1c81d6f471a3c3e1707ce0a3fa4966f37..42d6aef3f01719ee9a86d2b908305b6245c819ad 100644 (file)
@@ -57,6 +57,7 @@
 
 asmlinkage int sys_pciconfig_read() { return -ENOSYS; }
 asmlinkage int sys_pciconfig_write() { return -ENOSYS; }
+asmlinkage long sys_pciconfig_iobase() { return -ENOSYS; }
 void reset_for_srm(void) { }
 
 #else /* CONFIG_PCI */
@@ -93,6 +94,14 @@ pcibios_present(void)
 void __init
 pcibios_init(void)
 {
+       long i;
+
+       /* For the benefit of single-bus machines, emulate a multi-bus
+          machine to the (limited) extent necessary.  Init all bus2hose
+          entries to point to a dummy.  */
+       for (i = 0; i < 256; ++i)
+               bus2hose[i] = &default_hose;
+
        if (!pcibios_present())
                return;
 
@@ -280,6 +289,34 @@ sys_pciconfig_write(unsigned long bus, unsigned long dfn,
        return err;
 }
 
+/* Provide information on locations of various I/O regions in physical
+   memory.  Do this on a per-card basis so that we choose the right hose.  */
+
+asmlinkage long
+sys_pciconfig_iobase(long which, unsigned long bus, unsigned long dfn)
+{
+       struct linux_hose_info *hose;
+
+       hose = bus2hose[bus & 255];
+       if (!hose)
+               return -ENODEV;
+
+       switch (which) {
+       case IOBASE_HOSE:
+               return hose->pci_hose_index;
+       case IOBASE_SPARSE_MEM:
+               return hose->pci_sparse_mem_space;
+       case IOBASE_DENSE_MEM:
+               return hose->pci_dense_mem_space;
+       case IOBASE_SPARSE_IO:
+               return hose->pci_sparse_io_space;
+       case IOBASE_DENSE_IO:
+               return hose->pci_dense_io_space;
+       }
+
+       return -EOPNOTSUPP;
+}
+
 
 /*
  * Gory details start here...
@@ -1342,13 +1379,6 @@ layout_hoses(void)
 
                for (hose = hose_head; hose; hose = hose->next)
                        layout_one_hose(hose);
-       } else {
-               /* For the benefit of single-bus machines, emulate a
-                  multi-bus machine to the (limited) extent necessary. 
-                  Init all bus2hose entries to point to a dummy.  */
-               hose = &default_hose;
-               for (i = 0; i < 256; ++i)
-                       bus2hose[i] = hose;
        }
 }
 
index 8850517babbe5c3ea694a52b42eda999cd302ad1..9ce92ade2de5644b87171afaa665af9dc1abda84 100644 (file)
@@ -164,3 +164,4 @@ extern int common_swizzle(struct pci_dev *dev, int *pinp);
 extern struct linux_hose_info *hose_head, **hose_tail;
 extern int hose_count;
 extern int pci_probe_enabled;
+extern struct linux_hose_info default_hose;
index fa23a4cf6ae398605615561c72a13ba72da122ea..cbcd06b1d182b53bdcae51c66231ba179f247180 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <asm/system.h>
 #include <asm/ptrace.h>
+#include <asm/pci.h>
 
 #define __EXTERN_INLINE inline
 #include <asm/io.h>
@@ -24,6 +25,7 @@
 #undef __EXTERN_INLINE
 
 #include "proto.h"
+#include "bios32.h"
 
 /*
  * NOTE: Herein lie back-to-back mb instructions.  They are magic. 
@@ -436,6 +438,12 @@ apecs_init_arch(unsigned long *mem_start, unsigned long *mem_end)
         * what ARC or SRM might have left behind...
         */
        *(vuip)APECS_IOC_HAXR2 = 0; mb();
+
+       /* Tell userland where I/O space is located.  */
+       default_hose.pci_sparse_io_space = APECS_IO - IDENT_ADDR;
+       default_hose.pci_sparse_mem_space = APECS_SPARSE_MEM - IDENT_ADDR;
+       default_hose.pci_dense_io_space = 0;
+       default_hose.pci_dense_mem_space = APECS_DENSE_MEM - IDENT_ADDR;
 }
 
 int
index 5c40cbad2d9873ddbd8b953cf482388c4ce69996..028b6d911c8cc911f2f57430cfa58954aebbeff0 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <asm/system.h>
 #include <asm/ptrace.h>
+#include <asm/pci.h>
 
 #define __EXTERN_INLINE inline
 #include <asm/io.h>
@@ -23,6 +24,7 @@
 #undef __EXTERN_INLINE
 
 #include "proto.h"
+#include "bios32.h"
 
 /*
  * NOTE: Herein lie back-to-back mb instructions.  They are magic. 
@@ -580,6 +582,12 @@ cia_init_arch(unsigned long *mem_start, unsigned long *mem_end)
                *((vuip)CIA_IOC_HAE_IO) = 0; mb();
                *((vuip)CIA_IOC_HAE_IO);  /* read it back. */
         }
+
+       /* Tell userland where I/O space is located.  */
+       default_hose.pci_sparse_io_space = CIA_IO - IDENT_ADDR;
+       default_hose.pci_sparse_mem_space = CIA_SPARSE_MEM - IDENT_ADDR;
+       default_hose.pci_dense_io_space = 0;
+       default_hose.pci_dense_mem_space = CIA_DENSE_MEM - IDENT_ADDR;
 }
 
 void
index 2d7609e323a213010345ccf6c8ec45b9eb94036c..0408e76a78bdc931f52d499621390a0102b076b6 100644 (file)
@@ -301,35 +301,21 @@ irongate_register_dump(const char *function_name)
 void __init
 irongate_init_arch(unsigned long *mem_start, unsigned long *mem_end)
 {
-       struct linux_hose_info *hose;
-
        irongate_register_dump(__FUNCTION__);
 
-       /* Align memory to cache line; we'll be allocating from it. */
-
-       *mem_start = (*mem_start | 31) + 1;
-
-       /*
-        * Irongate only supports one PCI bus but do the hose thing anyway.
-        * Anything to do for AGP???
-        */
-
-       hose = (struct linux_hose_info *) *mem_start;
-       *mem_start = (unsigned long)(hose + 1);
-       memset(hose, 0, sizeof(*hose));
-       hose->pci_io_space = IRONGATE_IO;
-       hose->pci_mem_space = IRONGATE_MEM;
-       hose->pci_config_space = IRONGATE_CONF;
-       hose->pci_sparse_space = 0;
-       hose->pci_hose_index = 0;
-
-       /* add it to the hose list for bios32.[ch] */
-
-       *hose_tail = hose;
-       hose_tail = &hose->next;
-
        IRONGATE0->stat_cmd = IRONGATE0->stat_cmd & ~0x100;
        irongate_pci_clr_err();
+
+       /* Tell userland where I/O space is located.  For some reason,
+          the 40-bit PIO bias that we use in the kernel through KSEG
+          didn't work for the page table based user mappings.  So make
+          sure we get the 43-bit PIO bias.  */
+       default_hose.pci_sparse_io_space = 0;
+       default_hose.pci_sparse_mem_space = 0;
+       default_hose.pci_dense_io_space
+         = (IRONGATE_IO & 0xffffffffff) | 0x80000000000;
+       default_hose.pci_dense_mem_space
+         = (IRONGATE_MEM & 0xffffffffff) | 0x80000000000;
 }
 
 int
index 8a529f27aa16e28c154ef34c6edfb66bf5210604..d2c78ee4a5c399999aec3ba6593c767d7c4341a7 100644 (file)
@@ -16,7 +16,7 @@
 
 #include <asm/ptrace.h>
 #include <asm/system.h>
-#include <asm/smp.h>
+#include <asm/pci.h>
 
 #define __EXTERN_INLINE inline
 #include <asm/io.h>
@@ -24,6 +24,7 @@
 #undef __EXTERN_INLINE
 
 #include "proto.h"
+#include "bios32.h"
 
 /*
  * BIOS32-style PCI interface:
@@ -349,6 +350,12 @@ lca_init_arch(unsigned long *mem_start, unsigned long *mem_end)
         * data parity errors.
         */
        *(vulp)LCA_IOC_PAR_DIS = 1UL<<5;
+
+       /* Tell userland where I/O space is located.  */
+       default_hose.pci_sparse_io_space = LCA_IO - IDENT_ADDR;
+       default_hose.pci_sparse_mem_space = LCA_SPARSE_MEM - IDENT_ADDR;
+       default_hose.pci_dense_io_space = 0;
+       default_hose.pci_dense_mem_space = LCA_DENSE_MEM - IDENT_ADDR;
 }
 
 /*
index fcf8bab911450e2731b121e32deb982c698ff98a..e2583bfd74add555d4c296cfd8a5eb8e366d077e 100644 (file)
@@ -328,13 +328,16 @@ mcpcia_init_arch(unsigned long *mem_start, unsigned long *mem_end)
 
                mcpcia_hoses[h] = hose;
 
-               hose->pci_io_space = MCPCIA_IO(h);
-               hose->pci_mem_space = MCPCIA_DENSE(h);
                hose->pci_config_space = MCPCIA_CONF(h);
-               hose->pci_sparse_space = MCPCIA_SPARSE(h);
                hose->pci_hose_index = h;
                hose->pci_first_busno = 255;
                hose->pci_last_busno = 0;
+
+               /* Tell userland where I/O space is located.  */
+               hose->pci_sparse_io_space = MCPCIA_IO(h) - IDENT_ADDR;
+               hose->pci_sparse_mem_space = MCPCIA_SPARSE(h) - IDENT_ADDR;
+               hose->pci_dense_io_space = 0;
+               hose->pci_dense_mem_space = MCPCIA_DENSE(h) - IDENT_ADDR;
        }
 
 #if 1
index b9945402f4caa1b3499140bb07ca46e9253093ee..244579c4590519964e09f099ec4e4e41add623ca 100644 (file)
@@ -193,6 +193,12 @@ polaris_init_arch(unsigned long *mem_start, unsigned long *mem_end)
 #if 0
        printk("polaris_init_arch(): trusting firmware for setup\n");
 #endif
+
+       /* Tell userland where I/O space is located.  */
+       default_hose.pci_sparse_io_space = 0;
+       default_hose.pci_sparse_mem_space = 0;
+       default_hose.pci_dense_io_space = POLARIS_DENSE_IO_BASE - IDENT_ADDR;
+       default_hose.pci_dense_mem_space = POLARIS_DENSE_MEM_BASE - IDENT_ADDR;
 }
 
 int polaris_pci_clr_err(void)
index d66026e3ee552c2565bd24ea942479ab2b264c7a..17037c475cc0a7eeb9c425116b389808e37a0d24 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <asm/ptrace.h>
 #include <asm/system.h>
+#include <asm/pci.h>
 
 #define __EXTERN_INLINE inline
 #include <asm/io.h>
@@ -22,6 +23,7 @@
 #undef __EXTERN_INLINE
 
 #include "proto.h"
+#include "bios32.h"
 
 /* NOTE: Herein are back-to-back mb instructions.  They are magic.
    One plausible explanation is that the I/O controller does not properly
@@ -509,6 +511,12 @@ pyxis_finish_init_arch(void)
                        ctrl1 = *(vuip)PYXIS_CTRL1;  /* re-read */
                }
        }
+
+       /* Tell userland where I/O space is located.  */
+       default_hose.pci_sparse_io_space = 0;
+       default_hose.pci_sparse_mem_space = 0;
+       default_hose.pci_dense_io_space = PYXIS_BW_IO - IDENT_ADDR;
+       default_hose.pci_dense_mem_space = PYXIS_BW_MEM - IDENT_ADDR;
 }
 
 void __init
index c7ec2b6ee94fb75896bff94fd9d5967141a6b77b..58c82eb777189cff7dcea547b9b67f1db213db9b 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <asm/ptrace.h>
 #include <asm/system.h>
+#include <asm/pci.h>
 
 #define __EXTERN_INLINE
 #include <asm/io.h>
@@ -25,6 +26,7 @@
 #undef __EXTERN_INLINE
 
 #include "proto.h"
+#include "bios32.h"
 
 /*
  * NOTE: Herein lie back-to-back mb instructions.  They are magic. 
@@ -477,6 +479,12 @@ t2_init_arch(unsigned long *mem_start, unsigned long *mem_end)
                *(vulp)T2_HAE_4 = 0; mb(); /* do not touch this */
 #endif
        }
+
+       /* Tell userland where I/O space is located.  */
+       default_hose.pci_sparse_io_space = T2_IO - IDENT_ADDR;
+       default_hose.pci_sparse_mem_space = T2_SPARSE_MEM - IDENT_ADDR;
+       default_hose.pci_dense_io_space = 0;
+       default_hose.pci_dense_mem_space = T2_DENSE_MEM - IDENT_ADDR;
 }
 
 #define SIC_SEIC (1UL << 33)    /* System Event Clear */
index 48d4f73f387354cfa86fbf7c9983298cf70c2f57..4ca2dca6d9f5f2563800e5cde071192df666a239 100644 (file)
@@ -98,12 +98,12 @@ mk_conf_addr(u8 bus, u8 device_fn, u8 where, struct linux_hose_info *hose,
                 "pci_addr=0x%p, type1=0x%p)\n",
                 bus, device_fn, where, pci_addr, type1));
 
-        *type1 = (bus != 0);
+       *type1 = (bus != 0);
 
-        if (hose->pci_first_busno == bus)
+       if (hose->pci_first_busno == bus)
                bus = 0;
 
-        addr = (bus << 16) | (device_fn << 8) | where;
+       addr = (bus << 16) | (device_fn << 8) | where;
        addr |= hose->pci_config_space;
                
        *pci_addr = addr;
@@ -266,12 +266,20 @@ tsunami_init_one_pchip(tsunami_pchip *pchip, int index,
        *hose_tail = hose;
        hose_tail = &hose->next;
 
-       hose->pci_io_space = TSUNAMI_IO(index);
-       hose->pci_mem_space = TSUNAMI_MEM(index);
        hose->pci_config_space = TSUNAMI_CONF(index);
-       hose->pci_sparse_space = 0;
        hose->pci_hose_index = index;
 
+       /* This is for userland consumption.  For some reason, the 40-bit
+          PIO bias that we use in the kernel through KSEG didn't work for
+          the page table based user mappings.  So make sure we get the
+          43-bit PIO bias.  */
+       hose->pci_sparse_io_space = 0;
+       hose->pci_sparse_mem_space = 0;
+       hose->pci_dense_io_space
+         = (TSUNAMI_IO(index) & 0xffffffffff) | 0x80000000000;
+       hose->pci_dense_mem_space
+         = (TSUNAMI_MEM(index) & 0xffffffffff) | 0x80000000000;
+
        switch (alpha_use_srm_setup)
        {
        default:
@@ -329,7 +337,7 @@ tsunami_init_arch(unsigned long *mem_start, unsigned long *mem_end)
 {
 #ifdef NXM_MACHINE_CHECKS_ON_TSUNAMI
        extern asmlinkage void entInt(void);
-        unsigned long tmp;
+       unsigned long tmp;
        
        /* Ho hum.. init_arch is called before init_IRQ, but we need to be
           able to handle machine checks.  So install the handler now.  */
index 8e70eaeeeb785ebb095850333937dd531206667e..a4e125f230a2bf4776f8dd0d8822e97b7ef22414 100644 (file)
@@ -8,7 +8,7 @@
 
 #define SIGCHLD 20
 
-#define NR_SYSCALLS 371
+#define NR_SYSCALLS 377
 
 /*
  * These offsets must match with alpha_mv in <asm/machvec.h>.
@@ -1143,3 +1143,9 @@ sys_call_table:
        .quad sys_capget
        .quad sys_capset
        .quad sys_sendfile                      /* 370 */
+       .quad sys_ni_syscall
+       .quad sys_ni_syscall
+       .quad sys_ni_syscall
+       .quad sys_ni_syscall
+       .quad sys_ni_syscall                    /* 375 */
+       .quad sys_pciconfig_iobase
index 6281cfbc08f1b8ed9aad443d6cf85e82dbde5c95..193f8c7f86ec18cbf0bbf9496cf49f8bd9b9c520 100644 (file)
@@ -886,20 +886,8 @@ asmlinkage unsigned long osf_getsysinfo(unsigned long op, void *buffer,
                /* Return current software fp control & status bits.  */
                /* Note that DU doesn't verify available space here.  */
 
-               /* EV6 implements most of the bits in hardware.  If
-                  UNDZ is not set, UNFD is maintained in software.  */
-               if (implver() == IMPLVER_EV6) {
-                       unsigned long fpcr = rdfpcr();
-                       w = ieee_fpcr_to_swcr(fpcr);
-                       if (!(fpcr & FPCR_UNDZ)) {
-                               w &= ~IEEE_TRAP_ENABLE_UNF;
-                               w |= current->tss.flags & IEEE_TRAP_ENABLE_UNF;
-                       }
-               } else {
-                       /* Otherwise we are forced to do everything in sw.  */
-                       w = current->tss.flags & IEEE_SW_MASK;
-               }
-
+               w = current->tss.flags & IEEE_SW_MASK;
+               w = swcr_update_status(w, rdfpcr());
                if (put_user(w, (unsigned long *) buffer))
                        return -EFAULT;
                return 0;
@@ -950,7 +938,7 @@ asmlinkage unsigned long osf_setsysinfo(unsigned long op, void *buffer,
 {
        switch (op) {
        case SSI_IEEE_FP_CONTROL: {
-               unsigned long swcr, fpcr, undz, ev6;
+               unsigned long swcr, fpcr;
 
                /* 
                 * Alpha Architecture Handbook 4.7.7.3:
@@ -959,29 +947,24 @@ asmlinkage unsigned long osf_setsysinfo(unsigned long op, void *buffer,
                 * set in the trap shadow of a software-complete insn.
                 */
 
-               ev6 = (implver() == IMPLVER_EV6);
-
                /* Update softare trap enable bits.  */
                if (get_user(swcr, (unsigned long *)buffer))
                        return -EFAULT;
                current->tss.flags &= ~IEEE_SW_MASK;
                current->tss.flags |= swcr & IEEE_SW_MASK;
 
-               /* Update the real fpcr.  Keep UNFD off if not UNDZ.  */
+               /* Update the real fpcr.  */
                fpcr = rdfpcr();
-               if(ev6) {
-                   undz = (fpcr & FPCR_UNDZ);
-                   fpcr &= (~(FPCR_MASK | FPCR_UNDZ)) | FPCR_DYN_MASK;
-               }
-               else {
-                   fpcr &= (~FPCR_MASK) | FPCR_DYN_MASK;
-               }
+               fpcr &= FPCR_DYN_MASK;
                fpcr |= ieee_swcr_to_fpcr(swcr);
-               if(ev6 && !undz) {
-                   fpcr &= ~FPCR_UNFD;
-               }
                wrfpcr(fpcr);
-                  
+
+               /* If any exceptions are now unmasked, send a signal.  */
+               if (((swcr & IEEE_STATUS_MASK)
+                    >> IEEE_STATUS_TO_EXCSUM_SHIFT) & swcr) {
+                       send_sig(SIGFPE, current, 1);
+               }
+
                return 0;
        }
 
index 86dcb2dc3c50b87edfad1c37687cfac5f13f8c21..9c30d834424922d21eec11ee8f9e95374a1a63e4 100644 (file)
@@ -288,12 +288,9 @@ void exit_thread(void)
 void flush_thread(void)
 {
        /* Arrange for each exec'ed process to start off with a clean slate
-          with respect to the FPU.  This is all exceptions disabled.  Note
-           that EV6 defines UNFD valid only with UNDZ, which we don't want
-          for IEEE conformance -- so that disabled bit remains in software.  */
-
+          with respect to the FPU.  This is all exceptions disabled.  */
        current->tss.flags &= ~IEEE_SW_MASK;
-       wrfpcr(FPCR_DYN_NORMAL | FPCR_INVD | FPCR_DZED | FPCR_OVFD | FPCR_INED);
+       wrfpcr(FPCR_DYN_NORMAL | ieee_swcr_to_fpcr(0));
 }
 
 void release_thread(struct task_struct *dead_task)
index 899ad3923b1be2f212458ed1349c9e110d564eef..b1cd849afefb1fe286ba1a190c83d90f2682a26c 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 #include <asm/system.h>
+#include <asm/fpu.h>
 
 #include "proto.h"
 
@@ -119,18 +120,30 @@ get_reg_addr(struct task_struct * task, unsigned long regno)
 /*
  * Get contents of register REGNO in task TASK.
  */
-static inline long
+static long
 get_reg(struct task_struct * task, unsigned long regno)
 {
+       /* Special hack for fpcr -- combine hardware and software bits.  */
+       if (regno == 63) {
+               unsigned long fpcr = *get_reg_addr(task, regno);
+               unsigned long swcr = task->tss.flags & IEEE_SW_MASK;
+               swcr = swcr_update_status(swcr, fpcr);
+               return fpcr | swcr;
+       }
        return *get_reg_addr(task, regno);
 }
 
 /*
  * Write contents of register REGNO in task TASK.
  */
-static inline int
+static int
 put_reg(struct task_struct *task, unsigned long regno, long data)
 {
+       if (regno == 63) {
+               task->tss.flags = ((task->tss.flags & ~IEEE_SW_MASK)
+                                  | (data & IEEE_SW_MASK));
+               data = (data & FPCR_DYN_MASK) | ieee_swcr_to_fpcr(data);
+       }
        *get_reg_addr(task, regno) = data;
        return 0;
 }
index 93a65e76ebdabc64b3ae69bd994c5bd76b2c5d9d..f33331a7982b03ae9e8b8edcc1d4eae263bd7ba3 100644 (file)
 #include "irq.h"
 #include "machvec.h"
 
+#ifdef CONFIG_PCI
+#include <asm/pci.h>
+#include "bios32.h"
+#endif
+
 
 static void
 jensen_update_irq_hw(unsigned long irq, unsigned long mask, int unmask_p)
@@ -116,6 +121,18 @@ jensen_machine_check (u64 vector, u64 la, struct pt_regs *regs)
        printk(KERN_CRIT "Machine check\n");
 }
 
+static void __init
+jensen_init_arch(void)
+{
+#ifdef CONFIG_PCI
+       /* Tell userland where I/O space is located.  */
+       default_hose.pci_sparse_io_space = EISA_IO - IDENT_ADDR;
+       default_hose.pci_sparse_mem_space = EISA_MEM - IDENT_ADDR;
+       default_hose.pci_dense_io_space = 0;
+       default_hose.pci_dense_mem_space = 0;
+#endif
+}
+
 
 /*
  * The System Vector
@@ -136,7 +153,7 @@ struct alpha_machine_vector jensen_mv __initmv = {
        ack_irq:                generic_ack_irq,
        device_interrupt:       jensen_device_interrupt,
 
-       init_arch:              NULL,
+       init_arch:              jensen_init_arch,
        init_irq:               jensen_init_irq,
        init_pit:               generic_init_pit,
        kill_arch:              generic_kill_arch,
index 0a3aa1818d65b4be6c22b8bee4e04e02223e9f3a..8434e46b1d65600eb53961b7fe6cf9215940c628 100644 (file)
@@ -159,8 +159,7 @@ alpha_fp_emul (unsigned long pc)
        FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR);
        FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR);
 
-       unsigned long fa, fb, fc, func, mode, src;
-       unsigned long fpcw = current->tss.flags;
+       unsigned long fa, fb, fc, func, mode, src, swcr;
        unsigned long res, va, vb, vc, fpcr;
        __u32 insn;
 
@@ -175,10 +174,11 @@ alpha_fp_emul (unsigned long pc)
        mode   = (insn >> 11) & 0x3;
        
        fpcr = rdfpcr();
+       swcr = swcr_update_status(current->tss.flags, fpcr);
 
        if (mode == 3) {
-           /* Dynamic -- get rounding mode from fpcr.  */
-           mode = (fpcr >> FPCR_DYN_SHIFT) & 3;
+               /* Dynamic -- get rounding mode from fpcr.  */
+               mode = (fpcr >> FPCR_DYN_SHIFT) & 3;
        }
 
        switch (src) {
@@ -231,9 +231,14 @@ alpha_fp_emul (unsigned long pc)
                        }
                        FP_CMP_D(res, DA, DB, 3);
                        vc = 0x4000000000000000;
-                       /* CMPTEQ, CMPTUN don't trap on QNaN, while CMPTLT and CMPTLE do */
-                       if (res == 3 && ((func & 3) >= 2 || FP_ISSIGNAN_D(DA) || FP_ISSIGNAN_D(DB)))
+                       /* CMPTEQ, CMPTUN don't trap on QNaN,
+                          while CMPTLT and CMPTLE do */
+                       if (res == 3
+                           && ((func & 3) >= 2
+                               || FP_ISSIGNAN_D(DA)
+                               || FP_ISSIGNAN_D(DB))) {
                                FP_SET_EXCEPTION(FP_EX_INVALID);
+                       }
                        switch (func) {
                        case FOP_FNC_CMPxUN: if (res != 3) vc = 0; break;
                        case FOP_FNC_CMPxEQ: if (res) vc = 0; break;
@@ -285,9 +290,11 @@ alpha_fp_emul (unsigned long pc)
                        }
 
                case FOP_FNC_CVTxQ:
-                       if (DB_c == FP_CLS_NAN && (_FP_FRAC_HIGH_RAW_D(DB) & _FP_QNANBIT_D))
-                               vc = 0; /* AAHB Table B-2 sais QNaN should not trigger INV */
-                       else
+                       if (DB_c == FP_CLS_NAN
+                           && (_FP_FRAC_HIGH_RAW_D(DB) & _FP_QNANBIT_D)) {
+                         /* AAHB Table B-2 says QNaN should not trigger INV */
+                               vc = 0;
+                       } else
                                FP_TO_INT_ROUND_D(vc, DB, 64, 2);
                        goto done_d;
                }
@@ -321,11 +328,15 @@ alpha_fp_emul (unsigned long pc)
 
 pack_s:
        FP_PACK_SP(&vc, SR);
+       if ((_fex & FP_EX_UNDERFLOW) && (swcr & IEEE_MAP_UMZ))
+               vc = 0;
        alpha_write_fp_reg_s(fc, vc);
        goto done;
 
 pack_d:
        FP_PACK_DP(&vc, DR);
+       if ((_fex & FP_EX_UNDERFLOW) && (swcr & IEEE_MAP_UMZ))
+               vc = 0;
 done_d:
        alpha_write_fp_reg(fc, vc);
        goto done;
@@ -345,16 +356,16 @@ done_d:
 done:
        if (_fex) {
                /* Record exceptions in software control word.  */
-               current->tss.flags
-                 = fpcw |= (_fex << IEEE_STATUS_TO_EXCSUM_SHIFT);
+               swcr |= (_fex << IEEE_STATUS_TO_EXCSUM_SHIFT);
+               current->tss.flags |= (_fex << IEEE_STATUS_TO_EXCSUM_SHIFT);
 
                /* Update hardware control register */
                fpcr &= (~FPCR_MASK | FPCR_DYN_MASK);
-               fpcr |= ieee_swcr_to_fpcr(fpcw);
+               fpcr |= ieee_swcr_to_fpcr(swcr);
                wrfpcr(fpcr);
 
                /* Do we generate a signal?  */
-               if (_fex & fpcw & IEEE_TRAP_ENABLE_MASK) {
+               if (_fex & swcr & IEEE_TRAP_ENABLE_MASK) {
                        MOD_DEC_USE_COUNT;
                        return 0;
                }
index 8adc0e74c68bf29e67223dd028c2aa3231a6c3d2..9299effd15c25691565f6a81c562d612112b883e 100644 (file)
@@ -74,7 +74,7 @@
 #define FP_EX_INEXACT          IEEE_TRAP_ENABLE_INE
 #define FP_EX_DENORM           IEEE_TRAP_ENABLE_DNO
 
-#define FP_DENORM_ZERO         (fpcw & IEEE_MAP_DMZ)
+#define FP_DENORM_ZERO         (swcr & IEEE_MAP_DMZ)
 
 #define FP_HANDLE_EXCEPTIONS return _fex
 
index 3a5fc93a11598598a2bf341ad7f7fcbc9a14611b..9ca7002ebae75ccf66ece7a5c665db0f4d9e38cb 100644 (file)
@@ -216,9 +216,11 @@ tracesys:
        movl $-ENOSYS,EAX(%esp)
        call SYMBOL_NAME(syscall_trace)
        movl ORIG_EAX(%esp),%eax
+        cmpl $(NR_syscalls),%eax 
+        jae 1f 
        call *SYMBOL_NAME(sys_call_table)(,%eax,4)
        movl %eax,EAX(%esp)             # save the return value
-       call SYMBOL_NAME(syscall_trace)
+1:     call SYMBOL_NAME(syscall_trace)
        jmp ret_from_sys_call
 badsys:
        movl $-ENOSYS,EAX(%esp)
index c252b2c549d2061df1b8b74891e5361ccff0cb9e..9e46eb2cf1eeda8bcf175a4def25c0462e3671f5 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/errno.h>
 #include <linux/ptrace.h>
 #include <linux/user.h>
+#include <linux/sys.h> 
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -320,7 +321,9 @@ static int putreg(struct task_struct *child,
 {
        switch (regno >> 2) {
                case ORIG_EAX:
-                       return -EIO;
+                       if(value >= NR_syscalls)
+                               return -EIO;
+                       break;
                case FS:
                        if (value && (value & 3) != 3)
                                return -EIO;
index ff8f10922fde45fc3cdae76988f65ff2d8f9dff0..5c5f0eb90a0efd39334b1cfee24563339716a94a 100644 (file)
@@ -445,27 +445,29 @@ __initfunc(static int get_model_name(struct cpuinfo_x86 *c))
        cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
        cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
        c->x86_model_id[48] = 0;
+       
+       if(c->x86_vendor == X86_VENDOR_AMD)
+       {
+               /*  Set MTRR capability flag if appropriate  */
+               if(boot_cpu_data.x86 == 5) {
+                       if((boot_cpu_data.x86_model == 9) ||
+                          ((boot_cpu_data.x86_model == 8) && 
+                           (boot_cpu_data.x86_mask >= 8)))
+                               c->x86_capability |= X86_FEATURE_MTRR;
+               }
 
-       /*  Set MTRR capability flag if appropriate  */
-       if(boot_cpu_data.x86 == 5) {
-               if((boot_cpu_data.x86_model == 9) ||
-                  ((boot_cpu_data.x86_model == 8) && 
-                   (boot_cpu_data.x86_mask >= 8)))
-                       c->x86_capability |= X86_FEATURE_MTRR;
-       }
-
-       if (n >= 0x80000005){
-               cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
-               printk("CPU: L1 I Cache: %dK  L1 D Cache: %dK\n",
-                       ecx>>24, edx>>24);
-               c->x86_cache_size=(ecx>>24)+(edx>>24);
-       }
-       if (n >= 0x80000006){
-               cpuid(0x80000006, &dummy, &dummy, &ecx, &edx);
-               printk("CPU: L2 Cache: %dK\n", ecx>>16);
-               c->x86_cache_size = ecx>>16;
+               if (n >= 0x80000005){
+                       cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
+                       printk("CPU: L1 I Cache: %dK  L1 D Cache: %dK\n",
+                               ecx>>24, edx>>24);
+                       c->x86_cache_size=(ecx>>24)+(edx>>24);
+               }
+               if (n >= 0x80000006){
+                       cpuid(0x80000006, &dummy, &dummy, &ecx, &edx);
+                       printk("CPU: L2 Cache: %dK\n", ecx>>16);
+                       c->x86_cache_size = ecx>>16;
+               }
        }
-
        return 1;
 }
 
@@ -501,7 +503,7 @@ __initfunc(static int amd_model(struct cpuinfo_x86 *c))
                                rdmsr(0xC0000082, l, h);
                                if((l&0x0000FFFF)==0)
                                {               
-                                       l=(1<<0)|(mbytes/4);
+                                       l=(1<<0)|((mbytes/4)<<1);
                                        save_flags(flags);
                                        __cli();
                                        __asm__ __volatile__ ("wbinvd": : :"memory");
index 92c565ab50b34aeefca2149bd6789f032852f9d2..468d362aeb99965880b4b7eebee57313bde608f9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: sys_sparc.c,v 1.52.2.1 1999/10/04 10:36:15 davem Exp $
+/* $Id: sys_sparc.c,v 1.52.2.2 2000/03/24 00:03:22 davem Exp $
  * linux/arch/sparc/kernel/sys_sparc.c
  *
  * This file contains various random system calls that
@@ -238,6 +238,13 @@ c_sys_nis_syscall (struct pt_regs *regs)
        return -ENOSYS;
 }
 
+/* We don't want to warn about LFS syscalls which are defined in our headers */
+asmlinkage unsigned long
+sys_lfs_syscall (void)
+{
+       return -ENOSYS;
+}
+
 /* #define DEBUG_SPARC_BREAKPOINT */
 
 asmlinkage void
index 80ec4e7088f7665d542cc86e2583dc5048326026..9927e0b1bbe2fd3ed6f7d1c874660e237b8363e4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: systbls.S,v 1.83.2.1 1999/09/22 11:37:27 jj Exp $
+/* $Id: systbls.S,v 1.83.2.2 2000/03/24 00:03:18 davem Exp $
  * systbls.S: System call entry point tables for OS compatibility.
  *            The native Linux system call table lives here also.
  *
@@ -29,12 +29,12 @@ sys_call_table:
 /*40*/ .long sys_newlstat, sys_dup, sys_pipe, sys_times, sys_nis_syscall
 /*45*/ .long sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
 /*50*/ .long sys_getegid, sys_acct, sys_nis_syscall, sys_nis_syscall, sys_ioctl
-/*55*/ .long sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve
-/*60*/ .long sys_umask, sys_chroot, sys_newfstat, sys_nis_syscall, sys_getpagesize
+/*55*/ .long sys_reboot, sys_lfs_syscall, sys_symlink, sys_readlink, sys_execve
+/*60*/ .long sys_umask, sys_chroot, sys_newfstat, sys_lfs_syscall, sys_getpagesize
 /*65*/ .long sys_msync, sys_vfork, sys_pread, sys_pwrite, sys_nis_syscall
 /*70*/ .long sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_munmap, sys_mprotect
-/*75*/ .long sys_nis_syscall, sys_vhangup, sys_nis_syscall, sys_nis_syscall, sys_getgroups
-/*80*/ .long sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_nis_syscall
+/*75*/ .long sys_nis_syscall, sys_vhangup, sys_lfs_syscall, sys_nis_syscall, sys_getgroups
+/*80*/ .long sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_lfs_syscall
 /*85*/ .long sys_swapon, sys_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall
 /*90*/ .long sys_dup2, sys_nis_syscall, sys_fcntl, sys_select, sys_nis_syscall
 /*95*/ .long sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
@@ -44,8 +44,8 @@ sys_call_table:
 /*115*/        .long sys_nis_syscall, sys_gettimeofday, sys_getrusage, sys_nis_syscall, sys_getcwd
 /*120*/        .long sys_readv, sys_writev, sys_settimeofday, sys_fchown, sys_fchmod
 /*125*/        .long sys_nis_syscall, sys_setreuid, sys_setregid, sys_rename, sys_truncate
-/*130*/        .long sys_ftruncate, sys_flock, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
-/*135*/        .long sys_nis_syscall, sys_mkdir, sys_rmdir, sys_utimes, sys_nis_syscall
+/*130*/        .long sys_ftruncate, sys_flock, sys_lfs_syscall, sys_nis_syscall, sys_nis_syscall
+/*135*/        .long sys_nis_syscall, sys_mkdir, sys_rmdir, sys_utimes, sys_lfs_syscall
 /*140*/        .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getrlimit
 /*145*/        .long sys_setrlimit, sys_nis_syscall, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
 /*150*/        .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_nis_syscall
index f60addd562d78f44a306578d6ad97aefeff7a9b7..03340118867c94ec768932dced3520834c1bd403 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: sys_sparc.c,v 1.26.2.1 1999/09/22 11:37:38 jj Exp $
+/* $Id: sys_sparc.c,v 1.26.2.2 2000/03/24 00:03:27 davem Exp $
  * linux/arch/sparc64/kernel/sys_sparc.c
  *
  * This file contains various random system calls that
@@ -214,6 +214,13 @@ c_sys_nis_syscall (struct pt_regs *regs)
        return -ENOSYS;
 }
 
+/* We don't want to warn about LFS syscalls which are defined in our headers */
+asmlinkage unsigned long
+sys_lfs_syscall (void)
+{
+       return -ENOSYS;
+}
+
 /* #define DEBUG_SPARC_BREAKPOINT */
 
 asmlinkage void
index 4f1cb7577f4a2fd54b08fa4b516ce561af5c76ce..345a82d5085a19be8a7868108b365d604bb036f1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: systbls.S,v 1.53.2.3 2000/01/24 22:14:40 davem Exp $
+/* $Id: systbls.S,v 1.53.2.4 2000/03/24 00:03:28 davem Exp $
  * systbls.S: System call entry point tables for OS compatibility.
  *            The native Linux system call table lives here also.
  *
@@ -30,12 +30,12 @@ sys_call_table32:
 /*40*/ .word sys32_newlstat, sys_dup, sys_pipe, sys32_times, sys_nis_syscall
        .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
 /*50*/ .word sys_getegid, sys_acct, sys_nis_syscall, sys_nis_syscall, sys32_ioctl
-       .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys32_execve
-/*60*/ .word sys_umask, sys_chroot, sys32_newfstat, sys_nis_syscall, sys_getpagesize
+       .word sys_reboot, sys_lfs_syscall, sys_symlink, sys_readlink, sys32_execve
+/*60*/ .word sys_umask, sys_chroot, sys32_newfstat, sys_lfs_syscall, sys_getpagesize
        .word sys_msync, sys_vfork, sys32_pread, sys32_pwrite, sys_nis_syscall
 /*70*/ .word sys_nis_syscall, sys32_mmap, sys_nis_syscall, sys_munmap, sys_mprotect
-       .word sys_nis_syscall, sys_vhangup, sys_nis_syscall, sys_nis_syscall, sys32_getgroups
-/*80*/ .word sys32_setgroups, sys_getpgrp, sys_nis_syscall, sys32_setitimer, sys_nis_syscall
+       .word sys_nis_syscall, sys_vhangup, sys_lfs_syscall, sys_nis_syscall, sys32_getgroups
+/*80*/ .word sys32_setgroups, sys_getpgrp, sys_nis_syscall, sys32_setitimer, sys_lfs_syscall
        .word sys_swapon, sys32_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall
 /*90*/ .word sys_dup2, sys_nis_syscall, sys32_fcntl, sys32_select, sys_nis_syscall
        .word sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
@@ -45,8 +45,8 @@ sys_call_table32:
        .word sys_nis_syscall, sys32_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
 /*120*/        .word sys32_readv, sys32_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod
        .word sys_nis_syscall, sys32_setreuid, sys32_setregid, sys_rename, sys_truncate
-/*130*/        .word sys_ftruncate, sys_flock, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
-       .word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_nis_syscall
+/*130*/        .word sys_ftruncate, sys_flock, sys_lfs_syscall, sys_nis_syscall, sys_nis_syscall
+       .word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_lfs_syscall
 /*140*/        .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_getrlimit
        .word sys32_setrlimit, sys_nis_syscall, sys32_prctl, sys32_pciconfig_read, sys32_pciconfig_write
 /*150*/        .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_nis_syscall
index a75b6bae1de36a6e91e1bd333853bf261170d804..aa8c1e0844d52b542779f2c99f2f9c548c97d1cf 100644 (file)
@@ -705,6 +705,9 @@ static int i2ob_release(struct inode *inode, struct file *file)
                 */
                u32 msg[5];
                int *query_done = &dev->done_flag;
+
+               fsync_dev(inode->i_rdev);
+
                msg[0] = FIVE_WORD_MSG_SIZE|SGL_OFFSET_0;
                msg[1] = I2O_CMD_BLOCK_CFLUSH<<24|HOST_TID<<12|dev->tid;
                msg[2] = i2ob_context|0x40000000;
index e768ea34ea6311d136fb1778b2a5e89248dd805e..16e521076812e757c1426372669da7454fb52981 100644 (file)
@@ -53,8 +53,10 @@ static void i2o_pci_dispose(struct i2o_controller *c)
        iounmap(((u8 *)c->post_port)-0x40);
 
 #ifdef CONFIG_MTRR
-       if(c->bus.pci.mtrr_reg > 0)
-               mtrr_del(c->bus.pci.mtrr_reg, 0, 0);
+       if(c->bus.pci.mtrr_reg0 > 0)
+               mtrr_del(c->bus.pci.mtrr_reg0, 0, 0);
+       if(c->bus.pci.mtrr_reg1 > 0)
+               mtrr_del(c->bus.pci.mtrr_reg1, 0, 0);
 #endif
 }
 
@@ -109,7 +111,7 @@ static void i2o_pci_interrupt(int irq, void *dev_id, struct pt_regs *r)
  *
  * TODO: Add support for polled controllers
  */
-int __init i2o_pci_install(struct pci_dev *dev)
+int i2o_pci_install(struct pci_dev *dev)
 {
        struct i2o_controller *c=kmalloc(sizeof(struct i2o_controller),
                                                GFP_KERNEL);
@@ -183,8 +185,30 @@ int __init i2o_pci_install(struct pci_dev *dev)
         * Enable Write Combining MTRR for IOP's memory region
         */
 #ifdef CONFIG_MTRR
-       c->bus.pci.mtrr_reg = 
-               mtrr_add(c->mem_phys, size, MTRR_TYPE_WRCOMB, 1);
+       c->bus.pci.mtrr_reg0 =  mtrr_add(c->mem_phys, size, MTRR_TYPE_WRCOMB, 1);
+
+       /*
+        * If it is an INTEL i960 I/O processor then set the first 64K to Uncacheable
+        * since the region contains the Messaging unit which shouldn't be cached.
+        */
+
+       c->bus.pci.mtrr_reg1 = -1;
+
+       if(dev->vendor == PCI_VENDOR_ID_INTEL) 
+        {
+               printk(KERN_INFO "i2o_pci: MTRR workaround for Intel i960 processor\n");
+               c->bus.pci.mtrr_reg1 = mtrr_add(c->mem_phys, 65536, MTRR_TYPE_UNCACHABLE, 1);
+               if(c->bus.pci.mtrr_reg1< 0)
+               {
+                       printk(KERN_INFO "i2o_pci: Error in setting MTRR_TYPE_UNCACHABLE\n");
+                       if(c->bus.pci.mtrr_reg0>=0)
+                       {
+                               mtrr_del(c->bus.pci.mtrr_reg0, 0, 0);
+                               c->bus.pci.mtrr_reg0 = -1;
+                       }
+               }
+       }
+
 #endif
 
        I2O_IRQ_WRITE32(c,0xFFFFFFFF);
@@ -230,7 +254,7 @@ int __init i2o_pci_install(struct pci_dev *dev)
        return 0;       
 }
 
-int __init i2o_pci_scan(void)
+int i2o_pci_scan(void)
 {
        struct pci_dev *dev;
        int count=0;
index b4b4018e56c9c5f584218f5fe9c6e0dee40c6773..5cf8c509c29d33a15a9ab91c3f51edca6b34f178 100644 (file)
@@ -1696,6 +1696,8 @@ init_module(void)
 
                if (register_netdev(d) == 0)
                        n_eepro++;
+               else
+                       break;
        }
        
        return n_eepro ? 0 : -ENODEV;
index 3341e03062a2e1f931d2829d293994e82142bdc9..eefbcbac5ed6fc05716637bdaea4d690c0591314 100644 (file)
@@ -42,7 +42,7 @@ static int rxdmacount = 0;
 
 /* Set the copy breakpoint for the copy-only-tiny-buffer Rx method.
    Lower values use more memory, but are faster. */
-#ifdef __alpha__
+#if defined(__alpha__) || defined(__sparc__)
 /* force copying of all packets to avoid unaligned accesses on Alpha */
 static int rx_copybreak = 1518;
 #else
@@ -366,7 +366,7 @@ enum commands {
 #if defined(__LITTLE_ENDIAN)
 #define clear_suspend(cmd)  ((__u16 *)&(cmd)->cmd_status)[1] &= ~0x4000
 #elif defined(__BIG_ENDIAN)
-#define clear_suspend(cmd)  ((__u16 *)&(cmd)->cmd_status)[0] &= ~0x4000
+#define clear_suspend(cmd)  ((__u16 *)&(cmd)->cmd_status)[1] &= ~0x0040
 #else
 #error Unsupported byteorder
 #endif
@@ -480,7 +480,7 @@ struct speedo_private {
        struct timer_list timer;        /* Media selection timer. */
        struct speedo_mc_block *mc_setup_head;/* Multicast setup frame list head. */
        struct speedo_mc_block *mc_setup_tail;/* Multicast setup frame list tail. */
-       int in_interrupt;                                       /* Word-aligned dev->interrupt */
+       long in_interrupt;                                      /* Word-aligned dev->interrupt */
        char rx_mode;                                           /* Current PROMISC/ALLMULTI setting. */
        unsigned int tx_full:1;                         /* The Tx queue is full. */
        unsigned int full_duplex:1;                     /* Full-duplex operation requested. */
@@ -587,11 +587,19 @@ int eepro100_init(void)
                        ioaddr = pciaddr & ~3UL;
                        if (check_region(ioaddr, 32))
                                continue;
-               } else if ((ioaddr = (long)ioremap(pciaddr & ~0xfUL, 0x1000)) == 0) {
+               } else 
+#ifdef __sparc__
+               {
+                       /* ioremap is hosed in 2.2.x on Sparc. */
+                       ioaddr = pciaddr & ~0xfUL;
+               }
+#else
+               if ((ioaddr = (long)ioremap(pciaddr & ~0xfUL, 0x1000)) == 0) {
                        printk(KERN_INFO "Failed to map PCI address %#lx.\n",
                                   pciaddr);
                        continue;
                }
+#endif
                if (speedo_debug > 2)
                        printk("Found Intel i82557 PCI Speedo at I/O %#lx, IRQ %d.\n",
                                   ioaddr, irq);
index a3fe4d3d14bf4f8f79c84ee886df4b96a06827d2..4140350cd855e966210352894636d5084888958d 100644 (file)
@@ -420,7 +420,7 @@ static const char media_cap[] =
 {0,0,0,16,  3,19,16,24,  27,4,7,5, 0,20,23,20 };
 static u8 t21040_csr13[] = {2,0x0C,8,4,  4,0,0,0, 0,0,0,0, 4,0,0,0};
 /* 21041 transceiver register settings: 10-T, 10-2, AUI, 10-T, 10T-FD*/
-static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
+static u16 t21041_csr13[] = { 0xEF05, 0xEF0D, 0xEF0D, 0xEF05, 0xEF05, };
 static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, };
 static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
 
index 68c37778f841ed75a89cacee4ca3beb965b45151..2193b6aaa9cb2185f885dbee8dbc4b900e01f011 100644 (file)
@@ -4,7 +4,7 @@
  * A low level driver for Yamaha OPL3-SA2 and SA3 cards.
  * SAx cards should work, as they are just variants of the SA3.
  *
- * Copyright 1998, 1999 Scott Murray <scottm@interlog.com>
+ * Copyright 1998, 1999, 2000 Scott Murray <scott@spiteful.org>
  *
  * Originally based on the CS4232 driver (in cs4232.c) by Hannu Savolainen
  * and others.  Now incorporates code/ideas from pss.c, also by Hannu
@@ -32,6 +32,7 @@
  * Scott Murray            Simpler detection code should work all the time now
  *                         (with thanks to Ben Hutchings for the heuristic),
  *                         removed now unnecessary force option. (Jan 5, 1999)
+ * Scott Murray            Updated e-mail address. (Mar 18, 2000)
  *
  */
 
@@ -648,7 +649,7 @@ MODULE_PARM(dma2, "i");
 MODULE_PARM_DESC(dma2, "Set MSS (audio) second DMA channel (0, 1, 3)");
 
 MODULE_DESCRIPTION("Module for OPL3-SA2 and SA3 sound cards (uses AD1848 MSS driver).");
-MODULE_AUTHOR("Scott Murray <scottm@interlog.com>");
+MODULE_AUTHOR("Scott Murray <scott@spiteful.org>");
 
 EXPORT_NO_SYMBOLS;
 
index 0da0c256c9b0cbd3eda33414f132202772e9ee2d..25b1aebe9b74afee358f28a3ce96b7658677f9aa 100644 (file)
@@ -489,7 +489,7 @@ do_load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
                        if (elf_interpreter ||
                            elf_ppnt->p_filesz < 2 ||
                            elf_ppnt->p_filesz > PAGE_SIZE)
-                               goto out_free_interp;
+                               goto out_free_dentry;
 
                        /* This is the program interpreter used for
                         * shared libraries - for now assume that this
@@ -526,12 +526,12 @@ do_load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
                                        
                                current->personality = PER_SVR4;
                                interpreter_dentry = open_namei(elf_interpreter,
-                                                               0, 0);
+                                                               1, 0);
                                current->personality = old_pers;
                        } else
 #endif                                 
                                interpreter_dentry = open_namei(elf_interpreter,
-                                                               0, 0);
+                                                               1, 0);
                        set_fs(old_fs);
                        retval = PTR_ERR(interpreter_dentry);
                        if (IS_ERR(interpreter_dentry))
index 110326df21143696eb0d06f39082dcaec5cdfdd1..5e835996d286d15a2bd075ec3dd469d32eacc7ff 100644 (file)
@@ -183,8 +183,8 @@ revalidate:
                                                   bh, offset)) {
                                /* On error, skip the f_pos to the
                                    next block. */
-                               filp->f_pos = (filp->f_pos & (sb->s_blocksize - 1))
-                                             + sb->s_blocksize;
+                               filp->f_pos = (filp->f_pos | (sb->s_blocksize - 1))
+                                             + 1;
                                brelse (bh);
                                return stored;
                        }
index 6a79c4a5e96f1cfa565a609443fa195b97d15c08..4b3623ff939fb7bb1530451aa2642891c3c32051 100644 (file)
@@ -108,9 +108,9 @@ revalidate:
                                                   bh, offset)) {
                                /* On error, skip the f_pos to the
                                   next block. */
-                               filp->f_pos = (filp->f_pos &
+                               filp->f_pos = (filp->f_pos |
                                              (sb->s_blocksize - 1)) +
-                                              sb->s_blocksize;
+                                              1;
                                brelse (bh);
                                return stored;
                        }
index 107252d11b9cf31322f167b733c70bb9d536db98..87d56c6e2d8a484afc4968e70156fc41aaf405ac 100644 (file)
@@ -6,7 +6,7 @@
 #define TASK_ADDR_LIMIT 24
 #define TASK_EXEC_DOMAIN 32
 #define TASK_NEED_RESCHED 40
-#define TASK_SIZE 1064
+#define TASK_SIZE 1072
 #define STACK_SIZE 16384
 #define HAE_CACHE 0
 #define HAE_REG 8
index 67fd8a76a72cca3d706ba20d081a7469324e6a4c..a1a7c2429ccf96d29575f12aba233acb50d0647f 100644 (file)
@@ -320,7 +320,7 @@ __EXTERN_INLINE void * tsunami_bus_to_virt(unsigned long address)
 /*
  * I/O functions:
  *
- * TSUNAMI, the 21??? PCI/memory support chipset for the EV6 (21264)
+ * TSUNAMI, the 21272 PCI/memory support chipset for the EV6 (21264)
  * can only use linear accesses to get at PCI memory and I/O spaces.
  */
 
index 118941b3c86f8560fc20318e70776fab1e7cb247..b9d8faa61163f713715bc4a406465f9b648401bf 100644 (file)
@@ -27,7 +27,7 @@
 #define FPCR_DYN_PLUS   (0x3UL << FPCR_DYN_SHIFT)      /* towards +INF */
 #define FPCR_DYN_MASK   (0x3UL << FPCR_DYN_SHIFT)
 
-#define FPCR_MASK      0xfffe000000000000
+#define FPCR_MASK      0xffff800000000000
 
 /*
  * IEEE trap enables are implemented in software.  These per-thread
@@ -67,7 +67,8 @@
                                 IEEE_STATUS_OVF | IEEE_STATUS_UNF |    \
                                 IEEE_STATUS_INE | IEEE_STATUS_DNO)
 
-#define IEEE_SW_MASK           (IEEE_TRAP_ENABLE_MASK | IEEE_STATUS_MASK | IEEE_MAP_MASK)
+#define IEEE_SW_MASK           (IEEE_TRAP_ENABLE_MASK |                \
+                                IEEE_STATUS_MASK | IEEE_MAP_MASK)
 
 #define IEEE_CURRENT_RM_SHIFT  32
 #define IEEE_CURRENT_RM_MASK   (3UL<<IEEE_CURRENT_RM_SHIFT)
 
 /*
  * Convert the software IEEE trap enable and status bits into the
- * hardware fpcr format.
+ * hardware fpcr format. 
+ *
+ * Digital Unix engineers receive my thanks for not defining the
+ * software bits identical to the hardware bits.  The chip designers
+ * receive my thanks for making all the not-implemented fpcr bits
+ * RAZ forcing us to use system calls to read/write this value.
  */
 
 static inline unsigned long
@@ -86,11 +92,13 @@ ieee_swcr_to_fpcr(unsigned long sw)
 {
        unsigned long fp;
        fp = (sw & IEEE_STATUS_MASK) << 35;
-       fp |= sw & IEEE_STATUS_MASK ? FPCR_SUM : 0;
+       fp |= (sw & IEEE_MAP_DMZ) << 36;
+       fp |= (sw & IEEE_STATUS_MASK ? FPCR_SUM : 0);
        fp |= (~sw & (IEEE_TRAP_ENABLE_INV
                      | IEEE_TRAP_ENABLE_DZE
                      | IEEE_TRAP_ENABLE_OVF)) << 48;
        fp |= (~sw & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE)) << 57;
+       fp |= (sw & IEEE_MAP_UMZ ? FPCR_UNDZ | FPCR_UNFD : 0);
        fp |= (~sw & IEEE_TRAP_ENABLE_DNO) << 41;
        return fp;
 }
@@ -100,10 +108,12 @@ ieee_fpcr_to_swcr(unsigned long fp)
 {
        unsigned long sw;
        sw = (fp >> 35) & IEEE_STATUS_MASK;
+       sw |= (fp >> 36) & IEEE_MAP_DMZ;
        sw |= (~fp >> 48) & (IEEE_TRAP_ENABLE_INV
                             | IEEE_TRAP_ENABLE_DZE
                             | IEEE_TRAP_ENABLE_OVF);
        sw |= (~fp >> 57) & (IEEE_TRAP_ENABLE_UNF | IEEE_TRAP_ENABLE_INE);
+       sw |= (fp >> 47) & IEEE_MAP_UMZ;
        sw |= (~fp >> 41) & IEEE_TRAP_ENABLE_DNO;
        return sw;
 }
@@ -115,26 +125,59 @@ ieee_fpcr_to_swcr(unsigned long fp)
    never generates arithmetic faults and (b) call_pal instructions
    are implied trap barriers.  */
 
-static inline unsigned long rdfpcr(void)
+static inline unsigned long
+rdfpcr(void)
 {
        unsigned long tmp, ret;
+
+#if defined(__alpha_cix__) || defined(__alpha_fix__)
+       __asm__ ("ftoit $f0,%0\n\t"
+                "mf_fpcr $f0\n\t"
+                "ftoit $f0,%1\n\t"
+                "itoft %0,$f0"
+                : "=r"(tmp), "=r"(ret));
+#else
        __asm__ ("stt $f0,%0\n\t"
                 "mf_fpcr $f0\n\t"
                 "stt $f0,%1\n\t"
                 "ldt $f0,%0"
-               : "=m"(tmp), "=m"(ret));
+                : "=m"(tmp), "=m"(ret));
+#endif
+
        return ret;
 }
 
-static inline void wrfpcr(unsigned long val)
+static inline void
+wrfpcr(unsigned long val)
 {
        unsigned long tmp;
+
+#if defined(__alpha_cix__) || defined(__alpha_fix__)
+       __asm__ ("ftoit $f0,%0\n\t"
+                "itoft %1,$f0\n\t"
+                "mt_fpcr $f0\n\t"
+                "itoft %0,$f0"
+                : "=&r"(tmp) : "r"(val));
+#else
        __asm__ __volatile__ (
                "stt $f0,%0\n\t"
                "ldt $f0,%1\n\t"
                "mt_fpcr $f0\n\t"
                "ldt $f0,%0"
                : "=m"(tmp) : "m"(val));
+#endif
+}
+
+static inline unsigned long
+swcr_update_status(unsigned long swcr, unsigned long fpcr)
+{
+       /* EV6 implements most of the bits in hardware.  Collect
+          the acrued exception bits from the real fpcr.  */
+       if (implver() == IMPLVER_EV6) {
+               swcr &= ~IEEE_STATUS_MASK;
+               swcr |= (fpcr >> 35) & IEEE_STATUS_MASK;
+       }
+       return swcr;
 }
 
 extern unsigned long alpha_read_fp_reg (unsigned long reg);
index ae50cc3192c7be4ff0408b69af10e0671e6d74bd..8c686eb426a432dee1b1ff644a4cf30f031a2eb0 100644 (file)
@@ -13,7 +13,7 @@
 #define GEN_FLTUND     -5      /* fp underflow */
 #define GEN_FLTINV     -6      /* invalid fp operand */
 #define GEN_FLTINE     -7      /* inexact fp operand */
-#define GEN_DECOVF     -8      /* decimal overflow (for COBOL??) */
+#define GEN_DECOVF     -8      /* decimal overflow (for COBOL?) */
 #define GEN_DECDIV     -9      /* decimal division by zero */
 #define GEN_DECINV     -10     /* invalid decimal operand */
 #define GEN_ROPRAND    -11     /* reserved operand */
index ec710c9c8c9b6e2237ffba54d63b0184ca83c329..ec65678bb88ff8397515442a0d7dbc45b9084fdc 100644 (file)
@@ -16,7 +16,7 @@
 #define EV56_CPU               7       /* EV5.6 (21164)        */
 #define EV6_CPU                        8       /* EV6 (21164)          */
 #define PCA56_CPU              9       /* PCA56 (21164PC)      */
-#define PCA57_CPU              10      /* PCA57 (21164??)      */
+#define PCA57_CPU              10      /* PCA57 (21164notyet)  */
 
 /*
  * DEC system types for Alpha systems.  Found in HWRPB.
index fa6bd17e108cac8449261a20045e7fe8a6fef898..d2c53014f246ec1e28d5db3ebcc59ffc96cc168c 100644 (file)
 struct linux_hose_info {
         struct pci_bus                  pci_bus;
        struct linux_hose_info         *next;
-       unsigned long                   pci_io_space;
-       unsigned long                   pci_mem_space;
+       unsigned long                   pci_sparse_io_space;
+       unsigned long                   pci_sparse_mem_space;
+       unsigned long                   pci_dense_io_space;
+       unsigned long                   pci_dense_mem_space;
        unsigned long                   pci_config_space;
-       unsigned long                   pci_sparse_space;
         unsigned int                    pci_first_busno;
         unsigned int                    pci_last_busno;
        unsigned int                    pci_hose_index;
@@ -45,4 +46,11 @@ extern struct linux_hose_info *bus2hose[256];
 
 #endif /* Multiple busses */
 
+/* Values for the `which' argument to sys_pciconfig_iobase.  */
+#define IOBASE_HOSE             0
+#define IOBASE_SPARSE_MEM       1
+#define IOBASE_DENSE_MEM        2
+#define IOBASE_SPARSE_IO        3
+#define IOBASE_DENSE_IO         4
+
 #endif /* __ALPHA_PCI_H */
index df20edc7f2e2aaae199c7b8ead0467beb9eb4ced..0338d70f1dacf91732345c271d00c0be0a549756 100644 (file)
 #define __NR_capget                    368
 #define __NR_capset                    369
 #define __NR_sendfile                  370
+#define __NR_setresgid                 371     /* implemented in 2.3 */
+#define __NR_getresgid                 372     /* implemented in 2.3 */
+#define __NR_dipc                      373     /* implemented in 2.3 */
+#define __NR_pivot_root                        374     /* implemented in 2.3 */
+#define __NR_mincore                   375     /* implemented in 2.3 */
+#define __NR_pciconfig_iobase          376
 
 #if defined(__LIBRARY__) && defined(__GNUC__)
 
index b73ca473236dd5c5ad55c6a81447c72bdd57e366..b372401000071c254acdf23d06bbfc69dacf6c7b 100644 (file)
@@ -329,7 +329,8 @@ struct i2o_pci
 {
        int irq;
 #ifdef CONFIG_MTRR
-       int mtrr_reg;
+       int mtrr_reg0;
+       int mtrr_reg1;
 #endif
 };
 
index d801727aa213fee2321a512fadb8e5892e4a721f..dff77e476c9b2e36c381ef170a2a9d8426a4e550 100644 (file)
@@ -499,6 +499,7 @@ extern void FASTCALL(wake_up_process(struct task_struct * tsk));
 #define wake_up_interruptible(x)       __wake_up((x),TASK_INTERRUPTIBLE)
 
 extern int in_group_p(gid_t grp);
+extern int in_egroup_p(gid_t grp);
 
 extern void flush_signals(struct task_struct *);
 extern void flush_signal_handlers(struct task_struct *);
index 9d8dc89c2524ddc36303305a5d8958bb237db28e..74fbb38405e56e4774dc68737c7fab089edd986f 100644 (file)
@@ -116,6 +116,7 @@ EXPORT_SYMBOL(get_unmapped_area);
 
 /* filesystem internal functions */
 EXPORT_SYMBOL(in_group_p);
+EXPORT_SYMBOL(in_egroup_p);
 EXPORT_SYMBOL(update_atime);
 EXPORT_SYMBOL(get_super);
 EXPORT_SYMBOL(get_fs_type);
index a70385b910338b406b1235ed7d01b45267e30873..97fc5830ba1e104f25ef1e5d10d06eecb0618682 100644 (file)
@@ -807,6 +807,27 @@ out:
        return 1;
 }
 
+/* Like in_group_p, but testing against egid, not fsgid */
+
+int in_egroup_p(gid_t grp)
+{
+       if (grp != current->egid) {
+               int i = current->ngroups;
+               if (i) {
+                       gid_t *groups = current->groups;
+                       do {
+                               if (*groups == grp)
+                                       goto out;
+                               groups++;
+                               i--;
+                       } while (i);
+               }
+               return 0;
+       }
+out:
+       return 1;
+}
+
 /*
  * This should really be a blocking read-write lock
  * rather than a semaphore. Anybody want to implement
index bb3988849600057b567590f97dd32b2c7c7d9ab5..132817cec3f84e370ebc2243308925bc9237287f 100644 (file)
@@ -348,26 +348,6 @@ extern asmlinkage int sys_sysctl(struct __sysctl_args *args)
        return error;
 }
 
-/* Like in_group_p, but testing against egid, not fsgid */
-static int in_egroup_p(gid_t grp)
-{
-       if (grp != current->egid) {
-               int i = current->ngroups;
-               if (i) {
-                       gid_t *groups = current->groups;
-                       do {
-                               if (*groups == grp)
-                                       goto out;
-                               groups++;
-                               i--;
-                       } while (i);
-               }
-               return 0;
-       }
-out:
-       return 1;
-}
-
 /* ctl_perm does NOT grant the superuser all rights automatically, because
    some sysctl variables are readonly even to root. */
 
index 35d1f5440d947f068ce904e4c8637c04c67bd37e..da09b6640acd77d1e3780c190c68ece7235c5d38 100644 (file)
@@ -16,7 +16,7 @@
  *     Juan Jose Ciarlante     :       Litl bits for 2.1
  *     Juan Jose Ciarlante     :       use ip_masq_listen() 
  *     Juan Jose Ciarlante     :       use private app_data for own flag(s)
- *
+ *  Bjarni R. Einarsson :      Added protection against "extended FTP ALG attack"
  *
  *
  *     This program is free software; you can redistribute it and/or
  *     /etc/conf.modules (or /etc/modules.conf depending on your config)
  *     where modload will pick it up should you use modload to load your
  *     modules.
- *     
+ * 
+ * Protection against the "extended FTP ALG vulnerability".
+ *     This vulnerability was reported in:
+ *
+ *     http://www.securityfocus.com/templates/archive.pike?list=82&date=2000-03-08&msg=38C8C8EE.544524B1@enternet.se
+ * 
+ *     The protection here is very simplistic, but it at least denies access 
+ *     to all ports under 1024, and allows the user to specify an additional 
+ *     list of high ports on the insmod command line, like this:
+ *             noport=x1,x2,x3, ...
+ *     Up to MAX_MASQ_APP_PORTS (normally 12) ports may be specified, the 
+ *     default blocks access to the X server (port 6000) only.
+ * 
+ *     Patch by Bjarni R. Einarsson <bre@netverjar.is>.  The original patch is
+ *     available at: http://bre.klaki.net/programs/ip_masq_ftp.2000-03-20.diff
  */
 
 #include <linux/config.h>
 static int ports[MAX_MASQ_APP_PORTS] = {21}; /* I rely on the trailing items being set to zero */
 struct ip_masq_app *masq_incarnations[MAX_MASQ_APP_PORTS];
 
+/*
+ * List of ports (up to MAX_MASQ_APP_PORTS) we don't allow ftp-data 
+ * connections to.  Default is to block connections to port 6000 (X servers).
+ * This is in addition to all ports under 1024.
+ */
+static int noport[MAX_MASQ_APP_PORTS] = {6000, 0}; /* I rely on the trailing items being set to zero */
+
 /*
  *     Debug level
  */
@@ -69,6 +90,7 @@ MODULE_PARM(debug, "i");
 #endif
 
 MODULE_PARM(ports, "1-" __MODULE_STRING(MAX_MASQ_APP_PORTS) "i");
+MODULE_PARM(noport, "1-" __MODULE_STRING(MAX_MASQ_APP_PORTS) "i");
 
 /*     Dummy variable */
 static int masq_ftp_pasv;
@@ -100,7 +122,7 @@ masq_ftp_out (struct ip_masq_app *mapp, struct ip_masq *ms, struct sk_buff **skb
        struct ip_masq *n_ms;
        char buf[24];           /* xxx.xxx.xxx.xxx,ppp,ppp\000 */
         unsigned buf_len;
-       int diff;
+       int diff, i, unsafe;
 
         skb = *skb_p;
        iph = skb->nh.iph;
@@ -141,6 +163,20 @@ masq_ftp_out (struct ip_masq_app *mapp, struct ip_masq *ms, struct sk_buff **skb
                from = (p1<<24) | (p2<<16) | (p3<<8) | p4;
                port = (p5<<8) | p6;
 
+               if (port < 1024) 
+               {
+                       IP_MASQ_DEBUG(1-debug, "Unsafe PORT %X:%X detected, ignored\n",from,port);
+                       continue;
+               }
+
+               for (unsafe = i = 0; (i < MAX_MASQ_APP_PORTS) && (noport[i]); i++)
+                 if (port == noport[i])
+               {
+                       IP_MASQ_DEBUG(1-debug, "Unsafe PORT %X:%X detected, ignored\n",from,port);
+                       unsafe = 1;
+               }
+               if (unsafe) continue;
+
                IP_MASQ_DEBUG(1-debug, "PORT %X:%X detected\n",from,port);
 
                /*
index b887d80e71d7c898b0b8d38706525073f276e950..8961ebbefd79778af2c6c69d05d13ec25c9dba0a 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:    $Id: tcp.c,v 1.140.2.9 2000/02/07 20:20:00 davem Exp $
+ * Version:    $Id: tcp.c,v 1.140.2.10 2000/03/21 20:54:13 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -1448,11 +1448,12 @@ void tcp_shutdown(struct sock *sk, int how)
                return;
 
        /* If we've already sent a FIN, or it's a closed state, skip this. */
-       if ((1 << sk->state) & (TCPF_ESTABLISHED|TCPF_SYN_RECV|TCPF_SYN_SENT)) {
+       if ((1 << sk->state) &
+           (TCPF_ESTABLISHED|TCPF_SYN_SENT|TCPF_SYN_RECV|TCPF_CLOSE_WAIT)) {
                lock_sock(sk);
 
                /* Clear out any half completed packets.  FIN if needed. */
-               if (tcp_close_state(sk,sk->state == TCP_CLOSE_WAIT))
+               if (tcp_close_state(sk,0))
                        tcp_send_fin(sk);
 
                release_sock(sk);
index 6944155e547d7b981e125e149691a05b59056879..47e8a6f38fe833a5bd01eef6954cc444719c4432 100644 (file)
@@ -969,6 +969,10 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg, int len,
                        return -ENOTCONN;
        }
 
+       err = -EMSGSIZE;
+       if (len > sk->sndbuf)
+               goto out;
+
        if (sock->passcred && !sk->protinfo.af_unix.addr)
                unix_autobind(sock);