/src/CMake/Utilities/cmliblzma/liblzma/simple/powerpc.c
Line | Count | Source |
1 | | // SPDX-License-Identifier: 0BSD |
2 | | |
3 | | /////////////////////////////////////////////////////////////////////////////// |
4 | | // |
5 | | /// \file powerpc.c |
6 | | /// \brief Filter for PowerPC (big endian) binaries |
7 | | /// |
8 | | // Authors: Igor Pavlov |
9 | | // Lasse Collin |
10 | | // |
11 | | /////////////////////////////////////////////////////////////////////////////// |
12 | | |
13 | | #include "simple_private.h" |
14 | | |
15 | | |
16 | | static size_t |
17 | | powerpc_code(void *simple lzma_attribute((__unused__)), |
18 | | uint32_t now_pos, bool is_encoder, |
19 | | uint8_t *buffer, size_t size) |
20 | 120 | { |
21 | 120 | size_t i; |
22 | 862 | for (i = 0; i + 4 <= size; i += 4) { |
23 | | // PowerPC branch 6(48) 24(Offset) 1(Abs) 1(Link) |
24 | 742 | if ((buffer[i] >> 2) == 0x12 |
25 | 348 | && ((buffer[i + 3] & 3) == 1)) { |
26 | | |
27 | 344 | const uint32_t src |
28 | 344 | = (((uint32_t)(buffer[i + 0]) & 3) << 24) |
29 | 344 | | ((uint32_t)(buffer[i + 1]) << 16) |
30 | 344 | | ((uint32_t)(buffer[i + 2]) << 8) |
31 | 344 | | ((uint32_t)(buffer[i + 3]) & ~UINT32_C(3)); |
32 | | |
33 | 344 | uint32_t dest; |
34 | 344 | if (is_encoder) |
35 | 0 | dest = now_pos + (uint32_t)(i) + src; |
36 | 344 | else |
37 | 344 | dest = src - (now_pos + (uint32_t)(i)); |
38 | | |
39 | 344 | buffer[i + 0] = 0x48 | ((dest >> 24) & 0x03); |
40 | 344 | buffer[i + 1] = (dest >> 16); |
41 | 344 | buffer[i + 2] = (dest >> 8); |
42 | 344 | buffer[i + 3] &= 0x03; |
43 | 344 | buffer[i + 3] |= dest; |
44 | 344 | } |
45 | 742 | } |
46 | | |
47 | 120 | return i; |
48 | 120 | } |
49 | | |
50 | | |
51 | | static lzma_ret |
52 | | powerpc_coder_init(lzma_next_coder *next, const lzma_allocator *allocator, |
53 | | const lzma_filter_info *filters, bool is_encoder) |
54 | 42 | { |
55 | 42 | return lzma_simple_coder_init(next, allocator, filters, |
56 | 42 | &powerpc_code, 0, 4, 4, is_encoder); |
57 | 42 | } |
58 | | |
59 | | |
60 | | #ifdef HAVE_ENCODER_POWERPC |
61 | | extern lzma_ret |
62 | | lzma_simple_powerpc_encoder_init(lzma_next_coder *next, |
63 | | const lzma_allocator *allocator, |
64 | | const lzma_filter_info *filters) |
65 | 0 | { |
66 | 0 | return powerpc_coder_init(next, allocator, filters, true); |
67 | 0 | } |
68 | | #endif |
69 | | |
70 | | |
71 | | #ifdef HAVE_DECODER_POWERPC |
72 | | extern lzma_ret |
73 | | lzma_simple_powerpc_decoder_init(lzma_next_coder *next, |
74 | | const lzma_allocator *allocator, |
75 | | const lzma_filter_info *filters) |
76 | 42 | { |
77 | | return powerpc_coder_init(next, allocator, filters, false); |
78 | 42 | } |
79 | | #endif |