Lines Matching +full:4 +full:s

21 		BCJ_X86 = 4,        /* x86 or x86-64 */
68 * x86 1 4
69 * PowerPC 4 0
71 * ARM 4 0
73 * SPARC 4 0
89 static size_t bcj_x86(struct xz_dec_bcj *s, uint8_t *buf, size_t size) in bcj_x86() argument
98 uint32_t prev_mask = s->x86_prev_mask; in bcj_x86()
104 if (size <= 4) in bcj_x86()
107 size -= 4; in bcj_x86()
118 b = buf[i + 4 - mask_to_bit_num[prev_mask]]; in bcj_x86()
130 if (bcj_x86_test_msbyte(buf[i + 4])) { in bcj_x86()
133 dest = src - (s->pos + (uint32_t)i + 5); in bcj_x86()
148 i += 4; in bcj_x86()
155 s->x86_prev_mask = prev_pos > 3 ? 0 : prev_mask << (prev_pos - 1); in bcj_x86()
161 static size_t bcj_powerpc(struct xz_dec_bcj *s, uint8_t *buf, size_t size) in bcj_powerpc() argument
168 for (i = 0; i < size; i += 4) { in bcj_powerpc()
172 instr -= s->pos + (uint32_t)i; in bcj_powerpc()
184 static size_t bcj_ia64(struct xz_dec_bcj *s, uint8_t *buf, size_t size) in bcj_ia64() argument
189 4, 4, 6, 6, 0, 0, 7, 7, in bcj_ia64()
190 4, 4, 0, 0, 4, 4, 0, 0 in bcj_ia64()
194 * The local variables take a little bit stack space, but it's less in bcj_ia64()
246 addr <<= 4; in bcj_ia64()
247 addr -= s->pos + (uint32_t)i; in bcj_ia64()
248 addr >>= 4; in bcj_ia64()
270 static size_t bcj_arm(struct xz_dec_bcj *s, uint8_t *buf, size_t size) in bcj_arm() argument
277 for (i = 0; i < size; i += 4) { in bcj_arm()
282 addr -= s->pos + (uint32_t)i + 8; in bcj_arm()
295 static size_t bcj_armthumb(struct xz_dec_bcj *s, uint8_t *buf, size_t size) in bcj_armthumb() argument
300 if (size < 4) in bcj_armthumb()
303 size -= 4; in bcj_armthumb()
313 addr -= s->pos + (uint32_t)i + 4; in bcj_armthumb()
328 static size_t bcj_sparc(struct xz_dec_bcj *s, uint8_t *buf, size_t size) in bcj_sparc() argument
335 for (i = 0; i < size; i += 4) { in bcj_sparc()
339 instr -= s->pos + (uint32_t)i; in bcj_sparc()
352 static size_t bcj_arm64(struct xz_dec_bcj *s, uint8_t *buf, size_t size) in bcj_arm64() argument
360 for (i = 0; i < size; i += 4) { in bcj_arm64()
365 addr = instr - ((s->pos + (uint32_t)i) >> 2); in bcj_arm64()
377 addr -= (s->pos + (uint32_t)i) >> 12; in bcj_arm64()
393 static size_t bcj_riscv(struct xz_dec_bcj *s, uint8_t *buf, size_t size) in bcj_riscv() argument
422 addr -= s->pos + (uint32_t)i; in bcj_riscv()
429 | ((addr << 4) & 0xE0)); in bcj_riscv()
431 buf[i + 3] = (uint8_t)(((addr >> 4) & 0x7F) in bcj_riscv()
434 i += 4 - 2; in bcj_riscv()
443 /* AUIPC's rd doesn't equal x0 or x2. */ in bcj_riscv()
444 instr2 = get_unaligned_le32(buf + i + 4); in bcj_riscv()
456 /* AUIPC's rd equals x0 or x2. */ in bcj_riscv()
461 i += 4 - 2; in bcj_riscv()
465 addr = get_unaligned_be32(buf + i + 4); in bcj_riscv()
466 addr -= s->pos + (uint32_t)i; in bcj_riscv()
475 put_unaligned_le32(instr2, buf + i + 4); in bcj_riscv()
486 * Apply the selected BCJ filter. Update *pos and s->pos to match the amount
493 static void bcj_apply(struct xz_dec_bcj *s, in bcj_apply() argument
501 switch (s->type) { in bcj_apply()
504 filtered = bcj_x86(s, buf, size); in bcj_apply()
509 filtered = bcj_powerpc(s, buf, size); in bcj_apply()
514 filtered = bcj_ia64(s, buf, size); in bcj_apply()
519 filtered = bcj_arm(s, buf, size); in bcj_apply()
524 filtered = bcj_armthumb(s, buf, size); in bcj_apply()
529 filtered = bcj_sparc(s, buf, size); in bcj_apply()
534 filtered = bcj_arm64(s, buf, size); in bcj_apply()
539 filtered = bcj_riscv(s, buf, size); in bcj_apply()
549 s->pos += filtered; in bcj_apply()
557 static void bcj_flush(struct xz_dec_bcj *s, struct xz_buf *b) in bcj_flush() argument
561 copy_size = min_t(size_t, s->temp.filtered, b->out_size - b->out_pos); in bcj_flush()
562 memcpy(b->out + b->out_pos, s->temp.buf, copy_size); in bcj_flush()
565 s->temp.filtered -= copy_size; in bcj_flush()
566 s->temp.size -= copy_size; in bcj_flush()
567 memmove(s->temp.buf, s->temp.buf + copy_size, s->temp.size); in bcj_flush()
575 enum xz_ret xz_dec_bcj_run(struct xz_dec_bcj *s, struct xz_dec_lzma2 *lzma2, in xz_dec_bcj_run() argument
585 if (s->temp.filtered > 0) { in xz_dec_bcj_run()
586 bcj_flush(s, b); in xz_dec_bcj_run()
587 if (s->temp.filtered > 0) in xz_dec_bcj_run()
590 if (s->ret == XZ_STREAM_END) in xz_dec_bcj_run()
606 if (s->temp.size < b->out_size - b->out_pos || s->temp.size == 0) { in xz_dec_bcj_run()
608 memcpy(b->out + b->out_pos, s->temp.buf, s->temp.size); in xz_dec_bcj_run()
609 b->out_pos += s->temp.size; in xz_dec_bcj_run()
611 s->ret = xz_dec_lzma2_run(lzma2, b); in xz_dec_bcj_run()
612 if (s->ret != XZ_STREAM_END in xz_dec_bcj_run()
613 && (s->ret != XZ_OK || s->single_call)) in xz_dec_bcj_run()
614 return s->ret; in xz_dec_bcj_run()
616 bcj_apply(s, b->out, &out_start, b->out_pos); in xz_dec_bcj_run()
623 if (s->ret == XZ_STREAM_END) in xz_dec_bcj_run()
626 s->temp.size = b->out_pos - out_start; in xz_dec_bcj_run()
627 b->out_pos -= s->temp.size; in xz_dec_bcj_run()
628 memcpy(s->temp.buf, b->out + b->out_pos, s->temp.size); in xz_dec_bcj_run()
632 * the output buffer with unfiltered data, there's no point in xz_dec_bcj_run()
635 if (b->out_pos + s->temp.size < b->out_size) in xz_dec_bcj_run()
648 /* Make b->out{,_pos,_size} temporarily point to s->temp. */ in xz_dec_bcj_run()
649 s->out = b->out; in xz_dec_bcj_run()
650 s->out_pos = b->out_pos; in xz_dec_bcj_run()
651 s->out_size = b->out_size; in xz_dec_bcj_run()
652 b->out = s->temp.buf; in xz_dec_bcj_run()
653 b->out_pos = s->temp.size; in xz_dec_bcj_run()
654 b->out_size = sizeof(s->temp.buf); in xz_dec_bcj_run()
656 s->ret = xz_dec_lzma2_run(lzma2, b); in xz_dec_bcj_run()
658 s->temp.size = b->out_pos; in xz_dec_bcj_run()
659 b->out = s->out; in xz_dec_bcj_run()
660 b->out_pos = s->out_pos; in xz_dec_bcj_run()
661 b->out_size = s->out_size; in xz_dec_bcj_run()
663 if (s->ret != XZ_OK && s->ret != XZ_STREAM_END) in xz_dec_bcj_run()
664 return s->ret; in xz_dec_bcj_run()
666 bcj_apply(s, s->temp.buf, &s->temp.filtered, s->temp.size); in xz_dec_bcj_run()
673 if (s->ret == XZ_STREAM_END) in xz_dec_bcj_run()
674 s->temp.filtered = s->temp.size; in xz_dec_bcj_run()
676 bcj_flush(s, b); in xz_dec_bcj_run()
677 if (s->temp.filtered > 0) in xz_dec_bcj_run()
681 return s->ret; in xz_dec_bcj_run()
686 struct xz_dec_bcj *s = kmalloc(sizeof(*s), GFP_KERNEL); in xz_dec_bcj_create() local
687 if (s != NULL) in xz_dec_bcj_create()
688 s->single_call = single_call; in xz_dec_bcj_create()
690 return s; in xz_dec_bcj_create()
693 enum xz_ret xz_dec_bcj_reset(struct xz_dec_bcj *s, uint8_t id) in xz_dec_bcj_reset() argument
727 s->type = id; in xz_dec_bcj_reset()
728 s->ret = XZ_OK; in xz_dec_bcj_reset()
729 s->pos = 0; in xz_dec_bcj_reset()
730 s->x86_prev_mask = 0; in xz_dec_bcj_reset()
731 s->temp.filtered = 0; in xz_dec_bcj_reset()
732 s->temp.size = 0; in xz_dec_bcj_reset()