source: rtems/cpukit/include/xz.h @ 2afb22b

5
Last change on this file since 2afb22b was 2afb22b, checked in by Chris Johns <chrisj@…>, on 12/23/17 at 07:18:56

Remove make preinstall

A speciality of the RTEMS build system was the make preinstall step. It
copied header files from arbitrary locations into the build tree. The
header files were included via the -Bsome/build/tree/path GCC command
line option.

This has at least seven problems:

  • The make preinstall step itself needs time and disk space.
  • Errors in header files show up in the build tree copy. This makes it hard for editors to open the right file to fix the error.
  • There is no clear relationship between source and build tree header files. This makes an audit of the build process difficult.
  • The visibility of all header files in the build tree makes it difficult to enforce API barriers. For example it is discouraged to use BSP-specifics in the cpukit.
  • An introduction of a new build system is difficult.
  • Include paths specified by the -B option are system headers. This may suppress warnings.
  • The parallel build had sporadic failures on some hosts.

This patch removes the make preinstall step. All installed header
files are moved to dedicated include directories in the source tree.
Let @RTEMS_CPU@ be the target architecture, e.g. arm, powerpc, sparc,
etc. Let @RTEMS_BSP_FAMILIY@ be a BSP family base directory, e.g.
erc32, imx, qoriq, etc.

The new cpukit include directories are:

  • cpukit/include
  • cpukit/score/cpu/@RTEMS_CPU@/include
  • cpukit/libnetworking

The new BSP include directories are:

  • bsps/include
  • bsps/@RTEMS_CPU@/include
  • bsps/@RTEMS_CPU@/@RTEMS_BSP_FAMILIY@/include

There are build tree include directories for generated files.

The include directory order favours the most general header file, e.g.
it is not possible to override general header files via the include path
order.

The "bootstrap -p" option was removed. The new "bootstrap -H" option
should be used to regenerate the "headers.am" files.

Update #3254.

  • Property mode set to 100644
File size: 12.1 KB
Line 
1/*
2 * XZ decompressor
3 *
4 * Authors: Lasse Collin <lasse.collin@tukaani.org>
5 *          Igor Pavlov <http://7-zip.org/>
6 *
7 * This file has been put into the public domain.
8 * You can do whatever you want with this file.
9 */
10
11#ifndef XZ_H
12#define XZ_H
13
14#ifdef __KERNEL__
15#       include <linux/stddef.h>
16#       include <linux/types.h>
17#else
18#       include <stddef.h>
19#       include <stdint.h>
20#endif
21
22#ifdef __cplusplus
23extern "C" {
24#endif
25
26/* In Linux, this is used to make extern functions static when needed. */
27#ifndef XZ_EXTERN
28#       define XZ_EXTERN extern
29#endif
30
31/**
32 * enum xz_mode - Operation mode
33 *
34 * @XZ_SINGLE:              Single-call mode. This uses less RAM than
35 *                          than multi-call modes, because the LZMA2
36 *                          dictionary doesn't need to be allocated as
37 *                          part of the decoder state. All required data
38 *                          structures are allocated at initialization,
39 *                          so xz_dec_run() cannot return XZ_MEM_ERROR.
40 * @XZ_PREALLOC:            Multi-call mode with preallocated LZMA2
41 *                          dictionary buffer. All data structures are
42 *                          allocated at initialization, so xz_dec_run()
43 *                          cannot return XZ_MEM_ERROR.
44 * @XZ_DYNALLOC:            Multi-call mode. The LZMA2 dictionary is
45 *                          allocated once the required size has been
46 *                          parsed from the stream headers. If the
47 *                          allocation fails, xz_dec_run() will return
48 *                          XZ_MEM_ERROR.
49 *
50 * It is possible to enable support only for a subset of the above
51 * modes at compile time by defining XZ_DEC_SINGLE, XZ_DEC_PREALLOC,
52 * or XZ_DEC_DYNALLOC. The xz_dec kernel module is always compiled
53 * with support for all operation modes, but the preboot code may
54 * be built with fewer features to minimize code size.
55 */
56enum xz_mode {
57        XZ_SINGLE,
58        XZ_PREALLOC,
59        XZ_DYNALLOC
60};
61
62/**
63 * enum xz_ret - Return codes
64 * @XZ_OK:                  Everything is OK so far. More input or more
65 *                          output space is required to continue. This
66 *                          return code is possible only in multi-call mode
67 *                          (XZ_PREALLOC or XZ_DYNALLOC).
68 * @XZ_STREAM_END:          Operation finished successfully.
69 * @XZ_UNSUPPORTED_CHECK:   Integrity check type is not supported. Decoding
70 *                          is still possible in multi-call mode by simply
71 *                          calling xz_dec_run() again.
72 *                          Note that this return value is used only if
73 *                          XZ_DEC_ANY_CHECK was defined at build time,
74 *                          which is not used in the kernel. Unsupported
75 *                          check types return XZ_OPTIONS_ERROR if
76 *                          XZ_DEC_ANY_CHECK was not defined at build time.
77 * @XZ_MEM_ERROR:           Allocating memory failed. This return code is
78 *                          possible only if the decoder was initialized
79 *                          with XZ_DYNALLOC. The amount of memory that was
80 *                          tried to be allocated was no more than the
81 *                          dict_max argument given to xz_dec_init().
82 * @XZ_MEMLIMIT_ERROR:      A bigger LZMA2 dictionary would be needed than
83 *                          allowed by the dict_max argument given to
84 *                          xz_dec_init(). This return value is possible
85 *                          only in multi-call mode (XZ_PREALLOC or
86 *                          XZ_DYNALLOC); the single-call mode (XZ_SINGLE)
87 *                          ignores the dict_max argument.
88 * @XZ_FORMAT_ERROR:        File format was not recognized (wrong magic
89 *                          bytes).
90 * @XZ_OPTIONS_ERROR:       This implementation doesn't support the requested
91 *                          compression options. In the decoder this means
92 *                          that the header CRC32 matches, but the header
93 *                          itself specifies something that we don't support.
94 * @XZ_DATA_ERROR:          Compressed data is corrupt.
95 * @XZ_BUF_ERROR:           Cannot make any progress. Details are slightly
96 *                          different between multi-call and single-call
97 *                          mode; more information below.
98 *
99 * In multi-call mode, XZ_BUF_ERROR is returned when two consecutive calls
100 * to XZ code cannot consume any input and cannot produce any new output.
101 * This happens when there is no new input available, or the output buffer
102 * is full while at least one output byte is still pending. Assuming your
103 * code is not buggy, you can get this error only when decoding a compressed
104 * stream that is truncated or otherwise corrupt.
105 *
106 * In single-call mode, XZ_BUF_ERROR is returned only when the output buffer
107 * is too small or the compressed input is corrupt in a way that makes the
108 * decoder produce more output than the caller expected. When it is
109 * (relatively) clear that the compressed input is truncated, XZ_DATA_ERROR
110 * is used instead of XZ_BUF_ERROR.
111 */
112enum xz_ret {
113        XZ_OK,
114        XZ_STREAM_END,
115        XZ_UNSUPPORTED_CHECK,
116        XZ_MEM_ERROR,
117        XZ_MEMLIMIT_ERROR,
118        XZ_FORMAT_ERROR,
119        XZ_OPTIONS_ERROR,
120        XZ_DATA_ERROR,
121        XZ_BUF_ERROR
122};
123
124/**
125 * struct xz_buf - Passing input and output buffers to XZ code
126 * @in:         Beginning of the input buffer. This may be NULL if and only
127 *              if in_pos is equal to in_size.
128 * @in_pos:     Current position in the input buffer. This must not exceed
129 *              in_size.
130 * @in_size:    Size of the input buffer
131 * @out:        Beginning of the output buffer. This may be NULL if and only
132 *              if out_pos is equal to out_size.
133 * @out_pos:    Current position in the output buffer. This must not exceed
134 *              out_size.
135 * @out_size:   Size of the output buffer
136 *
137 * Only the contents of the output buffer from out[out_pos] onward, and
138 * the variables in_pos and out_pos are modified by the XZ code.
139 */
140struct xz_buf {
141        const uint8_t *in;
142        size_t in_pos;
143        size_t in_size;
144
145        uint8_t *out;
146        size_t out_pos;
147        size_t out_size;
148};
149
150/**
151 * struct xz_dec - Opaque type to hold the XZ decoder state
152 */
153struct xz_dec;
154
155/**
156 * xz_dec_init() - Allocate and initialize a XZ decoder state
157 * @mode:       Operation mode
158 * @dict_max:   Maximum size of the LZMA2 dictionary (history buffer) for
159 *              multi-call decoding. This is ignored in single-call mode
160 *              (mode == XZ_SINGLE). LZMA2 dictionary is always 2^n bytes
161 *              or 2^n + 2^(n-1) bytes (the latter sizes are less common
162 *              in practice), so other values for dict_max don't make sense.
163 *              In the kernel, dictionary sizes of 64 KiB, 128 KiB, 256 KiB,
164 *              512 KiB, and 1 MiB are probably the only reasonable values,
165 *              except for kernel and initramfs images where a bigger
166 *              dictionary can be fine and useful.
167 *
168 * Single-call mode (XZ_SINGLE): xz_dec_run() decodes the whole stream at
169 * once. The caller must provide enough output space or the decoding will
170 * fail. The output space is used as the dictionary buffer, which is why
171 * there is no need to allocate the dictionary as part of the decoder's
172 * internal state.
173 *
174 * Because the output buffer is used as the workspace, streams encoded using
175 * a big dictionary are not a problem in single-call mode. It is enough that
176 * the output buffer is big enough to hold the actual uncompressed data; it
177 * can be smaller than the dictionary size stored in the stream headers.
178 *
179 * Multi-call mode with preallocated dictionary (XZ_PREALLOC): dict_max bytes
180 * of memory is preallocated for the LZMA2 dictionary. This way there is no
181 * risk that xz_dec_run() could run out of memory, since xz_dec_run() will
182 * never allocate any memory. Instead, if the preallocated dictionary is too
183 * small for decoding the given input stream, xz_dec_run() will return
184 * XZ_MEMLIMIT_ERROR. Thus, it is important to know what kind of data will be
185 * decoded to avoid allocating excessive amount of memory for the dictionary.
186 *
187 * Multi-call mode with dynamically allocated dictionary (XZ_DYNALLOC):
188 * dict_max specifies the maximum allowed dictionary size that xz_dec_run()
189 * may allocate once it has parsed the dictionary size from the stream
190 * headers. This way excessive allocations can be avoided while still
191 * limiting the maximum memory usage to a sane value to prevent running the
192 * system out of memory when decompressing streams from untrusted sources.
193 *
194 * On success, xz_dec_init() returns a pointer to struct xz_dec, which is
195 * ready to be used with xz_dec_run(). If memory allocation fails,
196 * xz_dec_init() returns NULL.
197 */
198XZ_EXTERN struct xz_dec *xz_dec_init(enum xz_mode mode, uint32_t dict_max);
199
200/**
201 * xz_dec_run() - Run the XZ decoder
202 * @s:          Decoder state allocated using xz_dec_init()
203 * @b:          Input and output buffers
204 *
205 * The possible return values depend on build options and operation mode.
206 * See enum xz_ret for details.
207 *
208 * Note that if an error occurs in single-call mode (return value is not
209 * XZ_STREAM_END), b->in_pos and b->out_pos are not modified and the
210 * contents of the output buffer from b->out[b->out_pos] onward are
211 * undefined. This is true even after XZ_BUF_ERROR, because with some filter
212 * chains, there may be a second pass over the output buffer, and this pass
213 * cannot be properly done if the output buffer is truncated. Thus, you
214 * cannot give the single-call decoder a too small buffer and then expect to
215 * get that amount valid data from the beginning of the stream. You must use
216 * the multi-call decoder if you don't want to uncompress the whole stream.
217 */
218XZ_EXTERN enum xz_ret xz_dec_run(struct xz_dec *s, struct xz_buf *b);
219
220/**
221 * xz_dec_reset() - Reset an already allocated decoder state
222 * @s:          Decoder state allocated using xz_dec_init()
223 *
224 * This function can be used to reset the multi-call decoder state without
225 * freeing and reallocating memory with xz_dec_end() and xz_dec_init().
226 *
227 * In single-call mode, xz_dec_reset() is always called in the beginning of
228 * xz_dec_run(). Thus, explicit call to xz_dec_reset() is useful only in
229 * multi-call mode.
230 */
231XZ_EXTERN void xz_dec_reset(struct xz_dec *s);
232
233/**
234 * xz_dec_end() - Free the memory allocated for the decoder state
235 * @s:          Decoder state allocated using xz_dec_init(). If s is NULL,
236 *              this function does nothing.
237 */
238XZ_EXTERN void xz_dec_end(struct xz_dec *s);
239
240/*
241 * Standalone build (userspace build or in-kernel build for boot time use)
242 * needs a CRC32 implementation. For normal in-kernel use, kernel's own
243 * CRC32 module is used instead, and users of this module don't need to
244 * care about the functions below.
245 */
246#ifndef XZ_INTERNAL_CRC32
247#       ifdef __KERNEL__
248#               define XZ_INTERNAL_CRC32 0
249#       else
250#               define XZ_INTERNAL_CRC32 1
251#       endif
252#endif
253
254/*
255 * If CRC64 support has been enabled with XZ_USE_CRC64, a CRC64
256 * implementation is needed too.
257 */
258#ifndef XZ_USE_CRC64
259#       undef XZ_INTERNAL_CRC64
260#       define XZ_INTERNAL_CRC64 0
261#endif
262#ifndef XZ_INTERNAL_CRC64
263#       ifdef __KERNEL__
264#               error Using CRC64 in the kernel has not been implemented.
265#       else
266#               define XZ_INTERNAL_CRC64 1
267#       endif
268#endif
269
270#if XZ_INTERNAL_CRC32
271/*
272 * This must be called before any other xz_* function to initialize
273 * the CRC32 lookup table.
274 */
275XZ_EXTERN void xz_crc32_init(void);
276
277/*
278 * Update CRC32 value using the polynomial from IEEE-802.3. To start a new
279 * calculation, the third argument must be zero. To continue the calculation,
280 * the previously returned value is passed as the third argument.
281 */
282XZ_EXTERN uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc);
283#endif
284
285#if XZ_INTERNAL_CRC64
286/*
287 * This must be called before any other xz_* function (except xz_crc32_init())
288 * to initialize the CRC64 lookup table.
289 */
290XZ_EXTERN void xz_crc64_init(void);
291
292/*
293 * Update CRC64 value using the polynomial from ECMA-182. To start a new
294 * calculation, the third argument must be zero. To continue the calculation,
295 * the previously returned value is passed as the third argument.
296 */
297XZ_EXTERN uint64_t xz_crc64(const uint8_t *buf, size_t size, uint64_t crc);
298#endif
299
300#ifdef __cplusplus
301}
302#endif
303
304#endif
Note: See TracBrowser for help on using the repository browser.