1*79398b25SAndroid Build Coastguard Worker #ifndef SQUASHFS_FS 2*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FS 3*79398b25SAndroid Build Coastguard Worker 4*79398b25SAndroid Build Coastguard Worker /* 5*79398b25SAndroid Build Coastguard Worker * Squashfs 6*79398b25SAndroid Build Coastguard Worker * 7*79398b25SAndroid Build Coastguard Worker * Copyright (c) 2002, 2003, 2004, 2005, 2006 8*79398b25SAndroid Build Coastguard Worker * Phillip Lougher <[email protected]> 9*79398b25SAndroid Build Coastguard Worker * 10*79398b25SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or 11*79398b25SAndroid Build Coastguard Worker * modify it under the terms of the GNU General Public License 12*79398b25SAndroid Build Coastguard Worker * as published by the Free Software Foundation; either version 2, 13*79398b25SAndroid Build Coastguard Worker * or (at your option) any later version. 14*79398b25SAndroid Build Coastguard Worker * 15*79398b25SAndroid Build Coastguard Worker * This program is distributed in the hope that it will be useful, 16*79398b25SAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*79398b25SAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*79398b25SAndroid Build Coastguard Worker * GNU General Public License for more details. 19*79398b25SAndroid Build Coastguard Worker * 20*79398b25SAndroid Build Coastguard Worker * You should have received a copy of the GNU General Public License 21*79398b25SAndroid Build Coastguard Worker * along with this program; if not, write to the Free Software 22*79398b25SAndroid Build Coastguard Worker * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 23*79398b25SAndroid Build Coastguard Worker * 24*79398b25SAndroid Build Coastguard Worker * squashfs_fs.h 25*79398b25SAndroid Build Coastguard Worker */ 26*79398b25SAndroid Build Coastguard Worker 27*79398b25SAndroid Build Coastguard Worker #ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY 28*79398b25SAndroid Build Coastguard Worker #define CONFIG_SQUASHFS_2_0_COMPATIBILITY 29*79398b25SAndroid Build Coastguard Worker #endif 30*79398b25SAndroid Build Coastguard Worker 31*79398b25SAndroid Build Coastguard Worker #ifdef CONFIG_SQUASHFS_VMALLOC 32*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_ALLOC(a) vmalloc(a) 33*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FREE(a) vfree(a) 34*79398b25SAndroid Build Coastguard Worker #else 35*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_ALLOC(a) kmalloc(a, GFP_KERNEL) 36*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FREE(a) kfree(a) 37*79398b25SAndroid Build Coastguard Worker #endif 38*79398b25SAndroid Build Coastguard Worker #ifdef CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE 39*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE 40*79398b25SAndroid Build Coastguard Worker #else 41*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_CACHED_FRAGMENTS 3 42*79398b25SAndroid Build Coastguard Worker #endif 43*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MAJOR 3 44*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MINOR 0 45*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MAGIC 0x73717368 46*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MAGIC_SWAP 0x68737173 47*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_START 0 48*79398b25SAndroid Build Coastguard Worker 49*79398b25SAndroid Build Coastguard Worker /* size of metadata (inode and directory) blocks */ 50*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_METADATA_SIZE 8192 51*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_METADATA_LOG 13 52*79398b25SAndroid Build Coastguard Worker 53*79398b25SAndroid Build Coastguard Worker /* default size of data blocks */ 54*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FILE_SIZE 65536 55*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FILE_LOG 16 56*79398b25SAndroid Build Coastguard Worker 57*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FILE_MAX_SIZE 65536 58*79398b25SAndroid Build Coastguard Worker 59*79398b25SAndroid Build Coastguard Worker /* Max number of uids and gids */ 60*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_UIDS 256 61*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_GUIDS 255 62*79398b25SAndroid Build Coastguard Worker 63*79398b25SAndroid Build Coastguard Worker /* Max length of filename (not 255) */ 64*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_NAME_LEN 256 65*79398b25SAndroid Build Coastguard Worker 66*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_INVALID ((long long) 0xffffffffffff) 67*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_INVALID_FRAG ((unsigned int) 0xffffffff) 68*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_INVALID_BLK ((long long) -1) 69*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_USED_BLK ((long long) -2) 70*79398b25SAndroid Build Coastguard Worker 71*79398b25SAndroid Build Coastguard Worker /* Filesystem flags */ 72*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_NOI 0 73*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_NOD 1 74*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_CHECK 2 75*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_NOF 3 76*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_NO_FRAG 4 77*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_ALWAYS_FRAG 5 78*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_DUPLICATE 6 79*79398b25SAndroid Build Coastguard Worker 80*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_BIT(flag, bit) ((flag >> bit) & 1) 81*79398b25SAndroid Build Coastguard Worker 82*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, \ 83*79398b25SAndroid Build Coastguard Worker SQUASHFS_NOI) 84*79398b25SAndroid Build Coastguard Worker 85*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, \ 86*79398b25SAndroid Build Coastguard Worker SQUASHFS_NOD) 87*79398b25SAndroid Build Coastguard Worker 88*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ 89*79398b25SAndroid Build Coastguard Worker SQUASHFS_NOF) 90*79398b25SAndroid Build Coastguard Worker 91*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ 92*79398b25SAndroid Build Coastguard Worker SQUASHFS_NO_FRAG) 93*79398b25SAndroid Build Coastguard Worker 94*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ 95*79398b25SAndroid Build Coastguard Worker SQUASHFS_ALWAYS_FRAG) 96*79398b25SAndroid Build Coastguard Worker 97*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, \ 98*79398b25SAndroid Build Coastguard Worker SQUASHFS_DUPLICATE) 99*79398b25SAndroid Build Coastguard Worker 100*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_CHECK_DATA(flags) SQUASHFS_BIT(flags, \ 101*79398b25SAndroid Build Coastguard Worker SQUASHFS_CHECK) 102*79398b25SAndroid Build Coastguard Worker 103*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \ 104*79398b25SAndroid Build Coastguard Worker duplicate_checking) (noi | (nod << 1) | (check_data << 2) \ 105*79398b25SAndroid Build Coastguard Worker | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \ 106*79398b25SAndroid Build Coastguard Worker (duplicate_checking << 6)) 107*79398b25SAndroid Build Coastguard Worker 108*79398b25SAndroid Build Coastguard Worker /* Max number of types and file types */ 109*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_DIR_TYPE 1 110*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FILE_TYPE 2 111*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SYMLINK_TYPE 3 112*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_BLKDEV_TYPE 4 113*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_CHRDEV_TYPE 5 114*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FIFO_TYPE 6 115*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SOCKET_TYPE 7 116*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_LDIR_TYPE 8 117*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_LREG_TYPE 9 118*79398b25SAndroid Build Coastguard Worker 119*79398b25SAndroid Build Coastguard Worker /* 1.0 filesystem type definitions */ 120*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_TYPES 5 121*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_IPC_TYPE 0 122*79398b25SAndroid Build Coastguard Worker 123*79398b25SAndroid Build Coastguard Worker /* Flag whether block is compressed or uncompressed, bit is set if block is 124*79398b25SAndroid Build Coastguard Worker * uncompressed */ 125*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_COMPRESSED_BIT (1 << 15) 126*79398b25SAndroid Build Coastguard Worker 127*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \ 128*79398b25SAndroid Build Coastguard Worker (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT) 129*79398b25SAndroid Build Coastguard Worker 130*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT)) 131*79398b25SAndroid Build Coastguard Worker 132*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_COMPRESSED_BIT_BLOCK (1 << 24) 133*79398b25SAndroid Build Coastguard Worker 134*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) (((B) & \ 135*79398b25SAndroid Build Coastguard Worker ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \ 136*79398b25SAndroid Build Coastguard Worker ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK) 137*79398b25SAndroid Build Coastguard Worker 138*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK)) 139*79398b25SAndroid Build Coastguard Worker 140*79398b25SAndroid Build Coastguard Worker /* 141*79398b25SAndroid Build Coastguard Worker * Inode number ops. Inodes consist of a compressed block number, and an 142*79398b25SAndroid Build Coastguard Worker * uncompressed offset within that block 143*79398b25SAndroid Build Coastguard Worker */ 144*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_INODE_BLK(a) ((unsigned int) ((a) >> 16)) 145*79398b25SAndroid Build Coastguard Worker 146*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_INODE_OFFSET(a) ((unsigned int) ((a) & 0xffff)) 147*79398b25SAndroid Build Coastguard Worker 148*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MKINODE(A, B) ((squashfs_inode_t)(((squashfs_inode_t) (A)\ 149*79398b25SAndroid Build Coastguard Worker << 16) + (B))) 150*79398b25SAndroid Build Coastguard Worker 151*79398b25SAndroid Build Coastguard Worker /* Compute 32 bit VFS inode number from squashfs inode number */ 152*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MK_VFS_INODE(a, b) ((unsigned int) (((a) << 8) + \ 153*79398b25SAndroid Build Coastguard Worker ((b) >> 2) + 1)) 154*79398b25SAndroid Build Coastguard Worker /* XXX */ 155*79398b25SAndroid Build Coastguard Worker 156*79398b25SAndroid Build Coastguard Worker /* Translate between VFS mode and squashfs mode */ 157*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MODE(a) ((a) & 0xfff) 158*79398b25SAndroid Build Coastguard Worker 159*79398b25SAndroid Build Coastguard Worker /* fragment and fragment table defines */ 160*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_BYTES(A) (A * sizeof(struct squashfs_fragment_entry)) 161*79398b25SAndroid Build Coastguard Worker 162*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / \ 163*79398b25SAndroid Build Coastguard Worker SQUASHFS_METADATA_SIZE) 164*79398b25SAndroid Build Coastguard Worker 165*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % \ 166*79398b25SAndroid Build Coastguard Worker SQUASHFS_METADATA_SIZE) 167*79398b25SAndroid Build Coastguard Worker 168*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + \ 169*79398b25SAndroid Build Coastguard Worker SQUASHFS_METADATA_SIZE - 1) / \ 170*79398b25SAndroid Build Coastguard Worker SQUASHFS_METADATA_SIZE) 171*79398b25SAndroid Build Coastguard Worker 172*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) *\ 173*79398b25SAndroid Build Coastguard Worker sizeof(long long)) 174*79398b25SAndroid Build Coastguard Worker 175*79398b25SAndroid Build Coastguard Worker /* cached data constants for filesystem */ 176*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_CACHED_BLKS 8 177*79398b25SAndroid Build Coastguard Worker 178*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MAX_FILE_SIZE_LOG 64 179*79398b25SAndroid Build Coastguard Worker 180*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MAX_FILE_SIZE ((long long) 1 << \ 181*79398b25SAndroid Build Coastguard Worker (SQUASHFS_MAX_FILE_SIZE_LOG - 2)) 182*79398b25SAndroid Build Coastguard Worker 183*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MARKER_BYTE 0xff 184*79398b25SAndroid Build Coastguard Worker 185*79398b25SAndroid Build Coastguard Worker /* meta index cache */ 186*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int)) 187*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_META_ENTRIES 31 188*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_META_NUMBER 8 189*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SLOTS 4 190*79398b25SAndroid Build Coastguard Worker 191*79398b25SAndroid Build Coastguard Worker struct meta_entry { 192*79398b25SAndroid Build Coastguard Worker long long data_block; 193*79398b25SAndroid Build Coastguard Worker unsigned int index_block; 194*79398b25SAndroid Build Coastguard Worker unsigned short offset; 195*79398b25SAndroid Build Coastguard Worker unsigned short pad; 196*79398b25SAndroid Build Coastguard Worker }; 197*79398b25SAndroid Build Coastguard Worker 198*79398b25SAndroid Build Coastguard Worker struct meta_index { 199*79398b25SAndroid Build Coastguard Worker unsigned int inode_number; 200*79398b25SAndroid Build Coastguard Worker unsigned int offset; 201*79398b25SAndroid Build Coastguard Worker unsigned short entries; 202*79398b25SAndroid Build Coastguard Worker unsigned short skip; 203*79398b25SAndroid Build Coastguard Worker unsigned short locked; 204*79398b25SAndroid Build Coastguard Worker unsigned short pad; 205*79398b25SAndroid Build Coastguard Worker struct meta_entry meta_entry[SQUASHFS_META_ENTRIES]; 206*79398b25SAndroid Build Coastguard Worker }; 207*79398b25SAndroid Build Coastguard Worker 208*79398b25SAndroid Build Coastguard Worker 209*79398b25SAndroid Build Coastguard Worker /* 210*79398b25SAndroid Build Coastguard Worker * definitions for structures on disk 211*79398b25SAndroid Build Coastguard Worker */ 212*79398b25SAndroid Build Coastguard Worker 213*79398b25SAndroid Build Coastguard Worker typedef long long squashfs_block_t; 214*79398b25SAndroid Build Coastguard Worker typedef long long squashfs_inode_t; 215*79398b25SAndroid Build Coastguard Worker 216*79398b25SAndroid Build Coastguard Worker struct squashfs_super_block { 217*79398b25SAndroid Build Coastguard Worker unsigned int s_magic; 218*79398b25SAndroid Build Coastguard Worker unsigned int inodes; 219*79398b25SAndroid Build Coastguard Worker unsigned int bytes_used_2; 220*79398b25SAndroid Build Coastguard Worker unsigned int uid_start_2; 221*79398b25SAndroid Build Coastguard Worker unsigned int guid_start_2; 222*79398b25SAndroid Build Coastguard Worker unsigned int inode_table_start_2; 223*79398b25SAndroid Build Coastguard Worker unsigned int directory_table_start_2; 224*79398b25SAndroid Build Coastguard Worker unsigned int s_major:16; 225*79398b25SAndroid Build Coastguard Worker unsigned int s_minor:16; 226*79398b25SAndroid Build Coastguard Worker unsigned int block_size_1:16; 227*79398b25SAndroid Build Coastguard Worker unsigned int block_log:16; 228*79398b25SAndroid Build Coastguard Worker unsigned int flags:8; 229*79398b25SAndroid Build Coastguard Worker unsigned int no_uids:8; 230*79398b25SAndroid Build Coastguard Worker unsigned int no_guids:8; 231*79398b25SAndroid Build Coastguard Worker unsigned int mkfs_time /* time of filesystem creation */; 232*79398b25SAndroid Build Coastguard Worker squashfs_inode_t root_inode; 233*79398b25SAndroid Build Coastguard Worker unsigned int block_size; 234*79398b25SAndroid Build Coastguard Worker unsigned int fragments; 235*79398b25SAndroid Build Coastguard Worker unsigned int fragment_table_start_2; 236*79398b25SAndroid Build Coastguard Worker long long bytes_used; 237*79398b25SAndroid Build Coastguard Worker long long uid_start; 238*79398b25SAndroid Build Coastguard Worker long long guid_start; 239*79398b25SAndroid Build Coastguard Worker long long inode_table_start; 240*79398b25SAndroid Build Coastguard Worker long long directory_table_start; 241*79398b25SAndroid Build Coastguard Worker long long fragment_table_start; 242*79398b25SAndroid Build Coastguard Worker long long unused; 243*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 244*79398b25SAndroid Build Coastguard Worker 245*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_index { 246*79398b25SAndroid Build Coastguard Worker unsigned int index; 247*79398b25SAndroid Build Coastguard Worker unsigned int start_block; 248*79398b25SAndroid Build Coastguard Worker unsigned char size; 249*79398b25SAndroid Build Coastguard Worker unsigned char name[0]; 250*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 251*79398b25SAndroid Build Coastguard Worker 252*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_BASE_INODE_HEADER \ 253*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; \ 254*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; \ 255*79398b25SAndroid Build Coastguard Worker unsigned int uid:8; \ 256*79398b25SAndroid Build Coastguard Worker unsigned int guid:8; \ 257*79398b25SAndroid Build Coastguard Worker unsigned int mtime; \ 258*79398b25SAndroid Build Coastguard Worker unsigned int inode_number; 259*79398b25SAndroid Build Coastguard Worker 260*79398b25SAndroid Build Coastguard Worker struct squashfs_base_inode_header { 261*79398b25SAndroid Build Coastguard Worker SQUASHFS_BASE_INODE_HEADER; 262*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 263*79398b25SAndroid Build Coastguard Worker 264*79398b25SAndroid Build Coastguard Worker struct squashfs_ipc_inode_header { 265*79398b25SAndroid Build Coastguard Worker SQUASHFS_BASE_INODE_HEADER; 266*79398b25SAndroid Build Coastguard Worker unsigned int nlink; 267*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 268*79398b25SAndroid Build Coastguard Worker 269*79398b25SAndroid Build Coastguard Worker struct squashfs_dev_inode_header { 270*79398b25SAndroid Build Coastguard Worker SQUASHFS_BASE_INODE_HEADER; 271*79398b25SAndroid Build Coastguard Worker unsigned int nlink; 272*79398b25SAndroid Build Coastguard Worker unsigned short rdev; 273*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 274*79398b25SAndroid Build Coastguard Worker 275*79398b25SAndroid Build Coastguard Worker struct squashfs_symlink_inode_header { 276*79398b25SAndroid Build Coastguard Worker SQUASHFS_BASE_INODE_HEADER; 277*79398b25SAndroid Build Coastguard Worker unsigned int nlink; 278*79398b25SAndroid Build Coastguard Worker unsigned short symlink_size; 279*79398b25SAndroid Build Coastguard Worker char symlink[0]; 280*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 281*79398b25SAndroid Build Coastguard Worker 282*79398b25SAndroid Build Coastguard Worker struct squashfs_reg_inode_header { 283*79398b25SAndroid Build Coastguard Worker SQUASHFS_BASE_INODE_HEADER; 284*79398b25SAndroid Build Coastguard Worker squashfs_block_t start_block; 285*79398b25SAndroid Build Coastguard Worker unsigned int fragment; 286*79398b25SAndroid Build Coastguard Worker unsigned int offset; 287*79398b25SAndroid Build Coastguard Worker unsigned int file_size; 288*79398b25SAndroid Build Coastguard Worker unsigned short block_list[0]; 289*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 290*79398b25SAndroid Build Coastguard Worker 291*79398b25SAndroid Build Coastguard Worker struct squashfs_lreg_inode_header { 292*79398b25SAndroid Build Coastguard Worker SQUASHFS_BASE_INODE_HEADER; 293*79398b25SAndroid Build Coastguard Worker unsigned int nlink; 294*79398b25SAndroid Build Coastguard Worker squashfs_block_t start_block; 295*79398b25SAndroid Build Coastguard Worker unsigned int fragment; 296*79398b25SAndroid Build Coastguard Worker unsigned int offset; 297*79398b25SAndroid Build Coastguard Worker long long file_size; 298*79398b25SAndroid Build Coastguard Worker unsigned short block_list[0]; 299*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 300*79398b25SAndroid Build Coastguard Worker 301*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_inode_header { 302*79398b25SAndroid Build Coastguard Worker SQUASHFS_BASE_INODE_HEADER; 303*79398b25SAndroid Build Coastguard Worker unsigned int nlink; 304*79398b25SAndroid Build Coastguard Worker unsigned int file_size:19; 305*79398b25SAndroid Build Coastguard Worker unsigned int offset:13; 306*79398b25SAndroid Build Coastguard Worker unsigned int start_block; 307*79398b25SAndroid Build Coastguard Worker unsigned int parent_inode; 308*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 309*79398b25SAndroid Build Coastguard Worker 310*79398b25SAndroid Build Coastguard Worker struct squashfs_ldir_inode_header { 311*79398b25SAndroid Build Coastguard Worker SQUASHFS_BASE_INODE_HEADER; 312*79398b25SAndroid Build Coastguard Worker unsigned int nlink; 313*79398b25SAndroid Build Coastguard Worker unsigned int file_size:27; 314*79398b25SAndroid Build Coastguard Worker unsigned int offset:13; 315*79398b25SAndroid Build Coastguard Worker unsigned int start_block; 316*79398b25SAndroid Build Coastguard Worker unsigned int i_count:16; 317*79398b25SAndroid Build Coastguard Worker unsigned int parent_inode; 318*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_index index[0]; 319*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 320*79398b25SAndroid Build Coastguard Worker 321*79398b25SAndroid Build Coastguard Worker union squashfs_inode_header { 322*79398b25SAndroid Build Coastguard Worker struct squashfs_base_inode_header base; 323*79398b25SAndroid Build Coastguard Worker struct squashfs_dev_inode_header dev; 324*79398b25SAndroid Build Coastguard Worker struct squashfs_symlink_inode_header symlink; 325*79398b25SAndroid Build Coastguard Worker struct squashfs_reg_inode_header reg; 326*79398b25SAndroid Build Coastguard Worker struct squashfs_lreg_inode_header lreg; 327*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_inode_header dir; 328*79398b25SAndroid Build Coastguard Worker struct squashfs_ldir_inode_header ldir; 329*79398b25SAndroid Build Coastguard Worker struct squashfs_ipc_inode_header ipc; 330*79398b25SAndroid Build Coastguard Worker }; 331*79398b25SAndroid Build Coastguard Worker 332*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_entry { 333*79398b25SAndroid Build Coastguard Worker unsigned int offset:13; 334*79398b25SAndroid Build Coastguard Worker unsigned int type:3; 335*79398b25SAndroid Build Coastguard Worker unsigned int size:8; 336*79398b25SAndroid Build Coastguard Worker int inode_number:16; 337*79398b25SAndroid Build Coastguard Worker char name[0]; 338*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 339*79398b25SAndroid Build Coastguard Worker 340*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_header { 341*79398b25SAndroid Build Coastguard Worker unsigned int count:8; 342*79398b25SAndroid Build Coastguard Worker unsigned int start_block; 343*79398b25SAndroid Build Coastguard Worker unsigned int inode_number; 344*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 345*79398b25SAndroid Build Coastguard Worker 346*79398b25SAndroid Build Coastguard Worker struct squashfs_fragment_entry { 347*79398b25SAndroid Build Coastguard Worker long long start_block; 348*79398b25SAndroid Build Coastguard Worker unsigned int size; 349*79398b25SAndroid Build Coastguard Worker unsigned int unused; 350*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 351*79398b25SAndroid Build Coastguard Worker 352*79398b25SAndroid Build Coastguard Worker extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen); 353*79398b25SAndroid Build Coastguard Worker extern int squashfs_uncompress_init(void); 354*79398b25SAndroid Build Coastguard Worker extern int squashfs_uncompress_exit(void); 355*79398b25SAndroid Build Coastguard Worker 356*79398b25SAndroid Build Coastguard Worker /* 357*79398b25SAndroid Build Coastguard Worker * macros to convert each packed bitfield structure from little endian to big 358*79398b25SAndroid Build Coastguard Worker * endian and vice versa. These are needed when creating or using a filesystem 359*79398b25SAndroid Build Coastguard Worker * on a machine with different byte ordering to the target architecture. 360*79398b25SAndroid Build Coastguard Worker * 361*79398b25SAndroid Build Coastguard Worker */ 362*79398b25SAndroid Build Coastguard Worker 363*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_START \ 364*79398b25SAndroid Build Coastguard Worker int bits;\ 365*79398b25SAndroid Build Coastguard Worker int b_pos;\ 366*79398b25SAndroid Build Coastguard Worker unsigned long long val;\ 367*79398b25SAndroid Build Coastguard Worker unsigned char *s;\ 368*79398b25SAndroid Build Coastguard Worker unsigned char *d; 369*79398b25SAndroid Build Coastguard Worker 370*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\ 371*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 372*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\ 373*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\ 374*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inodes, d, 32, 32);\ 375*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\ 376*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\ 377*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\ 378*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\ 379*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\ 380*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->s_major, d, 224, 16);\ 381*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\ 382*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\ 383*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->block_log, d, 272, 16);\ 384*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->flags, d, 288, 8);\ 385*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\ 386*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\ 387*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\ 388*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\ 389*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->block_size, d, 408, 32);\ 390*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->fragments, d, 440, 32);\ 391*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\ 392*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\ 393*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\ 394*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\ 395*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\ 396*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\ 397*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\ 398*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->unused, d, 888, 64);\ 399*79398b25SAndroid Build Coastguard Worker } 400*79398b25SAndroid Build Coastguard Worker 401*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\ 402*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, n);\ 403*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ 404*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mode, d, 4, 12);\ 405*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->uid, d, 16, 8);\ 406*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->guid, d, 24, 8);\ 407*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mtime, d, 32, 32);\ 408*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inode_number, d, 64, 32); 409*79398b25SAndroid Build Coastguard Worker 410*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\ 411*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 412*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\ 413*79398b25SAndroid Build Coastguard Worker } 414*79398b25SAndroid Build Coastguard Worker 415*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\ 416*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 417*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ 418*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_ipc_inode_header))\ 419*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ 420*79398b25SAndroid Build Coastguard Worker } 421*79398b25SAndroid Build Coastguard Worker 422*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\ 423*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 424*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ 425*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_dev_inode_header)); \ 426*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ 427*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->rdev, d, 128, 16);\ 428*79398b25SAndroid Build Coastguard Worker } 429*79398b25SAndroid Build Coastguard Worker 430*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\ 431*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 432*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ 433*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_symlink_inode_header));\ 434*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ 435*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\ 436*79398b25SAndroid Build Coastguard Worker } 437*79398b25SAndroid Build Coastguard Worker 438*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\ 439*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 440*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ 441*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_reg_inode_header));\ 442*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 96, 64);\ 443*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->fragment, d, 160, 32);\ 444*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 192, 32);\ 445*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 224, 32);\ 446*79398b25SAndroid Build Coastguard Worker } 447*79398b25SAndroid Build Coastguard Worker 448*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\ 449*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 450*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ 451*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_lreg_inode_header));\ 452*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ 453*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 128, 64);\ 454*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->fragment, d, 192, 32);\ 455*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 224, 32);\ 456*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 256, 64);\ 457*79398b25SAndroid Build Coastguard Worker } 458*79398b25SAndroid Build Coastguard Worker 459*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\ 460*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 461*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ 462*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_dir_inode_header));\ 463*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ 464*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 128, 19);\ 465*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 147, 13);\ 466*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 160, 32);\ 467*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\ 468*79398b25SAndroid Build Coastguard Worker } 469*79398b25SAndroid Build Coastguard Worker 470*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\ 471*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 472*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \ 473*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_ldir_inode_header));\ 474*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->nlink, d, 96, 32);\ 475*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 128, 27);\ 476*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 155, 13);\ 477*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 168, 32);\ 478*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->i_count, d, 200, 16);\ 479*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\ 480*79398b25SAndroid Build Coastguard Worker } 481*79398b25SAndroid Build Coastguard Worker 482*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_INDEX(s, d) {\ 483*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 484*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\ 485*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->index, d, 0, 32);\ 486*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 32, 32);\ 487*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->size, d, 64, 8);\ 488*79398b25SAndroid Build Coastguard Worker } 489*79398b25SAndroid Build Coastguard Worker 490*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_HEADER(s, d) {\ 491*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 492*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\ 493*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->count, d, 0, 8);\ 494*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 8, 32);\ 495*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\ 496*79398b25SAndroid Build Coastguard Worker } 497*79398b25SAndroid Build Coastguard Worker 498*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\ 499*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 500*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\ 501*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 0, 13);\ 502*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->type, d, 13, 3);\ 503*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->size, d, 16, 8);\ 504*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\ 505*79398b25SAndroid Build Coastguard Worker } 506*79398b25SAndroid Build Coastguard Worker 507*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\ 508*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 509*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\ 510*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 0, 64);\ 511*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->size, d, 64, 32);\ 512*79398b25SAndroid Build Coastguard Worker } 513*79398b25SAndroid Build Coastguard Worker 514*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_SHORTS(s, d, n) {\ 515*79398b25SAndroid Build Coastguard Worker int entry;\ 516*79398b25SAndroid Build Coastguard Worker int bit_position;\ 517*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 518*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, n * 2);\ 519*79398b25SAndroid Build Coastguard Worker for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ 520*79398b25SAndroid Build Coastguard Worker 16)\ 521*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP(s[entry], d, bit_position, 16);\ 522*79398b25SAndroid Build Coastguard Worker } 523*79398b25SAndroid Build Coastguard Worker 524*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_INTS(s, d, n) {\ 525*79398b25SAndroid Build Coastguard Worker int entry;\ 526*79398b25SAndroid Build Coastguard Worker int bit_position;\ 527*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 528*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, n * 4);\ 529*79398b25SAndroid Build Coastguard Worker for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ 530*79398b25SAndroid Build Coastguard Worker 32)\ 531*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP(s[entry], d, bit_position, 32);\ 532*79398b25SAndroid Build Coastguard Worker } 533*79398b25SAndroid Build Coastguard Worker 534*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\ 535*79398b25SAndroid Build Coastguard Worker int entry;\ 536*79398b25SAndroid Build Coastguard Worker int bit_position;\ 537*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 538*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, n * 8);\ 539*79398b25SAndroid Build Coastguard Worker for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ 540*79398b25SAndroid Build Coastguard Worker 64)\ 541*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP(s[entry], d, bit_position, 64);\ 542*79398b25SAndroid Build Coastguard Worker } 543*79398b25SAndroid Build Coastguard Worker 544*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DATA(s, d, n, bits) {\ 545*79398b25SAndroid Build Coastguard Worker int entry;\ 546*79398b25SAndroid Build Coastguard Worker int bit_position;\ 547*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 548*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, n * bits / 8);\ 549*79398b25SAndroid Build Coastguard Worker for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \ 550*79398b25SAndroid Build Coastguard Worker bits)\ 551*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP(s[entry], d, bit_position, bits);\ 552*79398b25SAndroid Build Coastguard Worker } 553*79398b25SAndroid Build Coastguard Worker 554*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n) 555*79398b25SAndroid Build Coastguard Worker 556*79398b25SAndroid Build Coastguard Worker #ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY 557*79398b25SAndroid Build Coastguard Worker 558*79398b25SAndroid Build Coastguard Worker struct squashfs_base_inode_header_1 { 559*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 560*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 561*79398b25SAndroid Build Coastguard Worker unsigned int uid:4; /* index into uid table */ 562*79398b25SAndroid Build Coastguard Worker unsigned int guid:4; /* index into guid table */ 563*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 564*79398b25SAndroid Build Coastguard Worker 565*79398b25SAndroid Build Coastguard Worker struct squashfs_ipc_inode_header_1 { 566*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 567*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 568*79398b25SAndroid Build Coastguard Worker unsigned int uid:4; /* index into uid table */ 569*79398b25SAndroid Build Coastguard Worker unsigned int guid:4; /* index into guid table */ 570*79398b25SAndroid Build Coastguard Worker unsigned int type:4; 571*79398b25SAndroid Build Coastguard Worker unsigned int offset:4; 572*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 573*79398b25SAndroid Build Coastguard Worker 574*79398b25SAndroid Build Coastguard Worker struct squashfs_dev_inode_header_1 { 575*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 576*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 577*79398b25SAndroid Build Coastguard Worker unsigned int uid:4; /* index into uid table */ 578*79398b25SAndroid Build Coastguard Worker unsigned int guid:4; /* index into guid table */ 579*79398b25SAndroid Build Coastguard Worker unsigned short rdev; 580*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 581*79398b25SAndroid Build Coastguard Worker 582*79398b25SAndroid Build Coastguard Worker struct squashfs_symlink_inode_header_1 { 583*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 584*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 585*79398b25SAndroid Build Coastguard Worker unsigned int uid:4; /* index into uid table */ 586*79398b25SAndroid Build Coastguard Worker unsigned int guid:4; /* index into guid table */ 587*79398b25SAndroid Build Coastguard Worker unsigned short symlink_size; 588*79398b25SAndroid Build Coastguard Worker char symlink[0]; 589*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 590*79398b25SAndroid Build Coastguard Worker 591*79398b25SAndroid Build Coastguard Worker struct squashfs_reg_inode_header_1 { 592*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 593*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 594*79398b25SAndroid Build Coastguard Worker unsigned int uid:4; /* index into uid table */ 595*79398b25SAndroid Build Coastguard Worker unsigned int guid:4; /* index into guid table */ 596*79398b25SAndroid Build Coastguard Worker unsigned int mtime; 597*79398b25SAndroid Build Coastguard Worker unsigned int start_block; 598*79398b25SAndroid Build Coastguard Worker unsigned int file_size:32; 599*79398b25SAndroid Build Coastguard Worker unsigned short block_list[0]; 600*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 601*79398b25SAndroid Build Coastguard Worker 602*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_inode_header_1 { 603*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 604*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 605*79398b25SAndroid Build Coastguard Worker unsigned int uid:4; /* index into uid table */ 606*79398b25SAndroid Build Coastguard Worker unsigned int guid:4; /* index into guid table */ 607*79398b25SAndroid Build Coastguard Worker unsigned int file_size:19; 608*79398b25SAndroid Build Coastguard Worker unsigned int offset:13; 609*79398b25SAndroid Build Coastguard Worker unsigned int mtime; 610*79398b25SAndroid Build Coastguard Worker unsigned int start_block:24; 611*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 612*79398b25SAndroid Build Coastguard Worker 613*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \ 614*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, n);\ 615*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ 616*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mode, d, 4, 12);\ 617*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->uid, d, 16, 4);\ 618*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->guid, d, 20, 4); 619*79398b25SAndroid Build Coastguard Worker 620*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\ 621*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 622*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\ 623*79398b25SAndroid Build Coastguard Worker } 624*79398b25SAndroid Build Coastguard Worker 625*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\ 626*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 627*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ 628*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_ipc_inode_header_1));\ 629*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->type, d, 24, 4);\ 630*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 28, 4);\ 631*79398b25SAndroid Build Coastguard Worker } 632*79398b25SAndroid Build Coastguard Worker 633*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\ 634*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 635*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ 636*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_dev_inode_header_1));\ 637*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->rdev, d, 24, 16);\ 638*79398b25SAndroid Build Coastguard Worker } 639*79398b25SAndroid Build Coastguard Worker 640*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\ 641*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 642*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ 643*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_symlink_inode_header_1));\ 644*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\ 645*79398b25SAndroid Build Coastguard Worker } 646*79398b25SAndroid Build Coastguard Worker 647*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\ 648*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 649*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ 650*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_reg_inode_header_1));\ 651*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mtime, d, 24, 32);\ 652*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 56, 32);\ 653*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 88, 32);\ 654*79398b25SAndroid Build Coastguard Worker } 655*79398b25SAndroid Build Coastguard Worker 656*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\ 657*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 658*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \ 659*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_dir_inode_header_1));\ 660*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 24, 19);\ 661*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 43, 13);\ 662*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mtime, d, 56, 32);\ 663*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 88, 24);\ 664*79398b25SAndroid Build Coastguard Worker } 665*79398b25SAndroid Build Coastguard Worker 666*79398b25SAndroid Build Coastguard Worker #endif 667*79398b25SAndroid Build Coastguard Worker 668*79398b25SAndroid Build Coastguard Worker #ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY 669*79398b25SAndroid Build Coastguard Worker 670*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_index_2 { 671*79398b25SAndroid Build Coastguard Worker unsigned int index:27; 672*79398b25SAndroid Build Coastguard Worker unsigned int start_block:29; 673*79398b25SAndroid Build Coastguard Worker unsigned char size; 674*79398b25SAndroid Build Coastguard Worker unsigned char name[0]; 675*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 676*79398b25SAndroid Build Coastguard Worker 677*79398b25SAndroid Build Coastguard Worker struct squashfs_base_inode_header_2 { 678*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 679*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 680*79398b25SAndroid Build Coastguard Worker unsigned int uid:8; /* index into uid table */ 681*79398b25SAndroid Build Coastguard Worker unsigned int guid:8; /* index into guid table */ 682*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 683*79398b25SAndroid Build Coastguard Worker 684*79398b25SAndroid Build Coastguard Worker struct squashfs_ipc_inode_header_2 { 685*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 686*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 687*79398b25SAndroid Build Coastguard Worker unsigned int uid:8; /* index into uid table */ 688*79398b25SAndroid Build Coastguard Worker unsigned int guid:8; /* index into guid table */ 689*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 690*79398b25SAndroid Build Coastguard Worker 691*79398b25SAndroid Build Coastguard Worker struct squashfs_dev_inode_header_2 { 692*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 693*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 694*79398b25SAndroid Build Coastguard Worker unsigned int uid:8; /* index into uid table */ 695*79398b25SAndroid Build Coastguard Worker unsigned int guid:8; /* index into guid table */ 696*79398b25SAndroid Build Coastguard Worker unsigned short rdev; 697*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 698*79398b25SAndroid Build Coastguard Worker 699*79398b25SAndroid Build Coastguard Worker struct squashfs_symlink_inode_header_2 { 700*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 701*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 702*79398b25SAndroid Build Coastguard Worker unsigned int uid:8; /* index into uid table */ 703*79398b25SAndroid Build Coastguard Worker unsigned int guid:8; /* index into guid table */ 704*79398b25SAndroid Build Coastguard Worker unsigned short symlink_size; 705*79398b25SAndroid Build Coastguard Worker char symlink[0]; 706*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 707*79398b25SAndroid Build Coastguard Worker 708*79398b25SAndroid Build Coastguard Worker struct squashfs_reg_inode_header_2 { 709*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 710*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 711*79398b25SAndroid Build Coastguard Worker unsigned int uid:8; /* index into uid table */ 712*79398b25SAndroid Build Coastguard Worker unsigned int guid:8; /* index into guid table */ 713*79398b25SAndroid Build Coastguard Worker unsigned int mtime; 714*79398b25SAndroid Build Coastguard Worker unsigned int start_block; 715*79398b25SAndroid Build Coastguard Worker unsigned int fragment; 716*79398b25SAndroid Build Coastguard Worker unsigned int offset; 717*79398b25SAndroid Build Coastguard Worker unsigned int file_size:32; 718*79398b25SAndroid Build Coastguard Worker unsigned short block_list[0]; 719*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 720*79398b25SAndroid Build Coastguard Worker 721*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_inode_header_2 { 722*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 723*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 724*79398b25SAndroid Build Coastguard Worker unsigned int uid:8; /* index into uid table */ 725*79398b25SAndroid Build Coastguard Worker unsigned int guid:8; /* index into guid table */ 726*79398b25SAndroid Build Coastguard Worker unsigned int file_size:19; 727*79398b25SAndroid Build Coastguard Worker unsigned int offset:13; 728*79398b25SAndroid Build Coastguard Worker unsigned int mtime; 729*79398b25SAndroid Build Coastguard Worker unsigned int start_block:24; 730*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 731*79398b25SAndroid Build Coastguard Worker 732*79398b25SAndroid Build Coastguard Worker struct squashfs_ldir_inode_header_2 { 733*79398b25SAndroid Build Coastguard Worker unsigned int inode_type:4; 734*79398b25SAndroid Build Coastguard Worker unsigned int mode:12; /* protection */ 735*79398b25SAndroid Build Coastguard Worker unsigned int uid:8; /* index into uid table */ 736*79398b25SAndroid Build Coastguard Worker unsigned int guid:8; /* index into guid table */ 737*79398b25SAndroid Build Coastguard Worker unsigned int file_size:27; 738*79398b25SAndroid Build Coastguard Worker unsigned int offset:13; 739*79398b25SAndroid Build Coastguard Worker unsigned int mtime; 740*79398b25SAndroid Build Coastguard Worker unsigned int start_block:24; 741*79398b25SAndroid Build Coastguard Worker unsigned int i_count:16; 742*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_index_2 index[0]; 743*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 744*79398b25SAndroid Build Coastguard Worker 745*79398b25SAndroid Build Coastguard Worker union squashfs_inode_header_2 { 746*79398b25SAndroid Build Coastguard Worker struct squashfs_base_inode_header_2 base; 747*79398b25SAndroid Build Coastguard Worker struct squashfs_dev_inode_header_2 dev; 748*79398b25SAndroid Build Coastguard Worker struct squashfs_symlink_inode_header_2 symlink; 749*79398b25SAndroid Build Coastguard Worker struct squashfs_reg_inode_header_2 reg; 750*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_inode_header_2 dir; 751*79398b25SAndroid Build Coastguard Worker struct squashfs_ldir_inode_header_2 ldir; 752*79398b25SAndroid Build Coastguard Worker struct squashfs_ipc_inode_header_2 ipc; 753*79398b25SAndroid Build Coastguard Worker }; 754*79398b25SAndroid Build Coastguard Worker 755*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_header_2 { 756*79398b25SAndroid Build Coastguard Worker unsigned int count:8; 757*79398b25SAndroid Build Coastguard Worker unsigned int start_block:24; 758*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 759*79398b25SAndroid Build Coastguard Worker 760*79398b25SAndroid Build Coastguard Worker struct squashfs_dir_entry_2 { 761*79398b25SAndroid Build Coastguard Worker unsigned int offset:13; 762*79398b25SAndroid Build Coastguard Worker unsigned int type:3; 763*79398b25SAndroid Build Coastguard Worker unsigned int size:8; 764*79398b25SAndroid Build Coastguard Worker char name[0]; 765*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 766*79398b25SAndroid Build Coastguard Worker 767*79398b25SAndroid Build Coastguard Worker struct squashfs_fragment_entry_2 { 768*79398b25SAndroid Build Coastguard Worker unsigned int start_block; 769*79398b25SAndroid Build Coastguard Worker unsigned int size; 770*79398b25SAndroid Build Coastguard Worker } __attribute__ ((packed)); 771*79398b25SAndroid Build Coastguard Worker 772*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\ 773*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, n);\ 774*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\ 775*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mode, d, 4, 12);\ 776*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->uid, d, 16, 8);\ 777*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->guid, d, 24, 8);\ 778*79398b25SAndroid Build Coastguard Worker 779*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\ 780*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 781*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\ 782*79398b25SAndroid Build Coastguard Worker } 783*79398b25SAndroid Build Coastguard Worker 784*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \ 785*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2)) 786*79398b25SAndroid Build Coastguard Worker 787*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\ 788*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 789*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ 790*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_dev_inode_header_2)); \ 791*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->rdev, d, 32, 16);\ 792*79398b25SAndroid Build Coastguard Worker } 793*79398b25SAndroid Build Coastguard Worker 794*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\ 795*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 796*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ 797*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_symlink_inode_header_2));\ 798*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\ 799*79398b25SAndroid Build Coastguard Worker } 800*79398b25SAndroid Build Coastguard Worker 801*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\ 802*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 803*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ 804*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_reg_inode_header_2));\ 805*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mtime, d, 32, 32);\ 806*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 64, 32);\ 807*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->fragment, d, 96, 32);\ 808*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 128, 32);\ 809*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 160, 32);\ 810*79398b25SAndroid Build Coastguard Worker } 811*79398b25SAndroid Build Coastguard Worker 812*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\ 813*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 814*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ 815*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_dir_inode_header_2));\ 816*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 32, 19);\ 817*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 51, 13);\ 818*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mtime, d, 64, 32);\ 819*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 96, 24);\ 820*79398b25SAndroid Build Coastguard Worker } 821*79398b25SAndroid Build Coastguard Worker 822*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\ 823*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 824*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \ 825*79398b25SAndroid Build Coastguard Worker sizeof(struct squashfs_ldir_inode_header_2));\ 826*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->file_size, d, 32, 27);\ 827*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 59, 13);\ 828*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->mtime, d, 72, 32);\ 829*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 104, 24);\ 830*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->i_count, d, 128, 16);\ 831*79398b25SAndroid Build Coastguard Worker } 832*79398b25SAndroid Build Coastguard Worker 833*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\ 834*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 835*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\ 836*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->index, d, 0, 27);\ 837*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 27, 29);\ 838*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->size, d, 56, 8);\ 839*79398b25SAndroid Build Coastguard Worker } 840*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\ 841*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 842*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\ 843*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->count, d, 0, 8);\ 844*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 8, 24);\ 845*79398b25SAndroid Build Coastguard Worker } 846*79398b25SAndroid Build Coastguard Worker 847*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\ 848*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 849*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\ 850*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->offset, d, 0, 13);\ 851*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->type, d, 13, 3);\ 852*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->size, d, 16, 8);\ 853*79398b25SAndroid Build Coastguard Worker } 854*79398b25SAndroid Build Coastguard Worker 855*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\ 856*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP_START\ 857*79398b25SAndroid Build Coastguard Worker SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\ 858*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->start_block, d, 0, 32);\ 859*79398b25SAndroid Build Coastguard Worker SQUASHFS_SWAP((s)->size, d, 32, 32);\ 860*79398b25SAndroid Build Coastguard Worker } 861*79398b25SAndroid Build Coastguard Worker 862*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n) 863*79398b25SAndroid Build Coastguard Worker 864*79398b25SAndroid Build Coastguard Worker /* fragment and fragment table defines */ 865*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_BYTES_2(A) (A * sizeof(struct squashfs_fragment_entry_2)) 866*79398b25SAndroid Build Coastguard Worker 867*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_INDEX_2(A) (SQUASHFS_FRAGMENT_BYTES_2(A) / \ 868*79398b25SAndroid Build Coastguard Worker SQUASHFS_METADATA_SIZE) 869*79398b25SAndroid Build Coastguard Worker 870*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A) (SQUASHFS_FRAGMENT_BYTES_2(A) % \ 871*79398b25SAndroid Build Coastguard Worker SQUASHFS_METADATA_SIZE) 872*79398b25SAndroid Build Coastguard Worker 873*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_INDEXES_2(A) ((SQUASHFS_FRAGMENT_BYTES_2(A) + \ 874*79398b25SAndroid Build Coastguard Worker SQUASHFS_METADATA_SIZE - 1) / \ 875*79398b25SAndroid Build Coastguard Worker SQUASHFS_METADATA_SIZE) 876*79398b25SAndroid Build Coastguard Worker 877*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A) (SQUASHFS_FRAGMENT_INDEXES_2(A) *\ 878*79398b25SAndroid Build Coastguard Worker sizeof(int)) 879*79398b25SAndroid Build Coastguard Worker 880*79398b25SAndroid Build Coastguard Worker #endif 881*79398b25SAndroid Build Coastguard Worker 882*79398b25SAndroid Build Coastguard Worker #ifdef __KERNEL__ 883*79398b25SAndroid Build Coastguard Worker 884*79398b25SAndroid Build Coastguard Worker /* 885*79398b25SAndroid Build Coastguard Worker * macros used to swap each structure entry, taking into account 886*79398b25SAndroid Build Coastguard Worker * bitfields and different bitfield placing conventions on differing 887*79398b25SAndroid Build Coastguard Worker * architectures 888*79398b25SAndroid Build Coastguard Worker */ 889*79398b25SAndroid Build Coastguard Worker 890*79398b25SAndroid Build Coastguard Worker #include <asm/byteorder.h> 891*79398b25SAndroid Build Coastguard Worker 892*79398b25SAndroid Build Coastguard Worker #ifdef __BIG_ENDIAN 893*79398b25SAndroid Build Coastguard Worker /* convert from little endian to big endian */ 894*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \ 895*79398b25SAndroid Build Coastguard Worker tbits, b_pos) 896*79398b25SAndroid Build Coastguard Worker #else 897*79398b25SAndroid Build Coastguard Worker /* convert from big endian to little endian */ 898*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \ 899*79398b25SAndroid Build Coastguard Worker tbits, 64 - tbits - b_pos) 900*79398b25SAndroid Build Coastguard Worker #endif 901*79398b25SAndroid Build Coastguard Worker 902*79398b25SAndroid Build Coastguard Worker #define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\ 903*79398b25SAndroid Build Coastguard Worker b_pos = pos % 8;\ 904*79398b25SAndroid Build Coastguard Worker val = 0;\ 905*79398b25SAndroid Build Coastguard Worker s = (unsigned char *)p + (pos / 8);\ 906*79398b25SAndroid Build Coastguard Worker d = ((unsigned char *) &val) + 7;\ 907*79398b25SAndroid Build Coastguard Worker for(bits = 0; bits < (tbits + b_pos); bits += 8) \ 908*79398b25SAndroid Build Coastguard Worker *d-- = *s++;\ 909*79398b25SAndroid Build Coastguard Worker value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\ 910*79398b25SAndroid Build Coastguard Worker } 911*79398b25SAndroid Build Coastguard Worker 912*79398b25SAndroid Build Coastguard Worker #define SQUASHFS_MEMSET(s, d, n) memset(s, 0, n); 913*79398b25SAndroid Build Coastguard Worker 914*79398b25SAndroid Build Coastguard Worker #endif 915*79398b25SAndroid Build Coastguard Worker #endif 916