Coverage Report

Created: 2025-07-11 06:24

/src/lzma-fuzz/sdk/C/Bra.c
Line
Count
Source (jump to first uncovered line)
1
/* Bra.c -- Converters for RISC code
2
2017-04-04 : Igor Pavlov : Public domain */
3
4
#include "Precomp.h"
5
6
#include "CpuArch.h"
7
#include "Bra.h"
8
9
SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
10
8
{
11
8
  Byte *p;
12
8
  const Byte *lim;
13
8
  size &= ~(size_t)3;
14
8
  ip += 4;
15
8
  p = data;
16
8
  lim = data + size;
17
18
8
  if (encoding)
19
20
0
  for (;;)
21
0
  {
22
0
    for (;;)
23
0
    {
24
0
      if (p >= lim)
25
0
        return p - data;
26
0
      p += 4;
27
0
      if (p[-1] == 0xEB)
28
0
        break;
29
0
    }
30
0
    {
31
0
      UInt32 v = GetUi32(p - 4);
32
0
      v <<= 2;
33
0
        v += ip + (UInt32)(p - data);
34
0
      v >>= 2;
35
0
      v &= 0x00FFFFFF;
36
0
      v |= 0xEB000000;
37
0
      SetUi32(p - 4, v);
38
0
    }
39
0
  }
40
41
8
  for (;;)
42
36
  {
43
36
    for (;;)
44
136
    {
45
136
      if (p >= lim)
46
8
        return p - data;
47
128
      p += 4;
48
128
      if (p[-1] == 0xEB)
49
28
        break;
50
128
    }
51
28
    {
52
28
      UInt32 v = GetUi32(p - 4);
53
28
      v <<= 2;
54
28
        v -= ip + (UInt32)(p - data);
55
28
      v >>= 2;
56
28
      v &= 0x00FFFFFF;
57
28
      v |= 0xEB000000;
58
28
      SetUi32(p - 4, v);
59
28
    }
60
28
  }
61
8
}
62
63
64
SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
65
6
{
66
6
  Byte *p;
67
6
  const Byte *lim;
68
6
  size &= ~(size_t)1;
69
6
  p = data;
70
6
  lim = data + size - 4;
71
72
6
  if (encoding)
73
  
74
0
  for (;;)
75
0
  {
76
0
    UInt32 b1;
77
0
    for (;;)
78
0
    {
79
0
      UInt32 b3;
80
0
      if (p > lim)
81
0
        return p - data;
82
0
      b1 = p[1];
83
0
      b3 = p[3];
84
0
      p += 2;
85
0
      b1 ^= 8;
86
0
      if ((b3 & b1) >= 0xF8)
87
0
        break;
88
0
    }
89
0
    {
90
0
      UInt32 v =
91
0
             ((UInt32)b1 << 19)
92
0
          + (((UInt32)p[1] & 0x7) << 8)
93
0
          + (((UInt32)p[-2] << 11))
94
0
          + (p[0]);
95
96
0
      p += 2;
97
0
      {
98
0
        UInt32 cur = (ip + (UInt32)(p - data)) >> 1;
99
0
          v += cur;
100
0
      }
101
102
0
      p[-4] = (Byte)(v >> 11);
103
0
      p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));
104
0
      p[-2] = (Byte)v;
105
0
      p[-1] = (Byte)(0xF8 | (v >> 8));
106
0
    }
107
0
  }
108
  
109
6
  for (;;)
110
22
  {
111
22
    UInt32 b1;
112
22
    for (;;)
113
184
    {
114
184
      UInt32 b3;
115
184
      if (p > lim)
116
6
        return p - data;
117
178
      b1 = p[1];
118
178
      b3 = p[3];
119
178
      p += 2;
120
178
      b1 ^= 8;
121
178
      if ((b3 & b1) >= 0xF8)
122
16
        break;
123
178
    }
124
16
    {
125
16
      UInt32 v =
126
16
             ((UInt32)b1 << 19)
127
16
          + (((UInt32)p[1] & 0x7) << 8)
128
16
          + (((UInt32)p[-2] << 11))
129
16
          + (p[0]);
130
131
16
      p += 2;
132
16
      {
133
16
        UInt32 cur = (ip + (UInt32)(p - data)) >> 1;
134
16
          v -= cur;
135
16
      }
136
137
      /*
138
      SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000));
139
      SetUi16(p - 2, (UInt16)(v | 0xF800));
140
      */
141
      
142
16
      p[-4] = (Byte)(v >> 11);
143
16
      p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));
144
16
      p[-2] = (Byte)v;
145
16
      p[-1] = (Byte)(0xF8 | (v >> 8));
146
16
    }
147
16
  }
148
6
}
149
150
151
SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
152
10
{
153
10
  Byte *p;
154
10
  const Byte *lim;
155
10
  size &= ~(size_t)3;
156
10
  ip -= 4;
157
10
  p = data;
158
10
  lim = data + size;
159
160
10
  for (;;)
161
37
  {
162
37
    for (;;)
163
170
    {
164
170
      if (p >= lim)
165
10
        return p - data;
166
160
      p += 4;
167
      /* if ((v & 0xFC000003) == 0x48000001) */
168
160
      if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1)
169
27
        break;
170
160
    }
171
27
    {
172
27
      UInt32 v = GetBe32(p - 4);
173
27
      if (encoding)
174
0
        v += ip + (UInt32)(p - data);
175
27
      else
176
27
        v -= ip + (UInt32)(p - data);
177
27
      v &= 0x03FFFFFF;
178
27
      v |= 0x48000000;
179
27
      SetBe32(p - 4, v);
180
27
    }
181
27
  }
182
10
}
183
184
185
SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
186
3
{
187
3
  Byte *p;
188
3
  const Byte *lim;
189
3
  size &= ~(size_t)3;
190
3
  ip -= 4;
191
3
  p = data;
192
3
  lim = data + size;
193
194
3
  for (;;)
195
3
  {
196
3
    for (;;)
197
51
    {
198
51
      if (p >= lim)
199
3
        return p - data;
200
      /*
201
      v = GetBe32(p);
202
      p += 4;
203
      m = v + ((UInt32)5 << 29);
204
      m ^= (UInt32)7 << 29;
205
      m += (UInt32)1 << 22;
206
      if ((m & ((UInt32)0x1FF << 23)) == 0)
207
        break;
208
      */
209
48
      p += 4;
210
48
      if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) ||
211
48
          (p[-4] == 0x7F && (p[-3] >= 0xC0)))
212
0
        break;
213
48
    }
214
0
    {
215
0
      UInt32 v = GetBe32(p - 4);
216
0
      v <<= 2;
217
0
      if (encoding)
218
0
        v += ip + (UInt32)(p - data);
219
0
      else
220
0
        v -= ip + (UInt32)(p - data);
221
      
222
0
      v &= 0x01FFFFFF;
223
0
      v -= (UInt32)1 << 24;
224
0
      v ^= 0xFF000000;
225
0
      v >>= 2;
226
0
      v |= 0x40000000;
227
0
      SetBe32(p - 4, v);
228
0
    }
229
0
  }
230
3
}