john.levon@sun.com
2007-Feb-20 21:54 UTC
[Xen-devel] [PATCH] Add iso9660 support to libfsimage
# HG changeset patch # User john.levon@sun.com # Date 1172012044 28800 # Node ID ba6219d465a57363f2e9db2c92bd537bcfe44a80 # Parent 32af7d1cf326c33b5c02e3114e94afc5c7ab360b Add iso9660 support to libfsimage. Signed-off-by: John Levon <john.levon@sun.com> diff --git a/tools/libfsimage/Makefile b/tools/libfsimage/Makefile --- a/tools/libfsimage/Makefile +++ b/tools/libfsimage/Makefile @@ -1,7 +1,7 @@ XEN_ROOT = ../.. XEN_ROOT = ../.. include $(XEN_ROOT)/tools/Rules.mk -SUBDIRS-y = common ufs reiserfs +SUBDIRS-y = common ufs reiserfs iso9660 SUBDIRS-y += $(shell ./check-libext2fs) .PHONY: all diff --git a/tools/libfsimage/common/fsimage_grub.c b/tools/libfsimage/common/fsimage_grub.c --- a/tools/libfsimage/common/fsimage_grub.c +++ b/tools/libfsimage/common/fsimage_grub.c @@ -122,6 +122,84 @@ fsig_disk_read_junk(void) return (&disk_read_junk); } +#if defined(__i386__) || defined(__x86_64__) + +#ifdef __amd64 +#define BSF "bsfq" +#else +#define BSF "bsfl" +#endif +unsigned long +fsig_log2 (unsigned long word) +{ + __asm__ (BSF " %1,%0" + : "=r" (word) + : "r" (word)); + return word; +} + +#elif defined(__ia64__) + +#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# define ia64_popcnt(x) __builtin_popcountl(x) +#else +# define ia64_popcnt(x) \ + ({ \ + __u64 ia64_intri_res; \ + asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x)); \ + ia64_intri_res; \ + }) +#endif + +unsigned long +fsig_log2 (unsigned long word) +{ + unsigned long result; + + result = ia64_popcnt((word - 1) & ~word); + return result; +} + +#elif defined(__powerpc__) + +#ifdef __powerpc64__ +#define PPC_CNTLZL "cntlzd" +#else +#define PPC_CNTLZL "cntlzw" +#endif +#define BITS_PER_LONG (sizeof(long) * 8) + +static int +__ilog2(unsigned long x) +{ + int lz; + + asm (PPC_CNTLZL " %0,%1" : "=r" (lz) : "r" (x)); + return BITS_PER_LONG - 1 - lz; +} + +unsigned long +fsig_log2 (unsigned long word) +{ + return __ilog2(word & -word); +} + +#else /* Unoptimized */ + +unsigned long +fsig_log2 (unsigned long word) +{ + unsigned long result = 0; + + while (!(word & 1UL)) + { + result++; + word >>= 1; + } + return result; +} +#endif + int fsig_devread(fsi_file_t *ffi, unsigned int sector, unsigned int offset, unsigned int bufsize, char *buf) diff --git a/tools/libfsimage/common/fsimage_grub.h b/tools/libfsimage/common/fsimage_grub.h --- a/tools/libfsimage/common/fsimage_grub.h +++ b/tools/libfsimage/common/fsimage_grub.h @@ -57,16 +57,19 @@ typedef struct fsig_plugin_ops { #define disk_read_func (*fsig_disk_read_junk()) #define disk_read_hook (*fsig_disk_read_junk()) #define print_possibilities 0 +#define noisy_printf #define grub_memset memset #define grub_memmove memmove +#define grub_log2 fsig_log2 extern char **fsig_disk_read_junk(void); +unsigned long fsig_log2(unsigned long); #define ERR_FSYS_CORRUPT 1 +#define ERR_OUTSIDE_PART 1 #define ERR_SYMLINK_LOOP 1 #define ERR_FILELENGTH 1 -#define ERR_BAD_FILETYPE 1 #define ERR_BAD_FILETYPE 1 #define ERR_FILE_NOT_FOUND 1 diff --git a/tools/libfsimage/common/mapfile-GNU b/tools/libfsimage/common/mapfile-GNU --- a/tools/libfsimage/common/mapfile-GNU +++ b/tools/libfsimage/common/mapfile-GNU @@ -20,6 +20,7 @@ VERSION { fsig_init; fsig_devread; fsig_substring; + fsig_log2; fsig_fs_buf; fsig_file_alloc; fsig_file_buf; diff --git a/tools/libfsimage/common/mapfile-SunOS b/tools/libfsimage/common/mapfile-SunOS --- a/tools/libfsimage/common/mapfile-SunOS +++ b/tools/libfsimage/common/mapfile-SunOS @@ -19,6 +19,7 @@ libfsimage.so.1.0 { fsig_init; fsig_devread; fsig_substring; + fsig_log2; fsig_fs_buf; fsig_file_alloc; fsig_file_buf; diff --git a/tools/libfsimage/ext2fs/fsys_ext2fs.c b/tools/libfsimage/ext2fs/fsys_ext2fs.c --- a/tools/libfsimage/ext2fs/fsys_ext2fs.c +++ b/tools/libfsimage/ext2fs/fsys_ext2fs.c @@ -191,7 +191,7 @@ struct ext2_dir_entry /* ext2/super.c */ -#define log2(n) ffz(~(n)) +#define log2(n) grub_log2(n) #define EXT2_SUPER_MAGIC 0xEF53 /* include/linux/ext2_fs.h */ #define EXT2_ROOT_INO 2 /* include/linux/ext2_fs.h */ @@ -231,93 +231,6 @@ struct ext2_dir_entry #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) - -#if defined(__i386__) || defined(__x86_64__) -/* include/asm-i386/bitops.h */ -/* - * ffz = Find First Zero in word. Undefined if no zero exists, - * so code should check against ~0UL first.. - */ -#ifdef __amd64 -#define BSF "bsfq" -#else -#define BSF "bsfl" -#endif -static __inline__ unsigned long -ffz (unsigned long word) -{ - __asm__ (BSF " %1,%0" -: "=r" (word) -: "r" (~word)); - return word; -} - -#elif defined(__ia64__) - -typedef unsigned long __u64; - -#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# define ia64_popcnt(x) __builtin_popcountl(x) -#else -# define ia64_popcnt(x) \ - ({ \ - __u64 ia64_intri_res; \ - asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x)); \ - ia64_intri_res; \ - }) -#endif - -static __inline__ unsigned long -ffz (unsigned long word) -{ - unsigned long result; - - result = ia64_popcnt(word & (~word - 1)); - return result; -} - -#elif defined(__powerpc__) - -#ifdef __powerpc64__ -#define PPC_CNTLZL "cntlzd" -#else -#define PPC_CNTLZL "cntlzw" -#endif -#define BITS_PER_LONG (sizeof(long) * 8) - -static __inline__ int -__ilog2(unsigned long x) -{ - int lz; - - asm (PPC_CNTLZL " %0,%1" : "=r" (lz) : "r" (x)); - return BITS_PER_LONG - 1 - lz; -} - -static __inline__ unsigned long -ffz (unsigned long word) -{ - if ((word = ~word) == 0) - return BITS_PER_LONG; - return __ilog2(word & -word); -} - -#else /* Unoptimized */ - -static __inline__ unsigned long -ffz (unsigned long word) -{ - unsigned long result; - - result = 0; - while(word & 1) - { - result++; - word >>= 1; - } - return result; -} -#endif /* check filesystem types and read superblock into memory buffer */ int diff --git a/tools/libfsimage/iso9660/Makefile b/tools/libfsimage/iso9660/Makefile new file mode 100644 --- /dev/null +++ b/tools/libfsimage/iso9660/Makefile @@ -0,0 +1,15 @@ +XEN_ROOT = ../../.. + +LIB_SRCS-y = fsys_iso9660.c + +FS = iso9660 + +.PHONY: all +all: fs-all + +.PHONY: install +install: fs-install + +fsys_iso9660.c: iso9660.h + +include $(XEN_ROOT)/tools/libfsimage/Rules.mk diff --git a/tools/libfsimage/iso9660/fsys_iso9660.c b/tools/libfsimage/iso9660/fsys_iso9660.c new file mode 100644 --- /dev/null +++ b/tools/libfsimage/iso9660/fsys_iso9660.c @@ -0,0 +1,463 @@ +/* + * ISO 9660 filesystem backend for GRUB (GRand Unified Bootloader) + * including Rock Ridge Extensions support + * + * Copyright (C) 1998, 1999 Kousuke Takai <tak@kmc.kyoto-u.ac.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* + * References: + * linux/fs/isofs/rock.[ch] + * mkisofs-1.11.1/diag/isoinfo.c + * mkisofs-1.11.1/iso9660.h + * (all are written by Eric Youngdale) + * + * Modifications by: + * Leonid Lisovskiy <lly@pisem.net> 2003 + */ + +#include <fsimage_grub.h> +#include <limits.h> + +#include "iso9660.h" + +#define MAXINT INT_MAX + +/* iso9660 super-block data in memory */ +struct iso_sb_info { + unsigned long vol_sector; + +}; + +/* iso fs inode data in memory */ +struct iso_inode_info { + unsigned long file_start; +}; + +#define ISO_SUPER \ + ((struct iso_sb_info *)(FSYS_BUF)) +#define INODE \ + ((struct iso_inode_info *)(FSYS_BUF+sizeof(struct iso_sb_info))) +#define PRIMDESC ((struct iso_primary_descriptor *)(FSYS_BUF + 2048)) +#define DIRREC ((struct iso_directory_record *)(FSYS_BUF + 4096)) +#define RRCONT_BUF ((unsigned char *)(FSYS_BUF + 6144)) +#define NAME_BUF ((unsigned char *)(FSYS_BUF + 8192)) + + +#define log2 grub_log2 + +static int +iso9660_devread (fsi_file_t *ffi, int sector, int byte_offset, int byte_len, char *buf) +{ + static int read_count = 0, threshold = 2; + unsigned short sector_size_lg2 = log2(512 /*buf_geom.sector_size*/); + + /* + * We have to use own devread() function since BIOS return wrong geometry + */ + if (sector < 0) + { + errnum = ERR_OUTSIDE_PART; + return 0; + } + if (byte_len <= 0) + return 1; + +#if 0 + sector += (byte_offset >> sector_size_lg2); + byte_offset &= (buf_geom.sector_size - 1); + asm volatile ("shl%L0 %1,%0" + : "=r"(sector) + : "Ic"((int8_t)(ISO_SECTOR_BITS - sector_size_lg2)), + "0"(sector)); +#else + sector = (sector * 4) + (byte_offset >> sector_size_lg2); + byte_offset &= 511; +#endif + +#if !defined(STAGE1_5) + if (disk_read_hook && debug) + printf ("<%d, %d, %d>", sector, byte_offset, byte_len); +#endif /* !STAGE1_5 */ + + read_count += (byte_len >> 9); + if ((read_count >> 11) > threshold) { + noisy_printf("."); + threshold += 2; /* one dot every 2 MB */ + } + return devread(ffi, sector, byte_offset, byte_len, buf); +} + +int +iso9660_mount (fsi_file_t *ffi, const char *options) +{ + unsigned int sector; + + /* + * Because there is no defined slice type ID for ISO-9660 filesystem, + * this test will pass only either (1) if entire disk is used, or + * (2) if current partition is BSD style sub-partition whose ID is + * ISO-9660. + */ +#if 0 + if ((current_partition != 0xFFFFFF) + && !IS_PC_SLICE_TYPE_BSD_WITH_FS(current_slice, FS_ISO9660)) + return 0; +#endif + + /* + * Currently, only FIRST session of MultiSession disks are supported !!! + */ + for (sector = 16 ; sector < 32 ; sector++) + { + if (!iso9660_devread(ffi, sector, 0, sizeof(*PRIMDESC), (char *)PRIMDESC)) + break; + /* check ISO_VD_PRIMARY and ISO_STANDARD_ID */ + if (PRIMDESC->type.l == ISO_VD_PRIMARY + && !memcmp(PRIMDESC->id, ISO_STANDARD_ID, sizeof(PRIMDESC->id))) + { + ISO_SUPER->vol_sector = sector; + INODE->file_start = 0; +#if 0 + fsmax = PRIMDESC->volume_space_size.l; +#endif + return 1; + } + } + + return 0; +} + +int +iso9660_dir (fsi_file_t *ffi, char *dirname) +{ + struct iso_directory_record *idr; + RR_ptr_t rr_ptr; + struct rock_ridge *ce_ptr; + unsigned int pathlen; + int size; + unsigned int extent; + unsigned char file_type; + unsigned int rr_len; + unsigned char rr_flag; + + idr = &PRIMDESC->root_directory_record; + INODE->file_start = 0; + + do + { + while (*dirname == ''/'') /* skip leading slashes */ + dirname++; + /* pathlen = strcspn(dirname, "/\n\t "); */ + for (pathlen = 0 ; + dirname[pathlen] + && !isspace(dirname[pathlen]) && dirname[pathlen] != ''/'' ; + pathlen++) + ; + + size = idr->size.l; + extent = idr->extent.l; + + while (size > 0) + { + if (!iso9660_devread(ffi, extent, 0, ISO_SECTOR_SIZE, (char *)DIRREC)) + { + errnum = ERR_FSYS_CORRUPT; + return 0; + } + extent++; + + idr = (struct iso_directory_record *)DIRREC; + for (; idr->length.l > 0; + idr = (struct iso_directory_record *)((char *)idr + idr->length.l) ) + { + const char *name = idr->name; + unsigned int name_len = idr->name_len.l; + + file_type = (idr->flags.l & 2) ? ISO_DIRECTORY : ISO_REGULAR; + if (name_len == 1) + { + if ((name[0] == 0) || /* self */ + (name[0] == 1)) /* parent */ + continue; + } + if (name_len > 2 && CHECK2(name + name_len - 2, '';'', ''1'')) + { + name_len -= 2; /* truncate trailing file version */ + if (name_len > 1 && name[name_len - 1] == ''.'') + name_len--; /* truncate trailing dot */ + } + + /* + * Parse Rock-Ridge extension + */ + rr_len = (idr->length.l - idr->name_len.l + - sizeof(struct iso_directory_record) + + sizeof(idr->name)); + rr_ptr.ptr = ((unsigned char *)idr + idr->name_len.l + + sizeof(struct iso_directory_record) + - sizeof(idr->name)); + if (rr_ptr.i & 1) + rr_ptr.i++, rr_len--; + ce_ptr = NULL; + rr_flag = RR_FLAG_NM | RR_FLAG_PX /*| RR_FLAG_SL*/; + + while (rr_len >= 4) + { + if (rr_ptr.rr->version != 1) + { +#ifndef STAGE1_5 + if (debug) + printf( + "Non-supported version (%d) RockRidge chunk " + "`%c%c''\n", rr_ptr.rr->version, + rr_ptr.rr->signature & 0xFF, + rr_ptr.rr->signature >> 8); +#endif + } + else + { + switch (rr_ptr.rr->signature) + { + case RRMAGIC(''R'', ''R''): + if ( rr_ptr.rr->len >= (4+sizeof(struct RR))) + rr_flag &= rr_ptr.rr->u.rr.flags.l; + break; + case RRMAGIC(''N'', ''M''): + name = rr_ptr.rr->u.nm.name; + name_len = rr_ptr.rr->len - (4+sizeof(struct NM)); + rr_flag &= ~RR_FLAG_NM; + break; + case RRMAGIC(''P'', ''X''): + if (rr_ptr.rr->len >= (4+sizeof(struct PX))) + { + file_type = ((rr_ptr.rr->u.px.mode.l & POSIX_S_IFMT) + == POSIX_S_IFREG + ? ISO_REGULAR + : ((rr_ptr.rr->u.px.mode.l & POSIX_S_IFMT) + == POSIX_S_IFDIR + ? ISO_DIRECTORY : ISO_OTHER)); + rr_flag &= ~RR_FLAG_PX; + } + break; + case RRMAGIC(''C'', ''E''): + if (rr_ptr.rr->len >= (4+sizeof(struct CE))) + ce_ptr = rr_ptr.rr; + break; +#if 0 // RockRidge symlinks are not supported yet + case RRMAGIC(''S'', ''L''): + { + int slen; + unsigned char rootflag, prevflag; + char *rpnt = NAME_BUF+1024; + struct SL_component *slp; + + slen = rr_ptr.rr->len - (4+1); + slp = &rr_ptr.rr->u.sl.link; + while (slen > 1) + { + rootflag = 0; + switch (slp->flags.l) + { + case 0: + memcpy(rpnt, slp->text, slp->len); + rpnt += slp->len; + break; + case 4: + *rpnt++ = ''.''; + /* fallthru */ + case 2: + *rpnt++ = ''.''; + break; + case 8: + rootflag = 1; + *rpnt++ = ''/''; + break; + default: + printf("Symlink component flag not implemented (%d)\n", + slp->flags.l); + slen = 0; + break; + } + slen -= slp->len + 2; + prevflag = slp->flags.l; + slp = (struct SL_component *) ((char *) slp + slp->len + 2); + + if (slen < 2) + { + /* + * If there is another SL record, and this component + * record isn''t continued, then add a slash. + */ + if ((!rootflag) && (rr_ptr.rr->u.sl.flags.l & 1) && !(prevflag & 1)) + *rpnt++=''/''; + break; + } + + /* + * If this component record isn''t continued, then append a ''/''. + */ + if (!rootflag && !(prevflag & 1)) + *rpnt++ = ''/''; + } + *rpnt++ = ''\0''; + grub_putstr(NAME_BUF+1024);// debug print! + } + rr_flag &= ~RR_FLAG_SL; + break; +#endif + default: + break; + } + } + if (!rr_flag) + /* + * There is no more extension we expects... + */ + break; + + rr_len -= rr_ptr.rr->len; + rr_ptr.ptr += rr_ptr.rr->len; + if (rr_len < 4 && ce_ptr != NULL) + { + /* preserve name before loading new extent. */ + if( RRCONT_BUF <= (unsigned char *)name + && (unsigned char *)name < RRCONT_BUF + ISO_SECTOR_SIZE ) + { + memcpy(NAME_BUF, name, name_len); + name = NAME_BUF; + } + rr_ptr.ptr = RRCONT_BUF + ce_ptr->u.ce.offset.l; + rr_len = ce_ptr->u.ce.size.l; + if (!iso9660_devread(ffi, ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, RRCONT_BUF)) + { + errnum = 0; /* this is not fatal. */ + break; + } + ce_ptr = NULL; + } + } /* rr_len >= 4 */ + + filemax = MAXINT; + if (name_len >= pathlen + && !memcmp(name, dirname, pathlen)) + { + if (dirname[pathlen] == ''/'' || !print_possibilities) + { + /* + * DIRNAME is directory component of pathname, + * or we are to open a file. + */ + if (pathlen == name_len) + { + if (dirname[pathlen] == ''/'') + { + if (file_type != ISO_DIRECTORY) + { + errnum = ERR_BAD_FILETYPE; + return 0; + } + goto next_dir_level; + } + if (file_type != ISO_REGULAR) + { + errnum = ERR_BAD_FILETYPE; + return 0; + } + INODE->file_start = idr->extent.l; + filepos = 0; + filemax = idr->size.l; + return 1; + } + } + else /* Completion */ + { +#ifndef STAGE1_5 + if (print_possibilities > 0) + print_possibilities = -print_possibilities; + memcpy(NAME_BUF, name, name_len); + NAME_BUF[name_len] = ''\0''; + print_a_completion (NAME_BUF); +#endif + } + } + } /* for */ + + size -= ISO_SECTOR_SIZE; + } /* size>0 */ + + if (dirname[pathlen] == ''/'' || print_possibilities >= 0) + { + errnum = ERR_FILE_NOT_FOUND; + return 0; + } + + next_dir_level: + dirname += pathlen; + + } while (*dirname == ''/''); + + return 1; +} + +int +iso9660_read (fsi_file_t *ffi, char *buf, int len) +{ + int sector, blkoffset, size, ret; + + if (INODE->file_start == 0) + return 0; + + ret = 0; + blkoffset = filepos & (ISO_SECTOR_SIZE - 1); + sector = filepos >> ISO_SECTOR_BITS; + while (len > 0) + { + size = ISO_SECTOR_SIZE - blkoffset; + if (size > len) + size = len; + + disk_read_func = disk_read_hook; + + if (!iso9660_devread(ffi, INODE->file_start + sector, blkoffset, size, buf)) + return 0; + + disk_read_func = NULL; + + len -= size; + buf += size; + ret += size; + filepos += size; + sector++; + blkoffset = 0; + } + + return ret; +} + +fsi_plugin_ops_t * +fsi_init_plugin(int version, fsi_plugin_t *fp, const char **name) +{ + static fsig_plugin_ops_t ops = { + FSIMAGE_PLUGIN_VERSION, + .fpo_mount = iso9660_mount, + .fpo_dir = iso9660_dir, + .fpo_read = iso9660_read + }; + + *name = "iso9660"; + return (fsig_init(fp, &ops)); +} diff --git a/tools/libfsimage/iso9660/iso9660.h b/tools/libfsimage/iso9660/iso9660.h new file mode 100644 --- /dev/null +++ b/tools/libfsimage/iso9660/iso9660.h @@ -0,0 +1,219 @@ +/* + * ISO 9660 filesystem backend for GRUB (GRand Unified Bootloader) + * including Rock Ridge Extensions support + * + * Copyright (C) 1998, 1999 Kousuke Takai <tak@kmc.kyoto-u.ac.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* + * References: + * linux/fs/isofs/rock.[ch] + * mkisofs-1.11.1/diag/isoinfo.c + * mkisofs-1.11.1/iso9660.h + * (all are written by Eric Youngdale) + */ + +#ifndef _ISO9660_H_ +#define _ISO9660_H_ + +#define ISO_SECTOR_BITS (11) +#define ISO_SECTOR_SIZE (1<<ISO_SECTOR_BITS) + +#define ISO_REGULAR 1 /* regular file */ +#define ISO_DIRECTORY 2 /* directory */ +#define ISO_OTHER 0 /* other file (with Rock Ridge) */ + +#define RR_FLAG_PX 0x01 /* have POSIX file attributes */ +#define RR_FLAG_PN 0x02 /* POSIX devices */ +#define RR_FLAG_SL 0x04 /* Symbolic link */ +#define RR_FLAG_NM 0x08 /* have alternate file name */ +#define RR_FLAG_CL 0x10 /* Child link */ +#define RR_FLAG_PL 0x20 /* Parent link */ +#define RR_FLAG_RE 0x40 /* Relocation directory */ +#define RR_FLAG_TF 0x80 /* Timestamps */ + +/* POSIX file attributes for Rock Ridge extensions */ +#define POSIX_S_IFMT 0xF000 +#define POSIX_S_IFREG 0x8000 +#define POSIX_S_IFDIR 0x4000 + +/* volume descriptor types */ +#define ISO_VD_PRIMARY 1 +#define ISO_VD_END 255 + +#define ISO_STANDARD_ID "CD001" + +#ifndef ASM_FILE + +#ifndef __sun +#ifndef __BIT_TYPES_DEFINED__ +typedef int int8_t __attribute__((mode(QI))); +typedef unsigned int u_int8_t __attribute__((mode(QI))); +typedef int int16_t __attribute__((mode(HI))); +typedef unsigned int u_int16_t __attribute__((mode(HI))); +typedef int int32_t __attribute__((mode(SI))); +typedef unsigned int u_int32_t __attribute__((mode(SI))); +#endif +#else +#ifndef GRUB_UTIL +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif /* ! GRUB_UTIL */ +typedef unsigned char u_int8_t; +typedef unsigned short u_int16_t; +typedef unsigned int u_int32_t; +#endif /* __sun */ + +typedef union { + u_int8_t l,b; +} iso_8bit_t; + +struct __iso_16bit { + u_int16_t l, b; +} __attribute__ ((packed)); +typedef struct __iso_16bit iso_16bit_t; + +struct __iso_32bit { + u_int32_t l, b; +} __attribute__ ((packed)); +typedef struct __iso_32bit iso_32bit_t; + +typedef u_int8_t iso_date_t[7]; + +struct iso_directory_record { + iso_8bit_t length; + iso_8bit_t ext_attr_length; + iso_32bit_t extent; + iso_32bit_t size; + iso_date_t date; + iso_8bit_t flags; + iso_8bit_t file_unit_size; + iso_8bit_t interleave; + iso_16bit_t volume_seq_number; + iso_8bit_t name_len; + u_int8_t name[1]; +} __attribute__ ((packed)); + +struct iso_primary_descriptor { + iso_8bit_t type; + u_int8_t id[5]; + iso_8bit_t version; + u_int8_t _unused1[1]; + u_int8_t system_id[32]; + u_int8_t volume_id[32]; + u_int8_t _unused2[8]; + iso_32bit_t volume_space_size; + u_int8_t _unused3[32]; + iso_16bit_t volume_set_size; + iso_16bit_t volume_seq_number; + iso_16bit_t logical_block_size; + iso_32bit_t path_table_size; + u_int8_t type_l_path_table[4]; + u_int8_t opt_type_l_path_table[4]; + u_int8_t type_m_path_table[4]; + u_int8_t opt_type_m_path_table[4]; + struct iso_directory_record root_directory_record; + u_int8_t volume_set_id[128]; + u_int8_t publisher_id[128]; + u_int8_t preparer_id[128]; + u_int8_t application_id[128]; + u_int8_t copyright_file_id[37]; + u_int8_t abstract_file_id[37]; + u_int8_t bibliographic_file_id[37]; + u_int8_t creation_date[17]; + u_int8_t modification_date[17]; + u_int8_t expiration_date[17]; + u_int8_t effective_date[17]; + iso_8bit_t file_structure_version; + u_int8_t _unused4[1]; + u_int8_t application_data[512]; + u_int8_t _unused5[653]; +} __attribute__ ((packed)); + +struct rock_ridge { + u_int16_t signature; + u_int8_t len; + u_int8_t version; + union { + struct SP { + u_int16_t magic; + u_int8_t skip; + } sp; + struct CE { + iso_32bit_t extent; + iso_32bit_t offset; + iso_32bit_t size; + } ce; + struct ER { + u_int8_t len_id; + u_int8_t len_des; + u_int8_t len_src; + u_int8_t ext_ver; + u_int8_t data[0]; + } er; + struct RR { + iso_8bit_t flags; + } rr; + struct PX { + iso_32bit_t mode; + iso_32bit_t nlink; + iso_32bit_t uid; + iso_32bit_t gid; + } px; + struct PN { + iso_32bit_t dev_high; + iso_32bit_t dev_low; + } pn; + struct SL { + iso_8bit_t flags; + struct SL_component { + iso_8bit_t flags; + u_int8_t len; + u_int8_t text[0]; + } link; + } sl; + struct NM { + iso_8bit_t flags; + u_int8_t name[0]; + } nm; + struct CL { + iso_32bit_t location; + } cl; + struct PL { + iso_32bit_t location; + } pl; + struct TF { + iso_8bit_t flags; + iso_date_t times[0]; + } tf; + } u; +} __attribute__ ((packed)); + +typedef union RR_ptr { + struct rock_ridge *rr; + char *ptr; + int i; +} RR_ptr_t; + +#define RRMAGIC(c1, c2) ((c1)|(c2) << 8) + +#define CHECK2(ptr, c1, c2) \ + (*(unsigned short *)(ptr) == (((c1) | (c2) << 8) & 0xFFFF)) + +#endif /* !ASM_FILE */ + +#endif /* _ISO9660_H_ */ diff --git a/tools/libfsimage/reiserfs/fsys_reiserfs.c b/tools/libfsimage/reiserfs/fsys_reiserfs.c --- a/tools/libfsimage/reiserfs/fsys_reiserfs.c +++ b/tools/libfsimage/reiserfs/fsys_reiserfs.c @@ -363,83 +363,6 @@ struct fsys_reiser_info #define JOURNAL_START ((__u32 *) (INFO + 1)) #define JOURNAL_END ((__u32 *) (FSYS_BUF + FSYS_BUFLEN)) -#if defined(__i386__) || defined(__x86_64__) - -#ifdef __amd64 -#define BSF "bsfq" -#else -#define BSF "bsfl" -#endif -static __inline__ unsigned long -grub_log2 (unsigned long word) -{ - __asm__ (BSF " %1,%0" - : "=r" (word) - : "r" (word)); - return word; -} - -#elif defined(__ia64__) - -#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# define ia64_popcnt(x) __builtin_popcountl(x) -#else -# define ia64_popcnt(x) \ - ({ \ - __u64 ia64_intri_res; \ - asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x)); \ - ia64_intri_res; \ - }) -#endif - -static __inline__ unsigned long -grub_log2 (unsigned long word) -{ - unsigned long result; - - result = ia64_popcnt((word - 1) & ~word); - return result; -} - -#elif defined(__powerpc__) - -#ifdef __powerpc64__ -#define PPC_CNTLZL "cntlzd" -#else -#define PPC_CNTLZL "cntlzw" -#endif -#define BITS_PER_LONG (sizeof(long) * 8) - -static __inline__ int -__ilog2(unsigned long x) -{ - int lz; - - asm (PPC_CNTLZL " %0,%1" : "=r" (lz) : "r" (x)); - return BITS_PER_LONG - 1 - lz; -} - -static __inline__ unsigned long -grub_log2 (unsigned long word) -{ - return __ilog2(word & -word); -} - -#else /* Unoptimized */ - -static __inline__ unsigned long -grub_log2 (unsigned long word) -{ - unsigned long result = 0; - - while (!(word & 1UL)) - { - result++; - word >>= 1; - } - return result; -} -#endif #define log2 grub_log2 static __inline__ int _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel