0001
0002 #ifndef DFLTCC_UTIL_H
0003 #define DFLTCC_UTIL_H
0004
0005 #include <linux/zutil.h>
0006
0007
0008
0009
0010 typedef enum {
0011 DFLTCC_CC_OK = 0,
0012 DFLTCC_CC_OP1_TOO_SHORT = 1,
0013 DFLTCC_CC_OP2_TOO_SHORT = 2,
0014 DFLTCC_CC_OP2_CORRUPT = 2,
0015 DFLTCC_CC_AGAIN = 3,
0016 } dfltcc_cc;
0017
0018 #define DFLTCC_QAF 0
0019 #define DFLTCC_GDHT 1
0020 #define DFLTCC_CMPR 2
0021 #define DFLTCC_XPND 4
0022 #define HBT_CIRCULAR (1 << 7)
0023 #define HB_BITS 15
0024 #define HB_SIZE (1 << HB_BITS)
0025
0026 static inline dfltcc_cc dfltcc(
0027 int fn,
0028 void *param,
0029 Byte **op1,
0030 size_t *len1,
0031 const Byte **op2,
0032 size_t *len2,
0033 void *hist
0034 )
0035 {
0036 Byte *t2 = op1 ? *op1 : NULL;
0037 size_t t3 = len1 ? *len1 : 0;
0038 const Byte *t4 = op2 ? *op2 : NULL;
0039 size_t t5 = len2 ? *len2 : 0;
0040 register int r0 __asm__("r0") = fn;
0041 register void *r1 __asm__("r1") = param;
0042 register Byte *r2 __asm__("r2") = t2;
0043 register size_t r3 __asm__("r3") = t3;
0044 register const Byte *r4 __asm__("r4") = t4;
0045 register size_t r5 __asm__("r5") = t5;
0046 int cc;
0047
0048 __asm__ volatile(
0049 ".insn rrf,0xb9390000,%[r2],%[r4],%[hist],0\n"
0050 "ipm %[cc]\n"
0051 : [r2] "+r" (r2)
0052 , [r3] "+r" (r3)
0053 , [r4] "+r" (r4)
0054 , [r5] "+r" (r5)
0055 , [cc] "=r" (cc)
0056 : [r0] "r" (r0)
0057 , [r1] "r" (r1)
0058 , [hist] "r" (hist)
0059 : "cc", "memory");
0060 t2 = r2; t3 = r3; t4 = r4; t5 = r5;
0061
0062 if (op1)
0063 *op1 = t2;
0064 if (len1)
0065 *len1 = t3;
0066 if (op2)
0067 *op2 = t4;
0068 if (len2)
0069 *len2 = t5;
0070 return (cc >> 28) & 3;
0071 }
0072
0073 static inline int is_bit_set(
0074 const char *bits,
0075 int n
0076 )
0077 {
0078 return bits[n / 8] & (1 << (7 - (n % 8)));
0079 }
0080
0081 static inline void turn_bit_off(
0082 char *bits,
0083 int n
0084 )
0085 {
0086 bits[n / 8] &= ~(1 << (7 - (n % 8)));
0087 }
0088
0089 static inline int dfltcc_are_params_ok(
0090 int level,
0091 uInt window_bits,
0092 int strategy,
0093 uLong level_mask
0094 )
0095 {
0096 return (level_mask & (1 << level)) != 0 &&
0097 (window_bits == HB_BITS) &&
0098 (strategy == Z_DEFAULT_STRATEGY);
0099 }
0100
0101 char *oesc_msg(char *buf, int oesc);
0102
0103 #endif