⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acmacros.h

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 H
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * * Name: acmacros.h - C macros for the entire subsystem. *       $Revision: 97 $ * *****************************************************************************//* *  Copyright (C) 2000, 2001 R. Byron Moore * *  This program 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 2 of the License, or *  (at your option) any later version. * *  This program 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 this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifndef __ACMACROS_H__#define __ACMACROS_H__/* * Data manipulation macros */#ifndef LOWORD#define LOWORD(l)                       ((u16)(NATIVE_UINT)(l))#endif#ifndef HIWORD#define HIWORD(l)                       ((u16)((((NATIVE_UINT)(l)) >> 16) & 0xFFFF))#endif#ifndef LOBYTE#define LOBYTE(l)                       ((u8)(u16)(l))#endif#ifndef HIBYTE#define HIBYTE(l)                       ((u8)((((u16)(l)) >> 8) & 0xFF))#endif#define BIT0(x)                         ((((x) & 0x01) > 0) ? 1 : 0)#define BIT1(x)                         ((((x) & 0x02) > 0) ? 1 : 0)#define BIT2(x)                         ((((x) & 0x04) > 0) ? 1 : 0)#define BIT3(x)                         ((((x) & 0x08) > 0) ? 1 : 0)#define BIT4(x)                         ((((x) & 0x10) > 0) ? 1 : 0)#define BIT5(x)                         ((((x) & 0x20) > 0) ? 1 : 0)#define BIT6(x)                         ((((x) & 0x40) > 0) ? 1 : 0)#define BIT7(x)                         ((((x) & 0x80) > 0) ? 1 : 0)#define LOW_BASE(w)                     ((u16) ((w) & 0x0000FFFF))#define MID_BASE(b)                     ((u8) (((b) & 0x00FF0000) >> 16))#define HI_BASE(b)                      ((u8) (((b) & 0xFF000000) >> 24))#define LOW_LIMIT(w)                    ((u16) ((w) & 0x0000FFFF))#define HI_LIMIT(b)                     ((u8) (((b) & 0x00FF0000) >> 16))#ifdef _IA16/* * For 16-bit addresses, we have to assume that the upper 32 bits * are zero. */#ifndef LODWORD#define LODWORD(l)                      (l)#endif#ifndef HIDWORD#define HIDWORD(l)                      (0)#endif#define ACPI_GET_ADDRESS(a)             ((a).lo)#define ACPI_STORE_ADDRESS(a,b)         {(a).hi=0;(a).lo=(b);}#define ACPI_VALID_ADDRESS(a)           ((a).hi | (a).lo)#else#ifdef ACPI_NO_INTEGER64_SUPPORT/* * acpi_integer is 32-bits, no 64-bit support on this platform */#ifndef LODWORD#define LODWORD(l)                      ((u32)(l))#endif#ifndef HIDWORD#define HIDWORD(l)                      (0)#endif#define ACPI_GET_ADDRESS(a)             (a)#define ACPI_STORE_ADDRESS(a,b)         ((a)=(b))#define ACPI_VALID_ADDRESS(a)           (a)#else/* * Full 64-bit address/integer on both 32-bit and 64-bit platforms */#ifndef LODWORD#define LODWORD(l)                      ((u32)(u64)(l))#endif#ifndef HIDWORD#define HIDWORD(l)                      ((u32)(((*(uint64_struct *)(&l))).hi))#endif#define ACPI_GET_ADDRESS(a)             (a)#define ACPI_STORE_ADDRESS(a,b)         ((a)=(b))#define ACPI_VALID_ADDRESS(a)           (a)#endif#endif /*  * Extract a byte of data using a pointer.  Any more than a byte and we  * get into potential aligment issues -- see the STORE macros below  */#define GET8(addr)                      (*(u8*)(addr))/* Pointer arithmetic */#define POINTER_ADD(t,a,b)              (t *) ((NATIVE_UINT)(a) + (NATIVE_UINT)(b))#define POINTER_DIFF(a,b)               ((u32) ((NATIVE_UINT)(a) - (NATIVE_UINT)(b)))/* * Macros for moving data around to/from buffers that are possibly unaligned. * If the hardware supports the transfer of unaligned data, just do the store. * Otherwise, we have to move one byte at a time. */#ifdef _HW_ALIGNMENT_SUPPORT/* The hardware supports unaligned transfers, just do the move */#define MOVE_UNALIGNED16_TO_16(d,s)     *(u16*)(d) = *(u16*)(s)#define MOVE_UNALIGNED32_TO_32(d,s)     *(u32*)(d) = *(u32*)(s)#define MOVE_UNALIGNED16_TO_32(d,s)     *(u32*)(d) = *(u16*)(s)#define MOVE_UNALIGNED64_TO_64(d,s)     *(u64*)(d) = *(u64*)(s)#else/* * The hardware does not support unaligned transfers.  We must move the * data one byte at a time.  These macros work whether the source or * the destination (or both) is/are unaligned. */#define MOVE_UNALIGNED16_TO_16(d,s)     {((u8 *)(d))[0] = ((u8 *)(s))[0];\	 ((u8 *)(d))[1] = ((u8 *)(s))[1];}#define MOVE_UNALIGNED32_TO_32(d,s)     {((u8 *)(d))[0] = ((u8 *)(s))[0];\			  ((u8 *)(d))[1] = ((u8 *)(s))[1];\			  ((u8 *)(d))[2] = ((u8 *)(s))[2];\			  ((u8 *)(d))[3] = ((u8 *)(s))[3];}#define MOVE_UNALIGNED16_TO_32(d,s)     {(*(u32*)(d)) = 0; MOVE_UNALIGNED16_TO_16(d,s);}#define MOVE_UNALIGNED64_TO_64(d,s)     {((u8 *)(d))[0] = ((u8 *)(s))[0];\					   ((u8 *)(d))[1] = ((u8 *)(s))[1];\					   ((u8 *)(d))[2] = ((u8 *)(s))[2];\					   ((u8 *)(d))[3] = ((u8 *)(s))[3];\					   ((u8 *)(d))[4] = ((u8 *)(s))[4];\					   ((u8 *)(d))[5] = ((u8 *)(s))[5];\					   ((u8 *)(d))[6] = ((u8 *)(s))[6];\					   ((u8 *)(d))[7] = ((u8 *)(s))[7];}#endif/* * Fast power-of-two math macros for non-optimized compilers */#define _DIV(value,power_of2)           ((u32) ((value) >> (power_of2)))#define _MUL(value,power_of2)           ((u32) ((value) << (power_of2)))#define _MOD(value,divisor)             ((u32) ((value) & ((divisor) -1)))#define DIV_2(a)                        _DIV(a,1)#define MUL_2(a)                        _MUL(a,1)#define MOD_2(a)                        _MOD(a,2)#define DIV_4(a)                        _DIV(a,2)#define MUL_4(a)                        _MUL(a,2)#define MOD_4(a)                        _MOD(a,4)#define DIV_8(a)                        _DIV(a,3)#define MUL_8(a)                        _MUL(a,3)#define MOD_8(a)                        _MOD(a,8)#define DIV_16(a)                       _DIV(a,4)#define MUL_16(a)                       _MUL(a,4)#define MOD_16(a)                       _MOD(a,16)/* * Rounding macros (Power of two boundaries only) */#define ROUND_DOWN(value,boundary)      ((value) & (~((boundary)-1)))#define ROUND_UP(value,boundary)        (((value) + ((boundary)-1)) & (~((boundary)-1)))#define ROUND_DOWN_TO_32_BITS(a)        ROUND_DOWN(a,4)#define ROUND_DOWN_TO_64_BITS(a)        ROUND_DOWN(a,8)#define ROUND_DOWN_TO_NATIVE_WORD(a)    ROUND_DOWN(a,ALIGNED_ADDRESS_BOUNDARY)#define ROUND_UP_TO_32_bITS(a)          ROUND_UP(a,4)#define ROUND_UP_TO_64_bITS(a)          ROUND_UP(a,8)#define ROUND_UP_TO_NATIVE_WORD(a)      ROUND_UP(a,ALIGNED_ADDRESS_BOUNDARY)#define ROUND_PTR_UP_TO_4(a,b)          ((b *)(((NATIVE_UINT)(a) + 3) & ~3))#define ROUND_PTR_UP_TO_8(a,b)          ((b *)(((NATIVE_UINT)(a) + 7) & ~7))#define ROUND_BITS_UP_TO_BYTES(a)       DIV_8((a) + 7)#define ROUND_BITS_DOWN_TO_BYTES(a)     DIV_8((a))#define ROUND_UP_TO_1K(a)               (((a) + 1023) >> 10)/* Generic (non-power-of-two) rounding */#define ROUND_UP_TO(value,boundary)     (((value) + ((boundary)-1)) / (boundary))/* * Bitmask creation * Bit positions start at zero. * MASK_BITS_ABOVE creates a mask starting AT the position and above * MASK_BITS_BELOW creates a mask starting one bit BELOW the position */#define MASK_BITS_ABOVE(position)       (~(((u32)(-1)) << ((u32) (position))))#define MASK_BITS_BELOW(position)       (((u32)(-1)) << ((u32) (position)))/* Macros for GAS addressing */#ifndef _IA16#define ACPI_PCI_DEVICE_MASK            (u64) 0x0000FFFF00000000#define ACPI_PCI_FUNCTION_MASK          (u64) 0x00000000FFFF0000#define ACPI_PCI_REGISTER_MASK          (u64) 0x000000000000FFFF#define ACPI_PCI_FUNCTION(a)            (u16) ((((a) & ACPI_PCI_FUNCTION_MASK) >> 16))#define ACPI_PCI_DEVICE(a)              (u16) ((((a) & ACPI_PCI_DEVICE_MASK) >> 32))#define ACPI_PCI_REGISTER(a)            (u16) (((a) & ACPI_PCI_REGISTER_MASK))#else/* No support for GAS and PCI IDs in 16-bit mode  */#define ACPI_PCI_FUNCTION(a)            (u16) ((a) & 0xFFFF0000)#define ACPI_PCI_DEVICE(a)              (u16) ((a) & 0x0000FFFF)#define ACPI_PCI_REGISTER(a)            (u16) ((a) & 0x0000FFFF)#endif/* * An acpi_handle (which is actually an acpi_namespace_node *) can appear in some contexts, * such as on ap_obj_stack, where a pointer to an acpi_operand_object can also * appear.  This macro is used to distinguish them. * * The Data_type field is the first field in both structures. */#define VALID_DESCRIPTOR_TYPE(d,t)      (((acpi_namespace_node *)d)->data_type == t)/* Macro to test the object type */#define IS_THIS_OBJECT_TYPE(d,t)        (((acpi_operand_object  *)d)->common.type == (u8)t)/* Macro to check the table flags for SINGLE or MULTIPLE tables are allowed */#define IS_SINGLE_TABLE(x)              (((x) & 0x01) == ACPI_TABLE_SINGLE ? 1 : 0)/* * Macro to check if a pointer is within an ACPI table. * Parameter (a) is the pointer to check.  Parameter (b) must be defined * as a pointer to an acpi_table_header.  (b+1) then points past the header, * and ((u8 *)b+b->Length) points one byte past the end of the table. */#ifndef _IA16#define IS_IN_ACPI_TABLE(a,b)           (((u8 *)(a) >= (u8 *)(b + 1)) &&\							   ((u8 *)(a) < ((u8 *)b + b->length)))#else#define IS_IN_ACPI_TABLE(a,b)           (_segment)(a) == (_segment)(b) &&\									 (((u8 *)(a) >= (u8 *)(b + 1)) &&\									 ((u8 *)(a) < ((u8 *)b + b->length)))#endif/*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -