1 ///////////////////////////////////////////////////////////////////////////////
4 /// \brief Filter for PowerPC (big endian) binaries
6 // Authors: Igor Pavlov
9 // This file has been put into the public domain.
10 // You can do whatever you want with this file.
12 ///////////////////////////////////////////////////////////////////////////////
14 #include "simple_private.h"
18 powerpc_code(void *simple
lzma_attribute((__unused__
)),
19 uint32_t now_pos
, bool is_encoder
,
20 uint8_t *buffer
, size_t size
)
23 for (i
= 0; i
+ 4 <= size
; i
+= 4) {
24 // PowerPC branch 6(48) 24(Offset) 1(Abs) 1(Link)
25 if ((buffer
[i
] >> 2) == 0x12
26 && ((buffer
[i
+ 3] & 3) == 1)) {
28 const uint32_t src
= ((buffer
[i
+ 0] & 3) << 24)
29 | (buffer
[i
+ 1] << 16)
30 | (buffer
[i
+ 2] << 8)
31 | (buffer
[i
+ 3] & (~3));
35 dest
= now_pos
+ (uint32_t)(i
) + src
;
37 dest
= src
- (now_pos
+ (uint32_t)(i
));
39 buffer
[i
+ 0] = 0x48 | ((dest
>> 24) & 0x03);
40 buffer
[i
+ 1] = (dest
>> 16);
41 buffer
[i
+ 2] = (dest
>> 8);
42 buffer
[i
+ 3] &= 0x03;
43 buffer
[i
+ 3] |= dest
;
52 powerpc_coder_init(lzma_next_coder
*next
, const lzma_allocator
*allocator
,
53 const lzma_filter_info
*filters
, bool is_encoder
)
55 return lzma_simple_coder_init(next
, allocator
, filters
,
56 &powerpc_code
, 0, 4, 4, is_encoder
);
61 lzma_simple_powerpc_encoder_init(lzma_next_coder
*next
,
62 const lzma_allocator
*allocator
,
63 const lzma_filter_info
*filters
)
65 return powerpc_coder_init(next
, allocator
, filters
, true);
70 lzma_simple_powerpc_decoder_init(lzma_next_coder
*next
,
71 const lzma_allocator
*allocator
,
72 const lzma_filter_info
*filters
)
74 return powerpc_coder_init(next
, allocator
, filters
, false);