diff --git a/ChangeLog b/ChangeLog index 953cf126e..ab542e2e8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,46 @@ +2009-08-28 Vladimir Serbinenko + + Split befs.mod and afs.mod into *_be.mod and *.mod + + * conf/common.rmk (grub_probe_SOURCES): Add afs_be.c and befs_be.c. + (grub_fstest_SOURCES): Likewise. + (pkglib_MODULES): Add afs_be.mod and befs_be.mod. + (afs_be_mod_SOURCES): New variable. + (afs_be_mod_CFLAGS): Likewise. + (afs_be_mod_LDFLAGS): Likewise. + (befs_be_mod_SOURCES): Likewise. + (befs_be_mod_CFLAGS): Likewise. + (befs_be_mod_LDFLAGS): Likewise. + * conf/i386-coreboot.rmk (grub_emu_SOURCES): Add afs_be.c and befs_be.c. + * conf/i386-efi.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-pc.rmk (grub_setup_SOURCES): Likewise. + (grub_emu_SOURCES): Likewise. + * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/sparc64-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/x86_64-efi.rmk (grub_emu_SOURCES): Likewise. + * fs/afs_be.c: New file. + * fs/befs_be.c: New file. + * fs/afs.c (GRUB_AFS_FSNAME_SUFFIX): New definition. + (GRUB_AFS_FSNAME): Use GRUB_AFS_FSNAME_SUFFIX. + (U16): Replaced with ... + (grub_afs_to_cpu16): ...this. All users updated. + (U32): Replaced with ... + (grub_afs_to_cpu32): ...this. All users updated. + (U64): Replaced with ... + (grub_afs_to_cpu64): ...this. All users updated. + (GRUB_AFS_BO_LITTLE_ENDIAN): Remove. + (GRUB_AFS_BO_BIG_ENDIAN): Likewise. + (grub_afs_validate_sblock): Check only one endiannness. + (GRUB_MOD_INIT (befs)) [MODE_BIGENDIAN && MODE_BFS]: Rename to .. + (GRUB_MOD_INIT (befs_be)) [MODE_BIGENDIAN && MODE_BFS]: ... this. + (GRUB_MOD_INIT (afs)) [MODE_BIGENDIAN && !MODE_BFS]: Rename to .. + (GRUB_MOD_INIT (afs_be)) [MODE_BIGENDIAN && !MODE_BFS]: ... this. + (GRUB_MOD_FINI (befs)) [MODE_BIGENDIAN && MODE_BFS]: Rename to .. + (GRUB_MOD_FINI (befs_be)) [MODE_BIGENDIAN && MODE_BFS]: ... this. + (GRUB_MOD_FINI (afs)) [MODE_BIGENDIAN && !MODE_BFS]: Rename to .. + (GRUB_MOD_FINI (afs_be)) [MODE_BIGENDIAN && !MODE_BFS]: ... this. + 2009-08-26 Bean * fs/xfs.c (GRUB_XFS_INO_INOINAG): Replace 1L with 1LL to support diff --git a/conf/common.rmk b/conf/common.rmk index 6d767460b..7727f19e8 100644 --- a/conf/common.rmk +++ b/conf/common.rmk @@ -17,7 +17,8 @@ grub_probe_SOURCES = util/grub-probe.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ + fs/befs.c fs/befs_be.c fs/tar.c \ \ partmap/msdos.c partmap/apple.c partmap/sun.c partmap/gpt.c\ kern/fs.c kern/env.c fs/fshelp.c \ @@ -38,7 +39,8 @@ grub_fstest_SOURCES = util/grub-fstest.c util/hostfs.c util/misc.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c fs/befs.c \ + fs/befs_be.c fs/tar.c \ \ kern/partition.c partmap/msdos.c partmap/apple.c partmap/sun.c \ partmap/gpt.c \ @@ -177,7 +179,7 @@ CLEANFILES += grub-dumpbios pkglib_MODULES += fshelp.mod fat.mod ufs1.mod ufs2.mod ext2.mod ntfs.mod \ ntfscomp.mod minix.mod hfs.mod jfs.mod iso9660.mod xfs.mod \ affs.mod sfs.mod hfsplus.mod reiserfs.mod cpio.mod tar.mod \ - udf.mod afs.mod befs.mod + udf.mod afs.mod afs_be.mod befs.mod befs_be.mod # For fshelp.mod. fshelp_mod_SOURCES = fs/fshelp.c @@ -279,11 +281,21 @@ afs_mod_SOURCES = fs/afs.c afs_mod_CFLAGS = $(COMMON_CFLAGS) afs_mod_LDFLAGS = $(COMMON_LDFLAGS) +# For afs_be.mod. +afs_be_mod_SOURCES = fs/afs_be.c +afs_be_mod_CFLAGS = $(COMMON_CFLAGS) +afs_be_mod_LDFLAGS = $(COMMON_LDFLAGS) + # For befs.mod. befs_mod_SOURCES = fs/befs.c befs_mod_CFLAGS = $(COMMON_CFLAGS) befs_mod_LDFLAGS = $(COMMON_LDFLAGS) +# For befs_be.mod. +befs_be_mod_SOURCES = fs/befs_be.c +befs_be_mod_CFLAGS = $(COMMON_CFLAGS) +befs_be_mod_LDFLAGS = $(COMMON_LDFLAGS) + # Partition maps. pkglib_MODULES += part_amiga.mod diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk index 196abe68b..990ba805d 100644 --- a/conf/i386-coreboot.rmk +++ b/conf/i386-coreboot.rmk @@ -117,7 +117,8 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ + fs/befs.c fs/befs_be.c fs/tar.c \ \ fs/fshelp.c \ io/gzio.c \ diff --git a/conf/i386-efi.rmk b/conf/i386-efi.rmk index f1e5e8fe3..b470a7687 100644 --- a/conf/i386-efi.rmk +++ b/conf/i386-efi.rmk @@ -45,7 +45,8 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ + fs/befs.c fs/befs_be.c fs/tar.c \ \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ diff --git a/conf/i386-ieee1275.rmk b/conf/i386-ieee1275.rmk index 67234ebb6..989f1bc61 100644 --- a/conf/i386-ieee1275.rmk +++ b/conf/i386-ieee1275.rmk @@ -72,7 +72,8 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c fs/befs.c \ + fs/befs_be.c fs/tar.c \ \ fs/fshelp.c \ io/gzio.c \ diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index 6b177963e..d415aed32 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -102,7 +102,8 @@ grub_setup_SOURCES = util/i386/pc/grub-setup.c util/hostdisk.c \ fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ + fs/befs.c fs/befs_be.c fs/tar.c \ \ partmap/msdos.c partmap/gpt.c \ \ @@ -147,7 +148,8 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ + fs/befs.c fs/befs_be.c fs/tar.c \ \ util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ util/hostdisk.c util/getroot.c \ diff --git a/conf/powerpc-ieee1275.rmk b/conf/powerpc-ieee1275.rmk index c9b7e7592..0c6650dfd 100644 --- a/conf/powerpc-ieee1275.rmk +++ b/conf/powerpc-ieee1275.rmk @@ -52,7 +52,8 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ + fs/befs.c fs/befs_be.c fs/tar.c \ \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ diff --git a/conf/sparc64-ieee1275.rmk b/conf/sparc64-ieee1275.rmk index 621621399..7851fd64a 100644 --- a/conf/sparc64-ieee1275.rmk +++ b/conf/sparc64-ieee1275.rmk @@ -78,7 +78,8 @@ grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c util/hostdisk.c \ fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ + fs/befs.c fs/befs_be.c fs/tar.c \ \ partmap/amiga.c partmap/apple.c partmap/msdos.c \ partmap/sun.c partmap/acorn.c \ @@ -109,7 +110,8 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ + fs/befs.c fs/befs_be.c fs/tar.c \ \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ diff --git a/conf/x86_64-efi.rmk b/conf/x86_64-efi.rmk index b4c08b093..0defdcd93 100644 --- a/conf/x86_64-efi.rmk +++ b/conf/x86_64-efi.rmk @@ -43,7 +43,7 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ diff --git a/fs/afs.c b/fs/afs.c index 971c8bd2e..cd61f4db9 100644 --- a/fs/afs.c +++ b/fs/afs.c @@ -26,10 +26,16 @@ #include #include -#ifdef MODE_BFS -#define GRUB_AFS_FSNAME "befs" +#ifdef MODE_BIGENDIAN +#define GRUB_AFS_FSNAME_SUFFIX "_be" #else -#define GRUB_AFS_FSNAME "afs" +#define GRUB_AFS_FSNAME_SUFFIX "" +#endif + +#ifdef MODE_BFS +#define GRUB_AFS_FSNAME "befs" GRUB_AFS_FSNAME_SUFFIX +#else +#define GRUB_AFS_FSNAME "afs" GRUB_AFS_FSNAME_SUFFIX #endif #define GRUB_AFS_DIRECT_BLOCK_COUNT 12 @@ -65,14 +71,15 @@ #define GRUB_AFS_NULL_VAL ((grub_afs_bvalue_t)-1) -#define U16(sb, u) (((sb)->byte_order == GRUB_AFS_BO_LITTLE_ENDIAN) ? \ - grub_le_to_cpu16 (u) : grub_be_to_cpu16 (u)) - -#define U32(sb, u) (((sb)->byte_order == GRUB_AFS_BO_LITTLE_ENDIAN) ? \ - grub_le_to_cpu32 (u) : grub_be_to_cpu32 (u)) - -#define U64(sb, u) (((sb)->byte_order == GRUB_AFS_BO_LITTLE_ENDIAN) ? \ - grub_le_to_cpu64 (u) : grub_be_to_cpu64 (u)) +#ifdef MODE_BIGENDIAN +#define grub_afs_to_cpu16(x) grub_be_to_cpu16 (x) +#define grub_afs_to_cpu32(x) grub_be_to_cpu32 (x) +#define grub_afs_to_cpu64(x) grub_be_to_cpu64 (x) +#else +#define grub_afs_to_cpu16(x) grub_le_to_cpu16 (x) +#define grub_afs_to_cpu32(x) grub_le_to_cpu32 (x) +#define grub_afs_to_cpu64(x) grub_le_to_cpu64 (x) +#endif #ifdef MODE_BFS #define B_KEY_INDEX_ALIGN 8 @@ -90,12 +97,6 @@ ((char *) B_KEY_INDEX_OFFSET (node) + \ node->key_count * 2)) -enum -{ - GRUB_AFS_BO_LITTLE_ENDIAN, - GRUB_AFS_BO_BIG_ENDIAN -}; - typedef grub_uint64_t grub_afs_off_t; typedef grub_uint64_t grub_afs_bigtime; typedef grub_uint64_t grub_afs_bvalue_t; @@ -154,6 +155,9 @@ struct grub_afs_btree } __attribute__ ((packed)); #endif +/* Beware that following structure describes AtheFS and if you write code + which uses currently unused fields check it with both AtheFS and BeFS. + */ struct grub_afs_sblock { char name[32]; @@ -227,8 +231,8 @@ static grub_afs_off_t grub_afs_run_to_num (struct grub_afs_sblock *sb, struct grub_afs_blockrun *run) { - return ((grub_afs_off_t) U32 (sb, run->group) * sb->block_per_group + - U16 (sb, run->start)); + return ((grub_afs_off_t) grub_afs_to_cpu32 (run->group) + * sb->block_per_group + grub_afs_to_cpu16 (run->start)); } static grub_err_t @@ -248,25 +252,25 @@ grub_afs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) struct grub_afs_sblock *sb = &node->data->sblock; struct grub_afs_datastream *ds = &node->inode.stream; - if (fileblock < U64 (sb, ds->max_direct_range)) + if (fileblock < grub_afs_to_cpu64 (ds->max_direct_range)) { int i; for (i = 0; i < GRUB_AFS_DIRECT_BLOCK_COUNT; i++) { - if (fileblock < U16 (sb, ds->direct[i].len)) + if (fileblock < grub_afs_to_cpu16 (ds->direct[i].len)) return grub_afs_run_to_num (sb, &ds->direct[i]) + fileblock; - fileblock -= U16 (sb, ds->direct[i].len); + fileblock -= grub_afs_to_cpu16 (ds->direct[i].len); } } - else if (fileblock < U64 (sb, ds->max_indirect_range)) + else if (fileblock < grub_afs_to_cpu64 (ds->max_indirect_range)) { int ptrs_per_blk = sb->block_size / sizeof (struct grub_afs_blockrun); struct grub_afs_blockrun indir[ptrs_per_blk]; grub_afs_off_t blk = grub_afs_run_to_num (sb, &ds->indirect); int i; - fileblock -= U64 (sb, ds->max_direct_range); + fileblock -= grub_afs_to_cpu64 (ds->max_direct_range); for (i = 0; i < ds->indirect.len; i++, blk++) { int j; @@ -279,10 +283,10 @@ grub_afs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) for (j = 0; j < ptrs_per_blk; j++) { - if (fileblock < U16 (sb, indir[j].len)) + if (fileblock < grub_afs_to_cpu16 (indir[j].len)) return grub_afs_run_to_num (sb, &indir[j]) + fileblock; - fileblock -= U16 (sb, indir[j].len); + fileblock -= grub_afs_to_cpu16 (indir[j].len); } } } @@ -292,7 +296,7 @@ grub_afs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) struct grub_afs_blockrun indir[ptrs_per_blk]; /* ([idblk][idptr]) ([dblk][dptr]) [blk] */ - int cur_pos = fileblock - U64 (sb, ds->max_indirect_range); + int cur_pos = fileblock - grub_afs_to_cpu64 (ds->max_indirect_range); int dptr_size = GRUB_AFS_BLOCKS_PER_DI_RUN; int dblk_size = dptr_size * ptrs_per_blk; @@ -334,8 +338,7 @@ grub_afs_read_file (grub_fshelp_node_t node, { return grub_fshelp_read_file (node->data->disk, node, read_hook, pos, len, buf, grub_afs_read_block, - U64 (&node->data->sblock, - node->inode.stream.size), + grub_afs_to_cpu64 (node->inode.stream.size), node->data->sblock.block_shift - GRUB_DISK_SECTOR_BITS); } @@ -344,8 +347,7 @@ static char * grub_afs_read_symlink (grub_fshelp_node_t node) { char *ret; - struct grub_afs_sblock *sb = &node->data->sblock; - grub_afs_off_t size = U64 (sb, node->inode.stream.size); + grub_afs_off_t size = grub_afs_to_cpu64 (node->inode.stream.size); if (size == 0) { @@ -374,27 +376,27 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, struct grub_afs_btree head; char node_data [GRUB_AFS_BNODE_SIZE]; struct grub_afs_bnode *node = (struct grub_afs_bnode *) node_data; - struct grub_afs_sblock *sb = &dir->data->sblock; int i; if ((dir->inode.stream.size == 0) - || ((U32 (sb, dir->inode.mode) & GRUB_AFS_S_IFMT) != GRUB_AFS_S_IFDIR)) + || ((grub_afs_to_cpu32 (dir->inode.mode) & GRUB_AFS_S_IFMT) + != GRUB_AFS_S_IFDIR)) return 0; grub_afs_read_file (dir, 0, 0, sizeof (head), (char *) &head); if (grub_errno) return 0; - grub_afs_read_file (dir, 0, U64 (sb, head.root), + grub_afs_read_file (dir, 0, grub_afs_to_cpu64 (head.root), GRUB_AFS_BNODE_SIZE, (char *) node); if (grub_errno) return 0; - for (i = 0; i < (int) U32 (sb, head.tree_depth) - 1; i++) + for (i = 0; i < (int) grub_afs_to_cpu32 (head.tree_depth) - 1; i++) { grub_afs_bvalue_t blk; - blk = U64(sb, B_KEY_VALUE_OFFSET (node) [0]); + blk = grub_afs_to_cpu64(B_KEY_VALUE_OFFSET (node) [0]); grub_afs_read_file (dir, 0, blk, GRUB_AFS_BNODE_SIZE, (char *) node); if (grub_errno) return 0; @@ -411,8 +413,9 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, index = B_KEY_INDEX_OFFSET (node); - key_start = U16 (sb, (cur_key > 0) ? index[cur_key - 1] : 0); - key_size = U16 (sb, index[cur_key]) - key_start; + key_start = (cur_key > 0) + ? grub_afs_to_cpu16 (index[cur_key - 1]) : 0; + key_size = grub_afs_to_cpu16 (index[cur_key]) - key_start; if (key_size > 0) { char filename [key_size + 1]; @@ -425,14 +428,15 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, fdiro->data = dir->data; if (grub_afs_read_inode (dir->data, - U64 (sb, B_KEY_VALUE_OFFSET (node) [cur_key]), + grub_afs_to_cpu64 + (B_KEY_VALUE_OFFSET (node) [cur_key]), &fdiro->inode)) return 0; grub_memcpy (filename, &node->key_data[key_start], key_size); filename [key_size] = 0; - mode = (U32 (sb, fdiro->inode.mode) & GRUB_AFS_S_IFMT); + mode = (grub_afs_to_cpu32 (fdiro->inode.mode) & GRUB_AFS_S_IFMT); if (mode == GRUB_AFS_S_IFDIR) type = GRUB_FSHELP_DIR; else if (mode == GRUB_AFS_S_IFREG) @@ -447,12 +451,12 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, } cur_key++; - if (cur_key >= U32 (sb, node->key_count)) + if (cur_key >= grub_afs_to_cpu32 (node->key_count)) { if (node->right == GRUB_AFS_NULL_VAL) break; - grub_afs_read_file (dir, 0, U64 (sb, node->right), + grub_afs_read_file (dir, 0, grub_afs_to_cpu64 (node->right), GRUB_AFS_BNODE_SIZE, (char *) node); if (grub_errno) return 0; @@ -468,47 +472,20 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, static int grub_afs_validate_sblock (struct grub_afs_sblock *sb) { - if (grub_le_to_cpu32 (sb->magic1) == GRUB_AFS_SBLOCK_MAGIC1) + if (grub_afs_to_cpu32 (sb->magic1) == GRUB_AFS_SBLOCK_MAGIC1) { -#ifndef MODE_BFS - if (grub_le_to_cpu32 (sb->byte_order) != GRUB_AFS_BO_LITTLE_ENDIAN) - return 0; -#endif - - sb->byte_order = GRUB_AFS_BO_LITTLE_ENDIAN; - sb->magic2 = grub_le_to_cpu32 (sb->magic2); - sb->magic3 = grub_le_to_cpu32 (sb->magic3); - sb->block_shift = grub_le_to_cpu32 (sb->block_shift); - sb->block_size = grub_le_to_cpu32 (sb->block_size); - sb->used_blocks = grub_le_to_cpu64 (sb->used_blocks); - sb->num_blocks = grub_le_to_cpu64 (sb->num_blocks); - sb->inode_size = grub_le_to_cpu32 (sb->inode_size); - sb->alloc_group_count = grub_le_to_cpu32 (sb->alloc_group_count); - sb->alloc_group_shift = grub_le_to_cpu32 (sb->alloc_group_shift); - sb->block_per_group = grub_le_to_cpu32 (sb->block_per_group); - sb->alloc_group_count = grub_le_to_cpu32 (sb->alloc_group_count); - sb->log_size = grub_le_to_cpu32 (sb->log_size); - } - else if (grub_be_to_cpu32 (sb->magic1) == GRUB_AFS_SBLOCK_MAGIC1) - { -#ifndef MODE_BFS - if (grub_be_to_cpu32 (sb->byte_order) != GRUB_AFS_BO_BIG_ENDIAN) - return 0; -#endif - - sb->byte_order = GRUB_AFS_BO_BIG_ENDIAN; - sb->magic2 = grub_be_to_cpu32 (sb->magic2); - sb->magic3 = grub_be_to_cpu32 (sb->magic3); - sb->block_shift = grub_be_to_cpu32 (sb->block_shift); - sb->block_size = grub_be_to_cpu32 (sb->block_size); - sb->used_blocks = grub_be_to_cpu64 (sb->used_blocks); - sb->num_blocks = grub_be_to_cpu64 (sb->num_blocks); - sb->inode_size = grub_be_to_cpu32 (sb->inode_size); - sb->alloc_group_count = grub_be_to_cpu32 (sb->alloc_group_count); - sb->alloc_group_shift = grub_be_to_cpu32 (sb->alloc_group_shift); - sb->block_per_group = grub_be_to_cpu32 (sb->block_per_group); - sb->alloc_group_count = grub_be_to_cpu32 (sb->alloc_group_count); - sb->log_size = grub_be_to_cpu32 (sb->log_size); + sb->magic2 = grub_afs_to_cpu32 (sb->magic2); + sb->magic3 = grub_afs_to_cpu32 (sb->magic3); + sb->block_shift = grub_afs_to_cpu32 (sb->block_shift); + sb->block_size = grub_afs_to_cpu32 (sb->block_size); + sb->used_blocks = grub_afs_to_cpu64 (sb->used_blocks); + sb->num_blocks = grub_afs_to_cpu64 (sb->num_blocks); + sb->inode_size = grub_afs_to_cpu32 (sb->inode_size); + sb->alloc_group_count = grub_afs_to_cpu32 (sb->alloc_group_count); + sb->alloc_group_shift = grub_afs_to_cpu32 (sb->alloc_group_shift); + sb->block_per_group = grub_afs_to_cpu32 (sb->block_per_group); + sb->alloc_group_count = grub_afs_to_cpu32 (sb->alloc_group_count); + sb->log_size = grub_afs_to_cpu32 (sb->log_size); } else return 0; @@ -529,8 +506,8 @@ grub_afs_validate_sblock (struct grub_afs_sblock *sb) || ((grub_uint32_t) (1 << sb->alloc_group_shift) != sb->block_per_group * sb->block_size) || (sb->alloc_group_count * sb->block_per_group < sb->num_blocks) - || (U16 (sb, sb->log_block.len) != sb->log_size) - || (U32 (sb, sb->valid_log_blocks) > sb->log_size) + || (grub_afs_to_cpu16 (sb->log_block.len) != sb->log_size) + || (grub_afs_to_cpu32 (sb->valid_log_blocks) > sb->log_size) #endif ) return 0; @@ -594,7 +571,7 @@ grub_afs_open (struct grub_file *file, const char *name) grub_memcpy (data->inode, &fdiro->inode, sizeof (struct grub_afs_inode)); grub_free (fdiro); - file->size = U64 (&data->sblock, data->inode->stream.size); + file->size = grub_afs_to_cpu64 (data->inode->stream.size); file->data = data; file->offset = 0; @@ -648,10 +625,10 @@ grub_afs_dir (grub_device_t device, const char *path, info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR); info.mtimeset = 1; #ifdef MODE_BFS - info.mtime = U64 (&data->sblock, node->inode.modified_time) >> 16; + info.mtime = grub_afs_to_cpu64 (node->inode.modified_time) >> 16; #else - info.mtime = grub_divmod64 (U64 (&data->sblock, - node->inode.modified_time), 1000000, 0); + info.mtime = grub_divmod64 (grub_afs_to_cpu64 (node->inode.modified_time), + 1000000, 0); #endif grub_free (node); return hook (filename, &info); @@ -713,8 +690,12 @@ static struct grub_fs grub_afs_fs = { .next = 0 }; -#ifdef MODE_BFS +#if defined (MODE_BIGENDIAN) && defined (MODE_BFS) +GRUB_MOD_INIT (befs_be) +#elif defined (MODE_BFS) GRUB_MOD_INIT (befs) +#elif defined (MODE_BIGENDIAN) +GRUB_MOD_INIT (afs_be) #else GRUB_MOD_INIT (afs) #endif @@ -723,8 +704,12 @@ GRUB_MOD_INIT (afs) my_mod = mod; } -#ifdef MODE_BFS +#if defined (MODE_BIGENDIAN) && defined (MODE_BFS) +GRUB_MOD_FINI (befs_be) +#elif defined (MODE_BFS) GRUB_MOD_FINI (befs) +#elif defined (MODE_BIGENDIAN) +GRUB_MOD_FINI (afs_be) #else GRUB_MOD_FINI (afs) #endif diff --git a/fs/afs_be.c b/fs/afs_be.c new file mode 100644 index 000000000..1f1f48fbb --- /dev/null +++ b/fs/afs_be.c @@ -0,0 +1,2 @@ +#define MODE_BIGENDIAN 1 +#include "afs.c" diff --git a/fs/befs_be.c b/fs/befs_be.c new file mode 100644 index 000000000..f6e8179f4 --- /dev/null +++ b/fs/befs_be.c @@ -0,0 +1,4 @@ +/* befs.c - The native BeOS/Haiku file-system. */ +#define MODE_BFS 1 +#define MODE_BIGENDIAN 1 +#include "afs.c"