arm.c revision 292588
1///////////////////////////////////////////////////////////////////////////////
2//
3/// \file       arm.c
4/// \brief      Filter for ARM binaries
5///
6//  Authors:    Igor Pavlov
7//              Lasse Collin
8//
9//  This file has been put into the public domain.
10//  You can do whatever you want with this file.
11//
12///////////////////////////////////////////////////////////////////////////////
13
14#include "simple_private.h"
15
16
17static size_t
18arm_code(lzma_simple *simple lzma_attribute((__unused__)),
19		uint32_t now_pos, bool is_encoder,
20		uint8_t *buffer, size_t size)
21{
22	size_t i;
23	for (i = 0; i + 4 <= size; i += 4) {
24		if (buffer[i + 3] == 0xEB) {
25			uint32_t src = (buffer[i + 2] << 16)
26					| (buffer[i + 1] << 8)
27					| (buffer[i + 0]);
28			src <<= 2;
29
30			uint32_t dest;
31			if (is_encoder)
32				dest = now_pos + (uint32_t)(i) + 8 + src;
33			else
34				dest = src - (now_pos + (uint32_t)(i) + 8);
35
36			dest >>= 2;
37			buffer[i + 2] = (dest >> 16);
38			buffer[i + 1] = (dest >> 8);
39			buffer[i + 0] = dest;
40		}
41	}
42
43	return i;
44}
45
46
47static lzma_ret
48arm_coder_init(lzma_next_coder *next, const lzma_allocator *allocator,
49		const lzma_filter_info *filters, bool is_encoder)
50{
51	return lzma_simple_coder_init(next, allocator, filters,
52			&arm_code, 0, 4, 4, is_encoder);
53}
54
55
56extern lzma_ret
57lzma_simple_arm_encoder_init(lzma_next_coder *next,
58		const lzma_allocator *allocator,
59		const lzma_filter_info *filters)
60{
61	return arm_coder_init(next, allocator, filters, true);
62}
63
64
65extern lzma_ret
66lzma_simple_arm_decoder_init(lzma_next_coder *next,
67		const lzma_allocator *allocator,
68		const lzma_filter_info *filters)
69{
70	return arm_coder_init(next, allocator, filters, false);
71}
72