1 ///////////////////////////////////////////////////////////////////////////////
4 /// \brief Filter for ARM-Thumb 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 armthumb_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
+= 2) {
24 if ((buffer
[i
+ 1] & 0xF8) == 0xF0
25 && (buffer
[i
+ 3] & 0xF8) == 0xF8) {
26 uint32_t src
= ((buffer
[i
+ 1] & 0x7) << 19)
27 | (buffer
[i
+ 0] << 11)
28 | ((buffer
[i
+ 3] & 0x7) << 8)
35 dest
= now_pos
+ (uint32_t)(i
) + 4 + src
;
37 dest
= src
- (now_pos
+ (uint32_t)(i
) + 4);
40 buffer
[i
+ 1] = 0xF0 | ((dest
>> 19) & 0x7);
41 buffer
[i
+ 0] = (dest
>> 11);
42 buffer
[i
+ 3] = 0xF8 | ((dest
>> 8) & 0x7);
43 buffer
[i
+ 2] = (dest
);
53 armthumb_coder_init(lzma_next_coder
*next
, const lzma_allocator
*allocator
,
54 const lzma_filter_info
*filters
, bool is_encoder
)
56 return lzma_simple_coder_init(next
, allocator
, filters
,
57 &armthumb_code
, 0, 4, 2, is_encoder
);
62 lzma_simple_armthumb_encoder_init(lzma_next_coder
*next
,
63 const lzma_allocator
*allocator
,
64 const lzma_filter_info
*filters
)
66 return armthumb_coder_init(next
, allocator
, filters
, true);
71 lzma_simple_armthumb_decoder_init(lzma_next_coder
*next
,
72 const lzma_allocator
*allocator
,
73 const lzma_filter_info
*filters
)
75 return armthumb_coder_init(next
, allocator
, filters
, false);