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

📄 acmacros.h

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * * Name: acmacros.h - C macros for the entire subsystem. *       $Revision: 59 $ * *****************************************************************************//* *  Copyright (C) 2000 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#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#define ACPI_GET_ADDRESS(a)             (a)#define ACPI_STORE_ADDRESS(a,b)         ((a)=(b))#define ACPI_VALID_ADDRESS(a)           (a)#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))/* * 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)#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);}#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)/* * Divide and Modulo */#define ACPI_DIVIDE(n,d)                ((n) / (d))#define ACPI_MODULO(n,d)                ((n) % (d))/* * 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_UP_TO_1_k(a)              (((a) + 1023) >> 10)#ifdef DEBUG_ASSERT#undef DEBUG_ASSERT#endif/* Macros for GAS addressing */#define ACPI_PCI_DEVICE_MASK            (UINT64) 0x0000FFFF00000000#define ACPI_PCI_FUNCTION_MASK          (UINT64) 0x00000000FFFF0000#define ACPI_PCI_REGISTER_MASK          (UINT64) 0x000000000000FFFF#define ACPI_PCI_FUNCTION(a)            (u32) ((((a) & ACPI_PCI_FUNCTION_MASK) >> 16))#define ACPI_PCI_DEVICE(a)              (u32) ((((a) & ACPI_PCI_DEVICE_MASK) >> 32))#ifndef _IA16#define ACPI_PCI_REGISTER(a)            (u32) (((a) & ACPI_PCI_REGISTER_MASK))#define ACPI_PCI_DEVFUN(a)              (u32) ((ACPI_PCI_DEVICE(a) << 16) | ACPI_PCI_FUNCTION(a))#else#define ACPI_PCI_REGISTER(a)            (u32) (((a) & 0x0000FFFF))#define ACPI_PCI_DEVFUN(a)              (u32) ((((a) & 0xFFFF0000) >> 16))#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/* * Macros for the master AML opcode table */#ifdef ACPI_DEBUG#define OP_INFO_ENTRY(flags,name,Pargs,Iargs)     {flags,Pargs,Iargs,name}#else#define OP_INFO_ENTRY(flags,name,Pargs,Iargs)     {flags,Pargs,Iargs}#endif#define ARG_TYPE_WIDTH                  5#define ARG_1(x)                        ((u32)(x))#define ARG_2(x)                        ((u32)(x) << (1 * ARG_TYPE_WIDTH))#define ARG_3(x)                        ((u32)(x) << (2 * ARG_TYPE_WIDTH))#define ARG_4(x)                        ((u32)(x) << (3 * ARG_TYPE_WIDTH))#define ARG_5(x)                        ((u32)(x) << (4 * ARG_TYPE_WIDTH))#define ARG_6(x)                        ((u32)(x) << (5 * ARG_TYPE_WIDTH))

⌨️ 快捷键说明

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