acmacros.h
来自「一个类似windows」· C头文件 代码 · 共 508 行 · 第 1/2 页
H
508 行
/******************************************************************************
*
* Name: acmacros.h - C macros for the entire subsystem.
* $Revision: 1.4 $
*
*****************************************************************************/
/*
* 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 LODWORD
#define LODWORD(l) ((u32)(UINT64)(l))
#endif
#ifndef HIDWORD
#define HIDWORD(l) ((u32)((((UINT64)(l)) >> 32) & 0xFFFFFFFF))
#endif
#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.
*/
#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
/*
* Full 64-bit address on 32-bit and 64-bit platforms
*/
#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 */
#ifdef __GNUC__
#define ACPI_PCI_DEVICE_MASK (UINT64) 0x0000FFFF00000000ULL
#define ACPI_PCI_FUNCTION_MASK (UINT64) 0x00000000FFFF0000ULL
#define ACPI_PCI_REGISTER_MASK (UINT64) 0x000000000000FFFFULL
#else
#define ACPI_PCI_DEVICE_MASK (UINT64) 0x0000FFFF00000000
#define ACPI_PCI_FUNCTION_MASK (UINT64) 0x00000000FFFF0000
#define ACPI_PCI_REGISTER_MASK (UINT64) 0x000000000000FFFF
#endif
#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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?