utils: Allow for wrong endian file systems
authorAlan Cox <alan@etchedpixels.co.uk>
Sun, 30 Nov 2014 20:57:29 +0000 (20:57 +0000)
committerAlan Cox <alan@etchedpixels.co.uk>
Sun, 30 Nov 2014 20:57:29 +0000 (20:57 +0000)
Standalone/fuzix_fs.h
Standalone/mkfs.c
Standalone/ucp.c
Standalone/util.c

index a65b782..3c48bf5 100644 (file)
@@ -40,8 +40,9 @@ void bufsync (void);
 char *zerobuf (void);
 int super(void);
 
-#define swizzle16(x)   (x)
-#define swizzle32(x)   (x)
+extern uint16_t swizzle16(uint32_t v);
+extern uint32_t swizzle32(uint32_t v);
+extern int swizzling;
 
 typedef struct s_queue {
     char *q_base;    /* Pointer to data */
index 8fcb841..0d9d69a 100644 (file)
@@ -45,7 +45,7 @@ int main(int argc, char **argv)
                argc--;
        }
        if (argc != 4) {
-               printf("Usage: mkfs device isize fsize\n");
+               printf("Usage: mkfs [-X] device isize fsize\n");
                return -1;
        }
 
index f8f7f71..ba4c8b7 100644 (file)
@@ -25,6 +25,7 @@ char *month[] =
     "May", "Jun", "Jul", "Aug",
     "Sep", "Oct", "Nov", "Dec" };
 
+int swizzling = 0;
 
 int match(char *cmd);
 void usage(void);
index 895bb9b..9d1beed 100644 (file)
@@ -13,6 +13,8 @@ int dev_fd;
 int dev_offset;
 struct u_data udata;
 
+extern int swizzling;
+
 int fd_open(char *name)
 {
     char *namecopy, *sd;
@@ -43,3 +45,23 @@ void panic(char *s)
     fprintf(stderr, "panic: %s\n", s);
     exit(1);
 }
+
+uint16_t swizzle16(uint32_t v)
+{
+  if (v & 0xFFFF0000UL) {
+    fprintf(stderr, "swizzle16 given a 32bit input\n");
+    exit(1);
+  }
+  if (swizzling)
+    return (v & 0xFF) << 8 | ((v & 0xFF00) >> 8);
+  else return v;
+}
+
+uint32_t swizzle32(uint32_t v)
+{
+  if (!swizzling)
+    return v;
+
+  return (v & 0xFF) << 24 | (v & 0xFF00) << 8 | (v & 0xFF0000) >> 8 |
+    (v & 0xFF000000) >> 24;
+}