0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _EBCDIC_H
0011 #define _EBCDIC_H
0012
0013 #include <linux/types.h>
0014
0015 extern __u8 _ascebc_500[256];
0016 extern __u8 _ebcasc_500[256];
0017 extern __u8 _ascebc[256];
0018 extern __u8 _ebcasc[256];
0019 extern __u8 _ebc_tolower[256];
0020 extern __u8 _ebc_toupper[256];
0021
0022 static inline void
0023 codepage_convert(const __u8 *codepage, volatile char *addr, unsigned long nr)
0024 {
0025 if (nr-- <= 0)
0026 return;
0027 asm volatile(
0028 " bras 1,1f\n"
0029 " tr 0(1,%0),0(%2)\n"
0030 "0: tr 0(256,%0),0(%2)\n"
0031 " la %0,256(%0)\n"
0032 "1: ahi %1,-256\n"
0033 " jnm 0b\n"
0034 " ex %1,0(1)"
0035 : "+&a" (addr), "+&a" (nr)
0036 : "a" (codepage) : "cc", "memory", "1");
0037 }
0038
0039 #define ASCEBC(addr,nr) codepage_convert(_ascebc, addr, nr)
0040 #define EBCASC(addr,nr) codepage_convert(_ebcasc, addr, nr)
0041 #define ASCEBC_500(addr,nr) codepage_convert(_ascebc_500, addr, nr)
0042 #define EBCASC_500(addr,nr) codepage_convert(_ebcasc_500, addr, nr)
0043 #define EBC_TOLOWER(addr,nr) codepage_convert(_ebc_tolower, addr, nr)
0044 #define EBC_TOUPPER(addr,nr) codepage_convert(_ebc_toupper, addr, nr)
0045
0046 #endif
0047