Path: blob/master/Utilities/cmliblzma/liblzma/simple/armthumb.c
3156 views
// SPDX-License-Identifier: 0BSD12///////////////////////////////////////////////////////////////////////////////3//4/// \file armthumb.c5/// \brief Filter for ARM-Thumb binaries6///7// Authors: Igor Pavlov8// Lasse Collin9//10///////////////////////////////////////////////////////////////////////////////1112#include "simple_private.h"131415static size_t16armthumb_code(void *simple lzma_attribute((__unused__)),17uint32_t now_pos, bool is_encoder,18uint8_t *buffer, size_t size)19{20size_t i;21for (i = 0; i + 4 <= size; i += 2) {22if ((buffer[i + 1] & 0xF8) == 0xF023&& (buffer[i + 3] & 0xF8) == 0xF8) {24uint32_t src = (((uint32_t)(buffer[i + 1]) & 7) << 19)25| ((uint32_t)(buffer[i + 0]) << 11)26| (((uint32_t)(buffer[i + 3]) & 7) << 8)27| (uint32_t)(buffer[i + 2]);2829src <<= 1;3031uint32_t dest;32if (is_encoder)33dest = now_pos + (uint32_t)(i) + 4 + src;34else35dest = src - (now_pos + (uint32_t)(i) + 4);3637dest >>= 1;38buffer[i + 1] = 0xF0 | ((dest >> 19) & 0x7);39buffer[i + 0] = (dest >> 11);40buffer[i + 3] = 0xF8 | ((dest >> 8) & 0x7);41buffer[i + 2] = (dest);42i += 2;43}44}4546return i;47}484950static lzma_ret51armthumb_coder_init(lzma_next_coder *next, const lzma_allocator *allocator,52const lzma_filter_info *filters, bool is_encoder)53{54return lzma_simple_coder_init(next, allocator, filters,55&armthumb_code, 0, 4, 2, is_encoder);56}575859#ifdef HAVE_ENCODER_ARMTHUMB60extern lzma_ret61lzma_simple_armthumb_encoder_init(lzma_next_coder *next,62const lzma_allocator *allocator,63const lzma_filter_info *filters)64{65return armthumb_coder_init(next, allocator, filters, true);66}67#endif686970#ifdef HAVE_DECODER_ARMTHUMB71extern lzma_ret72lzma_simple_armthumb_decoder_init(lzma_next_coder *next,73const lzma_allocator *allocator,74const lzma_filter_info *filters)75{76return armthumb_coder_init(next, allocator, filters, false);77}78#endif798081