1229159Sadrian/*
2229159Sadrian * Private includes and definitions
3229159Sadrian *
4229159Sadrian * Author: Lasse Collin <lasse.collin@tukaani.org>
5229159Sadrian *
6229159Sadrian * This file has been put into the public domain.
7229159Sadrian * You can do whatever you want with this file.
8229159Sadrian */
9229159Sadrian
10229159Sadrian#ifndef XZ_PRIVATE_H
11229159Sadrian#define XZ_PRIVATE_H
12229159Sadrian
13229159Sadrian#ifdef __KERNEL__
14229159Sadrian#	include <linux/xz.h>
15229159Sadrian#	include <linux/kernel.h>
16229159Sadrian#	include <asm/unaligned.h>
17229159Sadrian	/* XZ_PREBOOT may be defined only via decompress_unxz.c. */
18229159Sadrian#	ifndef XZ_PREBOOT
19229159Sadrian#		include <linux/slab.h>
20229159Sadrian#		include <linux/vmalloc.h>
21229159Sadrian#		include <linux/string.h>
22229159Sadrian#		ifdef CONFIG_XZ_DEC_X86
23229159Sadrian#			define XZ_DEC_X86
24229159Sadrian#		endif
25229159Sadrian#		ifdef CONFIG_XZ_DEC_POWERPC
26229159Sadrian#			define XZ_DEC_POWERPC
27229159Sadrian#		endif
28229159Sadrian#		ifdef CONFIG_XZ_DEC_IA64
29229159Sadrian#			define XZ_DEC_IA64
30229159Sadrian#		endif
31229159Sadrian#		ifdef CONFIG_XZ_DEC_ARM
32229159Sadrian#			define XZ_DEC_ARM
33229159Sadrian#		endif
34229159Sadrian#		ifdef CONFIG_XZ_DEC_ARMTHUMB
35229159Sadrian#			define XZ_DEC_ARMTHUMB
36229159Sadrian#		endif
37229159Sadrian#		ifdef CONFIG_XZ_DEC_SPARC
38229159Sadrian#			define XZ_DEC_SPARC
39229159Sadrian#		endif
40229159Sadrian#		define memeq(a, b, size) (memcmp(a, b, size) == 0)
41229159Sadrian#		define memzero(buf, size) memset(buf, 0, size)
42229159Sadrian#	endif
43229159Sadrian#	define get_le32(p) le32_to_cpup((const uint32_t *)(p))
44229159Sadrian#else
45229159Sadrian	/*
46229159Sadrian	 * For userspace builds, use a separate header to define the required
47229159Sadrian	 * macros and functions. This makes it easier to adapt the code into
48229159Sadrian	 * different environments and avoids clutter in the Linux kernel tree.
49229159Sadrian	 */
50229533Sray#	include <contrib/xz-embedded/freebsd/xz_config.h>
51229159Sadrian#endif
52229159Sadrian
53229159Sadrian/* If no specific decoding mode is requested, enable support for all modes. */
54229159Sadrian#if !defined(XZ_DEC_SINGLE) && !defined(XZ_DEC_PREALLOC) \
55229159Sadrian		&& !defined(XZ_DEC_DYNALLOC)
56229159Sadrian#	define XZ_DEC_SINGLE
57229159Sadrian#	define XZ_DEC_PREALLOC
58229159Sadrian#	define XZ_DEC_DYNALLOC
59229159Sadrian#endif
60229159Sadrian
61229159Sadrian/*
62229159Sadrian * The DEC_IS_foo(mode) macros are used in "if" statements. If only some
63229159Sadrian * of the supported modes are enabled, these macros will evaluate to true or
64229159Sadrian * false at compile time and thus allow the compiler to omit unneeded code.
65229159Sadrian */
66229159Sadrian#ifdef XZ_DEC_SINGLE
67229159Sadrian#	define DEC_IS_SINGLE(mode) ((mode) == XZ_SINGLE)
68229159Sadrian#else
69229159Sadrian#	define DEC_IS_SINGLE(mode) (false)
70229159Sadrian#endif
71229159Sadrian
72229159Sadrian#ifdef XZ_DEC_PREALLOC
73229159Sadrian#	define DEC_IS_PREALLOC(mode) ((mode) == XZ_PREALLOC)
74229159Sadrian#else
75229159Sadrian#	define DEC_IS_PREALLOC(mode) (false)
76229159Sadrian#endif
77229159Sadrian
78229159Sadrian#ifdef XZ_DEC_DYNALLOC
79229159Sadrian#	define DEC_IS_DYNALLOC(mode) ((mode) == XZ_DYNALLOC)
80229159Sadrian#else
81229159Sadrian#	define DEC_IS_DYNALLOC(mode) (false)
82229159Sadrian#endif
83229159Sadrian
84229159Sadrian#if !defined(XZ_DEC_SINGLE)
85229159Sadrian#	define DEC_IS_MULTI(mode) (true)
86229159Sadrian#elif defined(XZ_DEC_PREALLOC) || defined(XZ_DEC_DYNALLOC)
87229159Sadrian#	define DEC_IS_MULTI(mode) ((mode) != XZ_SINGLE)
88229159Sadrian#else
89229159Sadrian#	define DEC_IS_MULTI(mode) (false)
90229159Sadrian#endif
91229159Sadrian
92229159Sadrian/*
93229159Sadrian * If any of the BCJ filter decoders are wanted, define XZ_DEC_BCJ.
94229159Sadrian * XZ_DEC_BCJ is used to enable generic support for BCJ decoders.
95229159Sadrian */
96229159Sadrian#ifndef XZ_DEC_BCJ
97229159Sadrian#	if defined(XZ_DEC_X86) || defined(XZ_DEC_POWERPC) \
98229159Sadrian			|| defined(XZ_DEC_IA64) || defined(XZ_DEC_ARM) \
99229159Sadrian			|| defined(XZ_DEC_ARM) || defined(XZ_DEC_ARMTHUMB) \
100229159Sadrian			|| defined(XZ_DEC_SPARC)
101229159Sadrian#		define XZ_DEC_BCJ
102229159Sadrian#	endif
103229159Sadrian#endif
104229159Sadrian
105229159Sadrian/*
106229159Sadrian * Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used
107229159Sadrian * before calling xz_dec_lzma2_run().
108229159Sadrian */
109229159SadrianXZ_EXTERN struct xz_dec_lzma2 *xz_dec_lzma2_create(enum xz_mode mode,
110229159Sadrian						   uint32_t dict_max);
111229159Sadrian
112229159Sadrian/*
113229159Sadrian * Decode the LZMA2 properties (one byte) and reset the decoder. Return
114229159Sadrian * XZ_OK on success, XZ_MEMLIMIT_ERROR if the preallocated dictionary is not
115229159Sadrian * big enough, and XZ_OPTIONS_ERROR if props indicates something that this
116229159Sadrian * decoder doesn't support.
117229159Sadrian */
118229159SadrianXZ_EXTERN enum xz_ret xz_dec_lzma2_reset(struct xz_dec_lzma2 *s,
119229159Sadrian					 uint8_t props);
120229159Sadrian
121229159Sadrian/* Decode raw LZMA2 stream from b->in to b->out. */
122229159SadrianXZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s,
123229159Sadrian				       struct xz_buf *b);
124229159Sadrian
125229159Sadrian/* Free the memory allocated for the LZMA2 decoder. */
126229159SadrianXZ_EXTERN void xz_dec_lzma2_end(struct xz_dec_lzma2 *s);
127229159Sadrian
128229159Sadrian#ifdef XZ_DEC_BCJ
129229159Sadrian/*
130229159Sadrian * Allocate memory for BCJ decoders. xz_dec_bcj_reset() must be used before
131229159Sadrian * calling xz_dec_bcj_run().
132229159Sadrian */
133229159SadrianXZ_EXTERN struct xz_dec_bcj *xz_dec_bcj_create(bool single_call);
134229159Sadrian
135229159Sadrian/*
136229159Sadrian * Decode the Filter ID of a BCJ filter. This implementation doesn't
137229159Sadrian * support custom start offsets, so no decoding of Filter Properties
138229159Sadrian * is needed. Returns XZ_OK if the given Filter ID is supported.
139229159Sadrian * Otherwise XZ_OPTIONS_ERROR is returned.
140229159Sadrian */
141229159SadrianXZ_EXTERN enum xz_ret xz_dec_bcj_reset(struct xz_dec_bcj *s, uint8_t id);
142229159Sadrian
143229159Sadrian/*
144229159Sadrian * Decode raw BCJ + LZMA2 stream. This must be used only if there actually is
145229159Sadrian * a BCJ filter in the chain. If the chain has only LZMA2, xz_dec_lzma2_run()
146229159Sadrian * must be called directly.
147229159Sadrian */
148229159SadrianXZ_EXTERN enum xz_ret xz_dec_bcj_run(struct xz_dec_bcj *s,
149229159Sadrian				     struct xz_dec_lzma2 *lzma2,
150229159Sadrian				     struct xz_buf *b);
151229159Sadrian
152229159Sadrian/* Free the memory allocated for the BCJ filters. */
153229159Sadrian#define xz_dec_bcj_end(s) kfree(s)
154229159Sadrian#endif
155229159Sadrian
156229159Sadrian#endif
157