sparc.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // SPDX-License-Identifier: 0BSD
  2. ///////////////////////////////////////////////////////////////////////////////
  3. //
  4. /// \file sparc.c
  5. /// \brief Filter for SPARC binaries
  6. ///
  7. // Authors: Igor Pavlov
  8. // Lasse Collin
  9. //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #include "simple_private.h"
  12. static size_t
  13. sparc_code(void *simple lzma_attribute((__unused__)),
  14. uint32_t now_pos, bool is_encoder,
  15. uint8_t *buffer, size_t size)
  16. {
  17. size_t i;
  18. for (i = 0; i + 4 <= size; i += 4) {
  19. if ((buffer[i] == 0x40 && (buffer[i + 1] & 0xC0) == 0x00)
  20. || (buffer[i] == 0x7F
  21. && (buffer[i + 1] & 0xC0) == 0xC0)) {
  22. uint32_t src = ((uint32_t)buffer[i + 0] << 24)
  23. | ((uint32_t)buffer[i + 1] << 16)
  24. | ((uint32_t)buffer[i + 2] << 8)
  25. | ((uint32_t)buffer[i + 3]);
  26. src <<= 2;
  27. uint32_t dest;
  28. if (is_encoder)
  29. dest = now_pos + (uint32_t)(i) + src;
  30. else
  31. dest = src - (now_pos + (uint32_t)(i));
  32. dest >>= 2;
  33. dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF)
  34. | (dest & 0x3FFFFF)
  35. | 0x40000000;
  36. buffer[i + 0] = (uint8_t)(dest >> 24);
  37. buffer[i + 1] = (uint8_t)(dest >> 16);
  38. buffer[i + 2] = (uint8_t)(dest >> 8);
  39. buffer[i + 3] = (uint8_t)(dest);
  40. }
  41. }
  42. return i;
  43. }
  44. static lzma_ret
  45. sparc_coder_init(lzma_next_coder *next, const lzma_allocator *allocator,
  46. const lzma_filter_info *filters, bool is_encoder)
  47. {
  48. return lzma_simple_coder_init(next, allocator, filters,
  49. &sparc_code, 0, 4, 4, is_encoder);
  50. }
  51. #ifdef HAVE_ENCODER_SPARC
  52. extern lzma_ret
  53. lzma_simple_sparc_encoder_init(lzma_next_coder *next,
  54. const lzma_allocator *allocator,
  55. const lzma_filter_info *filters)
  56. {
  57. return sparc_coder_init(next, allocator, filters, true);
  58. }
  59. #endif
  60. #ifdef HAVE_DECODER_SPARC
  61. extern lzma_ret
  62. lzma_simple_sparc_decoder_init(lzma_next_coder *next,
  63. const lzma_allocator *allocator,
  64. const lzma_filter_info *filters)
  65. {
  66. return sparc_coder_init(next, allocator, filters, false);
  67. }
  68. #endif