/* xz_config.h - Private includes and definitions for userspace use */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2010 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ /* * This file is based on code from XZ embedded project * http://tukaani.org/xz/embedded.html */ #ifndef XZ_CONFIG_H #define XZ_CONFIG_H /* Enable BCJ filter decoders. */ #if defined(GRUB_TARGET_CPU_I386) || defined(GRUB_TARGET_CPU_X86_64) #define XZ_DEC_X86 #endif #ifdef GRUB_TARGET_CPU_POWERPC #define XZ_DEC_POWERPC #endif #ifdef GRUB_TARGET_CPU_IA64 #define XZ_DEC_IA64 #endif #ifdef GRUB_TARGET_CPU_ARM #define XZ_DEC_ARM #endif #if 0 #define XZ_DEC_ARMTHUMB #endif #ifdef GRUB_TARGET_CPU_SPARC #define XZ_DEC_SPARC #endif #include "xz.h" #include #define kmalloc(size, flags) malloc(size) #define kfree(ptr) free(ptr) #define vmalloc(size) malloc(size) #define vfree(ptr) free(ptr) #define memeq(a, b, size) (memcmp(a, b, size) == 0) #define memzero(buf, size) memset(buf, 0, size) #define min(x, y) ((x) < (y) ? (x) : (y)) #define min_t(type, x, y) min(x, y) /* * Some functions have been marked with __always_inline to keep the * performance reasonable even when the compiler is optimizing for * small code size. You may be able to save a few bytes by #defining * __always_inline to plain inline, but don't complain if the code * becomes slow. * * NOTE: System headers on GNU/Linux may #define this macro already, * so if you want to change it, it you need to #undef it first. */ #ifndef __always_inline # ifdef __GNUC__ # define __always_inline \ inline __attribute__((__always_inline__)) # else # define __always_inline inline # endif #endif /* * Some functions are marked to never be inlined to reduce stack usage. * If you don't care about stack usage, you may want to modify this so * that noinline_for_stack is #defined to be empty even when using GCC. * Doing so may save a few bytes in binary size. */ #ifndef noinline_for_stack # ifdef __GNUC__ # define noinline_for_stack __attribute__((__noinline__)) # else # define noinline_for_stack # endif #endif /* Inline functions to access unaligned unsigned 32-bit integers */ static inline uint32_t get_unaligned_le32(const uint8_t *buf) { return (uint32_t)buf[0] | ((uint32_t)buf[1] << 8) | ((uint32_t)buf[2] << 16) | ((uint32_t)buf[3] << 24); } static inline uint32_t get_unaligned_be32(const uint8_t *buf) { return (uint32_t)(buf[0] << 24) | ((uint32_t)buf[1] << 16) | ((uint32_t)buf[2] << 8) | (uint32_t)buf[3]; } static inline void put_unaligned_le32(uint32_t val, uint8_t *buf) { buf[0] = (uint8_t)val; buf[1] = (uint8_t)(val >> 8); buf[2] = (uint8_t)(val >> 16); buf[3] = (uint8_t)(val >> 24); } static inline void put_unaligned_be32(uint32_t val, uint8_t *buf) { buf[0] = (uint8_t)(val >> 24); buf[1] = (uint8_t)(val >> 16); buf[2] = (uint8_t)(val >> 8); buf[3] = (uint8_t)val; } /* * Use get_unaligned_le32() also for aligned access for simplicity. On * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr)) * could save a few bytes in code size. */ #define get_le32 get_unaligned_le32 #endif