ucp: provision for endianness handling
authorAlan Cox <alan@etchedpixels.co.uk>
Sun, 30 Nov 2014 18:27:47 +0000 (18:27 +0000)
committerAlan Cox <alan@etchedpixels.co.uk>
Sun, 30 Nov 2014 18:27:47 +0000 (18:27 +0000)
We are going to need to handle wrong-endian file systems in order to cope
with the 6809 port. Add macros ready

Standalone/fuzix_fs.h
Standalone/xfs1.c
Standalone/xfs1a.c
Standalone/xfs1b.c
Standalone/xfs2.c

index 2a669f2..0fed2e7 100644 (file)
@@ -37,8 +37,10 @@ void xfs_init();
 void panic(char *s);
 void bufsync (void);
 char *zerobuf (void);
-int super();
+int super(void);
 
+#define swizzle16(x)   (x)
+#define swizzle32(x)   (x)
 
 typedef struct s_queue {
     char *q_base;    /* Pointer to data */
index fd3883d..67722a0 100644 (file)
@@ -196,7 +196,7 @@ int _creat(char *name, int16_t mode)
         if (parent && (ino = newfile(parent,name)))
             /* Parent was derefed in newfile */
         {
-            ino->c_node.i_mode = (F_REG | (mode & MODE_MASK & ~udata.u_mask));
+            ino->c_node.i_mode = swizzle16(F_REG | (mode & MODE_MASK & ~udata.u_mask));
             setftime(ino, A_TIME|M_TIME|C_TIME);
             /* The rest of the inode is initialized in newfile() */
             wr_inode(ino);
@@ -266,7 +266,7 @@ int _link( char *name1, char *name2)
         goto nogood;
 
     /* Update the link count. */
-    ++ino->c_node.i_nlink;
+    ino->c_node.i_nlink = swizzle16(swizzle16(ino->c_node.i_nlink)+1);
     wr_inode(ino);
     setftime(ino, C_TIME);
 
@@ -312,11 +312,12 @@ int _unlink(char *path)
 
     /* Decrease the link count of the inode */
 
-    ifnot (ino->c_node.i_nlink--)
+    if (ino->c_node.i_nlink == 0)
     {
-        ino->c_node.i_nlink += 2;
+        ino->c_node.i_nlink = swizzle16(swizzle16(ino->c_node.i_nlink)+2);
         printf("_unlink: bad nlink\n");
-    }
+    } else
+        ino->c_node.i_nlink = swizzle16(swizzle16(ino->c_node.i_nlink)-1);
     setftime(ino, C_TIME);
     i_deref(pino);
     i_deref(ino);
@@ -397,5 +398,5 @@ inoptr rwsetup( int rwflag, int d, char *buf, int nbytes)
 
 int psize(inoptr ino)
 {
-    return (ino->c_node.i_size);
+    return swizzle32(ino->c_node.i_size);
 }
index d2b07c7..1aefef4 100644 (file)
@@ -33,7 +33,7 @@ int32_t _lseek( int16_t file, int32_t offset, int16_t flag)
             of_tab[oftno].o_ptr += offset;
             break;
         case 2:
-            of_tab[oftno].o_ptr = ino->c_node.i_size + offset;
+            of_tab[oftno].o_ptr = swizzle32(ino->c_node.i_size) + offset;
             break;
         default:
             udata.u_error = EINVAL;
@@ -62,12 +62,12 @@ void readi( inoptr ino )
 
             /* See of end of file will limit read */
             toread = udata.u_count =
-                min(udata.u_count, ino->c_node.i_size-udata.u_offset);
+                min(udata.u_count, swizzle32(ino->c_node.i_size)-udata.u_offset);
             goto loop;
 
         case F_BDEV:
             toread = udata.u_count;
-            dev = *(ino->c_node.i_addr);
+            dev = swizzle16(*(ino->c_node.i_addr));
 
 loop:
             while (toread)
@@ -110,7 +110,7 @@ void writei( inoptr ino)
     {
 
         case F_BDEV:
-            dev = *(ino->c_node.i_addr);
+            dev = swizzle16(*(ino->c_node.i_addr));
         case F_DIR:
         case F_REG:
             towrite = udata.u_count;
@@ -137,8 +137,8 @@ loop:
             }
 
             /* Update size if file grew */
-            if ( udata.u_offset > ino->c_node.i_size) {
-                ino->c_node.i_size = udata.u_offset;
+            if ( udata.u_offset > swizzle32(ino->c_node.i_size)) {
+                ino->c_node.i_size = swizzle32(udata.u_offset);
                 ino->c_dirty = 1;
             }
             break;
index e0e6898..df55420 100644 (file)
@@ -44,8 +44,8 @@ int _mknod( char *name, int16_t mode, int16_t dev)
         goto nogood2;
 
     /* Initialize mode and dev */
-    ino->c_node.i_mode = mode & ~udata.u_mask;
-    ino->c_node.i_addr[0] = isdevice(ino) ? dev : 0;
+    ino->c_node.i_mode = swizzle16(mode & ~udata.u_mask);
+    ino->c_node.i_addr[0] = swizzle16(isdevice(ino) ? dev : 0);
     setftime(ino, A_TIME|M_TIME|C_TIME);
     wr_inode(ino);
 
@@ -82,7 +82,7 @@ void _sync(void)
 
     for (j=0; j < NDEVS; ++j)
     {
-        if (fs_tab[j].s_mounted == SMOUNTED && fs_tab[j].s_fmod)
+        if (swizzle16(fs_tab[j].s_mounted) == SMOUNTED && fs_tab[j].s_fmod)
         {
             fs_tab[j].s_fmod = 0;
             buf = bread(j, 1, 1);
@@ -179,13 +179,13 @@ int _chmod( char *path, int16_t mode)
     ifnot (ino = n_open(path,NULLINOPTR))
         return (-1);
 
-    if (ino->c_node.i_uid != udata.u_euid && !super())
+    if (swizzle16(ino->c_node.i_uid) != udata.u_euid && !super())
     {
         i_deref(ino);
         udata.u_error = EPERM;
         return(-1);
     }
-    ino->c_node.i_mode = (mode & MODE_MASK) | (ino->c_node.i_mode & F_MASK);
+    ino->c_node.i_mode = swizzle16((mode & MODE_MASK) | (swizzle16(ino->c_node.i_mode) & F_MASK));
     setftime(ino, C_TIME);
     i_deref(ino);
     return(0);
@@ -202,15 +202,15 @@ int _chown( char *path, int owner, int group)
     ifnot (ino = n_open(path,NULLINOPTR))
         return (-1);
 
-    if (ino->c_node.i_uid != udata.u_euid && !super())
+    if (swizzle16(ino->c_node.i_uid) != udata.u_euid && !super())
     {
         i_deref(ino);
         udata.u_error = EPERM;
         return(-1);
     }
 
-    ino->c_node.i_uid = owner;
-    ino->c_node.i_gid = group;
+    ino->c_node.i_uid = swizzle16(owner);
+    ino->c_node.i_gid = swizzle16(group);
     setftime(ino, C_TIME);
     i_deref(ino);
     return(0);
@@ -256,19 +256,19 @@ void stcpy( inoptr ino, struct uzi_stat *buf)
 {
     struct uzi_stat *b = (struct uzi_stat *)buf;
 
-    b->st_dev = ino->c_dev;
-    b->st_ino = ino->c_num;
-    b->st_mode = ino->c_node.i_mode;
-    b->st_nlink = ino->c_node.i_nlink;
-    b->st_uid = ino->c_node.i_uid;
-    b->st_gid = ino->c_node.i_gid;
+    b->st_dev = swizzle16(ino->c_dev);
+    b->st_ino = swizzle16(ino->c_num);
+    b->st_mode = swizzle16(ino->c_node.i_mode);
+    b->st_nlink = swizzle16(ino->c_node.i_nlink);
+    b->st_uid = swizzle16(ino->c_node.i_uid);
+    b->st_gid = swizzle16(ino->c_node.i_gid);
 
-    b->st_rdev = ino->c_node.i_addr[0];
+    b->st_rdev = swizzle16(ino->c_node.i_addr[0]);
 
-    b->st_size = ino->c_node.i_size;
-    b->fst_atime = ino->c_node.i_atime;
-    b->fst_mtime = ino->c_node.i_mtime;
-    b->fst_ctime = ino->c_node.i_ctime;
+    b->st_size = swizzle32(ino->c_node.i_size);
+    b->fst_atime = swizzle32(ino->c_node.i_atime);
+    b->fst_mtime = swizzle32(ino->c_node.i_mtime);
+    b->fst_ctime = swizzle32(ino->c_node.i_ctime);
 }
 
 
@@ -339,12 +339,13 @@ int _umask( int mask)
 int _getfsys(int dev,char * buf)
 {
     udata.u_error = 0;
-    if (dev < 0 || dev >= NDEVS || fs_tab[dev].s_mounted != SMOUNTED)
+    if (dev < 0 || dev >= NDEVS || swizzle16(fs_tab[dev].s_mounted) != SMOUNTED)
     {
         udata.u_error = ENXIO;
         return(-1);
     }
 
+    /* FIXME: endiam swapping here */
     bcopy((char *)&fs_tab[dev],(char *)buf,sizeof(struct filesys));
     return(0);
 }
@@ -411,7 +412,7 @@ int _mount( char *spec, char *dir, int rwflag)
         udata.u_error = ENOTDIR;
         goto nogood;
     }
-    dev = (int)sino->c_node.i_addr[0];
+    dev = (int)swizzle16(sino->c_node.i_addr[0]);
 
     if ( dev >= NDEVS ) // || d_open(dev))
     {
@@ -463,7 +464,7 @@ int _umount(char *spec)
         goto nogood;
     }
 
-    dev = (int)sino->c_node.i_addr[0];
+    dev = (int)swizzle16(sino->c_node.i_addr[0]);
     //ifnot (validdev(dev))
     //{
     //    udata.u_error = ENXIO;
index fac6f75..7ce0657 100644 (file)
@@ -118,7 +118,7 @@ inoptr srch_dir(inoptr wd, register char *compname)
     register int nblocks;
     unsigned inum;
 
-    nblocks = (wd->c_node.i_size + 511) >> 9;
+    nblocks = (swizzle32(wd->c_node.i_size) + 511) >> 9;
 
     for (curblock=0; curblock < nblocks; ++curblock)
     {
@@ -127,7 +127,7 @@ inoptr srch_dir(inoptr wd, register char *compname)
         {
             if (namecomp(compname,buf[curentry].d_name))
             {
-                inum = buf[curentry&0x0f].d_ino;
+                inum = swizzle16(buf[curentry&0x0f].d_ino);
                 brelse((bufptr)buf);
                 return(i_open(wd->c_dev, inum));
             }
@@ -234,12 +234,12 @@ inoptr i_open( register int dev, register unsigned ino)
 found:
     if (new)
     {
-        if (nindex->c_node.i_nlink || nindex->c_node.i_mode & F_MASK)
+        if (nindex->c_node.i_nlink || swizzle16(nindex->c_node.i_mode) & F_MASK)
             goto badino;
     }
     else
     {
-        ifnot (nindex->c_node.i_nlink && nindex->c_node.i_mode & F_MASK)
+        ifnot (nindex->c_node.i_nlink && swizzle16(nindex->c_node.i_mode) & F_MASK)
             goto badino;
     }
 
@@ -304,7 +304,7 @@ int ch_link( inoptr wd, char *oldname, char *newname, inoptr nindex)
 #endif
 
     if (nindex)
-        curentry.d_ino = nindex->c_num;
+        curentry.d_ino = swizzle16(nindex->c_num);
     else
         curentry.d_ino = 0;
 
@@ -323,8 +323,9 @@ int ch_link( inoptr wd, char *oldname, char *newname, inoptr nindex)
     setftime(wd, A_TIME|M_TIME|C_TIME);     /* Sets c_dirty */
 
     /* Update file length to next block */
-    if (wd->c_node.i_size&511)
-        wd->c_node.i_size += 512 - (wd->c_node.i_size&511);
+    if (swizzle32(wd->c_node.i_size)&511)
+        wd->c_node.i_size =
+          swizzle32(wd->c_node.i_size) + 512 - (swizzle16(wd->c_node.i_size)&511);
 
     return (1);
 }
@@ -390,11 +391,11 @@ inoptr newfile( inoptr pino, char *name)
         goto nogood;
 
     /* BIG FIX:  user/group setting was missing  SN */         /*280*/
-    nindex->c_node.i_uid = udata.u_euid;                       /*280*/
-    nindex->c_node.i_gid = udata.u_egid;                       /*280*/
+    nindex->c_node.i_uid = swizzle16(udata.u_euid);            /*280*/
+    nindex->c_node.i_gid = swizzle16(udata.u_egid);            /*280*/
 
-    nindex->c_node.i_mode = F_REG;   /* For the time being */
-    nindex->c_node.i_nlink = 1;
+    nindex->c_node.i_mode = swizzle16(F_REG);   /* For the time being */
+    nindex->c_node.i_nlink = swizzle16(1);
     nindex->c_node.i_size = 0;
     for (j=0; j <20; j++)
         nindex->c_node.i_addr[j] = 0;
@@ -437,7 +438,7 @@ fsptr getdev( int devno)
 
 int baddev(fsptr dev)
 {
-    return (dev->s_mounted != SMOUNTED);
+    return (swizzle16(dev->s_mounted) != SMOUNTED);
 }
 
 
@@ -462,12 +463,16 @@ unsigned i_alloc(int devno)
 tryagain:
     if (dev->s_ninode)
     {
+        int i;
+
         ifnot (dev->s_tinode)
             goto corrupt;
-        ino = dev->s_inode[--dev->s_ninode];
-        if (ino < 2 || ino >= (dev->s_isize-2)*8)
+        i = swizzle16(dev->s_ninode);
+        ino = swizzle16(dev->s_inode[--i]);
+        dev->s_ninode = swizzle16(i);
+        if (ino < 2 || ino >= (swizzle16(dev->s_isize)-2)*8)
             goto corrupt;
-        --dev->s_tinode;
+        dev->s_tinode = swizzle16(swizzle16(dev->s_tinode)-1);
         return(ino);
     }
 
@@ -481,7 +486,7 @@ tryagain:
         for (j=0; j < 8; j++)
         {
             ifnot (buf[j].i_mode || buf[j].i_nlink)
-                dev->s_inode[k++] = 8*(blk-2) + j;
+                dev->s_inode[k++] = swizzle16(8*(blk-2) + j);
             if (k==50)
             {
                 brelse((bufptr)buf);
@@ -500,12 +505,12 @@ done:
         return(0);
     }
 
-    dev->s_ninode = k;
+    dev->s_ninode = swizzle16(k);
     goto tryagain;
 
 corrupt:
     printf("i_alloc: corrupt superblock\n");
-    dev->s_mounted = 1;
+    dev->s_mounted = swizzle16(1);
     udata.u_error = ENOSPC;
     return(0);
 }
@@ -523,12 +528,15 @@ void i_free( int devno, unsigned ino)
     if (baddev(dev = getdev(devno)))
         return;
 
-    if (ino < 2 || ino >= (dev->s_isize-2)*8)
+    if (ino < 2 || ino >= (swizzle16(dev->s_isize)-2)*8)
         panic("i_free: bad ino");
 
-    ++dev->s_tinode;
-    if (dev->s_ninode < 50)
-        dev->s_inode[dev->s_ninode++] = ino;
+    dev->s_tinode = swizzle16(swizzle16(dev->s_tinode) + 1);
+    if (swizzle16(dev->s_ninode) < 50) {
+        int i = swizzle16(dev->s_ninode);
+        dev->s_inode[i++] = swizzle16(ino);
+        dev->s_ninode = swizzle16(i);
+   }
 }
 
 
@@ -542,20 +550,23 @@ blkno_t blk_alloc( int devno )
     register blkno_t newno;
     blkno_t *buf; /*, *bread(); -- HP */
     register int j;
+    int i;
 
     if (baddev(dev = getdev(devno)))
         goto corrupt2;
 
-    if (dev->s_nfree <= 0 || dev->s_nfree > 50)
+    if (swizzle16(dev->s_nfree) <= 0 || swizzle16(dev->s_nfree) > 50)
         goto corrupt;
 
-    newno = dev->s_free[--dev->s_nfree];
+    i = swizzle16(dev->s_nfree);
+    newno = swizzle16(dev->s_free[--i]);
+    dev->s_nfree=swizzle16(i);
     ifnot (newno)
     {
         if (dev->s_tfree != 0)
             goto corrupt;
         udata.u_error = ENOSPC;
-        ++dev->s_nfree;
+        dev->s_nfree=swizzle16(swizzle16(dev->s_nfree)+1);
         return(0);
     }
 
@@ -576,7 +587,7 @@ blkno_t blk_alloc( int devno )
 
     ifnot (dev->s_tfree)
         goto corrupt;
-    --dev->s_tfree;
+    dev->s_tfree=swizzle16(swizzle16(dev->s_tfree)-1);
 
     /* Zero out the new block */
     buf = (blkno_t *)bread(devno, newno, 2);
@@ -586,7 +597,7 @@ blkno_t blk_alloc( int devno )
 
 corrupt:
     printf("blk_alloc: corrupt\n");
-    dev->s_mounted = 1;
+    dev->s_mounted = swizzle16(1);
 corrupt2:
     udata.u_error = ENOSPC;
     return(0);
@@ -600,6 +611,7 @@ void blk_free( int devno, blkno_t blk)
 {
     register fsptr dev;
     register char *buf;
+    int b;
 
     ifnot (blk)
         return;
@@ -617,8 +629,10 @@ void blk_free( int devno, blkno_t blk)
         dev->s_nfree = 0;
     }
 
-    ++dev->s_tfree;
-    dev->s_free[(dev->s_nfree)++] = blk;
+    dev->s_tfree = swizzle16(swizzle16(dev->s_tfree)+1);
+    b = swizzle16(dev->s_nfree);
+    dev->s_free[b++] = swizzle16(blk);
+    dev->s_nfree=swizzle16(b);
 }
 
 
@@ -696,6 +710,8 @@ void i_ref( inoptr ino)
 
 void i_deref(inoptr ino)
 {
+    unsigned int m;
+
     magic(ino);
 
     ifnot (ino->c_refs)
@@ -704,15 +720,17 @@ void i_deref(inoptr ino)
     /* If the inode has no links and no refs, it must have
        its blocks freed. */
 
-    ifnot (--ino->c_refs || ino->c_node.i_nlink)
+    ifnot (--ino->c_refs || ino->c_node.i_nlink) {
 /*
  SN  (mcy)
 */
-        if (((ino->c_node.i_mode & F_MASK) == F_REG) ||
-            ((ino->c_node.i_mode & F_MASK) == F_DIR) ||
-            ((ino->c_node.i_mode & F_MASK) == F_PIPE))
-                f_trunc(ino);
 
+     m = swizzle16(ino->c_node.i_mode);
+        if (((m & F_MASK) == F_REG) ||
+            ((m & F_MASK) == F_DIR) ||
+            ((m & F_MASK) == F_PIPE))
+                f_trunc(ino);
+    }
     /* If the inode was modified, we must write it to disk. */
     if (!(ino->c_refs) && ino->c_dirty)
     {
@@ -749,14 +767,14 @@ void wr_inode(inoptr ino)
 /* isdevice(ino) returns true if ino points to a device */
 int isdevice(inoptr ino)
 {
-    return (ino->c_node.i_mode & 020000);
+    return (swizzle16(ino->c_node.i_mode) & 020000);
 }
 
 
 /* This returns the device number of an inode representing a device */
 int devnum(inoptr ino)
 {
-    return (*(ino->c_node.i_addr));
+    return (swizzle16(*(ino->c_node.i_addr)));
 }
 
 
@@ -772,14 +790,14 @@ void f_trunc(inoptr ino)
     dev = ino->c_dev;
 
     /* First deallocate the double indirect blocks */
-    freeblk(dev, ino->c_node.i_addr[19], 2);
+    freeblk(dev, swizzle16(ino->c_node.i_addr[19]), 2);
 
     /* Also deallocate the indirect blocks */
-    freeblk(dev, ino->c_node.i_addr[18], 1);
+    freeblk(dev, swizzle16(ino->c_node.i_addr[18]), 1);
 
     /* Finally, free the direct blocks */
     for (j=17; j >= 0; --j)
-        freeblk(dev, ino->c_node.i_addr[j], 0);
+        freeblk(dev, swizzle16(ino->c_node.i_addr[j]), 0);
 
     bzero((char *)ino->c_node.i_addr, sizeof(ino->c_node.i_addr));
 
@@ -801,7 +819,7 @@ void freeblk(int dev, blkno_t blk, int level)
     {
         buf = (blkno_t *)bread(dev, blk, 0);
         for (j=255; j >= 0; --j)
-            freeblk(dev, buf[j], level-1);
+            freeblk(dev, swizzle16(buf[j]), level-1);
         brelse((bufptr)buf);
     }
 
@@ -834,11 +852,11 @@ blkno_t bmap(inoptr ip, blkno_t bn, int rwflg)
          * blocks 0..17 are direct blocks
          */
         if(bn < 18) {
-                nb = ip->c_node.i_addr[bn];
+                nb = swizzle16(ip->c_node.i_addr[bn]);
                 if(nb == 0) {
                         if(rwflg || (nb = blk_alloc(dev))==0)
                                 return(NULLBLK);
-                        ip->c_node.i_addr[bn] = nb;
+                        ip->c_node.i_addr[bn] = swizzle16(nb);
                         ip->c_dirty = 1;
                 }
                 return(nb);
@@ -866,7 +884,7 @@ blkno_t bmap(inoptr ip, blkno_t bn, int rwflg)
         {
                 if(rwflg || !(nb = blk_alloc(dev)))
                         return(NULLBLK);
-                ip->c_node.i_addr[20-j] = nb;
+                ip->c_node.i_addr[20-j] = swizzle16(nb);
                 ip->c_dirty = 1;
         }
 
@@ -882,7 +900,7 @@ blkno_t bmap(inoptr ip, blkno_t bn, int rwflg)
                 }
                 ******/
                 i = (bn>>sh) & 0xff;
-                if ((nb = ((blkno_t *)bp)[i]))
+                if ((swizzle16(nb) = ((blkno_t *)bp)[i]))
                     brelse(bp);
                 else
                 {
@@ -890,7 +908,7 @@ blkno_t bmap(inoptr ip, blkno_t bn, int rwflg)
                                 brelse(bp);
                                 return(NULLBLK);
                         }
-                        ((blkno_t *)bp)[i] = nb;
+                        ((blkno_t *)bp)[i] = swizzle16(nb);
                         bawrite(bp);
                 }
                 sh -= 8;
@@ -912,7 +930,7 @@ void validblk(int dev, blkno_t num)
     if (devptr->s_mounted == 0)
         panic("validblk: not mounted");
 
-    if (num < devptr->s_isize || num >= devptr->s_fsize)
+    if (num < swizzle16(devptr->s_isize) || num >= swizzle16(devptr->s_fsize))
         panic("validblk: invalid blk");
 }
 
@@ -961,10 +979,10 @@ int getperm(inoptr ino)
     if (super())
         return(07);
 
-    mode = ino->c_node.i_mode;
-    if (ino->c_node.i_uid == udata.u_euid)
+    mode = swizzle16(ino->c_node.i_mode);
+    if (swizzle16(ino->c_node.i_uid) == udata.u_euid)
         mode >>= 6;
-    else if (ino->c_node.i_gid == udata.u_egid)
+    else if (swizzle16(ino->c_node.i_gid) == udata.u_egid)
         mode >>= 3;
 
     return(mode & 07);
@@ -988,7 +1006,7 @@ void setftime(inoptr ino, int flag)
 
 int getmode(inoptr ino)
 {
-    return( ino->c_node.i_mode & F_MASK);
+    return( swizzle16(ino->c_node.i_mode) & F_MASK);
 }
 
 
@@ -1006,8 +1024,8 @@ int fmount(int dev, inoptr ino)
     brelse((bufptr)buf);
     
     /* See if there really is a filesystem on the device */
-    if (fp->s_mounted != SMOUNTED ||
-         fp->s_isize >= fp->s_fsize)
+    if (swizzle16(fp->s_mounted) != SMOUNTED ||
+         swizzle16(fp->s_isize) >= swizzle16(fp->s_fsize))
         return (-1);
 
     fp->s_mntpt = ino;