Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: Zlib
0002 #ifndef DFLTCC_UTIL_H
0003 #define DFLTCC_UTIL_H
0004 
0005 #include <linux/zutil.h>
0006 
0007 /*
0008  * C wrapper for the DEFLATE CONVERSION CALL instruction.
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 /* DFLTCC_UTIL_H */