📄 osl.c
字号:
/* * acpi_osl.c - OS-dependent functions ($Revision: 83 $) * * Copyright (C) 2000 Andrew Henroid * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com> * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * 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 * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * */#include <asm/io.h>#include <xen/config.h>#include <xen/init.h>#include <xen/types.h>#include <xen/errno.h>#include <xen/acpi.h>#include <xen/numa.h>#include <acpi/acpi_bus.h>#include <acpi/acmacros.h>#include <acpi/acpiosxf.h>#include <acpi/platform/aclinux.h>#include <xen/spinlock.h>#include <xen/domain_page.h>#ifdef __ia64__#include <linux/efi.h>#endif#define _COMPONENT ACPI_OS_SERVICESACPI_MODULE_NAME("osl")#define PREFIX "ACPI: "struct acpi_os_dpc { acpi_osd_exec_callback function; void *context;};#ifdef CONFIG_ACPI_CUSTOM_DSDT#include CONFIG_ACPI_CUSTOM_DSDT_FILE#endif#ifdef ENABLE_DEBUGGER#include <linux/kdb.h>/* stuff for debugger support */int acpi_in_debugger;EXPORT_SYMBOL(acpi_in_debugger);extern char line_buf[80];#endif /*ENABLE_DEBUGGER */int acpi_specific_hotkey_enabled = TRUE;EXPORT_SYMBOL(acpi_specific_hotkey_enabled);void acpi_os_printf(const char *fmt, ...){ va_list args; va_start(args, fmt); acpi_os_vprintf(fmt, args); va_end(args);}void acpi_os_vprintf(const char *fmt, va_list args){ static char buffer[512]; vsnprintf(buffer, sizeof(buffer), fmt, args); printk("%s", buffer);}acpi_physical_address __init acpi_os_get_root_pointer(void){#ifdef __ia64__ if (efi_enabled) { if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) return efi.acpi20; else if (efi.acpi != EFI_INVALID_TABLE_ADDR) return efi.acpi; else { printk(KERN_ERR PREFIX "System description tables not found\n"); return 0; } } else#endif { acpi_physical_address pa = 0; acpi_find_root_pointer(&pa); return pa; }}void __iomem *acpi_os_map_memory(acpi_physical_address phys, acpi_size size){ return __acpi_map_table((unsigned long)phys, size);}EXPORT_SYMBOL_GPL(acpi_os_map_memory);void acpi_os_unmap_memory(void __iomem * virt, acpi_size size){}EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width){ u32 dummy; if (!value) value = &dummy; *value = 0; if (width <= 8) { *(u8 *) value = inb(port); } else if (width <= 16) { *(u16 *) value = inw(port); } else if (width <= 32) { *(u32 *) value = inl(port); } else { BUG(); } return AE_OK;}EXPORT_SYMBOL(acpi_os_read_port);acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width){ if (width <= 8) { outb(value, port); } else if (width <= 16) { outw(value, port); } else if (width <= 32) { outl(value, port); } else { BUG(); } return AE_OK;}EXPORT_SYMBOL(acpi_os_write_port);acpi_statusacpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width){ u32 dummy; void __iomem *virt_addr; virt_addr = map_domain_page(phys_addr>>PAGE_SHIFT); if (!value) value = &dummy; switch (width) { case 8: *(u8 *) value = readb(virt_addr); break; case 16: *(u16 *) value = readw(virt_addr); break; case 32: *(u32 *) value = readl(virt_addr); break; default: BUG(); } unmap_domain_page(virt_addr); return AE_OK;}acpi_statusacpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width){ void __iomem *virt_addr; virt_addr = map_domain_page(phys_addr>>PAGE_SHIFT); switch (width) { case 8: writeb(value, virt_addr); break; case 16: writew(value, virt_addr); break; case 32: writel(value, virt_addr); break; default: BUG(); } unmap_domain_page(virt_addr); return AE_OK;}/* * Acquire a spinlock. * * handle is a pointer to the spinlock_t. */acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp){ acpi_cpu_flags flags; spin_lock_irqsave(lockp, flags); return flags;}/* * Release a spinlock. See above. */void acpi_os_release_lock(acpi_spinlock lockp, acpi_cpu_flags flags){ spin_unlock_irqrestore(lockp, flags);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -