view usr/src/cmd/fs.d/pcfs/mkfs/mkfs_pcfs.h @ 4:1a15d5aaf794

synchronized with onnv_86 (6202) in onnv-gate
author Koji Uno <koji.uno@sun.com>
date Mon, 31 Aug 2009 14:38:03 +0900
parents c9caec207d52
children
line wrap: on
line source

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 1996, 1998, 1999 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef _MKFS_PCFS_H
#define	_MKFS_PCFS_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#define	BPSEC		512	/* Assumed # of bytes per sector */

#define	OPCODE1		0xE9
#define	OPCODE2		0xEB
#define	BOOTSECSIG	0xAA55

/*
 * Offset (in bytes) from address of boot sector to where we put
 * the backup copy of that sector.  (FAT32 only)
 */
#define	BKUP_BOOTSECT_OFFSET	0xC00

#define	uppercase(c)	((c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 'A' : (c))

#define	FAT12_TYPE_STRING	"FAT12   "
#define	FAT16_TYPE_STRING	"FAT16   "
#define	FAT32_TYPE_STRING	"FAT32   "

#define	FAT12_ENTSPERSECT	341
#define	FAT16_ENTSPERSECT	256
#define	FAT32_ENTSPERSECT	128

#ifndef	SUNIXOSBOOT
#define	SUNIXOSBOOT	190	/* Solaris UNIX boot partition */
#endif

/*
 *  A macro implementing a ceiling function for integer divides.
 */
#define	idivceil(dvend, dvsor) \
	((dvend)/(dvsor) + (((dvend)%(dvsor) == 0) ? 0 : 1))

/*
 *  Return values for the seek_XXX functions
 */
#define	PART_NOT_FOUND 0
#define	PART_FOUND 1

/*
 *	MS-DOS Disk layout:
 *
 *	---------------------
 *	|    Boot sector    |
 *	|-------------------|
 *	|   Reserved area   |
 *	|-------------------|
 *	|	FAT #1      |
 *	|-------------------|
 *	|	FAT #2      |
 *	|-------------------|
 *	|   Root directory  |
 *	|-------------------|
 *	|                   |
 *	|     File area     |
 *	|___________________|
 */

#ifdef i386
#pragma	pack(1)
#endif
struct _orig_bios_param_blk {
	uint16_t bytes_sector;
	uchar_t	 sectors_per_cluster;
	uint16_t resv_sectors;
	uchar_t	 num_fats;
	uint16_t num_root_entries;
	uint16_t sectors_in_volume;
	uchar_t	 media;
	uint16_t sectors_per_fat;
	uint16_t sectors_per_track;
	uint16_t heads;
	uint32_t hidden_sectors;
	uint32_t sectors_in_logical_volume;
};
#ifdef i386
#pragma pack()
#endif

#ifdef i386
#pragma	pack(1)
#endif
struct _bpb32_extensions {
	uint32_t big_sectors_per_fat;
	uint16_t ext_flags;
	uchar_t	 fs_vers_lo;
	uchar_t	 fs_vers_hi;
	uint32_t root_dir_clust;
	uint16_t fsinfosec;
	uint16_t backupboot;
	uint16_t reserved[6];
};
#ifdef i386
#pragma pack()
#endif

#ifdef i386
#pragma	pack(1)
#endif
struct _bpb_extensions {
	uchar_t  phys_drive_num;
	uchar_t  reserved;
	uchar_t  ext_signature;
	uint32_t volume_id;
	uchar_t  volume_label[11];
	uchar_t  type[8];
};
#ifdef i386
#pragma pack()
#endif

#ifdef i386
#pragma	pack(1)
#endif
struct _sun_bpb_extensions {
	uint16_t  bs_offset_high;
	uint16_t  bs_offset_low;
};
#ifdef i386
#pragma pack()
#endif

/*
 * bpb_t is a conglomeration of all the fields a bpb can have.  Every
 * bpb will have the orig_bios struct, but only FAT32's will have bpb32,
 * and only Solaris boot diskettes will have the sunbpb structure.
 */
typedef struct _bios_param_blk {
	struct _orig_bios_param_blk bpb;
	struct _bpb32_extensions    bpb32;
	struct _bpb_extensions	    ebpb;
	struct _sun_bpb_extensions  sunbpb;
} bpb_t;

#ifdef i386
#pragma	pack(1)
struct _bpb_head {
	uchar_t			    bs_jump_code[3];
	uchar_t			    bs_oem_name[8];
	struct _orig_bios_param_blk bs_bpb;
};
#pragma pack()

#pragma	pack(1)
struct _boot_sector {
	struct _bpb_head	    bs_front;
	struct _bpb_extensions	    bs_ebpb;
	struct _sun_bpb_extensions  bs_sebpb;
	uchar_t			    bs_bootstrap[444];
	uchar_t			    bs_signature[2];
};
#pragma pack()

#pragma	pack(1)
struct _boot_sector32 {
	struct _bpb_head	    bs_front;
	struct _bpb32_extensions    bs_bpb32;
	struct _bpb_extensions	    bs_ebpb;
	uchar_t			    bs_bootstrap[420];
	uchar_t			    bs_signature[2];
};
#pragma pack()
#else
#define	ORIG_BPB_START_INDEX	8	/* index into filler field */
#define	EXT_BPB_START_INDEX	33	/* index into filler field */
#define	BPB_32_START_INDEX	33	/* index into filler field */
#define	EXT_BPB_32_START_INDEX	61	/* index into filler field */
struct _boot_sector {
	uchar_t	 bs_jump_code[3];
	uchar_t  bs_filler[59];
	uchar_t  bs_sun_bpb[4];
	uchar_t	 bs_bootstrap[444];
	uchar_t  bs_signature[2];
};

struct _boot_sector32 {
	uchar_t	 bs_jump_code[3];
	uchar_t  bs_filler[87];
	uchar_t	 bs_bootstrap[420];
	uchar_t  bs_signature[2];
};
#endif

typedef union _ubso {
	struct _boot_sector	bs;
	struct _boot_sector32	bs32;
	struct mboot		mb;
	uchar_t			buf[BPSEC];
} boot_sector_t;

#ifdef	__cplusplus
}
#endif

#endif	/* _MKFS_PCFS_H */