From 9ec53cf4f32cc65e91a9c71651f05a6d872a7088 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Tue, 20 Feb 2001 16:28:40 +0000 Subject: [PATCH] ChangeLog, Makefile.in, bitops.h, tst_byteswap.c: bitops.h (ext2fs_swab16, ext2fs_swab32): Add i386 assembly inline functions. tst_byteswap.c: New function to test the byteswap functions. Add to regression test suite. --- lib/ext2fs/ChangeLog | 8 ++++ lib/ext2fs/Makefile.in | 7 +++- lib/ext2fs/bitops.h | 27 ++++++++++++- lib/ext2fs/tst_byteswap.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 lib/ext2fs/tst_byteswap.c diff --git a/lib/ext2fs/ChangeLog b/lib/ext2fs/ChangeLog index ee128ca..3a46a1d 100644 --- a/lib/ext2fs/ChangeLog +++ b/lib/ext2fs/ChangeLog @@ -1,3 +1,11 @@ +2001-02-20 Theodore Tso + + * bitops.h (ext2fs_swab16, ext2fs_swab32): Add i386 assembly + inline functions. + + * tst_byteswap.c: New function to test the byteswap functions. + Add to regression test suite. + 2001-02-08 Theodore Tso * e2image.h (struct ext2_image_hdr): Fix type for fs_hostname diff --git a/lib/ext2fs/Makefile.in b/lib/ext2fs/Makefile.in index 49102a7..dc0590f 100644 --- a/lib/ext2fs/Makefile.in +++ b/lib/ext2fs/Makefile.in @@ -177,12 +177,17 @@ tst_getsize: tst_getsize.o getsize.o $(STATIC_LIBEXT2FS) $(CC) -o tst_getsize tst_getsize.o getsize.o $(STATIC_LIBEXT2FS) \ $(LIBCOM_ERR) +tst_byteswap: tst_byteswap.o bitops.o $(STATIC_LIBEXT2FS) + $(CC) -o tst_byteswap tst_byteswap.o bitops.o $(STATIC_LIBEXT2FS) \ + $(LIBCOM_ERR) + mkjournal: mkjournal.c $(STATIC_LIBEXT2FS) $(CC) -o mkjournal $(srcdir)/mkjournal.c -DDEBUG $(STATIC_LIBEXT2FS) $(LIBCOM_ERR) $(ALL_CFLAGS) -check:: tst_badblocks tst_iscan +check:: tst_badblocks tst_iscan tst_byteswap ./tst_badblocks ./tst_iscan + ./tst_byteswap installdirs:: $(top_srcdir)/mkinstalldirs $(DESTDIR)$(libdir) \ diff --git a/lib/ext2fs/bitops.h b/lib/ext2fs/bitops.h index 6ab7781..f91f564 100644 --- a/lib/ext2fs/bitops.h +++ b/lib/ext2fs/bitops.h @@ -109,7 +109,8 @@ extern void ext2fs_set_bitmap_padding(ext2fs_generic_bitmap map); defined(__i586__))) #define _EXT2_HAVE_ASM_BITOPS_ - +#define _EXT2_HAVE_ASM_SWAB_ + /* * These are done by inline assembly for speed reasons..... * @@ -155,6 +156,28 @@ _INLINE_ int ext2fs_test_bit(int nr, const void * addr) return oldbit; } +_INLINE_ __u32 ext2fs_swab32(__u32 val) +{ +#ifdef EXT2FS_REQUIRE_486 + __asm__("bswap %0" : "=r" (val) : "0" (val)); +#else + __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ + "rorl $16,%0\n\t" /* swap words */ + "xchgb %b0,%h0" /* swap higher bytes */ + :"=q" (val) + : "0" (val)); +#endif + return val; +} + +_INLINE_ __u16 ext2fs_swab16(__u16 val) +{ + __asm__("xchgb %b0,%h0" /* swap bytes */ \ + : "=q" (val) \ + : "0" (val)); \ + return val; +} + #undef EXT2FS_ADDR #endif /* i386 */ @@ -314,7 +337,7 @@ _INLINE_ int ext2fs_test_bit(int nr, const void *addr) #endif /* __sparc__ */ -#ifndef _EXT2_HAVE_ASM_SWAB +#ifndef _EXT2_HAVE_ASM_SWAB_ _INLINE_ __u16 ext2fs_swab16(__u16 val) { diff --git a/lib/ext2fs/tst_byteswap.c b/lib/ext2fs/tst_byteswap.c new file mode 100644 index 0000000..96e44ec --- /dev/null +++ b/lib/ext2fs/tst_byteswap.c @@ -0,0 +1,97 @@ +/* + * This testing program makes sure the byteswap functions work + * + * Copyright (C) 2000 by Theodore Ts'o. + * + * %Begin-Header% + * This file may be redistributed under the terms of the GNU Public + * License. + * %End-Header% + */ + +#include +#include +#if HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#if HAVE_ERRNO_H +#include +#endif + +#if EXT2_FLAT_INCLUDES +#include "ext2_fs.h" +#else +#include +#endif + +#include "ext2fs.h" + +__u16 test1[] = { + 0x0001, 0x0100, + 0x1234, 0x3412, + 0xff00, 0x00ff, + 0x4000, 0x0040, + 0xfeff, 0xfffe, + 0x0000, 0x0000 + }; + +__u32 test2[] = { + 0x00000001, 0x01000000, + 0x80000000, 0x00000080, + 0x12345678, 0x78563412, + 0xffff0000, 0x0000ffff, + 0x00ff0000, 0x0000ff00, + 0xff000000, 0x000000ff, + 0x00000000, 0x00000000 + }; + +int main(int argc, char *argv) +{ + int i; + int errors = 0; + + printf("Testing ext2fs_swab16\n"); + i=0; + do { + printf("swab16(0x%04x) = 0x%04x\n", test1[i], + ext2fs_swab16(test1[i])); + if (ext2fs_swab16(test1[i]) != test1[i+1]) { + printf("Error!!! %04x != %04x\n", + ext2fs_swab16(test1[i]), test1[i+1]); + errors++; + } + if (ext2fs_swab16(test1[i+1]) != test1[i]) { + printf("Error!!! %04x != %04x\n", + ext2fs_swab16(test1[i+1]), test1[i]); + errors++; + } + i += 2; + } while (test1[i] != 0); + + printf("Testing ext2fs_swab32\n"); + i = 0; + do { + printf("swab32(0x%08x) = 0x%08x\n", test2[i], + ext2fs_swab32(test2[i])); + if (ext2fs_swab32(test2[i]) != test2[i+1]) { + printf("Error!!! %04x != %04x\n", + ext2fs_swab32(test2[i]), test2[i+1]); + errors++; + } + if (ext2fs_swab32(test2[i+1]) != test2[i]) { + printf("Error!!! %04x != %04x\n", + ext2fs_swab32(test2[i+1]), test2[i]); + errors++; + } + i += 2; + } while (test2[i] != 0); + + if (!errors) + printf("No errors found in the byteswap implementation!\n"); + + return errors; +} -- 1.8.3.1