NetBSD Problem Report #34737
From talmage@macdonell.onespeeddave.com Fri Oct 6 21:57:29 2006
Return-Path: <talmage@macdonell.onespeeddave.com>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
by narn.NetBSD.org (Postfix) with ESMTP id 71FC163B8CA
for <gnats-bugs@gnats.NetBSD.org>; Fri, 6 Oct 2006 21:57:29 +0000 (UTC)
Message-Id: <200610062029.k96KTULa001167@macdonell.onespeeddave.com>
Date: Fri, 6 Oct 2006 16:29:30 -0400 (EDT)
From: "David W. Talmage" <talmage@macdonell.onespeeddave.com>
Reply-To: talmage@macdonell.onespeeddave.com
To: gnats-bugs@NetBSD.org
Subject: NetBSD cannot mount a generation 5.5 iPod with Video
X-Send-Pr-Version: 3.95
>Number: 34737
>Category: kern
>Synopsis: NetBSD cannot mount a generation 5.5 iPod with Video
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: kern-bug-people
>State: closed
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Fri Oct 06 22:00:00 +0000 2006
>Closed-Date: Fri Jun 15 18:29:53 +0000 2007
>Last-Modified: Fri Jun 15 18:29:53 +0000 2007
>Originator: David W. Talmage
>Release: NetBSD 3.0.1
>Organization:
>Environment:
System: NetBSD macdonell.onespeeddave.com 3.0.1 NetBSD 3.0.1 (MACDONELL) #0: Sat Aug 19 18:21:00 EDT 2006 root@macdonell.onespeeddave.com:/usr/src/sys/arch/i386/compile/MACDONELL i386
Architecture: i386
Machine: i386
>Description:
NetBSD cannot mount a 30GB generation 5.5 iPod with Video. All attempts to
access the iPod hang in biowait.
When I plug in my iPod, NetBSD creates an incorrect geometry for the
iPod.
The firmware version of my iPod is 1.2.
Steve Bellovin reported in netbsd-users that his son's 60GB generation
5 iPod works correctly with his computer. The firmware version for
that iPod is 1.1.1.
Here is the output of dmesg when I plug in my iPod:
...
umass1 at uhub4 port 6 configuration 1 interface 0
umass1: Apple iPod, rev 2.00/0.02, addr 3
umass1: using SCSI over Bulk-Only
scsibus1 at umass1: 2 targets, 1 lun per target
sd4 at scsibus1 target 0 lun 0: <Apple, iPod, 1.62> disk removable
sd4: fabricating a geometry
sd4: 7153 MB, 7153 cyl, 64 head, 32 sec, 512 bytes/sect x 14651280 sectors
sd4: fabricating a geometry
My iPod works fine on my PowerBook G3 that runs Ubuntu Linux. Dmesg
on the PowerBook says this when I plug in the iPod:
[ 216.523212] usb 1-1: new full speed USB device using ohci_hcd and address 3
[ 216.735713] usb 1-1: configuration #1 chosen from 2 choices
[ 217.263083] Initializing USB Mass Storage driver...
[ 217.265749] scsi1 : SCSI emulation for USB Mass Storage devices
[ 217.267388] usb-storage: device found at 3
[ 217.267405] usb-storage: waiting for device to settle before scanning
[ 217.268047] usbcore: registered new driver usb-storage
[ 217.268064] USB Mass Storage support registered.
[ 222.273632] Vendor: Apple Model: iPod Rev: 1.62
[ 222.273697] Type: Direct-Access ANSI SCSI
revision: 00
[ 222.299277] usb-storage: device scan complete
[ 222.484324] Driver 'sd' needs updating - please use bus_type methods
[ 222.496025] SCSI device sda: 14651279 2048-byte hdwr sectors (30006 MB)
[ 222.505533] sda: Write Protect is off
[ 222.505558] sda: Mode Sense: 68 00 00 08
[ 222.505569] sda: assuming drive cache: write through
[ 222.525525] SCSI device sda: 14651279 2048-byte hdwr sectors (30006 MB)
[ 222.536547] sda: Write Protect is off
[ 222.536572] sda: Mode Sense: 68 00 00 08
[ 222.536584] sda: assuming drive cache: write through
[ 222.537343] sda: sda1 sda2
[ 222.556622] sd 1:0:0:0: Attached scsi removable disk sda
[ 222.665297] sd 1:0:0:0: Attached scsi generic sg0 type 0
[ 222.955741] Buffer I/O error on device sda2, logical block 14603084
[ 222.991313] Buffer I/O error on device sda2, logical block 14603084
[ 223.008003] Buffer I/O error on device sda2, logical block 14603084
[ 223.008481] Buffer I/O error on device sda2, logical block 14603084
[ 223.008905] Buffer I/O error on device sda2, logical block 14603084
[ 223.009329] Buffer I/O error on device sda2, logical block 14603084
[ 223.425816] Buffer I/O error on device sda2, logical block 14603084
[ 223.426289] Buffer I/O error on device sda2, logical block 14603084
[ 223.426889] Buffer I/O error on device sda2, logical block 14603084
[ 223.427432] Buffer I/O error on device sda2, logical block 14603084
[ 229.821573] FAT: utf8 is not a recommended IO charset for FAT filesystems,
filesystem will be case sensitive!
>How-To-Repeat:
Plug in a generation 5.5 iPod with Video.
>Fix:
>Release-Note:
>Audit-Trail:
From: Steve Woodford <scw@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: kern-bug-people@netbsd.org, gnats-admin@netbsd.org,
netbsd-bugs@netbsd.org
Subject: Re: kern/34737: NetBSD cannot mount a generation 5.5 iPod with Video
Date: Sat, 7 Oct 2006 09:57:52 +0100
--Boundary-00=_Qw2JFAAcwj5Av/B
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
On Friday 06 October 2006 23:00, David W. Talmage wrote:
> NetBSD cannot mount a 30GB generation 5.5 iPod with Video. All
> attempts to access the iPod hang in biowait.
>
> When I plug in my iPod, NetBSD creates an incorrect geometry for the
> iPod.
Can you try again after applying the attached patch under sys/dev/scsipi?
If my hunch is right, this will solve the geometry and hanging issues,
but it will uncover another limitation with the kernel. Namely the
DEV_BSIZE issue described at the following link:
http://www.sra.co.jp/people/soda/koji/sectorsize-en.txt
Cheers, Steve
--Boundary-00=_Qw2JFAAcwj5Av/B
Content-Type: text/x-diff;
charset="iso-8859-1";
name="scsipi-blksize.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="scsipi-blksize.diff"
Index: scsipi_base.c
===================================================================
RCS file: /cvsroot/src/sys/dev/scsipi/scsipi_base.c,v
retrieving revision 1.137
diff -u -r1.137 scsipi_base.c
--- scsipi_base.c 11 Sep 2006 19:43:55 -0000 1.137
+++ scsipi_base.c 7 Oct 2006 08:52:54 -0000
@@ -1025,7 +1025,7 @@
* Find out from the device what its capacity is.
*/
u_int64_t
-scsipi_size(struct scsipi_periph *periph, int flags)
+scsipi_size(struct scsipi_periph *periph, int *secsize, int flags)
{
union {
struct scsipi_read_capacity_10 cmd;
@@ -1048,8 +1048,11 @@
flags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK | XS_CTL_SILENT) != 0)
return (0);
- if (_4btol(data.data.addr) != 0xffffffff)
+ if (_4btol(data.data.addr) != 0xffffffff) {
+ if (secsize)
+ *secsize = _4btol(data.data.length);
return (_4btol(data.data.addr) + 1);
+ }
/*
* Device is larger than can be reflected by READ CAPACITY (10).
@@ -1067,6 +1070,8 @@
flags | XS_CTL_DATA_IN | XS_CTL_DATA_ONSTACK | XS_CTL_SILENT) != 0)
return (0);
+ if (secsize)
+ *secsize = _4btol(data.data.length);
return (_8btol(data.data16.addr) + 1);
}
Index: scsipiconf.h
===================================================================
RCS file: /cvsroot/src/sys/dev/scsipi/scsipiconf.h,v
retrieving revision 1.103
diff -u -r1.103 scsipiconf.h
--- scsipiconf.h 16 Feb 2006 20:17:19 -0000 1.103
+++ scsipiconf.h 7 Oct 2006 08:52:54 -0000
@@ -638,7 +638,7 @@
const char *scsipi_dtype(int);
void scsipi_strvis(u_char *, int, const u_char *, int);
int scsipi_execute_xs(struct scsipi_xfer *);
-u_int64_t scsipi_size(struct scsipi_periph *, int);
+u_int64_t scsipi_size(struct scsipi_periph *, int *, int);
int scsipi_test_unit_ready(struct scsipi_periph *, int);
int scsipi_prevent(struct scsipi_periph *, int, int);
int scsipi_inquire(struct scsipi_periph *,
Index: sd.c
===================================================================
RCS file: /cvsroot/src/sys/dev/scsipi/sd.c,v
retrieving revision 1.250
diff -u -r1.250 sd.c
--- sd.c 14 Sep 2006 17:54:34 -0000 1.250
+++ sd.c 7 Oct 2006 08:52:55 -0000
@@ -1651,7 +1651,7 @@
u_int8_t resvd;
} scsipi_sense;
u_int64_t sectors;
- int error;
+ int error, blksize;
/*
* scsipi_size (ie "read capacity") and mode sense page 6
@@ -1660,7 +1660,7 @@
* XXX probably differs for removable media
*/
dp->blksize = 512;
- if ((sectors = scsipi_size(sd->sc_periph, flags)) == 0)
+ if ((sectors = scsipi_size(sd->sc_periph, &blksize, flags)) == 0)
return (SDGP_RESULT_OFFLINE); /* XXX? */
error = scsipi_mode_sense(sd->sc_periph, SMS_DBD, 6,
@@ -1672,7 +1672,7 @@
dp->blksize = _2btol(scsipi_sense.lbs);
if (dp->blksize == 0)
- dp->blksize = 512;
+ dp->blksize = blksize ? blksize : 512;
/*
* Create a pseudo-geometry.
@@ -1700,13 +1700,13 @@
sd_get_capacity(struct sd_softc *sd, struct disk_parms *dp, int flags)
{
u_int64_t sectors;
- int error;
+ int error, blksize;
#if 0
int i;
u_int8_t *p;
#endif
- dp->disksize = sectors = scsipi_size(sd->sc_periph, flags);
+ dp->disksize = sectors = scsipi_size(sd->sc_periph, &blksize, flags);
if (sectors == 0) {
struct scsipi_read_format_capacities cmd;
struct {
@@ -1752,7 +1752,7 @@
dp->blksize = _3btol(data.desc.blklen);
if (dp->blksize == 0)
- dp->blksize = 512;
+ dp->blksize = blksize ? blksize : 512;
} else {
struct sd_mode_sense_data scsipi_sense;
int big, bsize;
@@ -1761,7 +1761,7 @@
memset(&scsipi_sense, 0, sizeof(scsipi_sense));
error = sd_mode_sense(sd, 0, &scsipi_sense,
sizeof(scsipi_sense.blk_desc), 0, flags | XS_CTL_SILENT, &big);
- dp->blksize = 512;
+ dp->blksize = blksize ? blksize : 512;
if (!error) {
if (big) {
bdesc = (void *)(&scsipi_sense.header.big + 1);
@@ -1780,7 +1780,7 @@
if (bsize >= 8) {
dp->blksize = _3btol(bdesc->blklen);
if (dp->blksize == 0)
- dp->blksize = 512;
+ dp->blksize = blksize ? blksize : 512;
}
}
}
--Boundary-00=_Qw2JFAAcwj5Av/B--
From: "David W. Talmage" <talmage@onespeeddave.com>
To: gnats-bugs@netbsd.org
Cc: Steve Woodford <scw@netbsd.org>
Subject: Re: kern/34737
Date: Mon, 9 Oct 2006 14:38:51 -0400
I applied the patch, rebuilt the kernel, and rebooted with the new kernel. As Mr. Woodford predicted, the patch resolved the geometry and hanging issues. Stll, I can't mount the iPod.
Here's what dmesg said when I plugged in the iPod:
umass1 at uhub4 port 6 configuration 1 interface 0
umass1: Apple iPod, rev 2.00/0.02, addr 3
umass1: using SCSI over Bulk-Only
scsibus1 at umass1: 2 targets, 1 lun per target
sd4 at scsibus1 target 0 lun 0: <Apple, iPod, 1.62> disk removable
sd4: fabricating a geometry
sd4: 28615 MB, 7153 cyl, 64 head, 32 sec, 2048 bytes/sect x 14651280 sectors
Let me tell you, that was exciting to see!
Disklabel said this:
talmage@macdonell% sudo disklabel sd4
disklabel: Can't read master boot record 0: Invalid argument
# /dev/rsd4d:
type: SCSI
disk: mydisk
label: fictitious
flags: removable
bytes/sector: 2048
sectors/track: 32
tracks/cylinder: 64
sectors/cylinder: 2048
cylinders: 7153
total sectors: 14651280
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0
6 partitions:
# size offset fstype [fsize bsize cpg/sgs]
d: 58605120 0 unused 0 0 # (Cyl. 0 - 28615+)
f: 14603085 48195 MSDOS # (Cyl. 23*- 7153*)
disklabel: boot block size 0
disklabel: super block size 0
disklabel: partition d: partition extends past end of unit
Attempting to read the disklabel from the iPod, I got this:
talmage@macdonell% sudo disklabel -r sd4
disklabel: Can't read master boot record 0: Invalid argument
disklabel: no disklabel
Still, I can't mount the iPod.
talmage@macdonell% sudo mount -t msdos /dev/sd4f /mnt/hd
mount_msdos: /dev/sd4f on /mnt/hd: Invalid argument
From: Steve Woodford <scw@netbsd.org>
To: talmage@acm.org
Cc: gnats-bugs@netbsd.org
Subject: Re: kern/34737
Date: Mon, 9 Oct 2006 21:16:28 +0100
On Monday 09 October 2006 19:38, David W. Talmage wrote:
> I applied the patch, rebuilt the kernel, and rebooted with the new
> kernel. As Mr. Woodford predicted, the patch resolved the geometry
> and hanging issues. Stll, I can't mount the iPod.
Yep, and here's why:
> sd4: 28615 MB, 7153 cyl, 64 head, 32 sec, 2048 bytes/sect x 14651280
> sectors
Note: 2048 bytes/sect.
Cheers, Steve
From: Steve Woodford <scw@netbsd.org>
To: gnats-bugs@NetBSD.org
Cc:
Subject: PR/34737 CVS commit: src/sys/dev/scsipi
Date: Mon, 9 Oct 2006 21:29:14 +0000 (UTC)
Module Name: src
Committed By: scw
Date: Mon Oct 9 21:29:14 UTC 2006
Modified Files:
src/sys/dev/scsipi: scsipi_base.c scsipiconf.h sd.c
Log Message:
Some removable umass(4) devices don't respond to mode sense page 6, or
simply return zero for logical block size. In either case, use the sector
length reported by READ_CAPACITY instead of defaulting to 512 bytes.
This partially addresses the problems reported in PR port-i386/34707 and
PR kern/34737. Namely the incorrectly reported drive geometry and the
'hanging' issue.
However, since the device in question reports 2048-byte physical sectors
it will remain unusable until DEV_BSIZE is banished.
To generate a diff of this commit:
cvs rdiff -r1.137 -r1.138 src/sys/dev/scsipi/scsipi_base.c
cvs rdiff -r1.103 -r1.104 src/sys/dev/scsipi/scsipiconf.h
cvs rdiff -r1.250 -r1.251 src/sys/dev/scsipi/sd.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
State-Changed-From-To: open->analyzed
State-Changed-By: scw@netbsd.org
State-Changed-When: Mon, 09 Oct 2006 22:37:38 +0100
State-Changed-Why:
Partial fix has been committed. However, the device still cannot be mounted
due to the DEV_BSIZE=512 problem.
From: Juan RP <juan@xtrarom.org>
To: gnats-bugs@NetBSD.org
Cc: scw@netbsd.org
Subject: Re: kern/34737 (NetBSD cannot mount a generation 5.5 iPod with
Video)
Date: Mon, 9 Oct 2006 23:51:01 +0200
On Mon, 9 Oct 2006 21:37:39 +0000 (UTC)
scw@netbsd.org wrote:
> Synopsis: NetBSD cannot mount a generation 5.5 iPod with Video
>
> State-Changed-From-To: open->analyzed
> State-Changed-By: scw@netbsd.org
> State-Changed-When: Mon, 09 Oct 2006 22:37:38 +0100
> State-Changed-Why:
> Partial fix has been committed. However, the device still cannot be
> mounted due to the DEV_BSIZE=512 problem.
Thanks for this... do you have any idea how to fix the problem with
DEV_BSIZE=512? I see it's hardcoded in
sys/arch/<machine>/include/param.h and used in multiple places over
the src tree.
BTW I do have another mp3 player with this problem:
umass0 at uhub2 port 1 configuration 1 interface 0
umass0: <USB MF> <USB PRODUCT>, rev 1.10/10.01, addr 2
umass0: using SCSI over Bulk-Only
scsibus0 at umass0: 2 targets, 1 lun per target
sd0 at scsibus0 target 0 lun 0: <SigmaTel, MSCN, 0100> disk removable
sd0: fabricating a geometry
sd0: 998 MB, 249 cyl, 64 head, 32 sec, 2048 bytes/sect x 511296 sectors
From: "Michael L. Hitch" <mhitch@lightning.msu.montana.edu>
To: gnats-bugs@NetBSD.org
Cc: kern-bug-people@NetBSD.org, <gnats-admin@NetBSD.org>,
<netbsd-bugs@NetBSD.org>, <talmage@macdonell.onespeeddave.com>
Subject: Re: PR/34737 CVS commit: src/sys/dev/scsipi
Date: Mon, 9 Oct 2006 15:29:05 -0600 (MDT)
On Mon, 9 Oct 2006, Steve Woodford wrote:
> This partially addresses the problems reported in PR port-i386/34707 and
> PR kern/34737. Namely the incorrectly reported drive geometry and the
> 'hanging' issue.
>
> However, since the device in question reports 2048-byte physical sectors
> it will remain unusable until DEV_BSIZE is banished.
I don't know about the other iPods, but the iPod Nano I tested
appears to have an HFS filesystem, which will make it even harder to
mount.
--
Michael L. Hitch mhitch@montana.edu
Computer Consultant
Information Technology Center
Montana State University Bozeman, MT USA
From: Juan RP <juan@xtrarom.org>
To: "Michael L. Hitch" <mhitch@lightning.msu.montana.edu>
Cc: gnats-bugs@NetBSD.org
Subject: Re: PR/34737 CVS commit: src/sys/dev/scsipi
Date: Mon, 9 Oct 2006 23:58:00 +0200
On Mon, 9 Oct 2006 15:29:05 -0600 (MDT)
"Michael L. Hitch" <mhitch@lightning.msu.montana.edu> wrote:
> On Mon, 9 Oct 2006, Steve Woodford wrote:
>
> > This partially addresses the problems reported in PR
> > port-i386/34707 and PR kern/34737. Namely the incorrectly reported
> > drive geometry and the 'hanging' issue.
> >
> > However, since the device in question reports 2048-byte physical
> > sectors it will remain unusable until DEV_BSIZE is banished.
>
> I don't know about the other iPods, but the iPod Nano I tested
> appears to have an HFS filesystem, which will make it even harder to
> mount.
Google SoC 2005 sponsored a project for HFS+, the code is able to
mount volumes with read only support... maybe you want to take a
look at it?
From: Steve Woodford <scw@netbsd.org>
To: Juan RP <juan@xtrarom.org>
Cc: gnats-bugs@netbsd.org
Subject: Re: kern/34737 (NetBSD cannot mount a generation 5.5 iPod with Video)
Date: Mon, 9 Oct 2006 23:00:04 +0100
On Monday 09 October 2006 22:51, Juan RP wrote:
> do you have any idea how to fix the problem with
> DEV_BSIZE=512?
See http://www.sra.co.jp/people/soda/koji/sectorsize-en.txt
> BTW I do have another mp3 player with this problem:
Likewise. I've been sitting on the fix for a couple of months, in case
it was just my particular brand of mp3 player which exhibited the mode
sense problem. The recent reports prompted me to commit it.
Cheers, Steve
From: "David W. Talmage" <talmage@onespeeddave.com>
To: gnats-bugs@netbsd.org
Cc:
Subject: Re: kern/34737
Date: Mon, 9 Oct 2006 18:03:51 -0400
On Monday 09 October 2006 4:16 pm, Steve Woodford wrote:
> On Monday 09 October 2006 19:38, David W. Talmage wrote:
> > I applied the patch, rebuilt the kernel, and rebooted with the new
> > kernel. As Mr. Woodford predicted, the patch resolved the geometry
> > and hanging issues. Stll, I can't mount the iPod.
>
> Yep, and here's why:
> > sd4: 28615 MB, 7153 cyl, 64 head, 32 sec, 2048 bytes/sect x 14651280
> > sectors
>
> Note: 2048 bytes/sect.
With Steve's patch, kern/34737 is reduced to kern/17398, which was offerred in
2002. Why wasn't that committed four years ago? It doesn't solve the
general problem of sectors bigger or smaller than 512 bytes, I grant you, but
it just seems too useful not to commit.
David
From: Steve Woodford <scw@netbsd.org>
To: gnats-bugs@netbsd.org
Cc: kern-bug-people@netbsd.org, gnats-admin@netbsd.org,
netbsd-bugs@netbsd.org, talmage@macdonell.onespeeddave.com
Subject: Re: kern/34737
Date: Mon, 9 Oct 2006 23:16:45 +0100
On Monday 09 October 2006 23:05, David W. Talmage wrote:
> With Steve's patch, kern/34737 is reduced to kern/17398, which was
> offerred in 2002. Why wasn't that committed four years ago? It
> doesn't solve the general problem of sectors bigger or smaller than
> 512 bytes, I grant you, but it just seems too useful not to commit.
Hmm, I didn't know about that PR. It's possible no developers had access
to suitable media (with 1KB/2KB physical sectors) with which to test
the changes. Now that's no longer true, I suspect we'll see those
changes added fairly soon, at least as a stop-gap until DEV_BSIZE is
fixed. ;-)
Cheers, Steve
From: David Laight <david@l8s.co.uk>
To: gnats-bugs@NetBSD.org
Cc:
Subject: Re: kern/34737
Date: Tue, 10 Oct 2006 07:44:20 +0100
On Mon, Oct 09, 2006 at 10:20:02PM +0000, Steve Woodford wrote:
>
> Hmm, I didn't know about that PR. It's possible no developers had access
> to suitable media (with 1KB/2KB physical sectors) with which to test
> the changes. Now that's no longer true, I suspect we'll see those
> changes added fairly soon, at least as a stop-gap until DEV_BSIZE is
> fixed. ;-)
For msdos file systems there is 'prior art' - presumably correctly
identified in that PR, although it doesn't contain details about
the mbr (especially with extended partitions).
For UFS I'm not 100% sure that some of the patches lurking in the PR
database really DTRT. I think I'd rather the filesystem disk layout
were independant of the sector size on the media itself.
Also where do we put the netbsd label?
Does it go at the same byte offset from the disk/partition start?
Or in the same numbered sector?
Or ???
David
--
David Laight: david@l8s.co.uk
State-Changed-From-To: analyzed->feedback
State-Changed-By: scw@netbsd.org
State-Changed-When: Sat, 25 Nov 2006 20:49:31 +0000
State-Changed-Why:
The patch has been committed to NetBSD-current.
Please test and report back whether or not it solves the problem.
State-Changed-From-To: feedback->closed
State-Changed-By: dsl@netbsd.org
State-Changed-When: Fri, 15 Jun 2007 18:29:53 +0000
State-Changed-Why:
In feedback for 6 months.
Current kernels are able to mount FAT filesystems off 2k sector media.
>Unformatted:
(Contact us)
$NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007
The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.