cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ecma_167.h (22266B)


      1/*
      2 * ecma_167.h
      3 *
      4 * This file is based on ECMA-167 3rd edition (June 1997)
      5 * https://www.ecma.ch
      6 *
      7 * Copyright (c) 2001-2002  Ben Fennema
      8 * Copyright (c) 2017-2019  Pali Rohár <pali@kernel.org>
      9 * All rights reserved.
     10 *
     11 * Redistribution and use in source and binary forms, with or without
     12 * modification, are permitted provided that the following conditions
     13 * are met:
     14 * 1. Redistributions of source code must retain the above copyright
     15 *    notice, this list of conditions, and the following disclaimer,
     16 *    without modification.
     17 * 2. The name of the author may not be used to endorse or promote products
     18 *    derived from this software without specific prior written permission.
     19 *
     20 * Alternatively, this software may be distributed under the terms of the
     21 * GNU Public License ("GPL").
     22 *
     23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
     27 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33 * SUCH DAMAGE.
     34 */
     35
     36/**
     37 * @file
     38 * ECMA-167r3 defines and structure definitions
     39 */
     40
     41#include <linux/types.h>
     42
     43#ifndef _ECMA_167_H
     44#define _ECMA_167_H 1
     45
     46/* Character sets and coding - d-characters (ECMA 167r3 1/7.2) */
     47typedef uint8_t		dchars;
     48
     49/* Character set specification (ECMA 167r3 1/7.2.1) */
     50struct charspec {
     51	uint8_t		charSetType;
     52	uint8_t		charSetInfo[63];
     53} __packed;
     54
     55/* Character Set Type (ECMA 167r3 1/7.2.1.1) */
     56#define CHARSPEC_TYPE_CS0		0x00	/* (1/7.2.2) */
     57#define CHARSPEC_TYPE_CS1		0x01	/* (1/7.2.3) */
     58#define CHARSPEC_TYPE_CS2		0x02	/* (1/7.2.4) */
     59#define CHARSPEC_TYPE_CS3		0x03	/* (1/7.2.5) */
     60#define CHARSPEC_TYPE_CS4		0x04	/* (1/7.2.6) */
     61#define CHARSPEC_TYPE_CS5		0x05	/* (1/7.2.7) */
     62#define CHARSPEC_TYPE_CS6		0x06	/* (1/7.2.8) */
     63#define CHARSPEC_TYPE_CS7		0x07	/* (1/7.2.9) */
     64#define CHARSPEC_TYPE_CS8		0x08	/* (1/7.2.10) */
     65
     66/* Fixed-length character fields - d-string (EMCA 167r3 1/7.2.12) */
     67typedef uint8_t		dstring;
     68
     69/* Timestamp (ECMA 167r3 1/7.3) */
     70struct timestamp {
     71	__le16		typeAndTimezone;
     72	__le16		year;
     73	uint8_t		month;
     74	uint8_t		day;
     75	uint8_t		hour;
     76	uint8_t		minute;
     77	uint8_t		second;
     78	uint8_t		centiseconds;
     79	uint8_t		hundredsOfMicroseconds;
     80	uint8_t		microseconds;
     81} __packed;
     82
     83/* Type and Time Zone (ECMA 167r3 1/7.3.1) */
     84#define TIMESTAMP_TYPE_MASK		0xF000
     85#define TIMESTAMP_TYPE_CUT		0x0000
     86#define TIMESTAMP_TYPE_LOCAL		0x1000
     87#define TIMESTAMP_TYPE_AGREEMENT	0x2000
     88#define TIMESTAMP_TIMEZONE_MASK		0x0FFF
     89
     90/* Entity identifier (ECMA 167r3 1/7.4) */
     91struct regid {
     92	uint8_t		flags;
     93	uint8_t		ident[23];
     94	uint8_t		identSuffix[8];
     95} __packed;
     96
     97/* Flags (ECMA 167r3 1/7.4.1) */
     98#define ENTITYID_FLAGS_DIRTY		0x01
     99#define ENTITYID_FLAGS_PROTECTED	0x02
    100
    101/* Volume Structure Descriptor (ECMA 167r3 2/9.1) */
    102#define VSD_STD_ID_LEN			5
    103struct volStructDesc {
    104	uint8_t		structType;
    105	uint8_t		stdIdent[VSD_STD_ID_LEN];
    106	uint8_t		structVersion;
    107	uint8_t		structData[2041];
    108} __packed;
    109
    110/* Standard Identifier (EMCA 167r2 2/9.1.2) */
    111#define VSD_STD_ID_NSR02		"NSR02"	/* (3/9.1) */
    112
    113/* Standard Identifier (ECMA 167r3 2/9.1.2) */
    114#define VSD_STD_ID_BEA01		"BEA01"	/* (2/9.2) */
    115#define VSD_STD_ID_BOOT2		"BOOT2"	/* (2/9.4) */
    116#define VSD_STD_ID_CD001		"CD001"	/* (ECMA-119) */
    117#define VSD_STD_ID_CDW02		"CDW02"	/* (ECMA-168) */
    118#define VSD_STD_ID_NSR03		"NSR03"	/* (3/9.1) */
    119#define VSD_STD_ID_TEA01		"TEA01"	/* (2/9.3) */
    120
    121/* Beginning Extended Area Descriptor (ECMA 167r3 2/9.2) */
    122struct beginningExtendedAreaDesc {
    123	uint8_t		structType;
    124	uint8_t		stdIdent[VSD_STD_ID_LEN];
    125	uint8_t		structVersion;
    126	uint8_t		structData[2041];
    127} __packed;
    128
    129/* Terminating Extended Area Descriptor (ECMA 167r3 2/9.3) */
    130struct terminatingExtendedAreaDesc {
    131	uint8_t		structType;
    132	uint8_t		stdIdent[VSD_STD_ID_LEN];
    133	uint8_t		structVersion;
    134	uint8_t		structData[2041];
    135} __packed;
    136
    137/* Boot Descriptor (ECMA 167r3 2/9.4) */
    138struct bootDesc {
    139	uint8_t			structType;
    140	uint8_t			stdIdent[VSD_STD_ID_LEN];
    141	uint8_t			structVersion;
    142	uint8_t			reserved1;
    143	struct regid		archType;
    144	struct regid		bootIdent;
    145	__le32			bootExtLocation;
    146	__le32			bootExtLength;
    147	__le64			loadAddress;
    148	__le64			startAddress;
    149	struct timestamp	descCreationDateAndTime;
    150	__le16			flags;
    151	uint8_t			reserved2[32];
    152	uint8_t			bootUse[1906];
    153} __packed;
    154
    155/* Flags (ECMA 167r3 2/9.4.12) */
    156#define BOOT_FLAGS_ERASE		0x01
    157
    158/* Extent Descriptor (ECMA 167r3 3/7.1) */
    159struct extent_ad {
    160	__le32		extLength;
    161	__le32		extLocation;
    162} __packed;
    163
    164struct kernel_extent_ad {
    165	uint32_t	extLength;
    166	uint32_t	extLocation;
    167};
    168
    169/* Descriptor Tag (ECMA 167r3 3/7.2) */
    170struct tag {
    171	__le16		tagIdent;
    172	__le16		descVersion;
    173	uint8_t		tagChecksum;
    174	uint8_t		reserved;
    175	__le16		tagSerialNum;
    176	__le16		descCRC;
    177	__le16		descCRCLength;
    178	__le32		tagLocation;
    179} __packed;
    180
    181/* Tag Identifier (ECMA 167r3 3/7.2.1) */
    182#define TAG_IDENT_PVD			0x0001
    183#define TAG_IDENT_AVDP			0x0002
    184#define TAG_IDENT_VDP			0x0003
    185#define TAG_IDENT_IUVD			0x0004
    186#define TAG_IDENT_PD			0x0005
    187#define TAG_IDENT_LVD			0x0006
    188#define TAG_IDENT_USD			0x0007
    189#define TAG_IDENT_TD			0x0008
    190#define TAG_IDENT_LVID			0x0009
    191
    192/* NSR Descriptor (ECMA 167r3 3/9.1) */
    193struct NSRDesc {
    194	uint8_t		structType;
    195	uint8_t		stdIdent[VSD_STD_ID_LEN];
    196	uint8_t		structVersion;
    197	uint8_t		reserved;
    198	uint8_t		structData[2040];
    199} __packed;
    200
    201/* Generic Descriptor */
    202struct genericDesc {
    203	struct tag	descTag;
    204	__le32		volDescSeqNum;
    205	uint8_t		reserved[492];
    206} __packed;
    207
    208/* Primary Volume Descriptor (ECMA 167r3 3/10.1) */
    209struct primaryVolDesc {
    210	struct tag		descTag;
    211	__le32			volDescSeqNum;
    212	__le32			primaryVolDescNum;
    213	dstring			volIdent[32];
    214	__le16			volSeqNum;
    215	__le16			maxVolSeqNum;
    216	__le16			interchangeLvl;
    217	__le16			maxInterchangeLvl;
    218	__le32			charSetList;
    219	__le32			maxCharSetList;
    220	dstring			volSetIdent[128];
    221	struct charspec		descCharSet;
    222	struct charspec		explanatoryCharSet;
    223	struct extent_ad	volAbstract;
    224	struct extent_ad	volCopyright;
    225	struct regid		appIdent;
    226	struct timestamp	recordingDateAndTime;
    227	struct regid		impIdent;
    228	uint8_t			impUse[64];
    229	__le32			predecessorVolDescSeqLocation;
    230	__le16			flags;
    231	uint8_t			reserved[22];
    232} __packed;
    233
    234/* Flags (ECMA 167r3 3/10.1.21) */
    235#define PVD_FLAGS_VSID_COMMON		0x0001
    236
    237/* Anchor Volume Descriptor Pointer (ECMA 167r3 3/10.2) */
    238struct anchorVolDescPtr {
    239	struct tag		descTag;
    240	struct extent_ad	mainVolDescSeqExt;
    241	struct extent_ad	reserveVolDescSeqExt;
    242	uint8_t	 		reserved[480];
    243} __packed;
    244
    245/* Volume Descriptor Pointer (ECMA 167r3 3/10.3) */
    246struct volDescPtr {
    247	struct tag		descTag;
    248	__le32			volDescSeqNum;
    249	struct extent_ad	nextVolDescSeqExt;
    250	uint8_t			reserved[484];
    251} __packed;
    252
    253/* Implementation Use Volume Descriptor (ECMA 167r3 3/10.4) */
    254struct impUseVolDesc {
    255	struct tag	descTag;
    256	__le32		volDescSeqNum;
    257	struct regid	impIdent;
    258	uint8_t		impUse[460];
    259} __packed;
    260
    261/* Partition Descriptor (ECMA 167r3 3/10.5) */
    262struct partitionDesc {
    263	struct tag descTag;
    264	__le32 volDescSeqNum;
    265	__le16 partitionFlags;
    266	__le16 partitionNumber;
    267	struct regid partitionContents;
    268	uint8_t partitionContentsUse[128];
    269	__le32 accessType;
    270	__le32 partitionStartingLocation;
    271	__le32 partitionLength;
    272	struct regid impIdent;
    273	uint8_t impUse[128];
    274	uint8_t reserved[156];
    275} __packed;
    276
    277/* Partition Flags (ECMA 167r3 3/10.5.3) */
    278#define PD_PARTITION_FLAGS_ALLOC	0x0001
    279
    280/* Partition Contents (ECMA 167r2 3/10.5.3) */
    281#define PD_PARTITION_CONTENTS_NSR02	"+NSR02"
    282
    283/* Partition Contents (ECMA 167r3 3/10.5.5) */
    284#define PD_PARTITION_CONTENTS_FDC01	"+FDC01"
    285#define PD_PARTITION_CONTENTS_CD001	"+CD001"
    286#define PD_PARTITION_CONTENTS_CDW02	"+CDW02"
    287#define PD_PARTITION_CONTENTS_NSR03	"+NSR03"
    288
    289/* Access Type (ECMA 167r3 3/10.5.7) */
    290#define PD_ACCESS_TYPE_NONE		0x00000000
    291#define PD_ACCESS_TYPE_READ_ONLY	0x00000001
    292#define PD_ACCESS_TYPE_WRITE_ONCE	0x00000002
    293#define PD_ACCESS_TYPE_REWRITABLE	0x00000003
    294#define PD_ACCESS_TYPE_OVERWRITABLE	0x00000004
    295
    296/* Logical Volume Descriptor (ECMA 167r3 3/10.6) */
    297struct logicalVolDesc {
    298	struct tag		descTag;
    299	__le32			volDescSeqNum;
    300	struct charspec		descCharSet;
    301	dstring			logicalVolIdent[128];
    302	__le32			logicalBlockSize;
    303	struct regid		domainIdent;
    304	uint8_t			logicalVolContentsUse[16];
    305	__le32			mapTableLength;
    306	__le32			numPartitionMaps;
    307	struct regid		impIdent;
    308	uint8_t			impUse[128];
    309	struct extent_ad	integritySeqExt;
    310	uint8_t			partitionMaps[];
    311} __packed;
    312
    313/* Generic Partition Map (ECMA 167r3 3/10.7.1) */
    314struct genericPartitionMap {
    315	uint8_t		partitionMapType;
    316	uint8_t		partitionMapLength;
    317	uint8_t		partitionMapping[];
    318} __packed;
    319
    320/* Partition Map Type (ECMA 167r3 3/10.7.1.1) */
    321#define GP_PARTITION_MAP_TYPE_UNDEF	0x00
    322#define GP_PARTITION_MAP_TYPE_1		0x01
    323#define GP_PARTITION_MAP_TYPE_2		0x02
    324
    325/* Type 1 Partition Map (ECMA 167r3 3/10.7.2) */
    326struct genericPartitionMap1 {
    327	uint8_t		partitionMapType;
    328	uint8_t		partitionMapLength;
    329	__le16		volSeqNum;
    330	__le16		partitionNum;
    331} __packed;
    332
    333/* Type 2 Partition Map (ECMA 167r3 3/10.7.3) */
    334struct genericPartitionMap2 {
    335	uint8_t		partitionMapType;
    336	uint8_t		partitionMapLength;
    337	uint8_t		partitionIdent[62];
    338} __packed;
    339
    340/* Unallocated Space Descriptor (ECMA 167r3 3/10.8) */
    341struct unallocSpaceDesc {
    342	struct tag		descTag;
    343	__le32			volDescSeqNum;
    344	__le32			numAllocDescs;
    345	struct extent_ad	allocDescs[];
    346} __packed;
    347
    348/* Terminating Descriptor (ECMA 167r3 3/10.9) */
    349struct terminatingDesc {
    350	struct tag	descTag;
    351	uint8_t		reserved[496];
    352} __packed;
    353
    354/* Logical Volume Integrity Descriptor (ECMA 167r3 3/10.10) */
    355struct logicalVolIntegrityDesc {
    356	struct tag		descTag;
    357	struct timestamp	recordingDateAndTime;
    358	__le32			integrityType;
    359	struct extent_ad	nextIntegrityExt;
    360	uint8_t			logicalVolContentsUse[32];
    361	__le32			numOfPartitions;
    362	__le32			lengthOfImpUse;
    363	__le32			freeSpaceTable[];
    364	/* __le32		sizeTable[]; */
    365	/* uint8_t		impUse[]; */
    366} __packed;
    367
    368/* Integrity Type (ECMA 167r3 3/10.10.3) */
    369#define LVID_INTEGRITY_TYPE_OPEN	0x00000000
    370#define LVID_INTEGRITY_TYPE_CLOSE	0x00000001
    371
    372/* Recorded Address (ECMA 167r3 4/7.1) */
    373struct lb_addr {
    374	__le32		logicalBlockNum;
    375	__le16	 	partitionReferenceNum;
    376} __packed;
    377
    378/* ... and its in-core analog */
    379struct kernel_lb_addr {
    380	uint32_t		logicalBlockNum;
    381	uint16_t	 	partitionReferenceNum;
    382};
    383
    384/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
    385struct short_ad {
    386        __le32		extLength;
    387        __le32		extPosition;
    388} __packed;
    389
    390/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
    391struct long_ad {
    392	__le32		extLength;
    393	struct lb_addr	extLocation;
    394	uint8_t		impUse[6];
    395} __packed;
    396
    397struct kernel_long_ad {
    398	uint32_t		extLength;
    399	struct kernel_lb_addr	extLocation;
    400	uint8_t			impUse[6];
    401};
    402
    403/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
    404struct ext_ad {
    405	__le32		extLength;
    406	__le32		recordedLength;
    407	__le32		informationLength;
    408	struct lb_addr	extLocation;
    409} __packed;
    410
    411struct kernel_ext_ad {
    412	uint32_t		extLength;
    413	uint32_t		recordedLength;
    414	uint32_t		informationLength;
    415	struct kernel_lb_addr	extLocation;
    416};
    417
    418/* Descriptor Tag (ECMA 167r3 4/7.2 - See 3/7.2) */
    419
    420/* Tag Identifier (ECMA 167r3 4/7.2.1) */
    421#define TAG_IDENT_FSD			0x0100
    422#define TAG_IDENT_FID			0x0101
    423#define TAG_IDENT_AED			0x0102
    424#define TAG_IDENT_IE			0x0103
    425#define TAG_IDENT_TE			0x0104
    426#define TAG_IDENT_FE			0x0105
    427#define TAG_IDENT_EAHD			0x0106
    428#define TAG_IDENT_USE			0x0107
    429#define TAG_IDENT_SBD			0x0108
    430#define TAG_IDENT_PIE			0x0109
    431#define TAG_IDENT_EFE			0x010A
    432
    433/* File Set Descriptor (ECMA 167r3 4/14.1) */
    434struct fileSetDesc {
    435	struct tag		descTag;
    436	struct timestamp	recordingDateAndTime;
    437	__le16			interchangeLvl;
    438	__le16			maxInterchangeLvl;
    439	__le32			charSetList;
    440	__le32			maxCharSetList;
    441	__le32			fileSetNum;
    442	__le32			fileSetDescNum;
    443	struct charspec		logicalVolIdentCharSet;
    444	dstring			logicalVolIdent[128];
    445	struct charspec		fileSetCharSet;
    446	dstring			fileSetIdent[32];
    447	dstring			copyrightFileIdent[32];
    448	dstring			abstractFileIdent[32];
    449	struct long_ad		rootDirectoryICB;
    450	struct regid		domainIdent;
    451	struct long_ad		nextExt;
    452	struct long_ad		streamDirectoryICB;
    453	uint8_t			reserved[32];
    454} __packed;
    455
    456/* Partition Header Descriptor (ECMA 167r3 4/14.3) */
    457struct partitionHeaderDesc {
    458	struct short_ad	unallocSpaceTable;
    459	struct short_ad	unallocSpaceBitmap;
    460	struct short_ad	partitionIntegrityTable;
    461	struct short_ad	freedSpaceTable;
    462	struct short_ad	freedSpaceBitmap;
    463	uint8_t		reserved[88];
    464} __packed;
    465
    466/* File Identifier Descriptor (ECMA 167r3 4/14.4) */
    467struct fileIdentDesc {
    468	struct tag	descTag;
    469	__le16		fileVersionNum;
    470	uint8_t		fileCharacteristics;
    471	uint8_t		lengthFileIdent;
    472	struct long_ad	icb;
    473	__le16		lengthOfImpUse;
    474	uint8_t		impUse[];
    475	/* uint8_t	fileIdent[]; */
    476	/* uint8_t	padding[]; */
    477} __packed;
    478
    479/* File Characteristics (ECMA 167r3 4/14.4.3) */
    480#define FID_FILE_CHAR_HIDDEN		0x01
    481#define FID_FILE_CHAR_DIRECTORY		0x02
    482#define FID_FILE_CHAR_DELETED		0x04
    483#define FID_FILE_CHAR_PARENT		0x08
    484#define FID_FILE_CHAR_METADATA		0x10
    485
    486/* Allocation Ext Descriptor (ECMA 167r3 4/14.5) */
    487struct allocExtDesc {
    488	struct tag	descTag;
    489	__le32		previousAllocExtLocation;
    490	__le32		lengthAllocDescs;
    491} __packed;
    492
    493/* ICB Tag (ECMA 167r3 4/14.6) */
    494struct icbtag {
    495	__le32		priorRecordedNumDirectEntries;
    496	__le16		strategyType;
    497	__le16		strategyParameter;
    498	__le16		numEntries;
    499	uint8_t		reserved;
    500	uint8_t		fileType;
    501	struct lb_addr	parentICBLocation;
    502	__le16		flags;
    503} __packed;
    504
    505/* Strategy Type (ECMA 167r3 4/14.6.2) */
    506#define ICBTAG_STRATEGY_TYPE_UNDEF	0x0000
    507#define ICBTAG_STRATEGY_TYPE_1		0x0001
    508#define ICBTAG_STRATEGY_TYPE_2		0x0002
    509#define ICBTAG_STRATEGY_TYPE_3		0x0003
    510#define ICBTAG_STRATEGY_TYPE_4		0x0004
    511
    512/* File Type (ECMA 167r3 4/14.6.6) */
    513#define ICBTAG_FILE_TYPE_UNDEF		0x00
    514#define ICBTAG_FILE_TYPE_USE		0x01
    515#define ICBTAG_FILE_TYPE_PIE		0x02
    516#define ICBTAG_FILE_TYPE_IE		0x03
    517#define ICBTAG_FILE_TYPE_DIRECTORY	0x04
    518#define ICBTAG_FILE_TYPE_REGULAR	0x05
    519#define ICBTAG_FILE_TYPE_BLOCK		0x06
    520#define ICBTAG_FILE_TYPE_CHAR		0x07
    521#define ICBTAG_FILE_TYPE_EA		0x08
    522#define ICBTAG_FILE_TYPE_FIFO		0x09
    523#define ICBTAG_FILE_TYPE_SOCKET		0x0A
    524#define ICBTAG_FILE_TYPE_TE		0x0B
    525#define ICBTAG_FILE_TYPE_SYMLINK	0x0C
    526#define ICBTAG_FILE_TYPE_STREAMDIR	0x0D
    527
    528/* Flags (ECMA 167r3 4/14.6.8) */
    529#define ICBTAG_FLAG_AD_MASK		0x0007
    530#define ICBTAG_FLAG_AD_SHORT		0x0000
    531#define ICBTAG_FLAG_AD_LONG		0x0001
    532#define ICBTAG_FLAG_AD_EXTENDED		0x0002
    533#define ICBTAG_FLAG_AD_IN_ICB		0x0003
    534#define ICBTAG_FLAG_SORTED		0x0008
    535#define ICBTAG_FLAG_NONRELOCATABLE	0x0010
    536#define ICBTAG_FLAG_ARCHIVE		0x0020
    537#define ICBTAG_FLAG_SETUID		0x0040
    538#define ICBTAG_FLAG_SETGID		0x0080
    539#define ICBTAG_FLAG_STICKY		0x0100
    540#define ICBTAG_FLAG_CONTIGUOUS		0x0200
    541#define ICBTAG_FLAG_SYSTEM		0x0400
    542#define ICBTAG_FLAG_TRANSFORMED		0x0800
    543#define ICBTAG_FLAG_MULTIVERSIONS	0x1000
    544#define ICBTAG_FLAG_STREAM		0x2000
    545
    546/* Indirect Entry (ECMA 167r3 4/14.7) */
    547struct indirectEntry {
    548	struct tag	descTag;
    549	struct icbtag	icbTag;
    550	struct long_ad	indirectICB;
    551} __packed;
    552
    553/* Terminal Entry (ECMA 167r3 4/14.8) */
    554struct terminalEntry {
    555	struct tag	descTag;
    556	struct icbtag	icbTag;
    557} __packed;
    558
    559/* File Entry (ECMA 167r3 4/14.9) */
    560struct fileEntry {
    561	struct tag		descTag;
    562	struct icbtag		icbTag;
    563	__le32			uid;
    564	__le32			gid;
    565	__le32			permissions;
    566	__le16			fileLinkCount;
    567	uint8_t			recordFormat;
    568	uint8_t			recordDisplayAttr;
    569	__le32			recordLength;
    570	__le64			informationLength;
    571	__le64			logicalBlocksRecorded;
    572	struct timestamp	accessTime;
    573	struct timestamp	modificationTime;
    574	struct timestamp	attrTime;
    575	__le32			checkpoint;
    576	struct long_ad		extendedAttrICB;
    577	struct regid		impIdent;
    578	__le64			uniqueID;
    579	__le32			lengthExtendedAttr;
    580	__le32			lengthAllocDescs;
    581	uint8_t			extendedAttr[];
    582	/* uint8_t		allocDescs[]; */
    583} __packed;
    584
    585/* Permissions (ECMA 167r3 4/14.9.5) */
    586#define FE_PERM_O_EXEC			0x00000001U
    587#define FE_PERM_O_WRITE			0x00000002U
    588#define FE_PERM_O_READ			0x00000004U
    589#define FE_PERM_O_CHATTR		0x00000008U
    590#define FE_PERM_O_DELETE		0x00000010U
    591#define FE_PERM_G_EXEC			0x00000020U
    592#define FE_PERM_G_WRITE			0x00000040U
    593#define FE_PERM_G_READ			0x00000080U
    594#define FE_PERM_G_CHATTR		0x00000100U
    595#define FE_PERM_G_DELETE		0x00000200U
    596#define FE_PERM_U_EXEC			0x00000400U
    597#define FE_PERM_U_WRITE			0x00000800U
    598#define FE_PERM_U_READ			0x00001000U
    599#define FE_PERM_U_CHATTR		0x00002000U
    600#define FE_PERM_U_DELETE		0x00004000U
    601
    602/* Record Format (ECMA 167r3 4/14.9.7) */
    603#define FE_RECORD_FMT_UNDEF		0x00
    604#define FE_RECORD_FMT_FIXED_PAD		0x01
    605#define FE_RECORD_FMT_FIXED		0x02
    606#define FE_RECORD_FMT_VARIABLE8		0x03
    607#define FE_RECORD_FMT_VARIABLE16	0x04
    608#define FE_RECORD_FMT_VARIABLE16_MSB	0x05
    609#define FE_RECORD_FMT_VARIABLE32	0x06
    610#define FE_RECORD_FMT_PRINT		0x07
    611#define FE_RECORD_FMT_LF		0x08
    612#define FE_RECORD_FMT_CR		0x09
    613#define FE_RECORD_FMT_CRLF		0x0A
    614#define FE_RECORD_FMT_LFCR		0x0B
    615
    616/* Record Display Attributes (ECMA 167r3 4/14.9.8) */
    617#define FE_RECORD_DISPLAY_ATTR_UNDEF	0x00
    618#define FE_RECORD_DISPLAY_ATTR_1	0x01
    619#define FE_RECORD_DISPLAY_ATTR_2	0x02
    620#define FE_RECORD_DISPLAY_ATTR_3	0x03
    621
    622/* Extended Attribute Header Descriptor (ECMA 167r3 4/14.10.1) */
    623struct extendedAttrHeaderDesc {
    624	struct tag	descTag;
    625	__le32		impAttrLocation;
    626	__le32		appAttrLocation;
    627} __packed;
    628
    629/* Generic Format (ECMA 167r3 4/14.10.2) */
    630struct genericFormat {
    631	__le32		attrType;
    632	uint8_t		attrSubtype;
    633	uint8_t		reserved[3];
    634	__le32		attrLength;
    635	uint8_t		attrData[];
    636} __packed;
    637
    638/* Character Set Information (ECMA 167r3 4/14.10.3) */
    639struct charSetInfo {
    640	__le32		attrType;
    641	uint8_t		attrSubtype;
    642	uint8_t		reserved[3];
    643	__le32		attrLength;
    644	__le32		escapeSeqLength;
    645	uint8_t		charSetType;
    646	uint8_t		escapeSeq[];
    647} __packed;
    648
    649/* Alternate Permissions (ECMA 167r3 4/14.10.4) */
    650struct altPerms {
    651	__le32		attrType;
    652	uint8_t		attrSubtype;
    653	uint8_t		reserved[3];
    654	__le32		attrLength;
    655	__le16		ownerIdent;
    656	__le16		groupIdent;
    657	__le16		permission;
    658} __packed;
    659
    660/* File Times Extended Attribute (ECMA 167r3 4/14.10.5) */
    661struct fileTimesExtAttr {
    662	__le32		attrType;
    663	uint8_t		attrSubtype;
    664	uint8_t		reserved[3];
    665	__le32		attrLength;
    666	__le32		dataLength;
    667	__le32		fileTimeExistence;
    668	uint8_t		fileTimes;
    669} __packed;
    670
    671/* FileTimeExistence (ECMA 167r3 4/14.10.5.6) */
    672#define FTE_CREATION			0x00000001
    673#define FTE_DELETION			0x00000004
    674#define FTE_EFFECTIVE			0x00000008
    675#define FTE_BACKUP			0x00000002
    676
    677/* Information Times Extended Attribute (ECMA 167r3 4/14.10.6) */
    678struct infoTimesExtAttr {
    679	__le32		attrType;
    680	uint8_t		attrSubtype;
    681	uint8_t		reserved[3];
    682	__le32		attrLength;
    683	__le32		dataLength;
    684	__le32		infoTimeExistence;
    685	uint8_t		infoTimes[];
    686} __packed;
    687
    688/* Device Specification (ECMA 167r3 4/14.10.7) */
    689struct deviceSpec {
    690	__le32		attrType;
    691	uint8_t		attrSubtype;
    692	uint8_t		reserved[3];
    693	__le32		attrLength;
    694	__le32		impUseLength;
    695	__le32		majorDeviceIdent;
    696	__le32		minorDeviceIdent;
    697	uint8_t		impUse[];
    698} __packed;
    699
    700/* Implementation Use Extended Attr (ECMA 167r3 4/14.10.8) */
    701struct impUseExtAttr {
    702	__le32		attrType;
    703	uint8_t		attrSubtype;
    704	uint8_t		reserved[3];
    705	__le32		attrLength;
    706	__le32		impUseLength;
    707	struct regid	impIdent;
    708	uint8_t		impUse[];
    709} __packed;
    710
    711/* Application Use Extended Attribute (ECMA 167r3 4/14.10.9) */
    712struct appUseExtAttr {
    713	__le32		attrType;
    714	uint8_t		attrSubtype;
    715	uint8_t		reserved[3];
    716	__le32		attrLength;
    717	__le32		appUseLength;
    718	struct regid	appIdent;
    719	uint8_t		appUse[];
    720} __packed;
    721
    722#define EXTATTR_CHAR_SET		1
    723#define EXTATTR_ALT_PERMS		3
    724#define EXTATTR_FILE_TIMES		5
    725#define EXTATTR_INFO_TIMES		6
    726#define EXTATTR_DEV_SPEC		12
    727#define EXTATTR_IMP_USE			2048
    728#define EXTATTR_APP_USE			65536
    729#define EXTATTR_SUBTYPE			1
    730
    731/* Unallocated Space Entry (ECMA 167r3 4/14.11) */
    732struct unallocSpaceEntry {
    733	struct tag	descTag;
    734	struct icbtag	icbTag;
    735	__le32		lengthAllocDescs;
    736	uint8_t		allocDescs[];
    737} __packed;
    738
    739/* Space Bitmap Descriptor (ECMA 167r3 4/14.12) */
    740struct spaceBitmapDesc {
    741	struct tag	descTag;
    742	__le32		numOfBits;
    743	__le32		numOfBytes;
    744	uint8_t		bitmap[];
    745} __packed;
    746
    747/* Partition Integrity Entry (ECMA 167r3 4/14.13) */
    748struct partitionIntegrityEntry {
    749	struct tag		descTag;
    750	struct icbtag		icbTag;
    751	struct timestamp	recordingDateAndTime;
    752	uint8_t			integrityType;
    753	uint8_t			reserved[175];
    754	struct regid		impIdent;
    755	uint8_t			impUse[256];
    756} __packed;
    757
    758/* Short Allocation Descriptor (ECMA 167r3 4/14.14.1) */
    759
    760/* Extent Length (ECMA 167r3 4/14.14.1.1) */
    761#define EXT_LENGTH_MASK			0x3FFFFFFF
    762#define EXT_TYPE_MASK			0xC0000000
    763#define EXT_RECORDED_ALLOCATED		0x00000000
    764#define EXT_NOT_RECORDED_ALLOCATED	0x40000000
    765#define EXT_NOT_RECORDED_NOT_ALLOCATED	0x80000000
    766#define EXT_NEXT_EXTENT_ALLOCDESCS	0xC0000000
    767
    768/* Long Allocation Descriptor (ECMA 167r3 4/14.14.2) */
    769
    770/* Extended Allocation Descriptor (ECMA 167r3 4/14.14.3) */
    771
    772/* Logical Volume Header Descriptor (ECMA 167r3 4/14.15) */
    773struct logicalVolHeaderDesc {
    774	__le64		uniqueID;
    775	uint8_t		reserved[24];
    776} __packed;
    777
    778/* Path Component (ECMA 167r3 4/14.16.1) */
    779struct pathComponent {
    780	uint8_t		componentType;
    781	uint8_t		lengthComponentIdent;
    782	__le16		componentFileVersionNum;
    783	dchars		componentIdent[];
    784} __packed;
    785
    786/* File Entry (ECMA 167r3 4/14.17) */
    787struct extendedFileEntry {
    788	struct tag		descTag;
    789	struct icbtag		icbTag;
    790	__le32			uid;
    791	__le32			gid;
    792	__le32			permissions;
    793	__le16			fileLinkCount;
    794	uint8_t			recordFormat;
    795	uint8_t			recordDisplayAttr;
    796	__le32			recordLength;
    797	__le64			informationLength;
    798	__le64			objectSize;
    799	__le64			logicalBlocksRecorded;
    800	struct timestamp	accessTime;
    801	struct timestamp	modificationTime;
    802	struct timestamp	createTime;
    803	struct timestamp	attrTime;
    804	__le32			checkpoint;
    805	__le32			reserved;
    806	struct long_ad		extendedAttrICB;
    807	struct long_ad		streamDirectoryICB;
    808	struct regid		impIdent;
    809	__le64			uniqueID;
    810	__le32			lengthExtendedAttr;
    811	__le32			lengthAllocDescs;
    812	uint8_t			extendedAttr[];
    813	/* uint8_t		allocDescs[]; */
    814} __packed;
    815
    816#endif /* _ECMA_167_H */