/src/xz/src/liblzma/simple/sparc.c
Line | Count | Source (jump to first uncovered line) |
1 | | // SPDX-License-Identifier: 0BSD |
2 | | |
3 | | /////////////////////////////////////////////////////////////////////////////// |
4 | | // |
5 | | /// \file sparc.c |
6 | | /// \brief Filter for SPARC binaries |
7 | | /// |
8 | | // Authors: Igor Pavlov |
9 | | // Lasse Collin |
10 | | // |
11 | | /////////////////////////////////////////////////////////////////////////////// |
12 | | |
13 | | #include "simple_private.h" |
14 | | |
15 | | |
16 | | static size_t |
17 | | sparc_code(void *simple lzma_attribute((__unused__)), |
18 | | uint32_t now_pos, bool is_encoder, |
19 | | uint8_t *buffer, size_t size) |
20 | 494k | { |
21 | 494k | size &= ~(size_t)3; |
22 | | |
23 | 494k | size_t i; |
24 | 1.48M | for (i = 0; i < size; i += 4) { |
25 | 987k | if ((buffer[i] == 0x40 && (buffer[i + 1] & 0xC0) == 0x00) |
26 | 987k | || (buffer[i] == 0x7F |
27 | 986k | && (buffer[i + 1] & 0xC0) == 0xC0)) { |
28 | | |
29 | 1.87k | uint32_t src = ((uint32_t)buffer[i + 0] << 24) |
30 | 1.87k | | ((uint32_t)buffer[i + 1] << 16) |
31 | 1.87k | | ((uint32_t)buffer[i + 2] << 8) |
32 | 1.87k | | ((uint32_t)buffer[i + 3]); |
33 | | |
34 | 1.87k | src <<= 2; |
35 | | |
36 | 1.87k | uint32_t dest; |
37 | 1.87k | if (is_encoder) |
38 | 0 | dest = now_pos + (uint32_t)(i) + src; |
39 | 1.87k | else |
40 | 1.87k | dest = src - (now_pos + (uint32_t)(i)); |
41 | | |
42 | 1.87k | dest >>= 2; |
43 | | |
44 | 1.87k | dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) |
45 | 1.87k | | (dest & 0x3FFFFF) |
46 | 1.87k | | 0x40000000; |
47 | | |
48 | 1.87k | buffer[i + 0] = (uint8_t)(dest >> 24); |
49 | 1.87k | buffer[i + 1] = (uint8_t)(dest >> 16); |
50 | 1.87k | buffer[i + 2] = (uint8_t)(dest >> 8); |
51 | 1.87k | buffer[i + 3] = (uint8_t)(dest); |
52 | 1.87k | } |
53 | 987k | } |
54 | | |
55 | 494k | return i; |
56 | 494k | } |
57 | | |
58 | | |
59 | | static lzma_ret |
60 | | sparc_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, |
61 | | const lzma_filter_info *filters, bool is_encoder) |
62 | 1.79k | { |
63 | 1.79k | return lzma_simple_coder_init(next, allocator, filters, |
64 | 1.79k | &sparc_code, 0, 4, 4, is_encoder); |
65 | 1.79k | } |
66 | | |
67 | | |
68 | | #ifdef HAVE_ENCODER_SPARC |
69 | | extern lzma_ret |
70 | | lzma_simple_sparc_encoder_init(lzma_next_coder *next, |
71 | | const lzma_allocator *allocator, |
72 | | const lzma_filter_info *filters) |
73 | 0 | { |
74 | 0 | return sparc_coder_init(next, allocator, filters, true); |
75 | 0 | } |
76 | | #endif |
77 | | |
78 | | |
79 | | #ifdef HAVE_DECODER_SPARC |
80 | | extern lzma_ret |
81 | | lzma_simple_sparc_decoder_init(lzma_next_coder *next, |
82 | | const lzma_allocator *allocator, |
83 | | const lzma_filter_info *filters) |
84 | 1.79k | { |
85 | 1.79k | return sparc_coder_init(next, allocator, filters, false); |
86 | 1.79k | } |
87 | | #endif |