All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Split big and little endian BeFS and AtheFS
@ 2009-08-14 20:53 Vladimir 'phcoder' Serbinenko
  2009-08-14 22:00 ` Pavel Roskin
  0 siblings, 1 reply; 9+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-08-14 20:53 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 534 bytes --]

Hello. Currently afs and befs modules handle both big and little
endian variants. Here is a patch to split into 2 modules.
Unfortunately I wasn't able to find easily-available big-endian images
to test but it shouldn't be a huge problem since we currently don't
boot corresponding OS on big-endian machines.
24643 coreafsbe.img
24423 coreafsle.img
25168 coreafs.img
24548 corebefsbe.img
24353 corebefsle.img
25039 corebefs.img

-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git

[-- Attachment #2: fsendian.diff --]
[-- Type: text/plain, Size: 20781 bytes --]

diff --git a/conf/common.rmk b/conf/common.rmk
index b0d3785..99df017 100644
--- a/conf/common.rmk
+++ b/conf/common.rmk
@@ -17,7 +17,7 @@ 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/pc.c partmap/apple.c partmap/sun.c partmap/gpt.c\
 	kern/fs.c kern/env.c fs/fshelp.c			\
@@ -38,7 +38,7 @@ 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/pc.c partmap/apple.c partmap/sun.c	\
 	partmap/gpt.c							\
@@ -177,7 +177,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 +279,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 += amiga.mod apple.mod pc.mod sun.mod acorn.mod gpt.mod
 
diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk
index ce2576b..178ccdd 100644
--- a/conf/i386-coreboot.rmk
+++ b/conf/i386-coreboot.rmk
@@ -116,7 +116,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/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 6e3cbcf..16bc835 100644
--- a/conf/i386-efi.rmk
+++ b/conf/i386-efi.rmk
@@ -44,7 +44,7 @@ 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 65d1c6b..9a76e49 100644
--- a/conf/i386-ieee1275.rmk
+++ b/conf/i386-ieee1275.rmk
@@ -71,7 +71,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/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 0ef5e47..7ccfc33 100644
--- a/conf/i386-pc.rmk
+++ b/conf/i386-pc.rmk
@@ -102,7 +102,7 @@ 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/pc.c partmap/gpt.c				\
 	\
@@ -146,7 +146,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/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 c30f61a..415e8b3 100644
--- a/conf/powerpc-ieee1275.rmk
+++ b/conf/powerpc-ieee1275.rmk
@@ -51,7 +51,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/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 b26496d..65035e5 100644
--- a/conf/sparc64-ieee1275.rmk
+++ b/conf/sparc64-ieee1275.rmk
@@ -78,7 +78,7 @@ 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/pc.c		\
 	partmap/sun.c partmap/acorn.c				\
@@ -108,7 +108,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/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 71a90ce..77cad94 100644
--- a/conf/x86_64-efi.rmk
+++ b/conf/x86_64-efi.rmk
@@ -42,7 +42,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 971c8bd..be36af9 100644
--- a/fs/afs.c
+++ b/fs/afs.c
@@ -26,10 +26,16 @@
 #include <grub/types.h>
 #include <grub/fshelp.h>
 
+#ifdef MODE_BIGENDIAN
+#define GRUB_AFS_FSNAME_SUFFIX "_be"
+#else
+#define GRUB_AFS_FSNAME_SUFFIX ""
+#endif
+
 #ifdef MODE_BFS
-#define GRUB_AFS_FSNAME "befs"
+#define GRUB_AFS_FSNAME "befs" GRUB_AFS_FSNAME_SUFFIX
 #else
-#define GRUB_AFS_FSNAME "afs"
+#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 U16(u) grub_be_to_cpu16 (u)
+#define U32(u) grub_be_to_cpu32 (u)
+#define U64(u) grub_be_to_cpu64 (u)
+#else
+#define U16(u) grub_le_to_cpu16 (u)
+#define U32(u) grub_le_to_cpu32 (u)
+#define U64(u) grub_le_to_cpu64 (u)
+#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;
@@ -158,7 +159,7 @@ struct grub_afs_sblock
 {
   char name[32];
   grub_uint32_t magic1;
-  grub_uint32_t byte_order;
+  grub_uint32_t unused;
   grub_uint32_t	block_size;
   grub_uint32_t block_shift;
   grub_afs_off_t num_blocks;
@@ -227,8 +228,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) U32 (run->group) * sb->block_per_group +
+          U16 (run->start));
 }
 
 static grub_err_t
@@ -248,25 +249,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 < U64 (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 < U16 (ds->direct[i].len))
             return grub_afs_run_to_num (sb, &ds->direct[i]) + fileblock;
-          fileblock -= U16 (sb, ds->direct[i].len);
+          fileblock -= U16 (ds->direct[i].len);
         }
     }
-  else if (fileblock < U64 (sb, ds->max_indirect_range))
+  else if (fileblock < U64 (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 -= U64 (ds->max_direct_range);
       for (i = 0; i < ds->indirect.len; i++, blk++)
         {
           int j;
@@ -279,10 +280,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 < U16 (indir[j].len))
                 return grub_afs_run_to_num (sb, &indir[j]) + fileblock;
 
-              fileblock -= U16 (sb, indir[j].len);
+              fileblock -= U16 (indir[j].len);
             }
         }
     }
@@ -292,7 +293,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 - U64 (ds->max_indirect_range);
 
       int dptr_size = GRUB_AFS_BLOCKS_PER_DI_RUN;
       int dblk_size = dptr_size * ptrs_per_blk;
@@ -334,8 +335,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),
+                                U64 (node->inode.stream.size),
 				node->data->sblock.block_shift
                                 - GRUB_DISK_SECTOR_BITS);
 }
@@ -344,8 +344,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 = U64 (node->inode.stream.size);
 
   if (size == 0)
     {
@@ -374,27 +373,26 @@ 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))
+      || ((U32 (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, U64 (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) U32 (head.tree_depth) - 1; i++)
     {
       grub_afs_bvalue_t blk;
 
-      blk = U64(sb, B_KEY_VALUE_OFFSET (node) [0]);
+      blk = U64(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 +409,8 @@ 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 = U16 ((cur_key > 0) ? index[cur_key - 1] : 0);
+          key_size = U16 (index[cur_key]) - key_start;
           if (key_size > 0)
             {
               char filename [key_size + 1];
@@ -425,14 +423,14 @@ 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]),
+                                       U64 (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 = (U32 (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 +445,12 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir,
             }
 
           cur_key++;
-          if (cur_key >= U32 (sb, node->key_count))
+          if (cur_key >= U32 (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, U64 (node->right),
                                   GRUB_AFS_BNODE_SIZE, (char *) node);
               if (grub_errno)
                 return 0;
@@ -468,47 +466,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 (U32 (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 = U32 (sb->magic2);
+      sb->magic3 = U32 (sb->magic3);
+      sb->block_shift = U32 (sb->block_shift);
+      sb->block_size = U32 (sb->block_size);
+      sb->used_blocks = U64 (sb->used_blocks);
+      sb->num_blocks = U64 (sb->num_blocks);
+      sb->inode_size = U32 (sb->inode_size);
+      sb->alloc_group_count = U32 (sb->alloc_group_count);
+      sb->alloc_group_shift = U32 (sb->alloc_group_shift);
+      sb->block_per_group = U32 (sb->block_per_group);
+      sb->alloc_group_count = U32 (sb->alloc_group_count);
+      sb->log_size = U32 (sb->log_size);
     }
   else
     return 0;
@@ -529,8 +500,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)
+      || (U16 (sb->log_block.len) != sb->log_size)
+      || (U32 (sb->valid_log_blocks) > sb->log_size)
 #endif
       )
     return 0;
@@ -594,7 +565,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 = U64 (data->inode->stream.size);
   file->data = data;
   file->offset = 0;
 
@@ -648,10 +619,9 @@ 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 = U64 (node->inode.modified_time) >> 16;
 #else
-      info.mtime = grub_divmod64 (U64 (&data->sblock,
-				       node->inode.modified_time), 1000000, 0);
+      info.mtime = grub_divmod64 (U64 (node->inode.modified_time), 1000000, 0);
 #endif
       grub_free (node);
       return hook (filename, &info);
@@ -713,8 +683,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 +697,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 0000000..1f1f48f
--- /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 0000000..f6e8179
--- /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"

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] Split big and little endian BeFS and AtheFS
  2009-08-14 20:53 [PATCH] Split big and little endian BeFS and AtheFS Vladimir 'phcoder' Serbinenko
@ 2009-08-14 22:00 ` Pavel Roskin
  2009-08-19 10:05   ` Vladimir 'phcoder' Serbinenko
  0 siblings, 1 reply; 9+ messages in thread
From: Pavel Roskin @ 2009-08-14 22:00 UTC (permalink / raw)
  To: The development of GRUB 2

On Fri, 2009-08-14 at 22:53 +0200, Vladimir 'phcoder' Serbinenko wrote:
> Hello. Currently afs and befs modules handle both big and little
> endian variants. Here is a patch to split into 2 modules.
> Unfortunately I wasn't able to find easily-available big-endian images
> to test but it shouldn't be a huge problem since we currently don't
> boot corresponding OS on big-endian machines.
> 24643 coreafsbe.img
> 24423 coreafsle.img
> 25168 coreafs.img
> 24548 corebefsbe.img
> 24353 corebefsle.img
> 25039 corebefs.img

I'm fine with the split, but please use something more descriptive than
U16, U32 and U64.  Maybe fs_to_cpu16() etc.

-- 
Regards,
Pavel Roskin



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Split big and little endian BeFS and AtheFS
  2009-08-14 22:00 ` Pavel Roskin
@ 2009-08-19 10:05   ` Vladimir 'phcoder' Serbinenko
  2009-08-20 22:16     ` Pavel Roskin
  0 siblings, 1 reply; 9+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-08-19 10:05 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 1109 bytes --]

On Sat, Aug 15, 2009 at 12:00 AM, Pavel Roskin<proski@gnu.org> wrote:
> On Fri, 2009-08-14 at 22:53 +0200, Vladimir 'phcoder' Serbinenko wrote:
>> Hello. Currently afs and befs modules handle both big and little
>> endian variants. Here is a patch to split into 2 modules.
>> Unfortunately I wasn't able to find easily-available big-endian images
>> to test but it shouldn't be a huge problem since we currently don't
>> boot corresponding OS on big-endian machines.
>> 24643 coreafsbe.img
>> 24423 coreafsle.img
>> 25168 coreafs.img
>> 24548 corebefsbe.img
>> 24353 corebefsle.img
>> 25039 corebefs.img
>
> I'm fine with the split, but please use something more descriptive than
> U16, U32 and U64.  Maybe fs_to_cpu16() etc.
>
U* was here before me but here is a patch w/o them
> --
> Regards,
> Pavel Roskin
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>



-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git

[-- Attachment #2: fsendian.diff --]
[-- Type: text/plain, Size: 21399 bytes --]

diff --git a/conf/common.rmk b/conf/common.rmk
index b0d3785..99df017 100644
--- a/conf/common.rmk
+++ b/conf/common.rmk
@@ -17,7 +17,7 @@ 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/pc.c partmap/apple.c partmap/sun.c partmap/gpt.c\
 	kern/fs.c kern/env.c fs/fshelp.c			\
@@ -38,7 +38,7 @@ 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/pc.c partmap/apple.c partmap/sun.c	\
 	partmap/gpt.c							\
@@ -177,7 +177,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 +279,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 += amiga.mod apple.mod pc.mod sun.mod acorn.mod gpt.mod
 
diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk
index ce2576b..178ccdd 100644
--- a/conf/i386-coreboot.rmk
+++ b/conf/i386-coreboot.rmk
@@ -116,7 +116,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/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 6e3cbcf..16bc835 100644
--- a/conf/i386-efi.rmk
+++ b/conf/i386-efi.rmk
@@ -44,7 +44,7 @@ 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 65d1c6b..9a76e49 100644
--- a/conf/i386-ieee1275.rmk
+++ b/conf/i386-ieee1275.rmk
@@ -71,7 +71,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/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 0ef5e47..7ccfc33 100644
--- a/conf/i386-pc.rmk
+++ b/conf/i386-pc.rmk
@@ -102,7 +102,7 @@ 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/pc.c partmap/gpt.c				\
 	\
@@ -146,7 +146,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/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 c30f61a..415e8b3 100644
--- a/conf/powerpc-ieee1275.rmk
+++ b/conf/powerpc-ieee1275.rmk
@@ -51,7 +51,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/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 b26496d..65035e5 100644
--- a/conf/sparc64-ieee1275.rmk
+++ b/conf/sparc64-ieee1275.rmk
@@ -78,7 +78,7 @@ 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/pc.c		\
 	partmap/sun.c partmap/acorn.c				\
@@ -108,7 +108,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/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 71a90ce..77cad94 100644
--- a/conf/x86_64-efi.rmk
+++ b/conf/x86_64-efi.rmk
@@ -42,7 +42,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 971c8bd..163c715 100644
--- a/fs/afs.c
+++ b/fs/afs.c
@@ -26,10 +26,16 @@
 #include <grub/types.h>
 #include <grub/fshelp.h>
 
+#ifdef MODE_BIGENDIAN
+#define GRUB_AFS_FSNAME_SUFFIX "_be"
+#else
+#define GRUB_AFS_FSNAME_SUFFIX ""
+#endif
+
 #ifdef MODE_BFS
-#define GRUB_AFS_FSNAME "befs"
+#define GRUB_AFS_FSNAME "befs" GRUB_AFS_FSNAME_SUFFIX
 #else
-#define GRUB_AFS_FSNAME "afs"
+#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 grub_be_to_cpu16
+#define grub_afs_to_cpu32 grub_be_to_cpu32
+#define grub_afs_to_cpu64 grub_be_to_cpu64
+#else
+#define grub_afs_to_cpu16 grub_le_to_cpu16
+#define grub_afs_to_cpu32 grub_le_to_cpu32
+#define grub_afs_to_cpu64 grub_le_to_cpu64
+#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;
@@ -158,7 +159,7 @@ struct grub_afs_sblock
 {
   char name[32];
   grub_uint32_t magic1;
-  grub_uint32_t byte_order;
+  grub_uint32_t unused;
   grub_uint32_t	block_size;
   grub_uint32_t block_shift;
   grub_afs_off_t num_blocks;
@@ -227,8 +228,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 +249,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 +280,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 +293,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 +335,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 +344,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 +373,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 +410,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 +425,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 +448,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 +469,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 +503,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 +568,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 +622,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 +687,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 +701,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 0000000..1f1f48f
--- /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 0000000..f6e8179
--- /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"

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] Split big and little endian BeFS and AtheFS
  2009-08-19 10:05   ` Vladimir 'phcoder' Serbinenko
@ 2009-08-20 22:16     ` Pavel Roskin
  2009-08-20 22:47       ` Vladimir 'phcoder' Serbinenko
  2009-08-23 10:40       ` Robert Millan
  0 siblings, 2 replies; 9+ messages in thread
From: Pavel Roskin @ 2009-08-20 22:16 UTC (permalink / raw)
  To: The development of GRUB 2

On Wed, 2009-08-19 at 12:05 +0200, Vladimir 'phcoder' Serbinenko wrote:

> > I'm fine with the split, but please use something more descriptive than
> > U16, U32 and U64.  Maybe fs_to_cpu16() etc.
> >
> U* was here before me but here is a patch w/o them

Sorry, I didn't realize that.  Then maybe it would be better to apply
that part separately after the split.

Please define macros with arguments.  It makes the code more readable.

Please don't introduce excessively long lines in *.rmk files.  Newlines
are cheap :-)

I don't think we should rename "byte_order" to "unused".  Just because
we doesn't use it now to determine the endianess, it doesn't mean that
the field becomes meaningless.  We may want to check it in the future.

There are other fields in the superblock that we don't use, such as
"flags", yet we don't rename them to "unusedN".

Apart from that, I'm fine with the patch.

-- 
Regards,
Pavel Roskin



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Split big and little endian BeFS and AtheFS
  2009-08-20 22:16     ` Pavel Roskin
@ 2009-08-20 22:47       ` Vladimir 'phcoder' Serbinenko
  2009-08-23 10:40       ` Robert Millan
  1 sibling, 0 replies; 9+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-08-20 22:47 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 1822 bytes --]

On Fri, Aug 21, 2009 at 12:16 AM, Pavel Roskin<proski@gnu.org> wrote:
> On Wed, 2009-08-19 at 12:05 +0200, Vladimir 'phcoder' Serbinenko wrote:
>
>> > I'm fine with the split, but please use something more descriptive than
>> > U16, U32 and U64.  Maybe fs_to_cpu16() etc.
>> >
>> U* was here before me but here is a patch w/o them
>
> Sorry, I didn't realize that.  Then maybe it would be better to apply
> that part separately after the split.
Well it will make a new series of hunks go through the same lines. It
would change U32(x,y)->U32(y)-> grub_afs_to_cpu32. I prefer the
shortcut.
>
> Please define macros with arguments.  It makes the code more readable.
>
> Please don't introduce excessively long lines in *.rmk files.  Newlines
> are cheap :-)
I used sed to add new files due to excessive duplication in our build system.
>
> I don't think we should rename "byte_order" to "unused".  Just because
> we doesn't use it now to determine the endianess, it doesn't mean that
> the field becomes meaningless.  We may want to check it in the future.
>
Ok. Even if getting reading this field right is tricky (it's used
somewhat strangely and differently on AtheFS and BeFS).
> There are other fields in the superblock that we don't use, such as
> "flags", yet we don't rename them to "unusedN".
>
Actually some of these fields (e.g. log handling) may even be
different on BeFS and AtheFS but I'm ok with keeping current names.
> Apart from that, I'm fine with the patch.
>
> --
> Regards,
> Pavel Roskin
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>



-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git

[-- Attachment #2: fsendian.diff --]
[-- Type: text/plain, Size: 21536 bytes --]

diff --git a/conf/common.rmk b/conf/common.rmk
index b0d3785..cbe913b 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/pc.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/pc.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 += amiga.mod apple.mod pc.mod sun.mod acorn.mod gpt.mod
 
diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk
index ce2576b..32377a4 100644
--- a/conf/i386-coreboot.rmk
+++ b/conf/i386-coreboot.rmk
@@ -116,7 +116,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 6e3cbcf..8a575b5 100644
--- a/conf/i386-efi.rmk
+++ b/conf/i386-efi.rmk
@@ -44,7 +44,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 65d1c6b..64097f1 100644
--- a/conf/i386-ieee1275.rmk
+++ b/conf/i386-ieee1275.rmk
@@ -71,7 +71,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 0ef5e47..a777fd9 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/pc.c partmap/gpt.c				\
 	\
@@ -146,7 +147,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 c30f61a..2ed9812 100644
--- a/conf/powerpc-ieee1275.rmk
+++ b/conf/powerpc-ieee1275.rmk
@@ -51,7 +51,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 b26496d..e97b81c 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/pc.c		\
 	partmap/sun.c partmap/acorn.c				\
@@ -108,7 +109,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 71a90ce..77cad94 100644
--- a/conf/x86_64-efi.rmk
+++ b/conf/x86_64-efi.rmk
@@ -42,7 +42,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 971c8bd..cd61f4d 100644
--- a/fs/afs.c
+++ b/fs/afs.c
@@ -26,10 +26,16 @@
 #include <grub/types.h>
 #include <grub/fshelp.h>
 
+#ifdef MODE_BIGENDIAN
+#define GRUB_AFS_FSNAME_SUFFIX "_be"
+#else
+#define GRUB_AFS_FSNAME_SUFFIX ""
+#endif
+
 #ifdef MODE_BFS
-#define GRUB_AFS_FSNAME "befs"
+#define GRUB_AFS_FSNAME "befs" GRUB_AFS_FSNAME_SUFFIX
 #else
-#define GRUB_AFS_FSNAME "afs"
+#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 0000000..1f1f48f
--- /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 0000000..f6e8179
--- /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"

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] Split big and little endian BeFS and AtheFS
  2009-08-20 22:16     ` Pavel Roskin
  2009-08-20 22:47       ` Vladimir 'phcoder' Serbinenko
@ 2009-08-23 10:40       ` Robert Millan
  2009-08-23 11:04         ` Vladimir 'phcoder' Serbinenko
  1 sibling, 1 reply; 9+ messages in thread
From: Robert Millan @ 2009-08-23 10:40 UTC (permalink / raw)
  To: The development of GRUB 2

On Thu, Aug 20, 2009 at 06:16:24PM -0400, Pavel Roskin wrote:
> I don't think we should rename "byte_order" to "unused".  Just because
> we doesn't use it now to determine the endianess,

Shouldn't we be checking for it?  (and error out if mismatch).

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Split big and little endian BeFS and AtheFS
  2009-08-23 10:40       ` Robert Millan
@ 2009-08-23 11:04         ` Vladimir 'phcoder' Serbinenko
  2009-08-23 23:09           ` Robert Millan
  0 siblings, 1 reply; 9+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-08-23 11:04 UTC (permalink / raw)
  To: The development of GRUB 2

On Sun, Aug 23, 2009 at 12:40 PM, Robert Millan<rmh@aybabtu.com> wrote:
> On Thu, Aug 20, 2009 at 06:16:24PM -0400, Pavel Roskin wrote:
>> I don't think we should rename "byte_order" to "unused".  Just because
>> we doesn't use it now to determine the endianess,
>
> Shouldn't we be checking for it?  (and error out if mismatch).
This field is unstraightforward to use. We already have the same
information from the magic (which is stored in native-endian). I feel
like checking additional field will just lead to rejected FS
especially if I don't get this field right. In other words I prefer to
keep complexity to minimum especially in parts of code not used
extensively.
>
> --
> Robert Millan
>
>  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
>  how) you may access your data; but nobody's threatening your freedom: we
>  still allow you to remove your data and not access it at all."
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>



-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Split big and little endian BeFS and AtheFS
  2009-08-23 11:04         ` Vladimir 'phcoder' Serbinenko
@ 2009-08-23 23:09           ` Robert Millan
  2009-08-28 13:02             ` Vladimir 'phcoder' Serbinenko
  0 siblings, 1 reply; 9+ messages in thread
From: Robert Millan @ 2009-08-23 23:09 UTC (permalink / raw)
  To: The development of GRUB 2

On Sun, Aug 23, 2009 at 01:04:30PM +0200, Vladimir 'phcoder' Serbinenko wrote:
> On Sun, Aug 23, 2009 at 12:40 PM, Robert Millan<rmh@aybabtu.com> wrote:
> > On Thu, Aug 20, 2009 at 06:16:24PM -0400, Pavel Roskin wrote:
> >> I don't think we should rename "byte_order" to "unused".  Just because
> >> we doesn't use it now to determine the endianess,
> >
> > Shouldn't we be checking for it?  (and error out if mismatch).
> This field is unstraightforward to use. We already have the same
> information from the magic (which is stored in native-endian). I feel
> like checking additional field will just lead to rejected FS
> especially if I don't get this field right. In other words I prefer to
> keep complexity to minimum especially in parts of code not used
> extensively.

As long as you're confident that we're discarding invalid FS reliably, no
problem with it.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Split big and little endian BeFS and AtheFS
  2009-08-23 23:09           ` Robert Millan
@ 2009-08-28 13:02             ` Vladimir 'phcoder' Serbinenko
  0 siblings, 0 replies; 9+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-08-28 13:02 UTC (permalink / raw)
  To: The development of GRUB 2

Comitted

On Mon, Aug 24, 2009 at 1:09 AM, Robert Millan<rmh@aybabtu.com> wrote:
> On Sun, Aug 23, 2009 at 01:04:30PM +0200, Vladimir 'phcoder' Serbinenko wrote:
>> On Sun, Aug 23, 2009 at 12:40 PM, Robert Millan<rmh@aybabtu.com> wrote:
>> > On Thu, Aug 20, 2009 at 06:16:24PM -0400, Pavel Roskin wrote:
>> >> I don't think we should rename "byte_order" to "unused".  Just because
>> >> we doesn't use it now to determine the endianess,
>> >
>> > Shouldn't we be checking for it?  (and error out if mismatch).
>> This field is unstraightforward to use. We already have the same
>> information from the magic (which is stored in native-endian). I feel
>> like checking additional field will just lead to rejected FS
>> especially if I don't get this field right. In other words I prefer to
>> keep complexity to minimum especially in parts of code not used
>> extensively.
>
> As long as you're confident that we're discarding invalid FS reliably, no
> problem with it.
>
> --
> Robert Millan
>
>  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
>  how) you may access your data; but nobody's threatening your freedom: we
>  still allow you to remove your data and not access it at all."
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>



-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2009-08-28 13:02 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-14 20:53 [PATCH] Split big and little endian BeFS and AtheFS Vladimir 'phcoder' Serbinenko
2009-08-14 22:00 ` Pavel Roskin
2009-08-19 10:05   ` Vladimir 'phcoder' Serbinenko
2009-08-20 22:16     ` Pavel Roskin
2009-08-20 22:47       ` Vladimir 'phcoder' Serbinenko
2009-08-23 10:40       ` Robert Millan
2009-08-23 11:04         ` Vladimir 'phcoder' Serbinenko
2009-08-23 23:09           ` Robert Millan
2009-08-28 13:02             ` Vladimir 'phcoder' Serbinenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.