366 lines
12 KiB
C
366 lines
12 KiB
C
/* unixDrv.c - UNIX-file disk driver (VxSim for Solaris) */
|
|
|
|
/*
|
|
* Copyright (c) 1984-1995,1997,1999,2000,2001,2003,2004,2006,2007
|
|
* Wind River Systems, Inc.
|
|
*
|
|
* The right to copy, distribute, modify or otherwise make use of this
|
|
* software may be licensed only pursuant to the terms of an applicable
|
|
* Wind River license agreement.
|
|
*/
|
|
|
|
/*
|
|
modification history
|
|
--------------------
|
|
01y,30jul07,elp added includes.
|
|
01x,18jun07,elp renamed field to coding convention.
|
|
01w,24may07,elp added SMP support.
|
|
01v,25oct06,elp include vxsimHostLibP.h rather than vxsimHostLib.h
|
|
01u,07apr06,dgp doc: fix formatting of routine name & examples in library
|
|
01t,31aug04,jmp modified to not build this library on SIMLINUX, it is only
|
|
kept on SIMSPARCSOLARIS for backward compatibility.
|
|
01s,04feb04,dbt Fixed documentation.
|
|
01r,23jun03,jeg reworked to use virtual disk APIs and documented as obsolete.
|
|
01q,16jun03,dbt Fixed previous changes
|
|
01p,18mar03,jeg improve error management ralative to host routine
|
|
01o,05mar03,jeg updated access to unix file definitions
|
|
01n,03feb03,jeg updated access to host specific routines. Code cleanup.
|
|
01m,04apr01,pfl doc update (SPR #63976)
|
|
01l,05dec00,jmp added SIMLINUX support.
|
|
01k,31jul00,jkf removal of RT-11 (rt11) file system, SPR#32821/31223
|
|
01j,16mar99,elg mention unixDrv is for Solaris and HP simulators (SPR 7719).
|
|
01i,11jul97,dgp doc: ad (VxSim) to title line
|
|
01h,09jan97,pr added ARCHCVTFLAGS for simsolaris
|
|
01g,30oct95,ism added support for simsolaris
|
|
01f,31oct94,kdl made conditional for simulator only.
|
|
01e,18aug93,gae modified unix_stat for hp.
|
|
01d,30jul93,gae doc touchup.
|
|
01c,23jan93,gae ANSIfied.
|
|
01b,20jul92,gae minor revision.
|
|
01a,01apr91,smeg derived from ramDrv.
|
|
*/
|
|
|
|
/*
|
|
DESCRIPTION
|
|
This driver emulates a VxWorks disk driver by using a virtual disk.
|
|
The VxWorks disk appears under UNIX as a single file.
|
|
The UNIX file name, and the size of the disk, may be specified during the
|
|
unixDiskDevCreate() call.
|
|
|
|
USER-CALLABLE ROUTINES
|
|
The routine unixDrv() must be called to initialize the driver and
|
|
the unixDiskDevCreate() routine is used to create devices.
|
|
|
|
CREATING UNIX DISKS
|
|
Before a UNIX disk can be used, it must be created. This is done
|
|
with the unixDiskDevCreate() call. The format of this call is:
|
|
|
|
\cs
|
|
BLK_DEV *unixDiskDevCreate
|
|
(
|
|
char *unixFile, /@ name of the UNIX file to use @/
|
|
int bytesPerBlk, /@ number of bytes per block @/
|
|
int blksPerTrack, /@ number of blocks per track @/
|
|
int nBlocks /@ number of blocks on this device @/
|
|
)
|
|
\ce
|
|
|
|
The UNIX file must be pre-allocated separately. This
|
|
can be done using the UNIX mkfile(8) command. Note that you have to
|
|
create an appropriately sized file. For example, to create a UNIX
|
|
file system that is used as a common floppy dosFs file system, you
|
|
would issue the comand:
|
|
\cs
|
|
mkfile 1440k /tmp/floppy.dos
|
|
\ce
|
|
This will create space for a 1.44 Meg DOS floppy (1474560 bytes,
|
|
or 2880 512-byte blocks).
|
|
|
|
The <bytesPerBlk> parameter specifies the size of each logical block
|
|
on the disk. If <bytesPerBlk> is zero, 512 is the default.
|
|
|
|
The <blksPerTrack> parameter specifies the number of blocks on each
|
|
logical track of the UNIX disk. If <blksPerTrack> is zero, the count of
|
|
blocks per track will be set to <nBlocks> (i.e., the disk will be defined
|
|
as having only one track). UNIX disk devices typically are specified
|
|
with only one track.
|
|
|
|
The <nBlocks> parameter specifies the size of the disk, in blocks.
|
|
If <nBlocks> is zero the size of the UNIX file specified, divided by
|
|
the number of bytes per block, is used.
|
|
|
|
The formatting parameters (<bytesPerBlk>, <blksPerTrack>, and <nBlocks>)
|
|
are critical only if the UNIX disk already contains the contents
|
|
of a disk created elsewhere. In that case, the formatting
|
|
parameters must be identical to those used when the image was created.
|
|
Otherwise, they may be any convenient number.
|
|
|
|
Once the device has been created it still does not have a name or
|
|
file system associated with it. This must be done by using the file
|
|
system's device initialization routine (e.g., dosFsDevInit()). The
|
|
dosFs file systems also provide make-file-system routines
|
|
(dosFsMkfs()), which may be used to associate a name
|
|
and file system with the block device and initialize that file system
|
|
on the device using default configuration parameters.
|
|
|
|
The unixDiskDevCreate() call returns a pointer to a block device
|
|
structure (BLK_DEV).
|
|
This structure contains fields that describe the physical properties of a
|
|
disk device and specify the addresses of routines within the UNIX disk driver.
|
|
The BLK_DEV structure address must be passed to the desired file system
|
|
(dosFs, or rawFs) during the file system's device
|
|
initialization or make-file-system routine. Only then is a name and file
|
|
system associated with the device, making it available for use.
|
|
|
|
As an example, to create a 200KB disk, 512-byte blocks, and only one track,
|
|
the proper call would be:
|
|
\cs
|
|
BLK_DEV *pBlkDev;
|
|
|
|
pBlkDev = unixDiskDevCreate ("/tmp/filesys1", 512, 400, 400, 0);
|
|
\ce
|
|
This will attach the UNIX file /tmp/filesys1 as a block device.
|
|
|
|
A convenience routine, unixDiskInit(), is provided to do the
|
|
unixDiskDevCreate() followed by either a dosFsMkFs() or dosFsDevInit(),
|
|
whichever is appropriate.
|
|
|
|
The format of this call is:
|
|
|
|
\cs
|
|
BLK_DEV *unixDiskInit
|
|
(
|
|
char * unixFile, /@ name of the UNIX file to use @/
|
|
char * volName, /@ name of the dosFs volume to use @/
|
|
int nBytes /@ number of bytes in dosFs volume @/
|
|
)
|
|
\ce
|
|
|
|
This call will create the UNIX disk if required.
|
|
|
|
IMPORTANT NOTE
|
|
This library is obsolete, but is kept for backward compatibility and is now
|
|
replaced by virtual disk library. But note that the virtual disk library is
|
|
not able to use unix disk created with unixDiskDevCreate() API.
|
|
|
|
SEE ALSO:
|
|
dosFsDevInit(), dosFsMkfs(), rawFsDevInit(),
|
|
*/
|
|
|
|
#include <vxWorks.h>
|
|
#include <errno.h>
|
|
#include <dosFsLib.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <private/vxsimHostLibP.h>
|
|
#include <virtualDiskLib.h>
|
|
#include <string.h>
|
|
#include <ioLib.h>
|
|
|
|
/* USED ONLY WITH SOLARIS SIMULATOR */
|
|
|
|
#if (CPU_FAMILY==SIMSPARCSOLARIS)
|
|
|
|
#define BLOCKSIZE 8192 /* default block size */
|
|
|
|
/* host file permissions : User : RW / Group : Read / Other : Read */
|
|
|
|
#define FILE_PERM S_IRUSR| S_IWUSR | S_IRGRP | S_IROTH
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* unixDrv - install UNIX disk driver
|
|
*
|
|
* This routine is to cause the UNIX disk driver to be linked in
|
|
* when building VxWorks when INCLUDE_DOS_DISK component is included in VxWorks
|
|
* image. Otherwise, it is not necessary to call this routine before using
|
|
* the UNIX disk driver.
|
|
*
|
|
* This routine is only applicable to VxSim for Solaris.
|
|
*
|
|
* IMPORTANT NOTE
|
|
* This routine is obsolete, but is kept for backward compatibility.
|
|
*
|
|
* RETURNS: OK (always).
|
|
*/
|
|
|
|
STATUS unixDrv (void)
|
|
{
|
|
return (OK);
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* unixDiskDevCreate - create a UNIX disk device
|
|
*
|
|
* This routine creates a UNIX disk device.
|
|
*
|
|
* The <unixFile> parameter specifies the name of the UNIX file to use
|
|
* for the disk device.
|
|
*
|
|
* The <bytesPerBlk> parameter specifies the size of each logical block
|
|
* on the disk. If <bytesPerBlk> is zero, 512 is the default.
|
|
*
|
|
* The <blksPerTrack> parameter specifies the number of blocks on each
|
|
* logical track of the disk. If <blksPerTrack> is zero, the count of
|
|
* blocks per track is set to <nBlocks> (i.e., the disk is defined
|
|
* as having only one track).
|
|
*
|
|
* The <nBlocks> parameter specifies the size of the disk, in blocks.
|
|
* If <nBlocks> is zero, a default size is used. The default is calculated
|
|
* as the size of the UNIX disk divided by the number of bytes per block.
|
|
*
|
|
* This routine is only applicable to VxSim for Solaris.
|
|
*
|
|
* IMPORTANT NOTE
|
|
* This routine is obsolete, but is kept for backward compatibility with previous
|
|
* version.
|
|
*
|
|
* RETURNS: A pointer to block device (BLK_DEV) structure,
|
|
* or NULL, if unable to open the UNIX disk.
|
|
*/
|
|
|
|
BLK_DEV * unixDiskDevCreate
|
|
(
|
|
char * unixFile, /* name of the UNIX file */
|
|
int bytesPerBlk, /* number of bytes per block */
|
|
int blksPerTrack, /* number of blocks per track */
|
|
int nBlocks /* number of blocks on this device */
|
|
)
|
|
{
|
|
struct stat fileStat; /* host file stat */
|
|
|
|
/* check if the host file aready exist, if not the unix disk is not
|
|
* created and a NULL value is returned.
|
|
*/
|
|
|
|
if (vxsimHostStat (unixFile, &fileStat) == ERROR)
|
|
{
|
|
printErr ("unixDiskDevCreate: Could not open %s read/write\n",
|
|
unixFile);
|
|
return (NULL);
|
|
}
|
|
|
|
/* Set up defaults for any values not specified */
|
|
|
|
if (bytesPerBlk == 0)
|
|
bytesPerBlk = DEFAULT_SIZE;
|
|
|
|
if (nBlocks == 0)
|
|
{
|
|
/*
|
|
*if nBlocks parameters is null, it is calculated regarding the
|
|
* host file size and bytesPerBlk parameter.
|
|
*/
|
|
|
|
nBlocks = fileStat.st_size / bytesPerBlk;
|
|
}
|
|
|
|
if (blksPerTrack == 0)
|
|
blksPerTrack = nBlocks;
|
|
|
|
return ((BLK_DEV *) virtualDiskOldCreate (unixFile, bytesPerBlk,
|
|
blksPerTrack, nBlocks));
|
|
|
|
}
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* unixDiskInit - initialize a dosFs disk on top of UNIX
|
|
*
|
|
* This routine provides some convenience for a user wanting to create
|
|
* a UNIX disk-based dosFs file system under VxWorks. The user only
|
|
* specifes the UNIX file to use, the dosFs volume name, and the
|
|
* size of the volume in bytes, if the UNIX file needs to be created.
|
|
*
|
|
* This routine is only applicable to VxSim for Solaris.
|
|
*
|
|
* IMPORTANT NOTE
|
|
* This routine is obsolete, but is kept for backward compatibility with previous
|
|
* version.
|
|
*
|
|
* RETURNS: N/A
|
|
*/
|
|
|
|
void unixDiskInit
|
|
(
|
|
char * unixFile, /* UNIX file name */
|
|
char * volName, /* dosFs name */
|
|
int diskSize /* number of bytes */
|
|
)
|
|
{
|
|
int fd; /* Unix file descriptor */
|
|
BOOL create; /* TRUE if a new Unix file have been created */
|
|
int dosFsStatus; /* DosFS creation status */
|
|
BLK_DEV * pBlkDev; /* created block device */
|
|
char * fileName; /* duplicate name in kernel (for host call) */
|
|
|
|
create = FALSE;
|
|
|
|
if ((fileName = strdup (unixFile)) == NULL)
|
|
{
|
|
printErr ("unixDiskInit: not enough memory\n");
|
|
return;
|
|
}
|
|
|
|
if ((fd = vxsimHostOpen (fileName, O_RDWR, FILE_PERM)) < 0)
|
|
{
|
|
/* Unix file not available, it must be created */
|
|
|
|
printErr ("unixDiskInit: %s not found. Creating...", unixFile);
|
|
|
|
if ((fd = vxsimHostOpen (unixFile, O_RDWR | O_CREAT, FILE_PERM)) < 0)
|
|
{
|
|
printErr ("permission denied\n");
|
|
goto done;
|
|
}
|
|
|
|
if (diskSize == 0)
|
|
diskSize = DEFAULT_DISK_SIZE;
|
|
|
|
/*
|
|
* filled the created file with empty characters to get the appropriated
|
|
* file size.
|
|
*/
|
|
|
|
if (vxsimHostFtruncate (fd, diskSize) != 0)
|
|
{
|
|
printErr ("unixDiskInit: Disk Write failed (disk full?)\n");
|
|
goto done;
|
|
}
|
|
|
|
create = TRUE;
|
|
}
|
|
|
|
vxsimHostClose (fd);
|
|
|
|
/* create the block device associated with the created file */
|
|
|
|
pBlkDev = unixDiskDevCreate (unixFile, DEFAULT_SIZE, 0, 0);
|
|
|
|
if (pBlkDev != NULL)
|
|
{
|
|
if (create)
|
|
dosFsStatus = (dosFsMkfs (volName, pBlkDev) == NULL) ? ERROR : OK;
|
|
else
|
|
dosFsStatus = (dosFsDevInit (volName, pBlkDev, 0) == NULL) ? ERROR : OK;
|
|
|
|
if (dosFsStatus == ERROR)
|
|
{
|
|
printErr ("unixDiskInit: could not init dosFs file system on %s\n",
|
|
unixFile);
|
|
}
|
|
else
|
|
{
|
|
printErr ("unixDiskInit: dosFs file system %s as device %s\n",
|
|
create ? "init'd" : "attached", volName);
|
|
}
|
|
}
|
|
else
|
|
printErr ("unixDiskInit: failed\n");
|
|
|
|
done:
|
|
free (fileName);
|
|
}
|
|
#endif /* (CPU_FAMILY==SIMSPARCSOLARIS) */
|