(root)/
xz-5.4.5/
src/
liblzma/
simple/
arm.c
       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  
      17  static size_t
      18  arm_code(void *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 = ((uint32_t)(buffer[i + 2]) << 16)
      26  					| ((uint32_t)(buffer[i + 1]) << 8)
      27  					| (uint32_t)(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  
      47  static lzma_ret
      48  arm_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  
      56  #ifdef HAVE_ENCODER_ARM
      57  extern lzma_ret
      58  lzma_simple_arm_encoder_init(lzma_next_coder *next,
      59  		const lzma_allocator *allocator,
      60  		const lzma_filter_info *filters)
      61  {
      62  	return arm_coder_init(next, allocator, filters, true);
      63  }
      64  #endif
      65  
      66  
      67  #ifdef HAVE_DECODER_ARM
      68  extern lzma_ret
      69  lzma_simple_arm_decoder_init(lzma_next_coder *next,
      70  		const lzma_allocator *allocator,
      71  		const lzma_filter_info *filters)
      72  {
      73  	return arm_coder_init(next, allocator, filters, false);
      74  }
      75  #endif