mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 13:44:26 -04:00
Merge branch 'x86/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (821 commits) x86: make 64bit hpet_set_mapping to use ioremap too, v2 x86: get x86_phys_bits early x86: max_low_pfn_mapped fix #4 x86: change _node_to_cpumask_ptr to return const ptr x86: I/O APIC: remove an IRQ2-mask hack x86: fix numaq_tsc_disable calling x86, e820: remove end_user_pfn x86: max_low_pfn_mapped fix, #3 x86: max_low_pfn_mapped fix, #2 x86: max_low_pfn_mapped fix, #1 x86_64: fix delayed signals x86: remove conflicting nx6325 and nx6125 quirks x86: Recover timer_ack lost in the merge of the NMI watchdog x86: I/O APIC: Never configure IRQ2 x86: L-APIC: Always fully configure IRQ0 x86: L-APIC: Set IRQ0 as edge-triggered x86: merge dwarf2 headers x86: use AS_CFI instead of UNWIND_INFO x86: use ignore macro instead of hash comment x86: use matching CFI_ENDPROC ...
This commit is contained in:
commit
a3da5bf84a
407 changed files with 24394 additions and 16658 deletions
|
|
@ -197,6 +197,63 @@ static inline int pmd_none_or_clear_bad(pmd_t *pmd)
|
|||
}
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
static inline pte_t __ptep_modify_prot_start(struct mm_struct *mm,
|
||||
unsigned long addr,
|
||||
pte_t *ptep)
|
||||
{
|
||||
/*
|
||||
* Get the current pte state, but zero it out to make it
|
||||
* non-present, preventing the hardware from asynchronously
|
||||
* updating it.
|
||||
*/
|
||||
return ptep_get_and_clear(mm, addr, ptep);
|
||||
}
|
||||
|
||||
static inline void __ptep_modify_prot_commit(struct mm_struct *mm,
|
||||
unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
/*
|
||||
* The pte is non-present, so there's no hardware state to
|
||||
* preserve.
|
||||
*/
|
||||
set_pte_at(mm, addr, ptep, pte);
|
||||
}
|
||||
|
||||
#ifndef __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION
|
||||
/*
|
||||
* Start a pte protection read-modify-write transaction, which
|
||||
* protects against asynchronous hardware modifications to the pte.
|
||||
* The intention is not to prevent the hardware from making pte
|
||||
* updates, but to prevent any updates it may make from being lost.
|
||||
*
|
||||
* This does not protect against other software modifications of the
|
||||
* pte; the appropriate pte lock must be held over the transation.
|
||||
*
|
||||
* Note that this interface is intended to be batchable, meaning that
|
||||
* ptep_modify_prot_commit may not actually update the pte, but merely
|
||||
* queue the update to be done at some later time. The update must be
|
||||
* actually committed before the pte lock is released, however.
|
||||
*/
|
||||
static inline pte_t ptep_modify_prot_start(struct mm_struct *mm,
|
||||
unsigned long addr,
|
||||
pte_t *ptep)
|
||||
{
|
||||
return __ptep_modify_prot_start(mm, addr, ptep);
|
||||
}
|
||||
|
||||
/*
|
||||
* Commit an update to a pte, leaving any hardware-controlled bits in
|
||||
* the PTE unmodified.
|
||||
*/
|
||||
static inline void ptep_modify_prot_commit(struct mm_struct *mm,
|
||||
unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
__ptep_modify_prot_commit(mm, addr, ptep, pte);
|
||||
}
|
||||
#endif /* __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION */
|
||||
|
||||
/*
|
||||
* A facility to provide lazy MMU batching. This allows PTE updates and
|
||||
* page invalidations to be delayed until a call to leave lazy MMU mode
|
||||
|
|
|
|||
|
|
@ -60,7 +60,8 @@
|
|||
#ifndef node_to_cpumask_ptr
|
||||
|
||||
#define node_to_cpumask_ptr(v, node) \
|
||||
cpumask_t _##v = node_to_cpumask(node), *v = &_##v
|
||||
cpumask_t _##v = node_to_cpumask(node); \
|
||||
const cpumask_t *v = &_##v
|
||||
|
||||
#define node_to_cpumask_ptr_next(v, node) \
|
||||
_##v = node_to_cpumask(node)
|
||||
|
|
|
|||
|
|
@ -93,6 +93,8 @@
|
|||
VMLINUX_SYMBOL(__end_rio_route_ops) = .; \
|
||||
} \
|
||||
\
|
||||
TRACEDATA \
|
||||
\
|
||||
/* Kernel symbol table: Normal symbols */ \
|
||||
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start___ksymtab) = .; \
|
||||
|
|
@ -318,6 +320,18 @@
|
|||
__stop___bug_table = .; \
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_TRACE
|
||||
#define TRACEDATA \
|
||||
. = ALIGN(4); \
|
||||
.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \
|
||||
__tracedata_start = .; \
|
||||
*(.tracedata) \
|
||||
__tracedata_end = .; \
|
||||
}
|
||||
#else
|
||||
#define TRACEDATA
|
||||
#endif
|
||||
|
||||
#define NOTES \
|
||||
.notes : AT(ADDR(.notes) - LOAD_OFFSET) { \
|
||||
VMLINUX_SYMBOL(__start_notes) = .; \
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
#include <asm/numa.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/mpspec.h>
|
||||
|
||||
#define COMPILER_DEPENDENT_INT64 long long
|
||||
#define COMPILER_DEPENDENT_UINT64 unsigned long long
|
||||
|
|
@ -160,9 +161,7 @@ struct bootnode;
|
|||
#ifdef CONFIG_ACPI_NUMA
|
||||
extern int acpi_numa;
|
||||
extern int acpi_scan_nodes(unsigned long start, unsigned long end);
|
||||
#ifdef CONFIG_X86_64
|
||||
# define NR_NODE_MEMBLKS (MAX_NUMNODES*2)
|
||||
#endif
|
||||
#define NR_NODE_MEMBLKS (MAX_NUMNODES*2)
|
||||
extern void acpi_fake_nodes(const struct bootnode *fake_nodes,
|
||||
int num_nodes);
|
||||
#else
|
||||
|
|
|
|||
32
include/asm-x86/amd_iommu.h
Normal file
32
include/asm-x86/amd_iommu.h
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (C) 2007-2008 Advanced Micro Devices, Inc.
|
||||
* Author: Joerg Roedel <joerg.roedel@amd.com>
|
||||
* Leo Duran <leo.duran@amd.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
* 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 _ASM_X86_AMD_IOMMU_H
|
||||
#define _ASM_X86_AMD_IOMMU_H
|
||||
|
||||
#ifdef CONFIG_AMD_IOMMU
|
||||
extern int amd_iommu_init(void);
|
||||
extern int amd_iommu_init_dma_ops(void);
|
||||
extern void amd_iommu_detect(void);
|
||||
#else
|
||||
static inline int amd_iommu_init(void) { return -ENODEV; }
|
||||
static inline void amd_iommu_detect(void) { }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
244
include/asm-x86/amd_iommu_types.h
Normal file
244
include/asm-x86/amd_iommu_types.h
Normal file
|
|
@ -0,0 +1,244 @@
|
|||
/*
|
||||
* Copyright (C) 2007-2008 Advanced Micro Devices, Inc.
|
||||
* Author: Joerg Roedel <joerg.roedel@amd.com>
|
||||
* Leo Duran <leo.duran@amd.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
* 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 __AMD_IOMMU_TYPES_H__
|
||||
#define __AMD_IOMMU_TYPES_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
/*
|
||||
* some size calculation constants
|
||||
*/
|
||||
#define DEV_TABLE_ENTRY_SIZE 256
|
||||
#define ALIAS_TABLE_ENTRY_SIZE 2
|
||||
#define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *))
|
||||
|
||||
/* helper macros */
|
||||
#define LOW_U32(x) ((x) & ((1ULL << 32)-1))
|
||||
#define HIGH_U32(x) (LOW_U32((x) >> 32))
|
||||
|
||||
/* Length of the MMIO region for the AMD IOMMU */
|
||||
#define MMIO_REGION_LENGTH 0x4000
|
||||
|
||||
/* Capability offsets used by the driver */
|
||||
#define MMIO_CAP_HDR_OFFSET 0x00
|
||||
#define MMIO_RANGE_OFFSET 0x0c
|
||||
|
||||
/* Masks, shifts and macros to parse the device range capability */
|
||||
#define MMIO_RANGE_LD_MASK 0xff000000
|
||||
#define MMIO_RANGE_FD_MASK 0x00ff0000
|
||||
#define MMIO_RANGE_BUS_MASK 0x0000ff00
|
||||
#define MMIO_RANGE_LD_SHIFT 24
|
||||
#define MMIO_RANGE_FD_SHIFT 16
|
||||
#define MMIO_RANGE_BUS_SHIFT 8
|
||||
#define MMIO_GET_LD(x) (((x) & MMIO_RANGE_LD_MASK) >> MMIO_RANGE_LD_SHIFT)
|
||||
#define MMIO_GET_FD(x) (((x) & MMIO_RANGE_FD_MASK) >> MMIO_RANGE_FD_SHIFT)
|
||||
#define MMIO_GET_BUS(x) (((x) & MMIO_RANGE_BUS_MASK) >> MMIO_RANGE_BUS_SHIFT)
|
||||
|
||||
/* Flag masks for the AMD IOMMU exclusion range */
|
||||
#define MMIO_EXCL_ENABLE_MASK 0x01ULL
|
||||
#define MMIO_EXCL_ALLOW_MASK 0x02ULL
|
||||
|
||||
/* Used offsets into the MMIO space */
|
||||
#define MMIO_DEV_TABLE_OFFSET 0x0000
|
||||
#define MMIO_CMD_BUF_OFFSET 0x0008
|
||||
#define MMIO_EVT_BUF_OFFSET 0x0010
|
||||
#define MMIO_CONTROL_OFFSET 0x0018
|
||||
#define MMIO_EXCL_BASE_OFFSET 0x0020
|
||||
#define MMIO_EXCL_LIMIT_OFFSET 0x0028
|
||||
#define MMIO_CMD_HEAD_OFFSET 0x2000
|
||||
#define MMIO_CMD_TAIL_OFFSET 0x2008
|
||||
#define MMIO_EVT_HEAD_OFFSET 0x2010
|
||||
#define MMIO_EVT_TAIL_OFFSET 0x2018
|
||||
#define MMIO_STATUS_OFFSET 0x2020
|
||||
|
||||
/* feature control bits */
|
||||
#define CONTROL_IOMMU_EN 0x00ULL
|
||||
#define CONTROL_HT_TUN_EN 0x01ULL
|
||||
#define CONTROL_EVT_LOG_EN 0x02ULL
|
||||
#define CONTROL_EVT_INT_EN 0x03ULL
|
||||
#define CONTROL_COMWAIT_EN 0x04ULL
|
||||
#define CONTROL_PASSPW_EN 0x08ULL
|
||||
#define CONTROL_RESPASSPW_EN 0x09ULL
|
||||
#define CONTROL_COHERENT_EN 0x0aULL
|
||||
#define CONTROL_ISOC_EN 0x0bULL
|
||||
#define CONTROL_CMDBUF_EN 0x0cULL
|
||||
#define CONTROL_PPFLOG_EN 0x0dULL
|
||||
#define CONTROL_PPFINT_EN 0x0eULL
|
||||
|
||||
/* command specific defines */
|
||||
#define CMD_COMPL_WAIT 0x01
|
||||
#define CMD_INV_DEV_ENTRY 0x02
|
||||
#define CMD_INV_IOMMU_PAGES 0x03
|
||||
|
||||
#define CMD_COMPL_WAIT_STORE_MASK 0x01
|
||||
#define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01
|
||||
#define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02
|
||||
|
||||
#define CMD_INV_IOMMU_ALL_PAGES_ADDRESS 0x7fffffffffffffffULL
|
||||
|
||||
/* macros and definitions for device table entries */
|
||||
#define DEV_ENTRY_VALID 0x00
|
||||
#define DEV_ENTRY_TRANSLATION 0x01
|
||||
#define DEV_ENTRY_IR 0x3d
|
||||
#define DEV_ENTRY_IW 0x3e
|
||||
#define DEV_ENTRY_EX 0x67
|
||||
#define DEV_ENTRY_SYSMGT1 0x68
|
||||
#define DEV_ENTRY_SYSMGT2 0x69
|
||||
#define DEV_ENTRY_INIT_PASS 0xb8
|
||||
#define DEV_ENTRY_EINT_PASS 0xb9
|
||||
#define DEV_ENTRY_NMI_PASS 0xba
|
||||
#define DEV_ENTRY_LINT0_PASS 0xbe
|
||||
#define DEV_ENTRY_LINT1_PASS 0xbf
|
||||
|
||||
/* constants to configure the command buffer */
|
||||
#define CMD_BUFFER_SIZE 8192
|
||||
#define CMD_BUFFER_ENTRIES 512
|
||||
#define MMIO_CMD_SIZE_SHIFT 56
|
||||
#define MMIO_CMD_SIZE_512 (0x9ULL << MMIO_CMD_SIZE_SHIFT)
|
||||
|
||||
#define PAGE_MODE_1_LEVEL 0x01
|
||||
#define PAGE_MODE_2_LEVEL 0x02
|
||||
#define PAGE_MODE_3_LEVEL 0x03
|
||||
|
||||
#define IOMMU_PDE_NL_0 0x000ULL
|
||||
#define IOMMU_PDE_NL_1 0x200ULL
|
||||
#define IOMMU_PDE_NL_2 0x400ULL
|
||||
#define IOMMU_PDE_NL_3 0x600ULL
|
||||
|
||||
#define IOMMU_PTE_L2_INDEX(address) (((address) >> 30) & 0x1ffULL)
|
||||
#define IOMMU_PTE_L1_INDEX(address) (((address) >> 21) & 0x1ffULL)
|
||||
#define IOMMU_PTE_L0_INDEX(address) (((address) >> 12) & 0x1ffULL)
|
||||
|
||||
#define IOMMU_MAP_SIZE_L1 (1ULL << 21)
|
||||
#define IOMMU_MAP_SIZE_L2 (1ULL << 30)
|
||||
#define IOMMU_MAP_SIZE_L3 (1ULL << 39)
|
||||
|
||||
#define IOMMU_PTE_P (1ULL << 0)
|
||||
#define IOMMU_PTE_U (1ULL << 59)
|
||||
#define IOMMU_PTE_FC (1ULL << 60)
|
||||
#define IOMMU_PTE_IR (1ULL << 61)
|
||||
#define IOMMU_PTE_IW (1ULL << 62)
|
||||
|
||||
#define IOMMU_L1_PDE(address) \
|
||||
((address) | IOMMU_PDE_NL_1 | IOMMU_PTE_P | IOMMU_PTE_IR | IOMMU_PTE_IW)
|
||||
#define IOMMU_L2_PDE(address) \
|
||||
((address) | IOMMU_PDE_NL_2 | IOMMU_PTE_P | IOMMU_PTE_IR | IOMMU_PTE_IW)
|
||||
|
||||
#define IOMMU_PAGE_MASK (((1ULL << 52) - 1) & ~0xfffULL)
|
||||
#define IOMMU_PTE_PRESENT(pte) ((pte) & IOMMU_PTE_P)
|
||||
#define IOMMU_PTE_PAGE(pte) (phys_to_virt((pte) & IOMMU_PAGE_MASK))
|
||||
#define IOMMU_PTE_MODE(pte) (((pte) >> 9) & 0x07)
|
||||
|
||||
#define IOMMU_PROT_MASK 0x03
|
||||
#define IOMMU_PROT_IR 0x01
|
||||
#define IOMMU_PROT_IW 0x02
|
||||
|
||||
/* IOMMU capabilities */
|
||||
#define IOMMU_CAP_IOTLB 24
|
||||
#define IOMMU_CAP_NPCACHE 26
|
||||
|
||||
#define MAX_DOMAIN_ID 65536
|
||||
|
||||
struct protection_domain {
|
||||
spinlock_t lock;
|
||||
u16 id;
|
||||
int mode;
|
||||
u64 *pt_root;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct dma_ops_domain {
|
||||
struct list_head list;
|
||||
struct protection_domain domain;
|
||||
unsigned long aperture_size;
|
||||
unsigned long next_bit;
|
||||
unsigned long *bitmap;
|
||||
u64 **pte_pages;
|
||||
};
|
||||
|
||||
struct amd_iommu {
|
||||
struct list_head list;
|
||||
spinlock_t lock;
|
||||
|
||||
u16 devid;
|
||||
u16 cap_ptr;
|
||||
|
||||
u64 mmio_phys;
|
||||
u8 *mmio_base;
|
||||
u32 cap;
|
||||
u16 first_device;
|
||||
u16 last_device;
|
||||
u64 exclusion_start;
|
||||
u64 exclusion_length;
|
||||
|
||||
u8 *cmd_buf;
|
||||
u32 cmd_buf_size;
|
||||
|
||||
int need_sync;
|
||||
|
||||
struct dma_ops_domain *default_dom;
|
||||
};
|
||||
|
||||
extern struct list_head amd_iommu_list;
|
||||
|
||||
struct dev_table_entry {
|
||||
u32 data[8];
|
||||
};
|
||||
|
||||
struct unity_map_entry {
|
||||
struct list_head list;
|
||||
u16 devid_start;
|
||||
u16 devid_end;
|
||||
u64 address_start;
|
||||
u64 address_end;
|
||||
int prot;
|
||||
};
|
||||
|
||||
extern struct list_head amd_iommu_unity_map;
|
||||
|
||||
/* data structures for device handling */
|
||||
extern struct dev_table_entry *amd_iommu_dev_table;
|
||||
extern u16 *amd_iommu_alias_table;
|
||||
extern struct amd_iommu **amd_iommu_rlookup_table;
|
||||
|
||||
extern unsigned amd_iommu_aperture_order;
|
||||
|
||||
extern u16 amd_iommu_last_bdf;
|
||||
|
||||
/* data structures for protection domain handling */
|
||||
extern struct protection_domain **amd_iommu_pd_table;
|
||||
extern unsigned long *amd_iommu_pd_alloc_bitmap;
|
||||
|
||||
extern int amd_iommu_isolate;
|
||||
|
||||
static inline void print_devid(u16 devid, int nl)
|
||||
{
|
||||
int bus = devid >> 8;
|
||||
int dev = devid >> 3 & 0x1f;
|
||||
int fn = devid & 0x07;
|
||||
|
||||
printk("%02x:%02x.%x", bus, dev, fn);
|
||||
if (nl)
|
||||
printk("\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -36,15 +36,11 @@ extern void generic_apic_probe(void);
|
|||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
|
||||
extern int apic_verbosity;
|
||||
extern int timer_over_8254;
|
||||
extern int local_apic_timer_c2_ok;
|
||||
extern int local_apic_timer_disabled;
|
||||
|
||||
extern int apic_runs_main_timer;
|
||||
extern int ioapic_force;
|
||||
extern int disable_apic;
|
||||
extern int disable_apic_timer;
|
||||
|
||||
extern int disable_apic;
|
||||
/*
|
||||
* Basic functions accessing APICs.
|
||||
*/
|
||||
|
|
@ -125,16 +121,22 @@ extern void enable_NMI_through_LVT0(void);
|
|||
*/
|
||||
#ifdef CONFIG_X86_64
|
||||
extern void early_init_lapic_mapping(void);
|
||||
extern int apic_is_clustered_box(void);
|
||||
#else
|
||||
static inline int apic_is_clustered_box(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern u8 setup_APIC_eilvt_mce(u8 vector, u8 msg_type, u8 mask);
|
||||
extern u8 setup_APIC_eilvt_ibs(u8 vector, u8 msg_type, u8 mask);
|
||||
|
||||
extern int apic_is_clustered_box(void);
|
||||
|
||||
#else /* !CONFIG_X86_LOCAL_APIC */
|
||||
static inline void lapic_shutdown(void) { }
|
||||
#define local_apic_timer_c2_ok 1
|
||||
static inline void init_apic_mappings(void) { }
|
||||
|
||||
#endif /* !CONFIG_X86_LOCAL_APIC */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,37 +1,40 @@
|
|||
#ifndef _ASM_X86_ASM_H
|
||||
#define _ASM_X86_ASM_H
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/* 32 bits */
|
||||
|
||||
# define _ASM_PTR " .long "
|
||||
# define _ASM_ALIGN " .balign 4 "
|
||||
# define _ASM_MOV_UL " movl "
|
||||
|
||||
# define _ASM_INC " incl "
|
||||
# define _ASM_DEC " decl "
|
||||
# define _ASM_ADD " addl "
|
||||
# define _ASM_SUB " subl "
|
||||
# define _ASM_XADD " xaddl "
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
# define __ASM_FORM(x) x
|
||||
# define __ASM_EX_SEC .section __ex_table
|
||||
#else
|
||||
/* 64 bits */
|
||||
# define __ASM_FORM(x) " " #x " "
|
||||
# define __ASM_EX_SEC " .section __ex_table,\"a\"\n"
|
||||
#endif
|
||||
|
||||
# define _ASM_PTR " .quad "
|
||||
# define _ASM_ALIGN " .balign 8 "
|
||||
# define _ASM_MOV_UL " movq "
|
||||
#ifdef CONFIG_X86_32
|
||||
# define __ASM_SEL(a,b) __ASM_FORM(a)
|
||||
#else
|
||||
# define __ASM_SEL(a,b) __ASM_FORM(b)
|
||||
#endif
|
||||
|
||||
# define _ASM_INC " incq "
|
||||
# define _ASM_DEC " decq "
|
||||
# define _ASM_ADD " addq "
|
||||
# define _ASM_SUB " subq "
|
||||
# define _ASM_XADD " xaddq "
|
||||
#define __ASM_SIZE(inst) __ASM_SEL(inst##l, inst##q)
|
||||
#define __ASM_REG(reg) __ASM_SEL(e##reg, r##reg)
|
||||
|
||||
#endif /* CONFIG_X86_32 */
|
||||
#define _ASM_PTR __ASM_SEL(.long, .quad)
|
||||
#define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8)
|
||||
#define _ASM_MOV_UL __ASM_SIZE(mov)
|
||||
|
||||
#define _ASM_INC __ASM_SIZE(inc)
|
||||
#define _ASM_DEC __ASM_SIZE(dec)
|
||||
#define _ASM_ADD __ASM_SIZE(add)
|
||||
#define _ASM_SUB __ASM_SIZE(sub)
|
||||
#define _ASM_XADD __ASM_SIZE(xadd)
|
||||
#define _ASM_AX __ASM_REG(ax)
|
||||
#define _ASM_BX __ASM_REG(bx)
|
||||
#define _ASM_CX __ASM_REG(cx)
|
||||
#define _ASM_DX __ASM_REG(dx)
|
||||
|
||||
/* Exception table entry */
|
||||
# define _ASM_EXTABLE(from,to) \
|
||||
" .section __ex_table,\"a\"\n" \
|
||||
__ASM_EX_SEC \
|
||||
_ASM_ALIGN "\n" \
|
||||
_ASM_PTR #from "," #to "\n" \
|
||||
" .previous\n"
|
||||
|
|
|
|||
|
|
@ -11,12 +11,6 @@
|
|||
* resource counting etc..
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define LOCK "lock ; "
|
||||
#else
|
||||
#define LOCK ""
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Make sure gcc doesn't try to be clever and move things around
|
||||
* on us. We need to use _exactly_ the address the user gave us,
|
||||
|
|
@ -431,6 +425,32 @@ static inline int atomic64_add_unless(atomic64_t *v, long a, long u)
|
|||
return c != (u);
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_inc_short - increment of a short integer
|
||||
* @v: pointer to type int
|
||||
*
|
||||
* Atomically adds 1 to @v
|
||||
* Returns the new value of @u
|
||||
*/
|
||||
static inline short int atomic_inc_short(short int *v)
|
||||
{
|
||||
asm(LOCK_PREFIX "addw $1, %0" : "+m" (*v));
|
||||
return *v;
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_or_long - OR of two long integers
|
||||
* @v1: pointer to type unsigned long
|
||||
* @v2: pointer to type unsigned long
|
||||
*
|
||||
* Atomically ORs @v1 and @v2
|
||||
* Returns the result of the OR
|
||||
*/
|
||||
static inline void atomic_or_long(unsigned long *v1, unsigned long v2)
|
||||
{
|
||||
asm(LOCK_PREFIX "orq %1, %0" : "+m" (*v1) : "r" (v2));
|
||||
}
|
||||
|
||||
#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
|
||||
|
||||
/* These are x86-specific, used by some header files */
|
||||
|
|
|
|||
|
|
@ -14,4 +14,6 @@ static inline unsigned int get_bios_ebda(void)
|
|||
return address; /* 0 means none */
|
||||
}
|
||||
|
||||
void reserve_ebda_region(void);
|
||||
|
||||
#endif /* _MACH_BIOS_EBDA_H */
|
||||
|
|
|
|||
|
|
@ -23,11 +23,21 @@
|
|||
#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
|
||||
/* Technically wrong, but this avoids compilation errors on some gcc
|
||||
versions. */
|
||||
#define ADDR "=m" (*(volatile long *) addr)
|
||||
#define BITOP_ADDR(x) "=m" (*(volatile long *) (x))
|
||||
#else
|
||||
#define ADDR "+m" (*(volatile long *) addr)
|
||||
#define BITOP_ADDR(x) "+m" (*(volatile long *) (x))
|
||||
#endif
|
||||
|
||||
#define ADDR BITOP_ADDR(addr)
|
||||
|
||||
/*
|
||||
* We do the locked ops that don't return the old value as
|
||||
* a mask operation on a byte.
|
||||
*/
|
||||
#define IS_IMMEDIATE(nr) (__builtin_constant_p(nr))
|
||||
#define CONST_MASK_ADDR(nr, addr) BITOP_ADDR((void *)(addr) + ((nr)>>3))
|
||||
#define CONST_MASK(nr) (1 << ((nr) & 7))
|
||||
|
||||
/**
|
||||
* set_bit - Atomically set a bit in memory
|
||||
* @nr: the bit to set
|
||||
|
|
@ -43,9 +53,17 @@
|
|||
* Note that @nr may be almost arbitrarily large; this function is not
|
||||
* restricted to acting on a single-word quantity.
|
||||
*/
|
||||
static inline void set_bit(int nr, volatile void *addr)
|
||||
static inline void set_bit(unsigned int nr, volatile unsigned long *addr)
|
||||
{
|
||||
asm volatile(LOCK_PREFIX "bts %1,%0" : ADDR : "Ir" (nr) : "memory");
|
||||
if (IS_IMMEDIATE(nr)) {
|
||||
asm volatile(LOCK_PREFIX "orb %1,%0"
|
||||
: CONST_MASK_ADDR(nr, addr)
|
||||
: "iq" ((u8)CONST_MASK(nr))
|
||||
: "memory");
|
||||
} else {
|
||||
asm volatile(LOCK_PREFIX "bts %1,%0"
|
||||
: BITOP_ADDR(addr) : "Ir" (nr) : "memory");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -57,7 +75,7 @@ static inline void set_bit(int nr, volatile void *addr)
|
|||
* If it's called on the same region of memory simultaneously, the effect
|
||||
* may be that only one operation succeeds.
|
||||
*/
|
||||
static inline void __set_bit(int nr, volatile void *addr)
|
||||
static inline void __set_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
asm volatile("bts %1,%0" : ADDR : "Ir" (nr) : "memory");
|
||||
}
|
||||
|
|
@ -72,9 +90,17 @@ static inline void __set_bit(int nr, volatile void *addr)
|
|||
* you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit()
|
||||
* in order to ensure changes are visible on other processors.
|
||||
*/
|
||||
static inline void clear_bit(int nr, volatile void *addr)
|
||||
static inline void clear_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
asm volatile(LOCK_PREFIX "btr %1,%0" : ADDR : "Ir" (nr));
|
||||
if (IS_IMMEDIATE(nr)) {
|
||||
asm volatile(LOCK_PREFIX "andb %1,%0"
|
||||
: CONST_MASK_ADDR(nr, addr)
|
||||
: "iq" ((u8)~CONST_MASK(nr)));
|
||||
} else {
|
||||
asm volatile(LOCK_PREFIX "btr %1,%0"
|
||||
: BITOP_ADDR(addr)
|
||||
: "Ir" (nr));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -85,13 +111,13 @@ static inline void clear_bit(int nr, volatile void *addr)
|
|||
* clear_bit() is atomic and implies release semantics before the memory
|
||||
* operation. It can be used for an unlock.
|
||||
*/
|
||||
static inline void clear_bit_unlock(unsigned nr, volatile void *addr)
|
||||
static inline void clear_bit_unlock(unsigned nr, volatile unsigned long *addr)
|
||||
{
|
||||
barrier();
|
||||
clear_bit(nr, addr);
|
||||
}
|
||||
|
||||
static inline void __clear_bit(int nr, volatile void *addr)
|
||||
static inline void __clear_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
asm volatile("btr %1,%0" : ADDR : "Ir" (nr));
|
||||
}
|
||||
|
|
@ -108,7 +134,7 @@ static inline void __clear_bit(int nr, volatile void *addr)
|
|||
* No memory barrier is required here, because x86 cannot reorder stores past
|
||||
* older loads. Same principle as spin_unlock.
|
||||
*/
|
||||
static inline void __clear_bit_unlock(unsigned nr, volatile void *addr)
|
||||
static inline void __clear_bit_unlock(unsigned nr, volatile unsigned long *addr)
|
||||
{
|
||||
barrier();
|
||||
__clear_bit(nr, addr);
|
||||
|
|
@ -126,7 +152,7 @@ static inline void __clear_bit_unlock(unsigned nr, volatile void *addr)
|
|||
* If it's called on the same region of memory simultaneously, the effect
|
||||
* may be that only one operation succeeds.
|
||||
*/
|
||||
static inline void __change_bit(int nr, volatile void *addr)
|
||||
static inline void __change_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
asm volatile("btc %1,%0" : ADDR : "Ir" (nr));
|
||||
}
|
||||
|
|
@ -140,7 +166,7 @@ static inline void __change_bit(int nr, volatile void *addr)
|
|||
* Note that @nr may be almost arbitrarily large; this function is not
|
||||
* restricted to acting on a single-word quantity.
|
||||
*/
|
||||
static inline void change_bit(int nr, volatile void *addr)
|
||||
static inline void change_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
asm volatile(LOCK_PREFIX "btc %1,%0" : ADDR : "Ir" (nr));
|
||||
}
|
||||
|
|
@ -153,7 +179,7 @@ static inline void change_bit(int nr, volatile void *addr)
|
|||
* This operation is atomic and cannot be reordered.
|
||||
* It also implies a memory barrier.
|
||||
*/
|
||||
static inline int test_and_set_bit(int nr, volatile void *addr)
|
||||
static inline int test_and_set_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
|
|
@ -170,7 +196,7 @@ static inline int test_and_set_bit(int nr, volatile void *addr)
|
|||
*
|
||||
* This is the same as test_and_set_bit on x86.
|
||||
*/
|
||||
static inline int test_and_set_bit_lock(int nr, volatile void *addr)
|
||||
static inline int test_and_set_bit_lock(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
return test_and_set_bit(nr, addr);
|
||||
}
|
||||
|
|
@ -184,7 +210,7 @@ static inline int test_and_set_bit_lock(int nr, volatile void *addr)
|
|||
* If two examples of this operation race, one can appear to succeed
|
||||
* but actually fail. You must protect multiple accesses with a lock.
|
||||
*/
|
||||
static inline int __test_and_set_bit(int nr, volatile void *addr)
|
||||
static inline int __test_and_set_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
|
|
@ -203,7 +229,7 @@ static inline int __test_and_set_bit(int nr, volatile void *addr)
|
|||
* This operation is atomic and cannot be reordered.
|
||||
* It also implies a memory barrier.
|
||||
*/
|
||||
static inline int test_and_clear_bit(int nr, volatile void *addr)
|
||||
static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
|
|
@ -223,7 +249,7 @@ static inline int test_and_clear_bit(int nr, volatile void *addr)
|
|||
* If two examples of this operation race, one can appear to succeed
|
||||
* but actually fail. You must protect multiple accesses with a lock.
|
||||
*/
|
||||
static inline int __test_and_clear_bit(int nr, volatile void *addr)
|
||||
static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
|
|
@ -235,7 +261,7 @@ static inline int __test_and_clear_bit(int nr, volatile void *addr)
|
|||
}
|
||||
|
||||
/* WARNING: non atomic and it can be reordered! */
|
||||
static inline int __test_and_change_bit(int nr, volatile void *addr)
|
||||
static inline int __test_and_change_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
|
|
@ -255,7 +281,7 @@ static inline int __test_and_change_bit(int nr, volatile void *addr)
|
|||
* This operation is atomic and cannot be reordered.
|
||||
* It also implies a memory barrier.
|
||||
*/
|
||||
static inline int test_and_change_bit(int nr, volatile void *addr)
|
||||
static inline int test_and_change_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
|
|
@ -266,13 +292,13 @@ static inline int test_and_change_bit(int nr, volatile void *addr)
|
|||
return oldbit;
|
||||
}
|
||||
|
||||
static inline int constant_test_bit(int nr, const volatile void *addr)
|
||||
static inline int constant_test_bit(int nr, const volatile unsigned long *addr)
|
||||
{
|
||||
return ((1UL << (nr % BITS_PER_LONG)) &
|
||||
(((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0;
|
||||
}
|
||||
|
||||
static inline int variable_test_bit(int nr, volatile const void *addr)
|
||||
static inline int variable_test_bit(int nr, volatile const unsigned long *addr)
|
||||
{
|
||||
int oldbit;
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
/* setup data types */
|
||||
#define SETUP_NONE 0
|
||||
#define SETUP_E820_EXT 1
|
||||
|
||||
/* extensible setup data list node */
|
||||
struct setup_data {
|
||||
|
|
@ -40,6 +41,7 @@ struct setup_header {
|
|||
__u8 type_of_loader;
|
||||
__u8 loadflags;
|
||||
#define LOADED_HIGH (1<<0)
|
||||
#define QUIET_FLAG (1<<5)
|
||||
#define KEEP_SEGMENTS (1<<6)
|
||||
#define CAN_USE_HEAP (1<<7)
|
||||
__u16 setup_move_size;
|
||||
|
|
|
|||
|
|
@ -93,6 +93,39 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
|
|||
return old;
|
||||
}
|
||||
|
||||
/*
|
||||
* Always use locked operations when touching memory shared with a
|
||||
* hypervisor, since the system may be SMP even if the guest kernel
|
||||
* isn't.
|
||||
*/
|
||||
static inline unsigned long __sync_cmpxchg(volatile void *ptr,
|
||||
unsigned long old,
|
||||
unsigned long new, int size)
|
||||
{
|
||||
unsigned long prev;
|
||||
switch (size) {
|
||||
case 1:
|
||||
asm volatile("lock; cmpxchgb %b1,%2"
|
||||
: "=a"(prev)
|
||||
: "q"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 2:
|
||||
asm volatile("lock; cmpxchgw %w1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
case 4:
|
||||
asm volatile("lock; cmpxchgl %1,%2"
|
||||
: "=a"(prev)
|
||||
: "r"(new), "m"(*__xg(ptr)), "0"(old)
|
||||
: "memory");
|
||||
return prev;
|
||||
}
|
||||
return old;
|
||||
}
|
||||
|
||||
static inline unsigned long __cmpxchg_local(volatile void *ptr,
|
||||
unsigned long old,
|
||||
unsigned long new, int size)
|
||||
|
|
@ -139,6 +172,10 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr,
|
|||
((__typeof__(*(ptr)))__cmpxchg_local((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))))
|
||||
#define sync_cmpxchg(ptr, o, n) \
|
||||
((__typeof__(*(ptr)))__sync_cmpxchg((ptr), (unsigned long)(o), \
|
||||
(unsigned long)(n), \
|
||||
sizeof(*(ptr))))
|
||||
#define cmpxchg64_local(ptr, o, n) \
|
||||
({ \
|
||||
BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
|
||||
|
|
|
|||
|
|
@ -74,8 +74,8 @@
|
|||
#define X86_FEATURE_ARCH_PERFMON (3*32+11) /* Intel Architectural PerfMon */
|
||||
#define X86_FEATURE_PEBS (3*32+12) /* Precise-Event Based Sampling */
|
||||
#define X86_FEATURE_BTS (3*32+13) /* Branch Trace Store */
|
||||
/* 14 free */
|
||||
/* 15 free */
|
||||
#define X86_FEATURE_SYSCALL32 (3*32+14) /* syscall in ia32 userspace */
|
||||
#define X86_FEATURE_SYSENTER32 (3*32+15) /* sysenter in ia32 userspace */
|
||||
#define X86_FEATURE_REP_GOOD (3*32+16) /* rep microcode works well on this CPU */
|
||||
#define X86_FEATURE_MFENCE_RDTSC (3*32+17) /* Mfence synchronizes RDTSC */
|
||||
#define X86_FEATURE_LFENCE_RDTSC (3*32+18) /* Lfence synchronizes RDTSC */
|
||||
|
|
@ -106,6 +106,7 @@
|
|||
/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */
|
||||
#define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */
|
||||
#define X86_FEATURE_CMP_LEGACY (6*32+ 1) /* If yes HyperThreading not valid */
|
||||
#define X86_FEATURE_IBS (6*32+ 10) /* Instruction Based Sampling */
|
||||
|
||||
/*
|
||||
* Auxiliary flags: Linux defined - For features scattered in various
|
||||
|
|
@ -142,11 +143,11 @@ extern const char * const x86_power_flags[32];
|
|||
#define clear_cpu_cap(c, bit) clear_bit(bit, (unsigned long *)((c)->x86_capability))
|
||||
#define setup_clear_cpu_cap(bit) do { \
|
||||
clear_cpu_cap(&boot_cpu_data, bit); \
|
||||
set_bit(bit, cleared_cpu_caps); \
|
||||
set_bit(bit, (unsigned long *)cleared_cpu_caps); \
|
||||
} while (0)
|
||||
#define setup_force_cpu_cap(bit) do { \
|
||||
set_cpu_cap(&boot_cpu_data, bit); \
|
||||
clear_bit(bit, cleared_cpu_caps); \
|
||||
clear_bit(bit, (unsigned long *)cleared_cpu_caps); \
|
||||
} while (0)
|
||||
|
||||
#define cpu_has_fpu boot_cpu_has(X86_FEATURE_FPU)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,39 @@
|
|||
#ifndef _X86_CURRENT_H
|
||||
#define _X86_CURRENT_H
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# include "current_32.h"
|
||||
#else
|
||||
# include "current_64.h"
|
||||
#endif
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/percpu.h>
|
||||
|
||||
struct task_struct;
|
||||
|
||||
DECLARE_PER_CPU(struct task_struct *, current_task);
|
||||
static __always_inline struct task_struct *get_current(void)
|
||||
{
|
||||
return x86_read_percpu(current_task);
|
||||
}
|
||||
|
||||
#else /* X86_32 */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/pda.h>
|
||||
|
||||
struct task_struct;
|
||||
|
||||
static __always_inline struct task_struct *get_current(void)
|
||||
{
|
||||
return read_pda(pcurrent);
|
||||
}
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
#include <asm/asm-offsets.h>
|
||||
#define GET_CURRENT(reg) movq %gs:(pda_pcurrent),reg
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* X86_32 */
|
||||
|
||||
#define current get_current()
|
||||
|
||||
#endif /* X86_CURRENT_H */
|
||||
|
|
|
|||
|
|
@ -1,17 +0,0 @@
|
|||
#ifndef _I386_CURRENT_H
|
||||
#define _I386_CURRENT_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/percpu.h>
|
||||
|
||||
struct task_struct;
|
||||
|
||||
DECLARE_PER_CPU(struct task_struct *, current_task);
|
||||
static __always_inline struct task_struct *get_current(void)
|
||||
{
|
||||
return x86_read_percpu(current_task);
|
||||
}
|
||||
|
||||
#define current get_current()
|
||||
|
||||
#endif /* !(_I386_CURRENT_H) */
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
#ifndef _X86_64_CURRENT_H
|
||||
#define _X86_64_CURRENT_H
|
||||
|
||||
#if !defined(__ASSEMBLY__)
|
||||
struct task_struct;
|
||||
|
||||
#include <asm/pda.h>
|
||||
|
||||
static inline struct task_struct *get_current(void)
|
||||
{
|
||||
struct task_struct *t = read_pda(pcurrent);
|
||||
return t;
|
||||
}
|
||||
|
||||
#define current get_current()
|
||||
|
||||
#else
|
||||
|
||||
#ifndef ASM_OFFSET_H
|
||||
#include <asm/asm-offsets.h>
|
||||
#endif
|
||||
|
||||
#define GET_CURRENT(reg) movq %gs:(pda_pcurrent),reg
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* !(_X86_64_CURRENT_H) */
|
||||
|
|
@ -29,11 +29,17 @@ static inline void fill_ldt(struct desc_struct *desc,
|
|||
extern struct desc_ptr idt_descr;
|
||||
extern gate_desc idt_table[];
|
||||
|
||||
struct gdt_page {
|
||||
struct desc_struct gdt[GDT_ENTRIES];
|
||||
} __attribute__((aligned(PAGE_SIZE)));
|
||||
DECLARE_PER_CPU(struct gdt_page, gdt_page);
|
||||
|
||||
static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
|
||||
{
|
||||
return per_cpu(gdt_page, cpu).gdt;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
extern struct desc_struct cpu_gdt_table[GDT_ENTRIES];
|
||||
extern struct desc_ptr cpu_gdt_descr[];
|
||||
/* the cpu gdt accessor */
|
||||
#define get_cpu_gdt_table(x) ((struct desc_struct *)cpu_gdt_descr[x].address)
|
||||
|
||||
static inline void pack_gate(gate_desc *gate, unsigned type, unsigned long func,
|
||||
unsigned dpl, unsigned ist, unsigned seg)
|
||||
|
|
@ -51,16 +57,6 @@ static inline void pack_gate(gate_desc *gate, unsigned type, unsigned long func,
|
|||
}
|
||||
|
||||
#else
|
||||
struct gdt_page {
|
||||
struct desc_struct gdt[GDT_ENTRIES];
|
||||
} __attribute__((aligned(PAGE_SIZE)));
|
||||
DECLARE_PER_CPU(struct gdt_page, gdt_page);
|
||||
|
||||
static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
|
||||
{
|
||||
return per_cpu(gdt_page, cpu).gdt;
|
||||
}
|
||||
|
||||
static inline void pack_gate(gate_desc *gate, unsigned char type,
|
||||
unsigned long base, unsigned dpl, unsigned flags,
|
||||
unsigned short seg)
|
||||
|
|
@ -311,6 +307,28 @@ static inline void set_intr_gate(unsigned int n, void *addr)
|
|||
_set_gate(n, GATE_INTERRUPT, addr, 0, 0, __KERNEL_CS);
|
||||
}
|
||||
|
||||
#define SYS_VECTOR_FREE 0
|
||||
#define SYS_VECTOR_ALLOCED 1
|
||||
|
||||
extern int first_system_vector;
|
||||
extern char system_vectors[];
|
||||
|
||||
static inline void alloc_system_vector(int vector)
|
||||
{
|
||||
if (system_vectors[vector] == SYS_VECTOR_FREE) {
|
||||
system_vectors[vector] = SYS_VECTOR_ALLOCED;
|
||||
if (first_system_vector > vector)
|
||||
first_system_vector = vector;
|
||||
} else
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void alloc_intr_gate(unsigned int n, void *addr)
|
||||
{
|
||||
alloc_system_vector(n);
|
||||
set_intr_gate(n, addr);
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine sets up an interrupt gate at directory privilege level 3.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -75,10 +75,14 @@ struct ldttss_desc64 {
|
|||
typedef struct gate_struct64 gate_desc;
|
||||
typedef struct ldttss_desc64 ldt_desc;
|
||||
typedef struct ldttss_desc64 tss_desc;
|
||||
#define gate_offset(g) ((g).offset_low | ((unsigned long)(g).offset_middle << 16) | ((unsigned long)(g).offset_high << 32))
|
||||
#define gate_segment(g) ((g).segment)
|
||||
#else
|
||||
typedef struct desc_struct gate_desc;
|
||||
typedef struct desc_struct ldt_desc;
|
||||
typedef struct desc_struct tss_desc;
|
||||
#define gate_offset(g) (((g).b & 0xffff0000) | ((g).a & 0x0000ffff))
|
||||
#define gate_segment(g) ((g).a >> 16)
|
||||
#endif
|
||||
|
||||
struct desc_ptr {
|
||||
|
|
|
|||
|
|
@ -3,12 +3,6 @@
|
|||
|
||||
#include <asm/io.h>
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
||||
#define dmi_alloc alloc_bootmem
|
||||
|
||||
#else /* CONFIG_X86_32 */
|
||||
|
||||
#define DMI_MAX_DATA 2048
|
||||
|
||||
extern int dmi_alloc_index;
|
||||
|
|
@ -25,8 +19,6 @@ static inline void *dmi_alloc(unsigned len)
|
|||
return dmi_alloc_data + idx;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Use early IO mappings for DMI because it's initialized early */
|
||||
#define dmi_ioremap early_ioremap
|
||||
#define dmi_iounmap early_iounmap
|
||||
|
|
|
|||
|
|
@ -1,5 +1,61 @@
|
|||
#ifdef CONFIG_X86_32
|
||||
# include "dwarf2_32.h"
|
||||
#else
|
||||
# include "dwarf2_64.h"
|
||||
#ifndef _DWARF2_H
|
||||
#define _DWARF2_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#warning "asm/dwarf2.h should be only included in pure assembly files"
|
||||
#endif
|
||||
|
||||
/*
|
||||
Macros for dwarf2 CFI unwind table entries.
|
||||
See "as.info" for details on these pseudo ops. Unfortunately
|
||||
they are only supported in very new binutils, so define them
|
||||
away for older version.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_AS_CFI
|
||||
|
||||
#define CFI_STARTPROC .cfi_startproc
|
||||
#define CFI_ENDPROC .cfi_endproc
|
||||
#define CFI_DEF_CFA .cfi_def_cfa
|
||||
#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register
|
||||
#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset
|
||||
#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset
|
||||
#define CFI_OFFSET .cfi_offset
|
||||
#define CFI_REL_OFFSET .cfi_rel_offset
|
||||
#define CFI_REGISTER .cfi_register
|
||||
#define CFI_RESTORE .cfi_restore
|
||||
#define CFI_REMEMBER_STATE .cfi_remember_state
|
||||
#define CFI_RESTORE_STATE .cfi_restore_state
|
||||
#define CFI_UNDEFINED .cfi_undefined
|
||||
|
||||
#ifdef CONFIG_AS_CFI_SIGNAL_FRAME
|
||||
#define CFI_SIGNAL_FRAME .cfi_signal_frame
|
||||
#else
|
||||
#define CFI_SIGNAL_FRAME
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
/* Due to the structure of pre-exisiting code, don't use assembler line
|
||||
comment character # to ignore the arguments. Instead, use a dummy macro. */
|
||||
.macro ignore a=0, b=0, c=0, d=0
|
||||
.endm
|
||||
|
||||
#define CFI_STARTPROC ignore
|
||||
#define CFI_ENDPROC ignore
|
||||
#define CFI_DEF_CFA ignore
|
||||
#define CFI_DEF_CFA_REGISTER ignore
|
||||
#define CFI_DEF_CFA_OFFSET ignore
|
||||
#define CFI_ADJUST_CFA_OFFSET ignore
|
||||
#define CFI_OFFSET ignore
|
||||
#define CFI_REL_OFFSET ignore
|
||||
#define CFI_REGISTER ignore
|
||||
#define CFI_RESTORE ignore
|
||||
#define CFI_REMEMBER_STATE ignore
|
||||
#define CFI_RESTORE_STATE ignore
|
||||
#define CFI_UNDEFINED ignore
|
||||
#define CFI_SIGNAL_FRAME ignore
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,61 +0,0 @@
|
|||
#ifndef _DWARF2_H
|
||||
#define _DWARF2_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#warning "asm/dwarf2.h should be only included in pure assembly files"
|
||||
#endif
|
||||
|
||||
/*
|
||||
Macros for dwarf2 CFI unwind table entries.
|
||||
See "as.info" for details on these pseudo ops. Unfortunately
|
||||
they are only supported in very new binutils, so define them
|
||||
away for older version.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_UNWIND_INFO
|
||||
|
||||
#define CFI_STARTPROC .cfi_startproc
|
||||
#define CFI_ENDPROC .cfi_endproc
|
||||
#define CFI_DEF_CFA .cfi_def_cfa
|
||||
#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register
|
||||
#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset
|
||||
#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset
|
||||
#define CFI_OFFSET .cfi_offset
|
||||
#define CFI_REL_OFFSET .cfi_rel_offset
|
||||
#define CFI_REGISTER .cfi_register
|
||||
#define CFI_RESTORE .cfi_restore
|
||||
#define CFI_REMEMBER_STATE .cfi_remember_state
|
||||
#define CFI_RESTORE_STATE .cfi_restore_state
|
||||
#define CFI_UNDEFINED .cfi_undefined
|
||||
|
||||
#ifdef CONFIG_AS_CFI_SIGNAL_FRAME
|
||||
#define CFI_SIGNAL_FRAME .cfi_signal_frame
|
||||
#else
|
||||
#define CFI_SIGNAL_FRAME
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
/* Due to the structure of pre-exisiting code, don't use assembler line
|
||||
comment character # to ignore the arguments. Instead, use a dummy macro. */
|
||||
.macro ignore a=0, b=0, c=0, d=0
|
||||
.endm
|
||||
|
||||
#define CFI_STARTPROC ignore
|
||||
#define CFI_ENDPROC ignore
|
||||
#define CFI_DEF_CFA ignore
|
||||
#define CFI_DEF_CFA_REGISTER ignore
|
||||
#define CFI_DEF_CFA_OFFSET ignore
|
||||
#define CFI_ADJUST_CFA_OFFSET ignore
|
||||
#define CFI_OFFSET ignore
|
||||
#define CFI_REL_OFFSET ignore
|
||||
#define CFI_REGISTER ignore
|
||||
#define CFI_RESTORE ignore
|
||||
#define CFI_REMEMBER_STATE ignore
|
||||
#define CFI_RESTORE_STATE ignore
|
||||
#define CFI_UNDEFINED ignore
|
||||
#define CFI_SIGNAL_FRAME ignore
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
#ifndef _DWARF2_H
|
||||
#define _DWARF2_H 1
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#warning "asm/dwarf2.h should be only included in pure assembly files"
|
||||
#endif
|
||||
|
||||
/*
|
||||
Macros for dwarf2 CFI unwind table entries.
|
||||
See "as.info" for details on these pseudo ops. Unfortunately
|
||||
they are only supported in very new binutils, so define them
|
||||
away for older version.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_AS_CFI
|
||||
|
||||
#define CFI_STARTPROC .cfi_startproc
|
||||
#define CFI_ENDPROC .cfi_endproc
|
||||
#define CFI_DEF_CFA .cfi_def_cfa
|
||||
#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register
|
||||
#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset
|
||||
#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset
|
||||
#define CFI_OFFSET .cfi_offset
|
||||
#define CFI_REL_OFFSET .cfi_rel_offset
|
||||
#define CFI_REGISTER .cfi_register
|
||||
#define CFI_RESTORE .cfi_restore
|
||||
#define CFI_REMEMBER_STATE .cfi_remember_state
|
||||
#define CFI_RESTORE_STATE .cfi_restore_state
|
||||
#define CFI_UNDEFINED .cfi_undefined
|
||||
#ifdef CONFIG_AS_CFI_SIGNAL_FRAME
|
||||
#define CFI_SIGNAL_FRAME .cfi_signal_frame
|
||||
#else
|
||||
#define CFI_SIGNAL_FRAME
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
/* use assembler line comment character # to ignore the arguments. */
|
||||
#define CFI_STARTPROC #
|
||||
#define CFI_ENDPROC #
|
||||
#define CFI_DEF_CFA #
|
||||
#define CFI_DEF_CFA_REGISTER #
|
||||
#define CFI_DEF_CFA_OFFSET #
|
||||
#define CFI_ADJUST_CFA_OFFSET #
|
||||
#define CFI_OFFSET #
|
||||
#define CFI_REL_OFFSET #
|
||||
#define CFI_REGISTER #
|
||||
#define CFI_RESTORE #
|
||||
#define CFI_REMEMBER_STATE #
|
||||
#define CFI_RESTORE_STATE #
|
||||
#define CFI_UNDEFINED #
|
||||
#define CFI_SIGNAL_FRAME #
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -2,6 +2,41 @@
|
|||
#define __ASM_E820_H
|
||||
#define E820MAP 0x2d0 /* our map */
|
||||
#define E820MAX 128 /* number of entries in E820MAP */
|
||||
|
||||
/*
|
||||
* Legacy E820 BIOS limits us to 128 (E820MAX) nodes due to the
|
||||
* constrained space in the zeropage. If we have more nodes than
|
||||
* that, and if we've booted off EFI firmware, then the EFI tables
|
||||
* passed us from the EFI firmware can list more nodes. Size our
|
||||
* internal memory map tables to have room for these additional
|
||||
* nodes, based on up to three entries per node for which the
|
||||
* kernel was built: MAX_NUMNODES == (1 << CONFIG_NODES_SHIFT),
|
||||
* plus E820MAX, allowing space for the possible duplicate E820
|
||||
* entries that might need room in the same arrays, prior to the
|
||||
* call to sanitize_e820_map() to remove duplicates. The allowance
|
||||
* of three memory map entries per node is "enough" entries for
|
||||
* the initial hardware platform motivating this mechanism to make
|
||||
* use of additional EFI map entries. Future platforms may want
|
||||
* to allow more than three entries per node or otherwise refine
|
||||
* this size.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Odd: 'make headers_check' complains about numa.h if I try
|
||||
* to collapse the next two #ifdef lines to a single line:
|
||||
* #if defined(__KERNEL__) && defined(CONFIG_EFI)
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
#ifdef CONFIG_EFI
|
||||
#include <linux/numa.h>
|
||||
#define E820_X_MAX (E820MAX + 3 * MAX_NUMNODES)
|
||||
#else /* ! CONFIG_EFI */
|
||||
#define E820_X_MAX E820MAX
|
||||
#endif
|
||||
#else /* ! __KERNEL__ */
|
||||
#define E820_X_MAX E820MAX
|
||||
#endif
|
||||
|
||||
#define E820NR 0x1e8 /* # entries in E820MAP */
|
||||
|
||||
#define E820_RAM 1
|
||||
|
|
@ -9,6 +44,9 @@
|
|||
#define E820_ACPI 3
|
||||
#define E820_NVS 4
|
||||
|
||||
/* reserved RAM used by kernel itself */
|
||||
#define E820_RESERVED_KERN 128
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
struct e820entry {
|
||||
__u64 addr; /* start of memory segment */
|
||||
|
|
@ -18,22 +56,79 @@ struct e820entry {
|
|||
|
||||
struct e820map {
|
||||
__u32 nr_map;
|
||||
struct e820entry map[E820MAX];
|
||||
struct e820entry map[E820_X_MAX];
|
||||
};
|
||||
|
||||
/* see comment in arch/x86/kernel/e820.c */
|
||||
extern struct e820map e820;
|
||||
extern struct e820map e820_saved;
|
||||
|
||||
extern int e820_any_mapped(u64 start, u64 end, unsigned type);
|
||||
extern int e820_all_mapped(u64 start, u64 end, unsigned type);
|
||||
extern void e820_add_region(u64 start, u64 size, int type);
|
||||
extern void e820_print_map(char *who);
|
||||
extern int
|
||||
sanitize_e820_map(struct e820entry *biosmap, int max_nr_map, int *pnr_map);
|
||||
extern u64 e820_update_range(u64 start, u64 size, unsigned old_type,
|
||||
unsigned new_type);
|
||||
extern u64 e820_remove_range(u64 start, u64 size, unsigned old_type,
|
||||
int checktype);
|
||||
extern void update_e820(void);
|
||||
extern void e820_setup_gap(void);
|
||||
extern int e820_search_gap(unsigned long *gapstart, unsigned long *gapsize,
|
||||
unsigned long start_addr, unsigned long long end_addr);
|
||||
struct setup_data;
|
||||
extern void parse_e820_ext(struct setup_data *data, unsigned long pa_data);
|
||||
|
||||
#if defined(CONFIG_X86_64) || \
|
||||
(defined(CONFIG_X86_32) && defined(CONFIG_HIBERNATION))
|
||||
extern void e820_mark_nosave_regions(unsigned long limit_pfn);
|
||||
#else
|
||||
static inline void e820_mark_nosave_regions(unsigned long limit_pfn)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
extern unsigned long end_user_pfn;
|
||||
|
||||
extern u64 find_e820_area(u64 start, u64 end, u64 size, u64 align);
|
||||
extern u64 find_e820_area_size(u64 start, u64 *sizep, u64 align);
|
||||
extern void reserve_early(u64 start, u64 end, char *name);
|
||||
extern void reserve_early_overlap_ok(u64 start, u64 end, char *name);
|
||||
extern void free_early(u64 start, u64 end);
|
||||
extern void early_res_to_bootmem(u64 start, u64 end);
|
||||
extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align);
|
||||
|
||||
extern unsigned long e820_end_of_ram_pfn(void);
|
||||
extern unsigned long e820_end_of_low_ram_pfn(void);
|
||||
extern int e820_find_active_region(const struct e820entry *ei,
|
||||
unsigned long start_pfn,
|
||||
unsigned long last_pfn,
|
||||
unsigned long *ei_startpfn,
|
||||
unsigned long *ei_endpfn);
|
||||
extern void e820_register_active_regions(int nid, unsigned long start_pfn,
|
||||
unsigned long end_pfn);
|
||||
extern u64 e820_hole_size(u64 start, u64 end);
|
||||
extern void finish_e820_parsing(void);
|
||||
extern void e820_reserve_resources(void);
|
||||
extern void setup_memory_map(void);
|
||||
extern char *default_machine_specific_memory_setup(void);
|
||||
extern char *machine_specific_memory_setup(void);
|
||||
extern char *memory_setup(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#define ISA_START_ADDRESS 0xa0000
|
||||
#define ISA_END_ADDRESS 0x100000
|
||||
#define is_ISA_range(s, e) ((s) >= ISA_START_ADDRESS && (e) < ISA_END_ADDRESS)
|
||||
|
||||
#define BIOS_BEGIN 0x000a0000
|
||||
#define BIOS_END 0x00100000
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#ifdef CONFIG_X86_32
|
||||
# include "e820_32.h"
|
||||
#else
|
||||
# include "e820_64.h"
|
||||
#endif
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#define HIGH_MEMORY (1024*1024)
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASM_E820_H */
|
||||
|
|
|
|||
|
|
@ -1,50 +0,0 @@
|
|||
/*
|
||||
* structures and definitions for the int 15, ax=e820 memory map
|
||||
* scheme.
|
||||
*
|
||||
* In a nutshell, arch/i386/boot/setup.S populates a scratch table
|
||||
* in the empty_zero_block that contains a list of usable address/size
|
||||
* duples. In arch/i386/kernel/setup.c, this information is
|
||||
* transferred into the e820map, and in arch/i386/mm/init.c, that
|
||||
* new information is used to mark pages reserved or not.
|
||||
*
|
||||
*/
|
||||
#ifndef __E820_HEADER
|
||||
#define __E820_HEADER
|
||||
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#define HIGH_MEMORY (1024*1024)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
extern struct e820map e820;
|
||||
extern void update_e820(void);
|
||||
|
||||
extern int e820_all_mapped(unsigned long start, unsigned long end,
|
||||
unsigned type);
|
||||
extern int e820_any_mapped(u64 start, u64 end, unsigned type);
|
||||
extern void propagate_e820_map(void);
|
||||
extern void register_bootmem_low_pages(unsigned long max_low_pfn);
|
||||
extern void add_memory_region(unsigned long long start,
|
||||
unsigned long long size, int type);
|
||||
extern void update_memory_range(u64 start, u64 size, unsigned old_type,
|
||||
unsigned new_type);
|
||||
extern void e820_register_memory(void);
|
||||
extern void limit_regions(unsigned long long size);
|
||||
extern void print_memory_map(char *who);
|
||||
extern void init_iomem_resources(struct resource *code_resource,
|
||||
struct resource *data_resource,
|
||||
struct resource *bss_resource);
|
||||
|
||||
#if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION)
|
||||
extern void e820_mark_nosave_regions(void);
|
||||
#else
|
||||
static inline void e820_mark_nosave_regions(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif/*!__ASSEMBLY__*/
|
||||
#endif/*__E820_HEADER*/
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* structures and definitions for the int 15, ax=e820 memory map
|
||||
* scheme.
|
||||
*
|
||||
* In a nutshell, setup.S populates a scratch table in the
|
||||
* empty_zero_block that contains a list of usable address/size
|
||||
* duples. setup.c, this information is transferred into the e820map,
|
||||
* and in init.c/numa.c, that new information is used to mark pages
|
||||
* reserved or not.
|
||||
*/
|
||||
#ifndef __E820_HEADER
|
||||
#define __E820_HEADER
|
||||
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern unsigned long find_e820_area(unsigned long start, unsigned long end,
|
||||
unsigned long size, unsigned long align);
|
||||
extern unsigned long find_e820_area_size(unsigned long start,
|
||||
unsigned long *sizep,
|
||||
unsigned long align);
|
||||
extern void add_memory_region(unsigned long start, unsigned long size,
|
||||
int type);
|
||||
extern void update_memory_range(u64 start, u64 size, unsigned old_type,
|
||||
unsigned new_type);
|
||||
extern void setup_memory_region(void);
|
||||
extern void contig_e820_setup(void);
|
||||
extern unsigned long e820_end_of_ram(void);
|
||||
extern void e820_reserve_resources(void);
|
||||
extern void e820_mark_nosave_regions(void);
|
||||
extern int e820_any_mapped(unsigned long start, unsigned long end,
|
||||
unsigned type);
|
||||
extern int e820_all_mapped(unsigned long start, unsigned long end,
|
||||
unsigned type);
|
||||
extern int e820_any_non_reserved(unsigned long start, unsigned long end);
|
||||
extern int is_memory_any_valid(unsigned long start, unsigned long end);
|
||||
extern int e820_all_non_reserved(unsigned long start, unsigned long end);
|
||||
extern int is_memory_all_valid(unsigned long start, unsigned long end);
|
||||
extern unsigned long e820_hole_size(unsigned long start, unsigned long end);
|
||||
|
||||
extern void e820_setup_gap(void);
|
||||
extern void e820_register_active_regions(int nid, unsigned long start_pfn,
|
||||
unsigned long end_pfn);
|
||||
|
||||
extern void finish_e820_parsing(void);
|
||||
|
||||
extern struct e820map e820;
|
||||
extern void update_e820(void);
|
||||
|
||||
extern void reserve_early(unsigned long start, unsigned long end, char *name);
|
||||
extern void free_early(unsigned long start, unsigned long end);
|
||||
extern void early_res_to_bootmem(unsigned long start, unsigned long end);
|
||||
|
||||
#endif/*!__ASSEMBLY__*/
|
||||
|
||||
#endif/*__E820_HEADER*/
|
||||
|
|
@ -90,7 +90,7 @@ extern void *efi_ioremap(unsigned long addr, unsigned long size);
|
|||
|
||||
#endif /* CONFIG_X86_32 */
|
||||
|
||||
extern void efi_reserve_bootmem(void);
|
||||
extern void efi_reserve_early(void);
|
||||
extern void efi_call_phys_prelog(void);
|
||||
extern void efi_call_phys_epilog(void);
|
||||
|
||||
|
|
|
|||
|
|
@ -83,9 +83,9 @@ extern unsigned int vdso_enabled;
|
|||
(((x)->e_machine == EM_386) || ((x)->e_machine == EM_486))
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#include <asm/system.h> /* for savesegment */
|
||||
#include <asm/desc.h>
|
||||
|
||||
#define elf_check_arch(x) elf_check_arch_ia32(x)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,62 @@
|
|||
# include "fixmap_64.h"
|
||||
#endif
|
||||
|
||||
extern int fixmaps_set;
|
||||
|
||||
void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
|
||||
void native_set_fixmap(enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
|
||||
#ifndef CONFIG_PARAVIRT
|
||||
static inline void __set_fixmap(enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags)
|
||||
{
|
||||
native_set_fixmap(idx, phys, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
|
||||
/*
|
||||
* Some hardware wants to get fixmapped without caching.
|
||||
*/
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
|
||||
#define clear_fixmap(idx) \
|
||||
__set_fixmap(idx, 0, __pgprot(0))
|
||||
|
||||
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
|
||||
#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
|
||||
|
||||
extern void __this_fixmap_does_not_exist(void);
|
||||
|
||||
/*
|
||||
* 'index to address' translation. If anyone tries to use the idx
|
||||
* directly without translation, we catch the bug with a NULL-deference
|
||||
* kernel oops. Illegal ranges of incoming indices are caught too.
|
||||
*/
|
||||
static __always_inline unsigned long fix_to_virt(const unsigned int idx)
|
||||
{
|
||||
/*
|
||||
* this branch gets completely eliminated after inlining,
|
||||
* except when someone tries to use fixaddr indices in an
|
||||
* illegal way. (such as mixing up address types or using
|
||||
* out-of-range indices).
|
||||
*
|
||||
* If it doesn't get removed, the linker will complain
|
||||
* loudly with a reasonably clear error message..
|
||||
*/
|
||||
if (idx >= __end_of_fixed_addresses)
|
||||
__this_fixmap_does_not_exist();
|
||||
|
||||
return __fix_to_virt(idx);
|
||||
}
|
||||
|
||||
static inline unsigned long virt_to_fix(const unsigned long vaddr)
|
||||
{
|
||||
BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
|
||||
return __virt_to_fix(vaddr);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -79,10 +79,6 @@ enum fixed_addresses {
|
|||
FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
|
||||
FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI
|
||||
FIX_ACPI_BEGIN,
|
||||
FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
|
||||
#endif
|
||||
#ifdef CONFIG_PCI_MMCONFIG
|
||||
FIX_PCIE_MCFG,
|
||||
#endif
|
||||
|
|
@ -103,23 +99,18 @@ enum fixed_addresses {
|
|||
(__end_of_permanent_fixed_addresses & 511),
|
||||
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_NESTING - 1,
|
||||
FIX_WP_TEST,
|
||||
#ifdef CONFIG_ACPI
|
||||
FIX_ACPI_BEGIN,
|
||||
FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
|
||||
#endif
|
||||
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
|
||||
FIX_OHCI1394_BASE,
|
||||
#endif
|
||||
__end_of_fixed_addresses
|
||||
};
|
||||
|
||||
extern void __set_fixmap(enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
extern void reserve_top_address(unsigned long reserve);
|
||||
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
/*
|
||||
* Some hardware wants to get fixmapped without caching.
|
||||
*/
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
|
||||
#define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP)
|
||||
|
||||
|
|
@ -128,38 +119,5 @@ extern void reserve_top_address(unsigned long reserve);
|
|||
#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
|
||||
#define FIXADDR_BOOT_START (FIXADDR_TOP - __FIXADDR_BOOT_SIZE)
|
||||
|
||||
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
|
||||
#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
|
||||
|
||||
extern void __this_fixmap_does_not_exist(void);
|
||||
|
||||
/*
|
||||
* 'index to address' translation. If anyone tries to use the idx
|
||||
* directly without tranlation, we catch the bug with a NULL-deference
|
||||
* kernel oops. Illegal ranges of incoming indices are caught too.
|
||||
*/
|
||||
static __always_inline unsigned long fix_to_virt(const unsigned int idx)
|
||||
{
|
||||
/*
|
||||
* this branch gets completely eliminated after inlining,
|
||||
* except when someone tries to use fixaddr indices in an
|
||||
* illegal way. (such as mixing up address types or using
|
||||
* out-of-range indices).
|
||||
*
|
||||
* If it doesn't get removed, the linker will complain
|
||||
* loudly with a reasonably clear error message..
|
||||
*/
|
||||
if (idx >= __end_of_fixed_addresses)
|
||||
__this_fixmap_does_not_exist();
|
||||
|
||||
return __fix_to_virt(idx);
|
||||
}
|
||||
|
||||
static inline unsigned long virt_to_fix(const unsigned long vaddr)
|
||||
{
|
||||
BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
|
||||
return __virt_to_fix(vaddr);
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#define _ASM_FIXMAP_64_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/apicdef.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/vsyscall.h>
|
||||
|
|
@ -39,30 +40,38 @@ enum fixed_addresses {
|
|||
VSYSCALL_HPET,
|
||||
FIX_DBGP_BASE,
|
||||
FIX_EARLYCON_MEM_BASE,
|
||||
FIX_HPET_BASE,
|
||||
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
|
||||
FIX_IO_APIC_BASE_0,
|
||||
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
|
||||
FIX_EFI_IO_MAP_LAST_PAGE,
|
||||
FIX_EFI_IO_MAP_FIRST_PAGE = FIX_EFI_IO_MAP_LAST_PAGE
|
||||
+ MAX_EFI_IO_PAGES - 1,
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
FIX_PARAVIRT_BOOTMAP,
|
||||
#endif
|
||||
#ifdef CONFIG_ACPI
|
||||
FIX_ACPI_BEGIN,
|
||||
FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
|
||||
#endif
|
||||
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
|
||||
FIX_OHCI1394_BASE,
|
||||
#endif
|
||||
__end_of_permanent_fixed_addresses,
|
||||
/*
|
||||
* 256 temporary boot-time mappings, used by early_ioremap(),
|
||||
* before ioremap() is functional.
|
||||
*
|
||||
* We round it up to the next 512 pages boundary so that we
|
||||
* can have a single pgd entry and a single pte table:
|
||||
*/
|
||||
#define NR_FIX_BTMAPS 64
|
||||
#define FIX_BTMAPS_NESTING 4
|
||||
FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 512 -
|
||||
(__end_of_permanent_fixed_addresses & 511),
|
||||
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_NESTING - 1,
|
||||
__end_of_fixed_addresses
|
||||
};
|
||||
|
||||
extern void __set_fixmap(enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
|
||||
#define set_fixmap(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL)
|
||||
/*
|
||||
* Some hardware wants to get fixmapped without caching.
|
||||
*/
|
||||
#define set_fixmap_nocache(idx, phys) \
|
||||
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
|
||||
|
||||
#define FIXADDR_TOP (VSYSCALL_END-PAGE_SIZE)
|
||||
#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
||||
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
|
||||
|
|
@ -71,30 +80,4 @@ extern void __set_fixmap(enum fixed_addresses idx,
|
|||
#define FIXADDR_USER_START ((unsigned long)VSYSCALL32_VSYSCALL)
|
||||
#define FIXADDR_USER_END (FIXADDR_USER_START + PAGE_SIZE)
|
||||
|
||||
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
|
||||
|
||||
extern void __this_fixmap_does_not_exist(void);
|
||||
|
||||
/*
|
||||
* 'index to address' translation. If anyone tries to use the idx
|
||||
* directly without translation, we catch the bug with a NULL-deference
|
||||
* kernel oops. Illegal ranges of incoming indices are caught too.
|
||||
*/
|
||||
static __always_inline unsigned long fix_to_virt(const unsigned int idx)
|
||||
{
|
||||
/*
|
||||
* this branch gets completely eliminated after inlining,
|
||||
* except when someone tries to use fixaddr indices in an
|
||||
* illegal way. (such as mixing up address types or using
|
||||
* out-of-range indices).
|
||||
*
|
||||
* If it doesn't get removed, the linker will complain
|
||||
* loudly with a reasonably clear error message..
|
||||
*/
|
||||
if (idx >= __end_of_fixed_addresses)
|
||||
__this_fixmap_does_not_exist();
|
||||
|
||||
return __fix_to_virt(idx);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,34 +1,72 @@
|
|||
#ifndef _ASM_X8664_IOMMU_H
|
||||
#define _ASM_X8664_IOMMU_H 1
|
||||
#ifndef _ASM_X8664_GART_H
|
||||
#define _ASM_X8664_GART_H 1
|
||||
|
||||
#include <asm/e820.h>
|
||||
#include <asm/iommu.h>
|
||||
|
||||
extern void set_up_gart_resume(u32, u32);
|
||||
|
||||
extern void pci_iommu_shutdown(void);
|
||||
extern void no_iommu_init(void);
|
||||
extern int force_iommu, no_iommu;
|
||||
extern int iommu_detected;
|
||||
#ifdef CONFIG_GART_IOMMU
|
||||
extern void gart_iommu_init(void);
|
||||
extern void gart_iommu_shutdown(void);
|
||||
extern void __init gart_parse_options(char *);
|
||||
extern void early_gart_iommu_check(void);
|
||||
extern void gart_iommu_hole_init(void);
|
||||
extern int fallback_aper_order;
|
||||
extern int fallback_aper_force;
|
||||
extern int gart_iommu_aperture;
|
||||
extern int gart_iommu_aperture_allowed;
|
||||
extern int gart_iommu_aperture_disabled;
|
||||
extern int fix_aperture;
|
||||
#else
|
||||
#define gart_iommu_aperture 0
|
||||
#define gart_iommu_aperture_allowed 0
|
||||
|
||||
static inline void early_gart_iommu_check(void)
|
||||
/* PTE bits. */
|
||||
#define GPTE_VALID 1
|
||||
#define GPTE_COHERENT 2
|
||||
|
||||
/* Aperture control register bits. */
|
||||
#define GARTEN (1<<0)
|
||||
#define DISGARTCPU (1<<4)
|
||||
#define DISGARTIO (1<<5)
|
||||
|
||||
/* GART cache control register bits. */
|
||||
#define INVGART (1<<0)
|
||||
#define GARTPTEERR (1<<1)
|
||||
|
||||
/* K8 On-cpu GART registers */
|
||||
#define AMD64_GARTAPERTURECTL 0x90
|
||||
#define AMD64_GARTAPERTUREBASE 0x94
|
||||
#define AMD64_GARTTABLEBASE 0x98
|
||||
#define AMD64_GARTCACHECTL 0x9c
|
||||
#define AMD64_GARTEN (1<<0)
|
||||
|
||||
static inline void enable_gart_translation(struct pci_dev *dev, u64 addr)
|
||||
{
|
||||
u32 tmp, ctl;
|
||||
|
||||
/* address of the mappings table */
|
||||
addr >>= 12;
|
||||
tmp = (u32) addr<<4;
|
||||
tmp &= ~0xf;
|
||||
pci_write_config_dword(dev, AMD64_GARTTABLEBASE, tmp);
|
||||
|
||||
/* Enable GART translation for this hammer. */
|
||||
pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &ctl);
|
||||
ctl |= GARTEN;
|
||||
ctl &= ~(DISGARTCPU | DISGARTIO);
|
||||
pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl);
|
||||
}
|
||||
|
||||
static inline void gart_iommu_shutdown(void)
|
||||
static inline int aperture_valid(u64 aper_base, u32 aper_size, u32 min_size)
|
||||
{
|
||||
if (!aper_base)
|
||||
return 0;
|
||||
|
||||
if (aper_base + aper_size > 0x100000000ULL) {
|
||||
printk(KERN_ERR "Aperture beyond 4GB. Ignoring.\n");
|
||||
return 0;
|
||||
}
|
||||
if (e820_any_mapped(aper_base, aper_base + aper_size, E820_RAM)) {
|
||||
printk(KERN_ERR "Aperture pointing to e820 RAM. Ignoring.\n");
|
||||
return 0;
|
||||
}
|
||||
if (aper_size < min_size) {
|
||||
printk(KERN_ERR "Aperture too small (%d MB) than (%d MB)\n",
|
||||
aper_size>>20, min_size>>20);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -44,4 +44,6 @@ DECLARE_PER_CPU(int, x2apic_extra_bits);
|
|||
extern void uv_cpu_init(void);
|
||||
extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip);
|
||||
|
||||
extern void setup_apic_routing(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -3,3 +3,9 @@
|
|||
#else
|
||||
# include "hardirq_64.h"
|
||||
#endif
|
||||
|
||||
extern u64 arch_irq_stat_cpu(unsigned int cpu);
|
||||
#define arch_irq_stat_cpu arch_irq_stat_cpu
|
||||
|
||||
extern u64 arch_irq_stat(void);
|
||||
#define arch_irq_stat arch_irq_stat
|
||||
|
|
|
|||
|
|
@ -74,6 +74,9 @@ struct page *kmap_atomic_to_page(void *ptr);
|
|||
|
||||
#define flush_cache_kmaps() do { } while (0)
|
||||
|
||||
extern void add_highpages_with_active_regions(int nid, unsigned long start_pfn,
|
||||
unsigned long end_pfn);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_HIGHMEM_H */
|
||||
|
|
|
|||
|
|
@ -86,8 +86,8 @@ extern void hpet_unregister_irq_handler(rtc_irq_handler handler);
|
|||
#else /* CONFIG_HPET_TIMER */
|
||||
|
||||
static inline int hpet_enable(void) { return 0; }
|
||||
static inline unsigned long hpet_readl(unsigned long a) { return 0; }
|
||||
static inline int is_hpet_enabled(void) { return 0; }
|
||||
#define hpet_readl(a) 0
|
||||
|
||||
#endif
|
||||
#endif /* ASM_X86_HPET_H */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,106 @@
|
|||
#ifdef CONFIG_X86_32
|
||||
# include "hw_irq_32.h"
|
||||
#else
|
||||
# include "hw_irq_64.h"
|
||||
#ifndef _ASM_HW_IRQ_H
|
||||
#define _ASM_HW_IRQ_H
|
||||
|
||||
/*
|
||||
* (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
|
||||
*
|
||||
* moved some of the old arch/i386/kernel/irq.h to here. VY
|
||||
*
|
||||
* IRQ/IPI changes taken from work by Thomas Radke
|
||||
* <tomsoft@informatik.tu-chemnitz.de>
|
||||
*
|
||||
* hacked by Andi Kleen for x86-64.
|
||||
* unified by tglx
|
||||
*/
|
||||
|
||||
#include <asm/irq_vectors.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/profile.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
#define platform_legacy_irq(irq) ((irq) < 16)
|
||||
|
||||
/* Interrupt handlers registered during init_IRQ */
|
||||
extern void apic_timer_interrupt(void);
|
||||
extern void error_interrupt(void);
|
||||
extern void spurious_interrupt(void);
|
||||
extern void thermal_interrupt(void);
|
||||
extern void reschedule_interrupt(void);
|
||||
|
||||
extern void invalidate_interrupt(void);
|
||||
extern void invalidate_interrupt0(void);
|
||||
extern void invalidate_interrupt1(void);
|
||||
extern void invalidate_interrupt2(void);
|
||||
extern void invalidate_interrupt3(void);
|
||||
extern void invalidate_interrupt4(void);
|
||||
extern void invalidate_interrupt5(void);
|
||||
extern void invalidate_interrupt6(void);
|
||||
extern void invalidate_interrupt7(void);
|
||||
|
||||
extern void irq_move_cleanup_interrupt(void);
|
||||
extern void threshold_interrupt(void);
|
||||
|
||||
extern void call_function_interrupt(void);
|
||||
|
||||
/* PIC specific functions */
|
||||
extern void disable_8259A_irq(unsigned int irq);
|
||||
extern void enable_8259A_irq(unsigned int irq);
|
||||
extern int i8259A_irq_pending(unsigned int irq);
|
||||
extern void make_8259A_irq(unsigned int irq);
|
||||
extern void init_8259A(int aeoi);
|
||||
|
||||
/* IOAPIC */
|
||||
#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
|
||||
extern unsigned long io_apic_irqs;
|
||||
|
||||
extern void init_VISWS_APIC_irqs(void);
|
||||
extern void setup_IO_APIC(void);
|
||||
extern void disable_IO_APIC(void);
|
||||
extern void print_IO_APIC(void);
|
||||
extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
|
||||
extern void setup_ioapic_dest(void);
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
extern void enable_IO_APIC(void);
|
||||
#endif
|
||||
|
||||
/* IPI functions */
|
||||
extern void send_IPI_self(int vector);
|
||||
extern void send_IPI(int dest, int vector);
|
||||
|
||||
/* Statistics */
|
||||
extern atomic_t irq_err_count;
|
||||
extern atomic_t irq_mis_count;
|
||||
|
||||
/* EISA */
|
||||
extern void eisa_set_level_irq(unsigned int irq);
|
||||
|
||||
/* Voyager functions */
|
||||
extern asmlinkage void vic_cpi_interrupt(void);
|
||||
extern asmlinkage void vic_sys_interrupt(void);
|
||||
extern asmlinkage void vic_cmn_interrupt(void);
|
||||
extern asmlinkage void qic_timer_interrupt(void);
|
||||
extern asmlinkage void qic_invalidate_interrupt(void);
|
||||
extern asmlinkage void qic_reschedule_interrupt(void);
|
||||
extern asmlinkage void qic_enable_irq_interrupt(void);
|
||||
extern asmlinkage void qic_call_function_interrupt(void);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
extern void (*const interrupt[NR_IRQS])(void);
|
||||
#else
|
||||
typedef int vector_irq_t[NR_VECTORS];
|
||||
DECLARE_PER_CPU(vector_irq_t, vector_irq);
|
||||
extern spinlock_t vector_lock;
|
||||
#endif
|
||||
extern void setup_vector_irq(int cpu);
|
||||
|
||||
#endif /* !ASSEMBLY_ */
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,66 +0,0 @@
|
|||
#ifndef _ASM_HW_IRQ_H
|
||||
#define _ASM_HW_IRQ_H
|
||||
|
||||
/*
|
||||
* linux/include/asm/hw_irq.h
|
||||
*
|
||||
* (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
|
||||
*
|
||||
* moved some of the old arch/i386/kernel/irq.h to here. VY
|
||||
*
|
||||
* IRQ/IPI changes taken from work by Thomas Radke
|
||||
* <tomsoft@informatik.tu-chemnitz.de>
|
||||
*/
|
||||
|
||||
#include <linux/profile.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
#define NMI_VECTOR 0x02
|
||||
|
||||
/*
|
||||
* Various low-level irq details needed by irq.c, process.c,
|
||||
* time.c, io_apic.c and smp.c
|
||||
*
|
||||
* Interrupt entry/exit code at both C and assembly level
|
||||
*/
|
||||
|
||||
extern void (*const interrupt[NR_IRQS])(void);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
void reschedule_interrupt(void);
|
||||
void invalidate_interrupt(void);
|
||||
void call_function_interrupt(void);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
void apic_timer_interrupt(void);
|
||||
void error_interrupt(void);
|
||||
void spurious_interrupt(void);
|
||||
void thermal_interrupt(void);
|
||||
#define platform_legacy_irq(irq) ((irq) < 16)
|
||||
#endif
|
||||
|
||||
void disable_8259A_irq(unsigned int irq);
|
||||
void enable_8259A_irq(unsigned int irq);
|
||||
int i8259A_irq_pending(unsigned int irq);
|
||||
void make_8259A_irq(unsigned int irq);
|
||||
void init_8259A(int aeoi);
|
||||
void send_IPI_self(int vector);
|
||||
void init_VISWS_APIC_irqs(void);
|
||||
void setup_IO_APIC(void);
|
||||
void disable_IO_APIC(void);
|
||||
void print_IO_APIC(void);
|
||||
int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
|
||||
void send_IPI(int dest, int vector);
|
||||
void setup_ioapic_dest(void);
|
||||
|
||||
extern unsigned long io_apic_irqs;
|
||||
|
||||
extern atomic_t irq_err_count;
|
||||
extern atomic_t irq_mis_count;
|
||||
|
||||
#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
|
||||
|
||||
#endif /* _ASM_HW_IRQ_H */
|
||||
|
|
@ -1,173 +0,0 @@
|
|||
#ifndef _ASM_HW_IRQ_H
|
||||
#define _ASM_HW_IRQ_H
|
||||
|
||||
/*
|
||||
* linux/include/asm/hw_irq.h
|
||||
*
|
||||
* (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
|
||||
*
|
||||
* moved some of the old arch/i386/kernel/irq.h to here. VY
|
||||
*
|
||||
* IRQ/IPI changes taken from work by Thomas Radke
|
||||
* <tomsoft@informatik.tu-chemnitz.de>
|
||||
*
|
||||
* hacked by Andi Kleen for x86-64.
|
||||
*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/irq.h>
|
||||
#include <linux/profile.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/percpu.h>
|
||||
#endif
|
||||
|
||||
#define NMI_VECTOR 0x02
|
||||
/*
|
||||
* IDT vectors usable for external interrupt sources start
|
||||
* at 0x20:
|
||||
*/
|
||||
#define FIRST_EXTERNAL_VECTOR 0x20
|
||||
|
||||
#define IA32_SYSCALL_VECTOR 0x80
|
||||
|
||||
|
||||
/* Reserve the lowest usable priority level 0x20 - 0x2f for triggering
|
||||
* cleanup after irq migration.
|
||||
*/
|
||||
#define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR
|
||||
|
||||
/*
|
||||
* Vectors 0x30-0x3f are used for ISA interrupts.
|
||||
*/
|
||||
#define IRQ0_VECTOR (FIRST_EXTERNAL_VECTOR + 0x10)
|
||||
#define IRQ1_VECTOR (IRQ0_VECTOR + 1)
|
||||
#define IRQ2_VECTOR (IRQ0_VECTOR + 2)
|
||||
#define IRQ3_VECTOR (IRQ0_VECTOR + 3)
|
||||
#define IRQ4_VECTOR (IRQ0_VECTOR + 4)
|
||||
#define IRQ5_VECTOR (IRQ0_VECTOR + 5)
|
||||
#define IRQ6_VECTOR (IRQ0_VECTOR + 6)
|
||||
#define IRQ7_VECTOR (IRQ0_VECTOR + 7)
|
||||
#define IRQ8_VECTOR (IRQ0_VECTOR + 8)
|
||||
#define IRQ9_VECTOR (IRQ0_VECTOR + 9)
|
||||
#define IRQ10_VECTOR (IRQ0_VECTOR + 10)
|
||||
#define IRQ11_VECTOR (IRQ0_VECTOR + 11)
|
||||
#define IRQ12_VECTOR (IRQ0_VECTOR + 12)
|
||||
#define IRQ13_VECTOR (IRQ0_VECTOR + 13)
|
||||
#define IRQ14_VECTOR (IRQ0_VECTOR + 14)
|
||||
#define IRQ15_VECTOR (IRQ0_VECTOR + 15)
|
||||
|
||||
/*
|
||||
* Special IRQ vectors used by the SMP architecture, 0xf0-0xff
|
||||
*
|
||||
* some of the following vectors are 'rare', they are merged
|
||||
* into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
|
||||
* TLB, reschedule and local APIC vectors are performance-critical.
|
||||
*/
|
||||
#define SPURIOUS_APIC_VECTOR 0xff
|
||||
#define ERROR_APIC_VECTOR 0xfe
|
||||
#define RESCHEDULE_VECTOR 0xfd
|
||||
#define CALL_FUNCTION_VECTOR 0xfc
|
||||
/* fb free - please don't readd KDB here because it's useless
|
||||
(hint - think what a NMI bit does to a vector) */
|
||||
#define THERMAL_APIC_VECTOR 0xfa
|
||||
#define THRESHOLD_APIC_VECTOR 0xf9
|
||||
/* f8 free */
|
||||
#define INVALIDATE_TLB_VECTOR_END 0xf7
|
||||
#define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */
|
||||
|
||||
#define NUM_INVALIDATE_TLB_VECTORS 8
|
||||
|
||||
/*
|
||||
* Local APIC timer IRQ vector is on a different priority level,
|
||||
* to work around the 'lost local interrupt if more than 2 IRQ
|
||||
* sources per level' errata.
|
||||
*/
|
||||
#define LOCAL_TIMER_VECTOR 0xef
|
||||
|
||||
/*
|
||||
* First APIC vector available to drivers: (vectors 0x30-0xee)
|
||||
* we start at 0x41 to spread out vectors evenly between priority
|
||||
* levels. (0x80 is the syscall vector)
|
||||
*/
|
||||
#define FIRST_DEVICE_VECTOR (IRQ15_VECTOR + 2)
|
||||
#define FIRST_SYSTEM_VECTOR 0xef /* duplicated in irq.h */
|
||||
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* Interrupt handlers registered during init_IRQ */
|
||||
void apic_timer_interrupt(void);
|
||||
void spurious_interrupt(void);
|
||||
void error_interrupt(void);
|
||||
void reschedule_interrupt(void);
|
||||
void call_function_interrupt(void);
|
||||
void irq_move_cleanup_interrupt(void);
|
||||
void invalidate_interrupt0(void);
|
||||
void invalidate_interrupt1(void);
|
||||
void invalidate_interrupt2(void);
|
||||
void invalidate_interrupt3(void);
|
||||
void invalidate_interrupt4(void);
|
||||
void invalidate_interrupt5(void);
|
||||
void invalidate_interrupt6(void);
|
||||
void invalidate_interrupt7(void);
|
||||
void thermal_interrupt(void);
|
||||
void threshold_interrupt(void);
|
||||
void i8254_timer_resume(void);
|
||||
|
||||
typedef int vector_irq_t[NR_VECTORS];
|
||||
DECLARE_PER_CPU(vector_irq_t, vector_irq);
|
||||
extern void __setup_vector_irq(int cpu);
|
||||
extern spinlock_t vector_lock;
|
||||
|
||||
/*
|
||||
* Various low-level irq details needed by irq.c, process.c,
|
||||
* time.c, io_apic.c and smp.c
|
||||
*
|
||||
* Interrupt entry/exit code at both C and assembly level
|
||||
*/
|
||||
|
||||
extern void disable_8259A_irq(unsigned int irq);
|
||||
extern void enable_8259A_irq(unsigned int irq);
|
||||
extern int i8259A_irq_pending(unsigned int irq);
|
||||
extern void make_8259A_irq(unsigned int irq);
|
||||
extern void init_8259A(int aeoi);
|
||||
extern void send_IPI_self(int vector);
|
||||
extern void init_VISWS_APIC_irqs(void);
|
||||
extern void setup_IO_APIC(void);
|
||||
extern void enable_IO_APIC(void);
|
||||
extern void disable_IO_APIC(void);
|
||||
extern void print_IO_APIC(void);
|
||||
extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn);
|
||||
extern void send_IPI(int dest, int vector);
|
||||
extern void setup_ioapic_dest(void);
|
||||
extern void native_init_IRQ(void);
|
||||
|
||||
extern unsigned long io_apic_irqs;
|
||||
|
||||
extern atomic_t irq_err_count;
|
||||
extern atomic_t irq_mis_count;
|
||||
|
||||
#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#define IRQ_NAME2(nr) nr##_interrupt(void)
|
||||
#define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr)
|
||||
|
||||
/*
|
||||
* SMP has a few special interrupts for IPI messages
|
||||
*/
|
||||
|
||||
#define BUILD_IRQ(nr) \
|
||||
asmlinkage void IRQ_NAME(nr); \
|
||||
asm("\n.p2align\n" \
|
||||
"IRQ" #nr "_interrupt:\n\t" \
|
||||
"push $~(" #nr ") ; " \
|
||||
"jmp common_interrupt");
|
||||
|
||||
#define platform_legacy_irq(irq) ((irq) < 16)
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_HW_IRQ_H */
|
||||
|
|
@ -55,4 +55,6 @@ static inline void outb_pic(unsigned char value, unsigned int port)
|
|||
udelay(2);
|
||||
}
|
||||
|
||||
extern struct irq_chip i8259A_chip;
|
||||
|
||||
#endif /* __ASM_I8259_H__ */
|
||||
|
|
|
|||
|
|
@ -3,6 +3,76 @@
|
|||
|
||||
#define ARCH_HAS_IOREMAP_WC
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
/*
|
||||
* early_ioremap() and early_iounmap() are for temporary early boot-time
|
||||
* mappings, before the real ioremap() is functional.
|
||||
* A boot-time mapping is currently limited to at most 16 pages.
|
||||
*/
|
||||
#ifndef __ASSEMBLY__
|
||||
extern void early_ioremap_init(void);
|
||||
extern void early_ioremap_clear(void);
|
||||
extern void early_ioremap_reset(void);
|
||||
extern void *early_ioremap(unsigned long offset, unsigned long size);
|
||||
extern void early_iounmap(void *addr, unsigned long size);
|
||||
extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
|
||||
#endif
|
||||
|
||||
#define build_mmio_read(name, size, type, reg, barrier) \
|
||||
static inline type name(const volatile void __iomem *addr) \
|
||||
{ type ret; asm volatile("mov" size " %1,%0":"=" reg (ret) \
|
||||
:"m" (*(volatile type __force *)addr) barrier); return ret; }
|
||||
|
||||
#define build_mmio_write(name, size, type, reg, barrier) \
|
||||
static inline void name(type val, volatile void __iomem *addr) \
|
||||
{ asm volatile("mov" size " %0,%1": :reg (val), \
|
||||
"m" (*(volatile type __force *)addr) barrier); }
|
||||
|
||||
build_mmio_read(readb, "b", unsigned char, "q", :"memory")
|
||||
build_mmio_read(readw, "w", unsigned short, "r", :"memory")
|
||||
build_mmio_read(readl, "l", unsigned int, "r", :"memory")
|
||||
|
||||
build_mmio_read(__readb, "b", unsigned char, "q", )
|
||||
build_mmio_read(__readw, "w", unsigned short, "r", )
|
||||
build_mmio_read(__readl, "l", unsigned int, "r", )
|
||||
|
||||
build_mmio_write(writeb, "b", unsigned char, "q", :"memory")
|
||||
build_mmio_write(writew, "w", unsigned short, "r", :"memory")
|
||||
build_mmio_write(writel, "l", unsigned int, "r", :"memory")
|
||||
|
||||
build_mmio_write(__writeb, "b", unsigned char, "q", )
|
||||
build_mmio_write(__writew, "w", unsigned short, "r", )
|
||||
build_mmio_write(__writel, "l", unsigned int, "r", )
|
||||
|
||||
#define readb_relaxed(a) __readb(a)
|
||||
#define readw_relaxed(a) __readw(a)
|
||||
#define readl_relaxed(a) __readl(a)
|
||||
#define __raw_readb __readb
|
||||
#define __raw_readw __readw
|
||||
#define __raw_readl __readl
|
||||
|
||||
#define __raw_writeb __writeb
|
||||
#define __raw_writew __writew
|
||||
#define __raw_writel __writel
|
||||
|
||||
#define mmiowb() barrier()
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
build_mmio_read(readq, "q", unsigned long, "r", :"memory")
|
||||
build_mmio_read(__readq, "q", unsigned long, "r", )
|
||||
build_mmio_write(writeq, "q", unsigned long, "r", :"memory")
|
||||
build_mmio_write(__writeq, "q", unsigned long, "r", )
|
||||
|
||||
#define readq_relaxed(a) __readq(a)
|
||||
#define __raw_readq __readq
|
||||
#define __raw_writeq writeq
|
||||
|
||||
/* Let people know we have them */
|
||||
#define readq readq
|
||||
#define writeq writeq
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# include "io_32.h"
|
||||
#else
|
||||
|
|
@ -16,4 +86,17 @@ extern int ioremap_change_attr(unsigned long vaddr, unsigned long size,
|
|||
unsigned long prot_val);
|
||||
extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size);
|
||||
|
||||
/*
|
||||
* early_ioremap() and early_iounmap() are for temporary early boot-time
|
||||
* mappings, before the real ioremap() is functional.
|
||||
* A boot-time mapping is currently limited to at most 16 pages.
|
||||
*/
|
||||
extern void early_ioremap_init(void);
|
||||
extern void early_ioremap_clear(void);
|
||||
extern void early_ioremap_reset(void);
|
||||
extern void *early_ioremap(unsigned long offset, unsigned long size);
|
||||
extern void early_iounmap(void *addr, unsigned long size);
|
||||
extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
|
||||
|
||||
|
||||
#endif /* _ASM_X86_IO_H */
|
||||
|
|
|
|||
|
|
@ -121,18 +121,6 @@ static inline void __iomem *ioremap(resource_size_t offset, unsigned long size)
|
|||
|
||||
extern void iounmap(volatile void __iomem *addr);
|
||||
|
||||
/*
|
||||
* early_ioremap() and early_iounmap() are for temporary early boot-time
|
||||
* mappings, before the real ioremap() is functional.
|
||||
* A boot-time mapping is currently limited to at most 16 pages.
|
||||
*/
|
||||
extern void early_ioremap_init(void);
|
||||
extern void early_ioremap_clear(void);
|
||||
extern void early_ioremap_reset(void);
|
||||
extern void *early_ioremap(unsigned long offset, unsigned long size);
|
||||
extern void early_iounmap(void *addr, unsigned long size);
|
||||
extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
|
||||
|
||||
/*
|
||||
* ISA I/O bus memory addresses are 1:1 with the physical address.
|
||||
*/
|
||||
|
|
@ -149,55 +137,6 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
|
|||
#define virt_to_bus virt_to_phys
|
||||
#define bus_to_virt phys_to_virt
|
||||
|
||||
/*
|
||||
* readX/writeX() are used to access memory mapped devices. On some
|
||||
* architectures the memory mapped IO stuff needs to be accessed
|
||||
* differently. On the x86 architecture, we just read/write the
|
||||
* memory location directly.
|
||||
*/
|
||||
|
||||
static inline unsigned char readb(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(volatile unsigned char __force *)addr;
|
||||
}
|
||||
|
||||
static inline unsigned short readw(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(volatile unsigned short __force *)addr;
|
||||
}
|
||||
|
||||
static inline unsigned int readl(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(volatile unsigned int __force *) addr;
|
||||
}
|
||||
|
||||
#define readb_relaxed(addr) readb(addr)
|
||||
#define readw_relaxed(addr) readw(addr)
|
||||
#define readl_relaxed(addr) readl(addr)
|
||||
#define __raw_readb readb
|
||||
#define __raw_readw readw
|
||||
#define __raw_readl readl
|
||||
|
||||
static inline void writeb(unsigned char b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned char __force *)addr = b;
|
||||
}
|
||||
|
||||
static inline void writew(unsigned short b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned short __force *)addr = b;
|
||||
}
|
||||
|
||||
static inline void writel(unsigned int b, volatile void __iomem *addr)
|
||||
{
|
||||
*(volatile unsigned int __force *)addr = b;
|
||||
}
|
||||
#define __raw_writeb writeb
|
||||
#define __raw_writew writew
|
||||
#define __raw_writel writel
|
||||
|
||||
#define mmiowb()
|
||||
|
||||
static inline void
|
||||
memset_io(volatile void __iomem *addr, unsigned char val, int count)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -204,77 +204,6 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
|
|||
#define virt_to_bus virt_to_phys
|
||||
#define bus_to_virt phys_to_virt
|
||||
|
||||
/*
|
||||
* readX/writeX() are used to access memory mapped devices. On some
|
||||
* architectures the memory mapped IO stuff needs to be accessed
|
||||
* differently. On the x86 architecture, we just read/write the
|
||||
* memory location directly.
|
||||
*/
|
||||
|
||||
static inline __u8 __readb(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(__force volatile __u8 *)addr;
|
||||
}
|
||||
|
||||
static inline __u16 __readw(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(__force volatile __u16 *)addr;
|
||||
}
|
||||
|
||||
static __always_inline __u32 __readl(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(__force volatile __u32 *)addr;
|
||||
}
|
||||
|
||||
static inline __u64 __readq(const volatile void __iomem *addr)
|
||||
{
|
||||
return *(__force volatile __u64 *)addr;
|
||||
}
|
||||
|
||||
#define readb(x) __readb(x)
|
||||
#define readw(x) __readw(x)
|
||||
#define readl(x) __readl(x)
|
||||
#define readq(x) __readq(x)
|
||||
#define readb_relaxed(a) readb(a)
|
||||
#define readw_relaxed(a) readw(a)
|
||||
#define readl_relaxed(a) readl(a)
|
||||
#define readq_relaxed(a) readq(a)
|
||||
#define __raw_readb readb
|
||||
#define __raw_readw readw
|
||||
#define __raw_readl readl
|
||||
#define __raw_readq readq
|
||||
|
||||
#define mmiowb()
|
||||
|
||||
static inline void __writel(__u32 b, volatile void __iomem *addr)
|
||||
{
|
||||
*(__force volatile __u32 *)addr = b;
|
||||
}
|
||||
|
||||
static inline void __writeq(__u64 b, volatile void __iomem *addr)
|
||||
{
|
||||
*(__force volatile __u64 *)addr = b;
|
||||
}
|
||||
|
||||
static inline void __writeb(__u8 b, volatile void __iomem *addr)
|
||||
{
|
||||
*(__force volatile __u8 *)addr = b;
|
||||
}
|
||||
|
||||
static inline void __writew(__u16 b, volatile void __iomem *addr)
|
||||
{
|
||||
*(__force volatile __u16 *)addr = b;
|
||||
}
|
||||
|
||||
#define writeq(val, addr) __writeq((val), (addr))
|
||||
#define writel(val, addr) __writel((val), (addr))
|
||||
#define writew(val, addr) __writew((val), (addr))
|
||||
#define writeb(val, addr) __writeb((val), (addr))
|
||||
#define __raw_writeb writeb
|
||||
#define __raw_writew writew
|
||||
#define __raw_writel writel
|
||||
#define __raw_writeq writeq
|
||||
|
||||
void __memcpy_fromio(void *, unsigned long, unsigned);
|
||||
void __memcpy_toio(unsigned long, const void *, unsigned);
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,15 @@
|
|||
* Copyright (C) 1997, 1998, 1999, 2000 Ingo Molnar
|
||||
*/
|
||||
|
||||
/* I/O Unit Redirection Table */
|
||||
#define IO_APIC_REDIR_VECTOR_MASK 0x000FF
|
||||
#define IO_APIC_REDIR_DEST_LOGICAL 0x00800
|
||||
#define IO_APIC_REDIR_DEST_PHYSICAL 0x00000
|
||||
#define IO_APIC_REDIR_SEND_PENDING (1 << 12)
|
||||
#define IO_APIC_REDIR_REMOTE_IRR (1 << 14)
|
||||
#define IO_APIC_REDIR_LEVEL_TRIGGER (1 << 15)
|
||||
#define IO_APIC_REDIR_MASKED (1 << 16)
|
||||
|
||||
/*
|
||||
* The structure of the IO-APIC:
|
||||
*/
|
||||
|
|
@ -112,21 +121,32 @@ extern int nr_ioapic_registers[MAX_IO_APICS];
|
|||
|
||||
#define MP_MAX_IOAPIC_PIN 127
|
||||
|
||||
struct mp_ioapic_routing {
|
||||
int apic_id;
|
||||
int gsi_base;
|
||||
int gsi_end;
|
||||
DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1);
|
||||
struct mp_config_ioapic {
|
||||
unsigned long mp_apicaddr;
|
||||
unsigned int mp_apicid;
|
||||
unsigned char mp_type;
|
||||
unsigned char mp_apicver;
|
||||
unsigned char mp_flags;
|
||||
};
|
||||
|
||||
struct mp_config_intsrc {
|
||||
unsigned int mp_dstapic;
|
||||
unsigned char mp_type;
|
||||
unsigned char mp_irqtype;
|
||||
unsigned short mp_irqflag;
|
||||
unsigned char mp_srcbus;
|
||||
unsigned char mp_srcbusirq;
|
||||
unsigned char mp_dstirq;
|
||||
};
|
||||
|
||||
/* I/O APIC entries */
|
||||
extern struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
|
||||
extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS];
|
||||
|
||||
/* # of MP IRQ source entries */
|
||||
extern int mp_irq_entries;
|
||||
|
||||
/* MP IRQ source entries */
|
||||
extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
||||
extern struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
|
||||
|
||||
/* non-0 if default (table-less) MP configuration */
|
||||
extern int mpc_default_type;
|
||||
|
|
@ -137,6 +157,9 @@ extern int sis_apic_bug;
|
|||
/* 1 if "noapic" boot option passed */
|
||||
extern int skip_ioapic_setup;
|
||||
|
||||
/* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */
|
||||
extern int timer_through_8259;
|
||||
|
||||
static inline void disable_ioapic_setup(void)
|
||||
{
|
||||
skip_ioapic_setup = 1;
|
||||
|
|
@ -162,6 +185,8 @@ extern void ioapic_init_mappings(void);
|
|||
|
||||
#else /* !CONFIG_X86_IO_APIC */
|
||||
#define io_apic_assign_pci_irqs 0
|
||||
static const int timer_through_8259 = 0;
|
||||
static inline void ioapic_init_mappings(void) { }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,29 +1,34 @@
|
|||
#ifndef _ASM_X8664_GART_H
|
||||
#define _ASM_X8664_GART_H 1
|
||||
#ifndef _ASM_X8664_IOMMU_H
|
||||
#define _ASM_X8664_IOMMU_H 1
|
||||
|
||||
extern void pci_iommu_shutdown(void);
|
||||
extern void no_iommu_init(void);
|
||||
extern int force_iommu, no_iommu;
|
||||
extern int iommu_detected;
|
||||
#ifdef CONFIG_IOMMU
|
||||
|
||||
#ifdef CONFIG_GART_IOMMU
|
||||
extern int gart_iommu_aperture;
|
||||
extern int gart_iommu_aperture_allowed;
|
||||
extern int gart_iommu_aperture_disabled;
|
||||
|
||||
extern void early_gart_iommu_check(void);
|
||||
extern void gart_iommu_init(void);
|
||||
extern void gart_iommu_shutdown(void);
|
||||
extern void __init gart_parse_options(char *);
|
||||
extern void iommu_hole_init(void);
|
||||
extern int fallback_aper_order;
|
||||
extern int fallback_aper_force;
|
||||
extern int iommu_aperture;
|
||||
extern int iommu_aperture_allowed;
|
||||
extern int iommu_aperture_disabled;
|
||||
extern int fix_aperture;
|
||||
extern void gart_iommu_hole_init(void);
|
||||
|
||||
#else
|
||||
#define iommu_aperture 0
|
||||
#define iommu_aperture_allowed 0
|
||||
#define gart_iommu_aperture 0
|
||||
#define gart_iommu_aperture_allowed 0
|
||||
#define gart_iommu_aperture_disabled 1
|
||||
|
||||
static inline void early_gart_iommu_check(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void gart_iommu_shutdown(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <asm/hw_irq.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
/*
|
||||
* the following functions deal with sending IPIs between CPUs.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,50 @@
|
|||
#ifdef CONFIG_X86_32
|
||||
# include "irq_32.h"
|
||||
#else
|
||||
# include "irq_64.h"
|
||||
#ifndef _ASM_IRQ_H
|
||||
#define _ASM_IRQ_H
|
||||
/*
|
||||
* (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
|
||||
*
|
||||
* IRQ/IPI changes taken from work by Thomas Radke
|
||||
* <tomsoft@informatik.tu-chemnitz.de>
|
||||
*/
|
||||
|
||||
#include <asm/apicdef.h>
|
||||
#include <asm/irq_vectors.h>
|
||||
|
||||
static inline int irq_canonicalize(int irq)
|
||||
{
|
||||
return ((irq == 2) ? 9 : irq);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
# define ARCH_HAS_NMI_WATCHDOG
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_4KSTACKS
|
||||
extern void irq_ctx_init(int cpu);
|
||||
extern void irq_ctx_exit(int cpu);
|
||||
# define __ARCH_HAS_DO_SOFTIRQ
|
||||
#else
|
||||
# define irq_ctx_init(cpu) do { } while (0)
|
||||
# define irq_ctx_exit(cpu) do { } while (0)
|
||||
# ifdef CONFIG_X86_64
|
||||
# define __ARCH_HAS_DO_SOFTIRQ
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IRQBALANCE
|
||||
extern int irqbalance_disable(char *str);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#include <linux/cpumask.h>
|
||||
extern void fixup_irqs(cpumask_t map);
|
||||
#endif
|
||||
|
||||
extern unsigned int do_IRQ(struct pt_regs *regs);
|
||||
extern void init_IRQ(void);
|
||||
extern void native_init_IRQ(void);
|
||||
|
||||
/* Interrupt vector management */
|
||||
extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
|
||||
|
||||
#endif /* _ASM_IRQ_H */
|
||||
|
|
|
|||
|
|
@ -1,51 +0,0 @@
|
|||
#ifndef _ASM_IRQ_H
|
||||
#define _ASM_IRQ_H
|
||||
|
||||
/*
|
||||
* linux/include/asm/irq.h
|
||||
*
|
||||
* (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
|
||||
*
|
||||
* IRQ/IPI changes taken from work by Thomas Radke
|
||||
* <tomsoft@informatik.tu-chemnitz.de>
|
||||
*/
|
||||
|
||||
#include <linux/sched.h>
|
||||
/* include comes from machine specific directory */
|
||||
#include "irq_vectors.h"
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
static inline int irq_canonicalize(int irq)
|
||||
{
|
||||
return ((irq == 2) ? 9 : irq);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
# define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_4KSTACKS
|
||||
extern void irq_ctx_init(int cpu);
|
||||
extern void irq_ctx_exit(int cpu);
|
||||
# define __ARCH_HAS_DO_SOFTIRQ
|
||||
#else
|
||||
# define irq_ctx_init(cpu) do { } while (0)
|
||||
# define irq_ctx_exit(cpu) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IRQBALANCE
|
||||
extern int irqbalance_disable(char *str);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
extern void fixup_irqs(cpumask_t map);
|
||||
#endif
|
||||
|
||||
unsigned int do_IRQ(struct pt_regs *regs);
|
||||
void init_IRQ(void);
|
||||
void __init native_init_IRQ(void);
|
||||
|
||||
/* Interrupt vector management */
|
||||
extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
|
||||
|
||||
#endif /* _ASM_IRQ_H */
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
#ifndef _ASM_IRQ_H
|
||||
#define _ASM_IRQ_H
|
||||
|
||||
/*
|
||||
* linux/include/asm/irq.h
|
||||
*
|
||||
* (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
|
||||
*
|
||||
* IRQ/IPI changes taken from work by Thomas Radke
|
||||
* <tomsoft@informatik.tu-chemnitz.de>
|
||||
*/
|
||||
|
||||
#define TIMER_IRQ 0
|
||||
|
||||
/*
|
||||
* 16 8259A IRQ's, 208 potential APIC interrupt sources.
|
||||
* Right now the APIC is mostly only used for SMP.
|
||||
* 256 vectors is an architectural limit. (we can have
|
||||
* more than 256 devices theoretically, but they will
|
||||
* have to use shared interrupts)
|
||||
* Since vectors 0x00-0x1f are used/reserved for the CPU,
|
||||
* the usable vector space is 0x20-0xff (224 vectors)
|
||||
*/
|
||||
|
||||
/*
|
||||
* The maximum number of vectors supported by x86_64 processors
|
||||
* is limited to 256. For processors other than x86_64, NR_VECTORS
|
||||
* should be changed accordingly.
|
||||
*/
|
||||
#define NR_VECTORS 256
|
||||
|
||||
#define FIRST_SYSTEM_VECTOR 0xef /* duplicated in hw_irq.h */
|
||||
|
||||
#define NR_IRQS (NR_VECTORS + (32 * NR_CPUS))
|
||||
#define NR_IRQ_VECTORS NR_IRQS
|
||||
|
||||
static inline int irq_canonicalize(int irq)
|
||||
{
|
||||
return ((irq == 2) ? 9 : irq);
|
||||
}
|
||||
|
||||
#define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#include <linux/cpumask.h>
|
||||
extern void fixup_irqs(cpumask_t map);
|
||||
#endif
|
||||
|
||||
#define __ARCH_HAS_DO_SOFTIRQ 1
|
||||
|
||||
#endif /* _ASM_IRQ_H */
|
||||
169
include/asm-x86/irq_vectors.h
Normal file
169
include/asm-x86/irq_vectors.h
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
#ifndef _ASM_IRQ_VECTORS_H
|
||||
#define _ASM_IRQ_VECTORS_H
|
||||
|
||||
#include <linux/threads.h>
|
||||
|
||||
#define NMI_VECTOR 0x02
|
||||
|
||||
/*
|
||||
* IDT vectors usable for external interrupt sources start
|
||||
* at 0x20:
|
||||
*/
|
||||
#define FIRST_EXTERNAL_VECTOR 0x20
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# define SYSCALL_VECTOR 0x80
|
||||
#else
|
||||
# define IA32_SYSCALL_VECTOR 0x80
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Reserve the lowest usable priority level 0x20 - 0x2f for triggering
|
||||
* cleanup after irq migration on 64 bit.
|
||||
*/
|
||||
#define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR
|
||||
|
||||
/*
|
||||
* Vectors 0x20-0x2f are used for ISA interrupts on 32 bit.
|
||||
* Vectors 0x30-0x3f are used for ISA interrupts on 64 bit.
|
||||
*/
|
||||
#ifdef CONFIG_X86_32
|
||||
#define IRQ0_VECTOR (FIRST_EXTERNAL_VECTOR)
|
||||
#else
|
||||
#define IRQ0_VECTOR (FIRST_EXTERNAL_VECTOR + 0x10)
|
||||
#endif
|
||||
#define IRQ1_VECTOR (IRQ0_VECTOR + 1)
|
||||
#define IRQ2_VECTOR (IRQ0_VECTOR + 2)
|
||||
#define IRQ3_VECTOR (IRQ0_VECTOR + 3)
|
||||
#define IRQ4_VECTOR (IRQ0_VECTOR + 4)
|
||||
#define IRQ5_VECTOR (IRQ0_VECTOR + 5)
|
||||
#define IRQ6_VECTOR (IRQ0_VECTOR + 6)
|
||||
#define IRQ7_VECTOR (IRQ0_VECTOR + 7)
|
||||
#define IRQ8_VECTOR (IRQ0_VECTOR + 8)
|
||||
#define IRQ9_VECTOR (IRQ0_VECTOR + 9)
|
||||
#define IRQ10_VECTOR (IRQ0_VECTOR + 10)
|
||||
#define IRQ11_VECTOR (IRQ0_VECTOR + 11)
|
||||
#define IRQ12_VECTOR (IRQ0_VECTOR + 12)
|
||||
#define IRQ13_VECTOR (IRQ0_VECTOR + 13)
|
||||
#define IRQ14_VECTOR (IRQ0_VECTOR + 14)
|
||||
#define IRQ15_VECTOR (IRQ0_VECTOR + 15)
|
||||
|
||||
/*
|
||||
* Special IRQ vectors used by the SMP architecture, 0xf0-0xff
|
||||
*
|
||||
* some of the following vectors are 'rare', they are merged
|
||||
* into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
|
||||
* TLB, reschedule and local APIC vectors are performance-critical.
|
||||
*
|
||||
* Vectors 0xf0-0xfa are free (reserved for future Linux use).
|
||||
*/
|
||||
#ifdef CONFIG_X86_32
|
||||
|
||||
# define SPURIOUS_APIC_VECTOR 0xff
|
||||
# define ERROR_APIC_VECTOR 0xfe
|
||||
# define INVALIDATE_TLB_VECTOR 0xfd
|
||||
# define RESCHEDULE_VECTOR 0xfc
|
||||
# define CALL_FUNCTION_VECTOR 0xfb
|
||||
# define THERMAL_APIC_VECTOR 0xf0
|
||||
|
||||
#else
|
||||
|
||||
#define SPURIOUS_APIC_VECTOR 0xff
|
||||
#define ERROR_APIC_VECTOR 0xfe
|
||||
#define RESCHEDULE_VECTOR 0xfd
|
||||
#define CALL_FUNCTION_VECTOR 0xfc
|
||||
#define THERMAL_APIC_VECTOR 0xfa
|
||||
#define THRESHOLD_APIC_VECTOR 0xf9
|
||||
#define INVALIDATE_TLB_VECTOR_END 0xf7
|
||||
#define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */
|
||||
|
||||
#define NUM_INVALIDATE_TLB_VECTORS 8
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Local APIC timer IRQ vector is on a different priority level,
|
||||
* to work around the 'lost local interrupt if more than 2 IRQ
|
||||
* sources per level' errata.
|
||||
*/
|
||||
#define LOCAL_TIMER_VECTOR 0xef
|
||||
|
||||
/*
|
||||
* First APIC vector available to drivers: (vectors 0x30-0xee) we
|
||||
* start at 0x31(0x41) to spread out vectors evenly between priority
|
||||
* levels. (0x80 is the syscall vector)
|
||||
*/
|
||||
#ifdef CONFIG_X86_32
|
||||
# define FIRST_DEVICE_VECTOR 0x31
|
||||
#else
|
||||
# define FIRST_DEVICE_VECTOR (IRQ15_VECTOR + 2)
|
||||
#endif
|
||||
|
||||
#define NR_VECTORS 256
|
||||
|
||||
#define FPU_IRQ 13
|
||||
|
||||
#define FIRST_VM86_IRQ 3
|
||||
#define LAST_VM86_IRQ 15
|
||||
#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
|
||||
|
||||
#if !defined(CONFIG_X86_VOYAGER)
|
||||
|
||||
# if defined(CONFIG_X86_IO_APIC) || defined(CONFIG_PARAVIRT) || defined(CONFIG_X86_VISWS)
|
||||
|
||||
# define NR_IRQS 224
|
||||
|
||||
# if (224 >= 32 * NR_CPUS)
|
||||
# define NR_IRQ_VECTORS NR_IRQS
|
||||
# else
|
||||
# define NR_IRQ_VECTORS (32 * NR_CPUS)
|
||||
# endif
|
||||
|
||||
# else /* IO_APIC || PARAVIRT */
|
||||
|
||||
# define NR_IRQS 16
|
||||
# define NR_IRQ_VECTORS NR_IRQS
|
||||
|
||||
# endif
|
||||
|
||||
#else /* !VISWS && !VOYAGER */
|
||||
|
||||
# define NR_IRQS 224
|
||||
# define NR_IRQ_VECTORS NR_IRQS
|
||||
|
||||
#endif /* VISWS */
|
||||
|
||||
/* Voyager specific defines */
|
||||
/* These define the CPIs we use in linux */
|
||||
#define VIC_CPI_LEVEL0 0
|
||||
#define VIC_CPI_LEVEL1 1
|
||||
/* now the fake CPIs */
|
||||
#define VIC_TIMER_CPI 2
|
||||
#define VIC_INVALIDATE_CPI 3
|
||||
#define VIC_RESCHEDULE_CPI 4
|
||||
#define VIC_ENABLE_IRQ_CPI 5
|
||||
#define VIC_CALL_FUNCTION_CPI 6
|
||||
|
||||
/* Now the QIC CPIs: Since we don't need the two initial levels,
|
||||
* these are 2 less than the VIC CPIs */
|
||||
#define QIC_CPI_OFFSET 1
|
||||
#define QIC_TIMER_CPI (VIC_TIMER_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_INVALIDATE_CPI (VIC_INVALIDATE_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_RESCHEDULE_CPI (VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_ENABLE_IRQ_CPI (VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_CALL_FUNCTION_CPI (VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET)
|
||||
|
||||
#define VIC_START_FAKE_CPI VIC_TIMER_CPI
|
||||
#define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_CPI
|
||||
|
||||
/* this is the SYS_INT CPI. */
|
||||
#define VIC_SYS_INT 8
|
||||
#define VIC_CMN_INT 15
|
||||
|
||||
/* This is the boot CPI for alternate processors. It gets overwritten
|
||||
* by the above once the system has activated all available processors */
|
||||
#define VIC_CPU_BOOT_CPI VIC_CPI_LEVEL0
|
||||
#define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8)
|
||||
|
||||
|
||||
#endif /* _ASM_IRQ_VECTORS_H */
|
||||
|
|
@ -111,14 +111,35 @@ static inline unsigned long __raw_local_irq_save(void)
|
|||
#define DISABLE_INTERRUPTS(x) cli
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define SWAPGS swapgs
|
||||
/*
|
||||
* Currently paravirt can't handle swapgs nicely when we
|
||||
* don't have a stack we can rely on (such as a user space
|
||||
* stack). So we either find a way around these or just fault
|
||||
* and emulate if a guest tries to call swapgs directly.
|
||||
*
|
||||
* Either way, this is a good way to document that we don't
|
||||
* have a reliable stack. x86_64 only.
|
||||
*/
|
||||
#define SWAPGS_UNSAFE_STACK swapgs
|
||||
|
||||
#define PARAVIRT_ADJUST_EXCEPTION_FRAME /* */
|
||||
|
||||
#define INTERRUPT_RETURN iretq
|
||||
#define ENABLE_INTERRUPTS_SYSCALL_RET \
|
||||
movq %gs:pda_oldrsp, %rsp; \
|
||||
swapgs; \
|
||||
sysretq;
|
||||
#define USERGS_SYSRET64 \
|
||||
swapgs; \
|
||||
sysretq;
|
||||
#define USERGS_SYSRET32 \
|
||||
swapgs; \
|
||||
sysretl
|
||||
#define ENABLE_INTERRUPTS_SYSEXIT32 \
|
||||
swapgs; \
|
||||
sti; \
|
||||
sysexit
|
||||
|
||||
#else
|
||||
#define INTERRUPT_RETURN iret
|
||||
#define ENABLE_INTERRUPTS_SYSCALL_RET sti; sysexit
|
||||
#define ENABLE_INTERRUPTS_SYSEXIT sti; sysexit
|
||||
#define GET_CR0_INTO_EAX movl %cr0, %eax
|
||||
#endif
|
||||
|
||||
|
|
@ -169,16 +190,6 @@ static inline void trace_hardirqs_fixup(void)
|
|||
#else
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* Currently paravirt can't handle swapgs nicely when we
|
||||
* don't have a stack we can rely on (such as a user space
|
||||
* stack). So we either find a way around these or just fault
|
||||
* and emulate if a guest tries to call swapgs directly.
|
||||
*
|
||||
* Either way, this is a good way to document that we don't
|
||||
* have a reliable stack. x86_64 only.
|
||||
*/
|
||||
#define SWAPGS_UNSAFE_STACK swapgs
|
||||
#define ARCH_TRACE_IRQS_ON call trace_hardirqs_on_thunk
|
||||
#define ARCH_TRACE_IRQS_OFF call trace_hardirqs_off_thunk
|
||||
#define ARCH_LOCKDEP_SYS_EXIT call lockdep_sys_exit_thunk
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ static inline int multi_timer_check(int apic, int irq)
|
|||
|
||||
static inline int apicid_to_node(int logical_apicid)
|
||||
{
|
||||
return (0);
|
||||
return apicid_2_node[hard_smp_processor_id()];
|
||||
}
|
||||
|
||||
static inline int cpu_present_to_apicid(int mps_cpu)
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
#ifndef __ASM_MACH_MPSPEC_H
|
||||
#define __ASM_MACH_MPSPEC_H
|
||||
|
||||
#define MAX_IRQ_SOURCES 256
|
||||
|
||||
#define MAX_MP_BUSSES 32
|
||||
|
||||
#endif /* __ASM_MACH_MPSPEC_H */
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
* This file should contain #defines for all of the interrupt vector
|
||||
* numbers used by this architecture.
|
||||
*
|
||||
* In addition, there are some standard defines:
|
||||
*
|
||||
* FIRST_EXTERNAL_VECTOR:
|
||||
* The first free place for external interrupts
|
||||
*
|
||||
* SYSCALL_VECTOR:
|
||||
* The IRQ vector a syscall makes the user to kernel transition
|
||||
* under.
|
||||
*
|
||||
* TIMER_IRQ:
|
||||
* The IRQ number the timer interrupt comes in at.
|
||||
*
|
||||
* NR_IRQS:
|
||||
* The total number of interrupt vectors (including all the
|
||||
* architecture specific interrupts) needed.
|
||||
*
|
||||
*/
|
||||
#ifndef _ASM_IRQ_VECTORS_H
|
||||
#define _ASM_IRQ_VECTORS_H
|
||||
|
||||
/*
|
||||
* IDT vectors usable for external interrupt sources start
|
||||
* at 0x20:
|
||||
*/
|
||||
#define FIRST_EXTERNAL_VECTOR 0x20
|
||||
|
||||
#define SYSCALL_VECTOR 0x80
|
||||
|
||||
/*
|
||||
* Vectors 0x20-0x2f are used for ISA interrupts.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Special IRQ vectors used by the SMP architecture, 0xf0-0xff
|
||||
*
|
||||
* some of the following vectors are 'rare', they are merged
|
||||
* into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
|
||||
* TLB, reschedule and local APIC vectors are performance-critical.
|
||||
*
|
||||
* Vectors 0xf0-0xfa are free (reserved for future Linux use).
|
||||
*/
|
||||
#define SPURIOUS_APIC_VECTOR 0xff
|
||||
#define ERROR_APIC_VECTOR 0xfe
|
||||
#define INVALIDATE_TLB_VECTOR 0xfd
|
||||
#define RESCHEDULE_VECTOR 0xfc
|
||||
#define CALL_FUNCTION_VECTOR 0xfb
|
||||
|
||||
#define THERMAL_APIC_VECTOR 0xf0
|
||||
/*
|
||||
* Local APIC timer IRQ vector is on a different priority level,
|
||||
* to work around the 'lost local interrupt if more than 2 IRQ
|
||||
* sources per level' errata.
|
||||
*/
|
||||
#define LOCAL_TIMER_VECTOR 0xef
|
||||
|
||||
/*
|
||||
* First APIC vector available to drivers: (vectors 0x30-0xee)
|
||||
* we start at 0x31 to spread out vectors evenly between priority
|
||||
* levels. (0x80 is the syscall vector)
|
||||
*/
|
||||
#define FIRST_DEVICE_VECTOR 0x31
|
||||
#define FIRST_SYSTEM_VECTOR 0xef
|
||||
|
||||
#define TIMER_IRQ 0
|
||||
|
||||
/*
|
||||
* 16 8259A IRQ's, 208 potential APIC interrupt sources.
|
||||
* Right now the APIC is mostly only used for SMP.
|
||||
* 256 vectors is an architectural limit. (we can have
|
||||
* more than 256 devices theoretically, but they will
|
||||
* have to use shared interrupts)
|
||||
* Since vectors 0x00-0x1f are used/reserved for the CPU,
|
||||
* the usable vector space is 0x20-0xff (224 vectors)
|
||||
*/
|
||||
|
||||
/*
|
||||
* The maximum number of vectors supported by i386 processors
|
||||
* is limited to 256. For processors other than i386, NR_VECTORS
|
||||
* should be changed accordingly.
|
||||
*/
|
||||
#define NR_VECTORS 256
|
||||
|
||||
#include "irq_vectors_limits.h"
|
||||
|
||||
#define FPU_IRQ 13
|
||||
|
||||
#define FIRST_VM86_IRQ 3
|
||||
#define LAST_VM86_IRQ 15
|
||||
#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
|
||||
|
||||
|
||||
#endif /* _ASM_IRQ_VECTORS_H */
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
#ifndef _ASM_IRQ_VECTORS_LIMITS_H
|
||||
#define _ASM_IRQ_VECTORS_LIMITS_H
|
||||
|
||||
#if defined(CONFIG_X86_IO_APIC) || defined(CONFIG_PARAVIRT)
|
||||
#define NR_IRQS 224
|
||||
# if (224 >= 32 * NR_CPUS)
|
||||
# define NR_IRQ_VECTORS NR_IRQS
|
||||
# else
|
||||
# define NR_IRQ_VECTORS (32 * NR_CPUS)
|
||||
# endif
|
||||
#else
|
||||
#define NR_IRQS 16
|
||||
#define NR_IRQ_VECTORS NR_IRQS
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_IRQ_VECTORS_LIMITS_H */
|
||||
|
|
@ -77,7 +77,11 @@ static inline void setup_apic_routing(void)
|
|||
|
||||
static inline int apicid_to_node(int logical_apicid)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
return apicid_2_node[hard_smp_processor_id()];
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,3 @@
|
|||
/* Hook to call BIOS initialisation function */
|
||||
|
||||
/* no action for generic */
|
||||
|
||||
#ifndef ARCH_SETUP
|
||||
#define ARCH_SETUP
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -3,7 +3,9 @@
|
|||
|
||||
static inline void smpboot_clear_io_apic_irqs(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
io_apic_irqs = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
|
||||
|
|
@ -35,17 +37,23 @@ static inline void smpboot_restore_warm_reset_vector(void)
|
|||
|
||||
static inline void __init smpboot_setup_io_apic(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
/*
|
||||
* Here we can be sure that there is an IO-APIC in the system. Let's
|
||||
* go and set it up:
|
||||
*/
|
||||
if (!skip_ioapic_setup && nr_ioapics)
|
||||
setup_IO_APIC();
|
||||
else
|
||||
else {
|
||||
nr_ioapics = 0;
|
||||
localise_nmi_watchdog();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void smpboot_clear_io_apic(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
nr_ioapics = 0;
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
#ifndef __ASM_MACH_MPSPEC_H
|
||||
#define __ASM_MACH_MPSPEC_H
|
||||
|
||||
#define MAX_IRQ_SOURCES 256
|
||||
|
||||
#define MAX_MP_BUSSES 256
|
||||
|
||||
#endif /* __ASM_MACH_MPSPEC_H */
|
||||
|
|
@ -1,7 +1,10 @@
|
|||
#ifndef _MACH_MPPARSE_H
|
||||
#define _MACH_MPPARSE_H 1
|
||||
|
||||
int mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid);
|
||||
int acpi_madt_oem_check(char *oem_id, char *oem_table_id);
|
||||
|
||||
extern int mps_oem_check(struct mp_config_table *mpc, char *oem,
|
||||
char *productid);
|
||||
|
||||
extern int acpi_madt_oem_check(char *oem_id, char *oem_table_id);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -20,8 +20,14 @@ static inline cpumask_t target_cpus(void)
|
|||
#define INT_DELIVERY_MODE dest_LowestPrio
|
||||
#define INT_DEST_MODE 0 /* physical delivery on LOCAL quad */
|
||||
|
||||
#define check_apicid_used(bitmap, apicid) physid_isset(apicid, bitmap)
|
||||
#define check_apicid_present(bit) physid_isset(bit, phys_cpu_present_map)
|
||||
static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
|
||||
{
|
||||
return physid_isset(apicid, bitmap);
|
||||
}
|
||||
static inline unsigned long check_apicid_present(int bit)
|
||||
{
|
||||
return physid_isset(bit, phys_cpu_present_map);
|
||||
}
|
||||
#define apicid_cluster(apicid) (apicid & 0xF0)
|
||||
|
||||
static inline int apic_id_registered(void)
|
||||
|
|
@ -77,11 +83,6 @@ static inline int cpu_present_to_apicid(int mps_cpu)
|
|||
return BAD_APICID;
|
||||
}
|
||||
|
||||
static inline int generate_logical_apicid(int quad, int phys_apicid)
|
||||
{
|
||||
return (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1);
|
||||
}
|
||||
|
||||
static inline int apicid_to_node(int logical_apicid)
|
||||
{
|
||||
return logical_apicid >> 4;
|
||||
|
|
@ -95,30 +96,6 @@ static inline physid_mask_t apicid_to_cpu_present(int logical_apicid)
|
|||
return physid_mask_of_physid(cpu + 4*node);
|
||||
}
|
||||
|
||||
struct mpc_config_translation {
|
||||
unsigned char mpc_type;
|
||||
unsigned char trans_len;
|
||||
unsigned char trans_type;
|
||||
unsigned char trans_quad;
|
||||
unsigned char trans_global;
|
||||
unsigned char trans_local;
|
||||
unsigned short trans_reserved;
|
||||
};
|
||||
|
||||
static inline int mpc_apic_id(struct mpc_config_processor *m,
|
||||
struct mpc_config_translation *translation_record)
|
||||
{
|
||||
int quad = translation_record->trans_quad;
|
||||
int logical_apicid = generate_logical_apicid(quad, m->mpc_apicid);
|
||||
|
||||
printk("Processor #%d %u:%u APIC version %d (quad %d, apic %d)\n",
|
||||
m->mpc_apicid,
|
||||
(m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
|
||||
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
|
||||
m->mpc_apicver, quad, logical_apicid);
|
||||
return logical_apicid;
|
||||
}
|
||||
|
||||
extern void *xquad_portio;
|
||||
|
||||
static inline void setup_portio_remap(void)
|
||||
|
|
|
|||
|
|
@ -1,14 +1,7 @@
|
|||
#ifndef __ASM_MACH_MPPARSE_H
|
||||
#define __ASM_MACH_MPPARSE_H
|
||||
|
||||
extern void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
|
||||
struct mpc_config_translation *translation);
|
||||
extern void mpc_oem_pci_bus(struct mpc_config_bus *m,
|
||||
struct mpc_config_translation *translation);
|
||||
|
||||
/* Hook from generic ACPI tables.c */
|
||||
static inline void acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
||||
{
|
||||
}
|
||||
extern void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem,
|
||||
char *productid);
|
||||
|
||||
#endif /* __ASM_MACH_MPPARSE_H */
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
#ifndef __ASM_MACH_MPSPEC_H
|
||||
#define __ASM_MACH_MPSPEC_H
|
||||
|
||||
#define MAX_IRQ_SOURCES 512
|
||||
|
||||
#define MAX_MP_BUSSES 32
|
||||
|
||||
#endif /* __ASM_MACH_MPSPEC_H */
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
#ifndef __ASM_MACH_MPSPEC_H
|
||||
#define __ASM_MACH_MPSPEC_H
|
||||
|
||||
#define MAX_IRQ_SOURCES 256
|
||||
|
||||
/* Maximum 256 PCI busses, plus 1 ISA bus in each of 4 cabinets. */
|
||||
#define MAX_MP_BUSSES 260
|
||||
|
||||
#endif /* __ASM_MACH_MPSPEC_H */
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
#ifndef _ASM_IRQ_VECTORS_H
|
||||
#define _ASM_IRQ_VECTORS_H
|
||||
|
||||
/*
|
||||
* IDT vectors usable for external interrupt sources start
|
||||
* at 0x20:
|
||||
*/
|
||||
#define FIRST_EXTERNAL_VECTOR 0x20
|
||||
|
||||
#define SYSCALL_VECTOR 0x80
|
||||
|
||||
/*
|
||||
* Vectors 0x20-0x2f are used for ISA interrupts.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Special IRQ vectors used by the SMP architecture, 0xf0-0xff
|
||||
*
|
||||
* some of the following vectors are 'rare', they are merged
|
||||
* into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
|
||||
* TLB, reschedule and local APIC vectors are performance-critical.
|
||||
*
|
||||
* Vectors 0xf0-0xfa are free (reserved for future Linux use).
|
||||
*/
|
||||
#define SPURIOUS_APIC_VECTOR 0xff
|
||||
#define ERROR_APIC_VECTOR 0xfe
|
||||
#define INVALIDATE_TLB_VECTOR 0xfd
|
||||
#define RESCHEDULE_VECTOR 0xfc
|
||||
#define CALL_FUNCTION_VECTOR 0xfb
|
||||
|
||||
#define THERMAL_APIC_VECTOR 0xf0
|
||||
/*
|
||||
* Local APIC timer IRQ vector is on a different priority level,
|
||||
* to work around the 'lost local interrupt if more than 2 IRQ
|
||||
* sources per level' errata.
|
||||
*/
|
||||
#define LOCAL_TIMER_VECTOR 0xef
|
||||
|
||||
/*
|
||||
* First APIC vector available to drivers: (vectors 0x30-0xee)
|
||||
* we start at 0x31 to spread out vectors evenly between priority
|
||||
* levels. (0x80 is the syscall vector)
|
||||
*/
|
||||
#define FIRST_DEVICE_VECTOR 0x31
|
||||
#define FIRST_SYSTEM_VECTOR 0xef
|
||||
|
||||
#define TIMER_IRQ 0
|
||||
|
||||
/*
|
||||
* IRQ definitions
|
||||
*/
|
||||
#define NR_VECTORS 256
|
||||
#define NR_IRQS 224
|
||||
#define NR_IRQ_VECTORS NR_IRQS
|
||||
|
||||
#define FPU_IRQ 13
|
||||
|
||||
#define FIRST_VM86_IRQ 3
|
||||
#define LAST_VM86_IRQ 15
|
||||
#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
|
||||
|
||||
#endif /* _ASM_IRQ_VECTORS_H */
|
||||
|
|
@ -1,103 +1 @@
|
|||
#ifndef __ASM_MACH_APIC_H
|
||||
#define __ASM_MACH_APIC_H
|
||||
|
||||
#include <mach_apicdef.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
#define APIC_DFR_VALUE (APIC_DFR_FLAT)
|
||||
|
||||
#define no_balance_irq (0)
|
||||
#define esr_disable (0)
|
||||
|
||||
#define INT_DELIVERY_MODE dest_LowestPrio
|
||||
#define INT_DEST_MODE 1 /* logical delivery broadcast to all procs */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define TARGET_CPUS cpu_online_map
|
||||
#else
|
||||
#define TARGET_CPUS cpumask_of_cpu(0)
|
||||
#endif
|
||||
|
||||
#define check_apicid_used(bitmap, apicid) physid_isset(apicid, bitmap)
|
||||
#define check_apicid_present(bit) physid_isset(bit, phys_cpu_present_map)
|
||||
|
||||
static inline int apic_id_registered(void)
|
||||
{
|
||||
return physid_isset(GET_APIC_ID(read_apic_id()), phys_cpu_present_map);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up the logical destination ID.
|
||||
*
|
||||
* Intel recommends to set DFR, LDR and TPR before enabling
|
||||
* an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel
|
||||
* document number 292116). So here it goes...
|
||||
*/
|
||||
static inline void init_apic_ldr(void)
|
||||
{
|
||||
unsigned long val;
|
||||
|
||||
apic_write_around(APIC_DFR, APIC_DFR_VALUE);
|
||||
val = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
|
||||
val |= SET_APIC_LOGICAL_ID(1UL << smp_processor_id());
|
||||
apic_write_around(APIC_LDR, val);
|
||||
}
|
||||
|
||||
static inline void summit_check(char *oem, char *productid)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void setup_apic_routing(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int apicid_to_node(int logical_apicid)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Mapping from cpu number to logical apicid */
|
||||
static inline int cpu_to_logical_apicid(int cpu)
|
||||
{
|
||||
return 1 << cpu;
|
||||
}
|
||||
|
||||
static inline int cpu_present_to_apicid(int mps_cpu)
|
||||
{
|
||||
if (mps_cpu < get_physical_broadcast())
|
||||
return mps_cpu;
|
||||
else
|
||||
return BAD_APICID;
|
||||
}
|
||||
|
||||
static inline physid_mask_t apicid_to_cpu_present(int apicid)
|
||||
{
|
||||
return physid_mask_of_physid(apicid);
|
||||
}
|
||||
|
||||
#define WAKE_SECONDARY_VIA_INIT
|
||||
|
||||
static inline void setup_portio_remap(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void enable_apic_mode(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
|
||||
{
|
||||
return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map);
|
||||
}
|
||||
|
||||
static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
|
||||
{
|
||||
return cpus_addr(cpumask)[0];
|
||||
}
|
||||
|
||||
static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb)
|
||||
{
|
||||
return cpuid_apic >> index_msb;
|
||||
}
|
||||
|
||||
#endif /* __ASM_MACH_APIC_H */
|
||||
#include "../mach-default/mach_apic.h"
|
||||
|
|
|
|||
|
|
@ -1,12 +1 @@
|
|||
#ifndef __ASM_MACH_APICDEF_H
|
||||
#define __ASM_MACH_APICDEF_H
|
||||
|
||||
#define APIC_ID_MASK (0xF<<24)
|
||||
|
||||
static inline unsigned get_apic_id(unsigned long x)
|
||||
{
|
||||
return (((x)>>24)&0xF);
|
||||
}
|
||||
#define GET_APIC_ID(x) get_apic_id(x)
|
||||
|
||||
#endif
|
||||
#include "../mach-default/mach_apicdef.h"
|
||||
|
|
|
|||
|
|
@ -1,8 +1 @@
|
|||
/* Hook to call BIOS initialisation function */
|
||||
|
||||
extern unsigned long sgivwfb_mem_phys;
|
||||
extern unsigned long sgivwfb_mem_size;
|
||||
|
||||
/* no action for visws */
|
||||
|
||||
#define ARCH_SETUP
|
||||
#include "../mach-default/setup_arch.h"
|
||||
|
|
|
|||
|
|
@ -1,28 +1 @@
|
|||
static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
|
||||
{
|
||||
CMOS_WRITE(0xa, 0xf);
|
||||
local_flush_tlb();
|
||||
Dprintk("1.\n");
|
||||
*((volatile unsigned short *) TRAMPOLINE_HIGH) = start_eip >> 4;
|
||||
Dprintk("2.\n");
|
||||
*((volatile unsigned short *) TRAMPOLINE_LOW) = start_eip & 0xf;
|
||||
Dprintk("3.\n");
|
||||
}
|
||||
|
||||
/* for visws do nothing for any of these */
|
||||
|
||||
static inline void smpboot_clear_io_apic_irqs(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void smpboot_restore_warm_reset_vector(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void smpboot_setup_io_apic(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void smpboot_clear_io_apic(void)
|
||||
{
|
||||
}
|
||||
#include "../mach-default/smpboot_hooks.h"
|
||||
|
|
|
|||
|
|
@ -1,79 +0,0 @@
|
|||
/* -*- mode: c; c-basic-offset: 8 -*- */
|
||||
|
||||
/* Copyright (C) 2002
|
||||
*
|
||||
* Author: James.Bottomley@HansenPartnership.com
|
||||
*
|
||||
* linux/arch/i386/voyager/irq_vectors.h
|
||||
*
|
||||
* This file provides definitions for the VIC and QIC CPIs
|
||||
*/
|
||||
|
||||
#ifndef _ASM_IRQ_VECTORS_H
|
||||
#define _ASM_IRQ_VECTORS_H
|
||||
|
||||
/*
|
||||
* IDT vectors usable for external interrupt sources start
|
||||
* at 0x20:
|
||||
*/
|
||||
#define FIRST_EXTERNAL_VECTOR 0x20
|
||||
|
||||
#define SYSCALL_VECTOR 0x80
|
||||
|
||||
/*
|
||||
* Vectors 0x20-0x2f are used for ISA interrupts.
|
||||
*/
|
||||
|
||||
/* These define the CPIs we use in linux */
|
||||
#define VIC_CPI_LEVEL0 0
|
||||
#define VIC_CPI_LEVEL1 1
|
||||
/* now the fake CPIs */
|
||||
#define VIC_TIMER_CPI 2
|
||||
#define VIC_INVALIDATE_CPI 3
|
||||
#define VIC_RESCHEDULE_CPI 4
|
||||
#define VIC_ENABLE_IRQ_CPI 5
|
||||
#define VIC_CALL_FUNCTION_CPI 6
|
||||
|
||||
/* Now the QIC CPIs: Since we don't need the two initial levels,
|
||||
* these are 2 less than the VIC CPIs */
|
||||
#define QIC_CPI_OFFSET 1
|
||||
#define QIC_TIMER_CPI (VIC_TIMER_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_INVALIDATE_CPI (VIC_INVALIDATE_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_RESCHEDULE_CPI (VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_ENABLE_IRQ_CPI (VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET)
|
||||
#define QIC_CALL_FUNCTION_CPI (VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET)
|
||||
|
||||
#define VIC_START_FAKE_CPI VIC_TIMER_CPI
|
||||
#define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_CPI
|
||||
|
||||
/* this is the SYS_INT CPI. */
|
||||
#define VIC_SYS_INT 8
|
||||
#define VIC_CMN_INT 15
|
||||
|
||||
/* This is the boot CPI for alternate processors. It gets overwritten
|
||||
* by the above once the system has activated all available processors */
|
||||
#define VIC_CPU_BOOT_CPI VIC_CPI_LEVEL0
|
||||
#define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8)
|
||||
|
||||
#define NR_VECTORS 256
|
||||
#define NR_IRQS 224
|
||||
#define NR_IRQ_VECTORS NR_IRQS
|
||||
|
||||
#define FPU_IRQ 13
|
||||
|
||||
#define FIRST_VM86_IRQ 3
|
||||
#define LAST_VM86_IRQ 15
|
||||
#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern asmlinkage void vic_cpi_interrupt(void);
|
||||
extern asmlinkage void vic_sys_interrupt(void);
|
||||
extern asmlinkage void vic_cmn_interrupt(void);
|
||||
extern asmlinkage void qic_timer_interrupt(void);
|
||||
extern asmlinkage void qic_invalidate_interrupt(void);
|
||||
extern asmlinkage void qic_reschedule_interrupt(void);
|
||||
extern asmlinkage void qic_enable_irq_interrupt(void);
|
||||
extern asmlinkage void qic_call_function_interrupt(void);
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_IRQ_VECTORS_H */
|
||||
12
include/asm-x86/mmconfig.h
Normal file
12
include/asm-x86/mmconfig.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _ASM_MMCONFIG_H
|
||||
#define _ASM_MMCONFIG_H
|
||||
|
||||
#ifdef CONFIG_PCI_MMCONFIG
|
||||
extern void __cpuinit fam10h_check_enable_mmcfg(void);
|
||||
extern void __init check_enable_amd_mmconf_dmi(void);
|
||||
#else
|
||||
static inline void fam10h_check_enable_mmcfg(void) { }
|
||||
static inline void check_enable_amd_mmconf_dmi(void) { }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -1,5 +1,37 @@
|
|||
#ifndef __ASM_X86_MMU_CONTEXT_H
|
||||
#define __ASM_X86_MMU_CONTEXT_H
|
||||
|
||||
#include <asm/desc.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/paravirt.h>
|
||||
#ifndef CONFIG_PARAVIRT
|
||||
#include <asm-generic/mm_hooks.h>
|
||||
|
||||
static inline void paravirt_activate_mm(struct mm_struct *prev,
|
||||
struct mm_struct *next)
|
||||
{
|
||||
}
|
||||
#endif /* !CONFIG_PARAVIRT */
|
||||
|
||||
/*
|
||||
* Used for LDT copy/destruction.
|
||||
*/
|
||||
int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
|
||||
void destroy_context(struct mm_struct *mm);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# include "mmu_context_32.h"
|
||||
#else
|
||||
# include "mmu_context_64.h"
|
||||
#endif
|
||||
|
||||
#define activate_mm(prev, next) \
|
||||
do { \
|
||||
paravirt_activate_mm((prev), (next)); \
|
||||
switch_mm((prev), (next), NULL); \
|
||||
} while (0);
|
||||
|
||||
|
||||
#endif /* __ASM_X86_MMU_CONTEXT_H */
|
||||
|
|
|
|||
|
|
@ -1,28 +1,6 @@
|
|||
#ifndef __I386_SCHED_H
|
||||
#define __I386_SCHED_H
|
||||
|
||||
#include <asm/desc.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/paravirt.h>
|
||||
#ifndef CONFIG_PARAVIRT
|
||||
#include <asm-generic/mm_hooks.h>
|
||||
|
||||
static inline void paravirt_activate_mm(struct mm_struct *prev,
|
||||
struct mm_struct *next)
|
||||
{
|
||||
}
|
||||
#endif /* !CONFIG_PARAVIRT */
|
||||
|
||||
|
||||
/*
|
||||
* Used for LDT copy/destruction.
|
||||
*/
|
||||
int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
|
||||
void destroy_context(struct mm_struct *mm);
|
||||
|
||||
|
||||
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
|
|
@ -75,10 +53,4 @@ static inline void switch_mm(struct mm_struct *prev,
|
|||
#define deactivate_mm(tsk, mm) \
|
||||
asm("movl %0,%%gs": :"r" (0));
|
||||
|
||||
#define activate_mm(prev, next) \
|
||||
do { \
|
||||
paravirt_activate_mm((prev), (next)); \
|
||||
switch_mm((prev), (next), NULL); \
|
||||
} while (0);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,21 +1,7 @@
|
|||
#ifndef __X86_64_MMU_CONTEXT_H
|
||||
#define __X86_64_MMU_CONTEXT_H
|
||||
|
||||
#include <asm/desc.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/pda.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#ifndef CONFIG_PARAVIRT
|
||||
#include <asm-generic/mm_hooks.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* possibly do the LDT unload here?
|
||||
*/
|
||||
int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
|
||||
void destroy_context(struct mm_struct *mm);
|
||||
|
||||
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
|
||||
{
|
||||
|
|
@ -65,8 +51,4 @@ do { \
|
|||
asm volatile("movl %0,%%fs"::"r"(0)); \
|
||||
} while (0)
|
||||
|
||||
#define activate_mm(prev, next) \
|
||||
switch_mm((prev), (next), NULL)
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -12,11 +12,9 @@
|
|||
extern struct pglist_data *node_data[];
|
||||
#define NODE_DATA(nid) (node_data[nid])
|
||||
|
||||
#ifdef CONFIG_X86_NUMAQ
|
||||
#include <asm/numaq.h>
|
||||
#elif defined(CONFIG_ACPI_SRAT)/* summit or generic arch */
|
||||
#include <asm/srat.h>
|
||||
#endif
|
||||
#include <asm/numaq.h>
|
||||
/* summit or generic arch */
|
||||
#include <asm/srat.h>
|
||||
|
||||
extern int get_memcfg_numa_flat(void);
|
||||
/*
|
||||
|
|
@ -26,28 +24,20 @@ extern int get_memcfg_numa_flat(void);
|
|||
*/
|
||||
static inline void get_memcfg_numa(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_NUMAQ
|
||||
|
||||
if (get_memcfg_numaq())
|
||||
return;
|
||||
#elif defined(CONFIG_ACPI_SRAT)
|
||||
if (get_memcfg_from_srat())
|
||||
return;
|
||||
#endif
|
||||
|
||||
get_memcfg_numa_flat();
|
||||
}
|
||||
|
||||
extern int early_pfn_to_nid(unsigned long pfn);
|
||||
extern void numa_kva_reserve(void);
|
||||
|
||||
#else /* !CONFIG_NUMA */
|
||||
|
||||
#define get_memcfg_numa get_memcfg_numa_flat
|
||||
#define get_zholes_size(n) (0)
|
||||
|
||||
static inline void numa_kva_reserve(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
|
|
@ -55,14 +45,14 @@ static inline void numa_kva_reserve(void)
|
|||
/*
|
||||
* generic node memory support, the following assumptions apply:
|
||||
*
|
||||
* 1) memory comes in 256Mb contigious chunks which are either present or not
|
||||
* 1) memory comes in 64Mb contigious chunks which are either present or not
|
||||
* 2) we will not have more than 64Gb in total
|
||||
*
|
||||
* for now assume that 64Gb is max amount of RAM for whole system
|
||||
* 64Gb / 4096bytes/page = 16777216 pages
|
||||
*/
|
||||
#define MAX_NR_PAGES 16777216
|
||||
#define MAX_ELEMENTS 256
|
||||
#define MAX_ELEMENTS 1024
|
||||
#define PAGES_PER_ELEMENT (MAX_NR_PAGES/MAX_ELEMENTS)
|
||||
|
||||
extern s8 physnode_map[];
|
||||
|
|
@ -87,9 +77,6 @@ static inline int pfn_to_nid(unsigned long pfn)
|
|||
__pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
|
||||
})
|
||||
|
||||
#ifdef CONFIG_X86_NUMAQ /* we have contiguous memory on NUMA-Q */
|
||||
#define pfn_valid(pfn) ((pfn) < num_physpages)
|
||||
#else
|
||||
static inline int pfn_valid(int pfn)
|
||||
{
|
||||
int nid = pfn_to_nid(pfn);
|
||||
|
|
@ -98,7 +85,6 @@ static inline int pfn_valid(int pfn)
|
|||
return (pfn < node_end_pfn(nid));
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_X86_NUMAQ */
|
||||
|
||||
#endif /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,12 @@ extern int apic_version[MAX_APICS];
|
|||
extern u8 apicid_2_node[];
|
||||
extern int pic_mode;
|
||||
|
||||
#ifdef CONFIG_X86_NUMAQ
|
||||
extern int mp_bus_id_to_node[MAX_MP_BUSSES];
|
||||
extern int mp_bus_id_to_local[MAX_MP_BUSSES];
|
||||
extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
|
||||
#endif
|
||||
|
||||
#define MAX_APICID 256
|
||||
|
||||
#else
|
||||
|
|
@ -21,26 +27,30 @@ extern int pic_mode;
|
|||
/* Each PCI slot may be a combo card with its own bus. 4 IRQ pins per slot. */
|
||||
#define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4)
|
||||
|
||||
#endif
|
||||
|
||||
extern void early_find_smp_config(void);
|
||||
extern void early_get_smp_config(void);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MCA) || defined(CONFIG_EISA)
|
||||
extern int mp_bus_id_to_type[MAX_MP_BUSSES];
|
||||
#endif
|
||||
|
||||
extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
|
||||
|
||||
extern int mp_bus_id_to_pci_bus[MAX_MP_BUSSES];
|
||||
|
||||
extern unsigned int boot_cpu_physical_apicid;
|
||||
extern unsigned int max_physical_apicid;
|
||||
extern int smp_found_config;
|
||||
extern int mpc_default_type;
|
||||
extern unsigned long mp_lapic_addr;
|
||||
|
||||
extern void find_smp_config(void);
|
||||
extern void get_smp_config(void);
|
||||
#ifdef CONFIG_X86_MPPARSE
|
||||
extern void early_reserve_e820_mpc_new(void);
|
||||
#else
|
||||
static inline void early_reserve_e820_mpc_new(void) { }
|
||||
#endif
|
||||
|
||||
void __cpuinit generic_processor_info(int apicid, int version);
|
||||
#ifdef CONFIG_ACPI
|
||||
|
|
@ -49,6 +59,17 @@ extern void mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger,
|
|||
u32 gsi);
|
||||
extern void mp_config_acpi_legacy_irqs(void);
|
||||
extern int mp_register_gsi(u32 gsi, int edge_level, int active_high_low);
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
|
||||
u32 gsi, int triggering, int polarity);
|
||||
#else
|
||||
static inline int
|
||||
mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
|
||||
u32 gsi, int triggering, int polarity)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_ACPI */
|
||||
|
||||
#define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS)
|
||||
|
|
@ -101,6 +122,7 @@ typedef struct physid_mask physid_mask_t;
|
|||
__physid_mask; \
|
||||
})
|
||||
|
||||
/* Note: will create very large stack frames if physid_mask_t is big */
|
||||
#define physid_mask_of_physid(physid) \
|
||||
({ \
|
||||
physid_mask_t __physid_mask = PHYSID_MASK_NONE; \
|
||||
|
|
@ -108,6 +130,12 @@ typedef struct physid_mask physid_mask_t;
|
|||
__physid_mask; \
|
||||
})
|
||||
|
||||
static inline void physid_set_mask_of_physid(int physid, physid_mask_t *map)
|
||||
{
|
||||
physids_clear(*map);
|
||||
physid_set(physid, *map);
|
||||
}
|
||||
|
||||
#define PHYSID_MASK_ALL { {[0 ... PHYSID_ARRAY_SIZE-1] = ~0UL} }
|
||||
#define PHYSID_MASK_NONE { {[0 ... PHYSID_ARRAY_SIZE-1] = 0UL} }
|
||||
|
||||
|
|
|
|||
|
|
@ -17,10 +17,11 @@
|
|||
# define MAX_MPC_ENTRY 1024
|
||||
# define MAX_APICS 256
|
||||
#else
|
||||
/*
|
||||
* A maximum of 255 APICs with the current APIC ID architecture.
|
||||
*/
|
||||
# define MAX_APICS 255
|
||||
# if NR_CPUS <= 255
|
||||
# define MAX_APICS 255
|
||||
# else
|
||||
# define MAX_APICS 32768
|
||||
# endif
|
||||
#endif
|
||||
|
||||
struct intel_mp_floating {
|
||||
|
|
|
|||
|
|
@ -111,7 +111,9 @@
|
|||
#define MSR_K8_TOP_MEM2 0xc001001d
|
||||
#define MSR_K8_SYSCFG 0xc0010010
|
||||
#define MSR_K8_HWCR 0xc0010015
|
||||
#define MSR_K8_ENABLE_C1E 0xc0010055
|
||||
#define MSR_K8_INT_PENDING_MSG 0xc0010055
|
||||
/* C1E active bits in int pending message */
|
||||
#define K8_INTP_C1E_ACTIVE_MASK 0x18000000
|
||||
#define MSR_K8_TSEG_ADDR 0xc0010112
|
||||
#define K8_MTRRFIXRANGE_DRAM_ENABLE 0x00040000 /* MtrrFixDramEn bit */
|
||||
#define K8_MTRRFIXRANGE_DRAM_MODIFY 0x00080000 /* MtrrFixDramModEn bit */
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr,
|
|||
static inline void native_write_msr(unsigned int msr,
|
||||
unsigned low, unsigned high)
|
||||
{
|
||||
asm volatile("wrmsr" : : "c" (msr), "a"(low), "d" (high));
|
||||
asm volatile("wrmsr" : : "c" (msr), "a"(low), "d" (high) : "memory");
|
||||
}
|
||||
|
||||
static inline int native_write_msr_safe(unsigned int msr,
|
||||
|
|
@ -81,7 +81,8 @@ static inline int native_write_msr_safe(unsigned int msr,
|
|||
_ASM_EXTABLE(2b, 3b)
|
||||
: "=a" (err)
|
||||
: "c" (msr), "0" (low), "d" (high),
|
||||
"i" (-EFAULT));
|
||||
"i" (-EFAULT)
|
||||
: "memory");
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,38 +15,13 @@
|
|||
*/
|
||||
int do_nmi_callback(struct pt_regs *regs, int cpu);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
/** Replace the PM callback routine for NMI. */
|
||||
struct pm_dev *set_nmi_pm_callback(pm_callback callback);
|
||||
|
||||
/** Unset the PM callback routine back to the default. */
|
||||
void unset_nmi_pm_callback(struct pm_dev *dev);
|
||||
|
||||
#else
|
||||
|
||||
static inline struct pm_dev *set_nmi_pm_callback(pm_callback callback)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void unset_nmi_pm_callback(struct pm_dev *dev)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
extern void default_do_nmi(struct pt_regs *);
|
||||
extern void die_nmi(char *str, struct pt_regs *regs, int do_panic);
|
||||
extern void nmi_watchdog_default(void);
|
||||
#else
|
||||
#define nmi_watchdog_default() do {} while (0)
|
||||
#endif
|
||||
|
||||
extern void die_nmi(char *str, struct pt_regs *regs, int do_panic);
|
||||
extern int check_nmi_watchdog(void);
|
||||
extern int nmi_watchdog_enabled;
|
||||
extern int unknown_nmi_panic;
|
||||
extern int avail_to_resrv_perfctr_nmi_bit(unsigned int);
|
||||
extern int avail_to_resrv_perfctr_nmi(unsigned int);
|
||||
extern int reserve_perfctr_nmi(unsigned int);
|
||||
|
|
@ -62,12 +37,10 @@ extern int nmi_watchdog_tick(struct pt_regs *regs, unsigned reason);
|
|||
|
||||
extern atomic_t nmi_active;
|
||||
extern unsigned int nmi_watchdog;
|
||||
#define NMI_DISABLED -1
|
||||
#define NMI_NONE 0
|
||||
#define NMI_IO_APIC 1
|
||||
#define NMI_LOCAL_APIC 2
|
||||
#define NMI_INVALID 3
|
||||
#define NMI_DEFAULT NMI_DISABLED
|
||||
|
||||
struct ctl_table;
|
||||
struct file;
|
||||
|
|
@ -78,6 +51,24 @@ extern int unknown_nmi_panic;
|
|||
void __trigger_all_cpu_backtrace(void);
|
||||
#define trigger_all_cpu_backtrace() __trigger_all_cpu_backtrace()
|
||||
|
||||
static inline void localise_nmi_watchdog(void)
|
||||
{
|
||||
if (nmi_watchdog == NMI_IO_APIC)
|
||||
nmi_watchdog = NMI_LOCAL_APIC;
|
||||
}
|
||||
|
||||
/* check if nmi_watchdog is active (ie was specified at boot) */
|
||||
static inline int nmi_watchdog_active(void)
|
||||
{
|
||||
/*
|
||||
* actually it should be:
|
||||
* return (nmi_watchdog == NMI_LOCAL_APIC ||
|
||||
* nmi_watchdog == NMI_IO_APIC)
|
||||
* but since they are power of two we could use a
|
||||
* cheaper way --cvg
|
||||
*/
|
||||
return nmi_watchdog & 0x3;
|
||||
}
|
||||
#endif
|
||||
|
||||
void lapic_watchdog_stop(void);
|
||||
|
|
|
|||
|
|
@ -2,14 +2,10 @@
|
|||
#define _ASM_X86_32_NUMA_H 1
|
||||
|
||||
extern int pxm_to_nid(int pxm);
|
||||
extern void numa_remove_cpu(int cpu);
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
extern void __init remap_numa_kva(void);
|
||||
extern void set_highmem_pages_init(int);
|
||||
#else
|
||||
static inline void remap_numa_kva(void)
|
||||
{
|
||||
}
|
||||
extern void set_highmem_pages_init(void);
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_32_NUMA_H */
|
||||
|
|
|
|||
|
|
@ -14,32 +14,30 @@ extern int compute_hash_shift(struct bootnode *nodes, int numblks,
|
|||
|
||||
#define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT))
|
||||
|
||||
extern void numa_add_cpu(int cpu);
|
||||
extern void numa_init_array(void);
|
||||
extern int numa_off;
|
||||
|
||||
extern void numa_set_node(int cpu, int node);
|
||||
extern void srat_reserve_add_area(int nodeid);
|
||||
extern int hotadd_percent;
|
||||
|
||||
extern s16 apicid_to_node[MAX_LOCAL_APIC];
|
||||
|
||||
extern void numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn);
|
||||
extern unsigned long numa_free_all_bootmem(void);
|
||||
extern void setup_node_bootmem(int nodeid, unsigned long start,
|
||||
unsigned long end);
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
extern void __init init_cpu_to_node(void);
|
||||
|
||||
static inline void clear_node_cpumask(int cpu)
|
||||
{
|
||||
clear_bit(cpu, (unsigned long *)&node_to_cpumask_map[cpu_to_node(cpu)]);
|
||||
}
|
||||
|
||||
extern void __cpuinit numa_set_node(int cpu, int node);
|
||||
extern void __cpuinit numa_clear_node(int cpu);
|
||||
extern void __cpuinit numa_add_cpu(int cpu);
|
||||
extern void __cpuinit numa_remove_cpu(int cpu);
|
||||
#else
|
||||
#define init_cpu_to_node() do {} while (0)
|
||||
#define clear_node_cpumask(cpu) do {} while (0)
|
||||
static inline void init_cpu_to_node(void) { }
|
||||
static inline void numa_set_node(int cpu, int node) { }
|
||||
static inline void numa_clear_node(int cpu) { }
|
||||
static inline void numa_add_cpu(int cpu, int node) { }
|
||||
static inline void numa_remove_cpu(int cpu) { }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#ifdef CONFIG_X86_NUMAQ
|
||||
|
||||
extern int found_numaq;
|
||||
extern int get_memcfg_numaq(void);
|
||||
|
||||
/*
|
||||
|
|
@ -156,9 +157,12 @@ struct sys_cfg_data {
|
|||
struct eachquadmem eq[MAX_NUMNODES]; /* indexed by quad id */
|
||||
};
|
||||
|
||||
static inline unsigned long *get_zholes_size(int nid)
|
||||
void numaq_tsc_disable(void);
|
||||
|
||||
#else
|
||||
static inline int get_memcfg_numaq(void)
|
||||
{
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_X86_NUMAQ */
|
||||
#endif /* NUMAQ_H */
|
||||
|
|
|
|||
|
|
@ -51,9 +51,17 @@
|
|||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
typedef struct { pgdval_t pgd; } pgd_t;
|
||||
typedef struct { pgprotval_t pgprot; } pgprot_t;
|
||||
|
||||
extern int page_is_ram(unsigned long pagenr);
|
||||
extern int devmem_is_allowed(unsigned long pagenr);
|
||||
extern void map_devmem(unsigned long pfn, unsigned long size,
|
||||
pgprot_t vma_prot);
|
||||
extern void unmap_devmem(unsigned long pfn, unsigned long size,
|
||||
pgprot_t vma_prot);
|
||||
|
||||
extern unsigned long max_low_pfn_mapped;
|
||||
extern unsigned long max_pfn_mapped;
|
||||
|
||||
struct page;
|
||||
|
|
@ -74,9 +82,6 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
|
|||
alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
|
||||
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
||||
|
||||
typedef struct { pgdval_t pgd; } pgd_t;
|
||||
typedef struct { pgprotval_t pgprot; } pgprot_t;
|
||||
|
||||
static inline pgd_t native_make_pgd(pgdval_t val)
|
||||
{
|
||||
return (pgd_t) { val };
|
||||
|
|
@ -160,6 +165,7 @@ static inline pteval_t native_pte_val(pte_t pte)
|
|||
#endif
|
||||
|
||||
#define pte_val(x) native_pte_val(x)
|
||||
#define pte_flags(x) native_pte_val(x)
|
||||
#define __pte(x) native_make_pte(x)
|
||||
|
||||
#endif /* CONFIG_PARAVIRT */
|
||||
|
|
|
|||
|
|
@ -13,6 +13,14 @@
|
|||
*/
|
||||
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
|
||||
|
||||
#ifdef CONFIG_4KSTACKS
|
||||
#define THREAD_ORDER 0
|
||||
#else
|
||||
#define THREAD_ORDER 1
|
||||
#endif
|
||||
#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
|
||||
|
||||
|
||||
#ifdef CONFIG_X86_PAE
|
||||
/* 44=32+12, the limit we can fit into an unsigned long pfn */
|
||||
#define __PHYSICAL_MASK_SHIFT 44
|
||||
|
|
@ -84,6 +92,13 @@ extern int sysctl_legacy_va_layout;
|
|||
#define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE)
|
||||
#define MAXMEM (-__PAGE_OFFSET - __VMALLOC_RESERVE)
|
||||
|
||||
extern void find_low_pfn_range(void);
|
||||
extern unsigned long init_memory_mapping(unsigned long start,
|
||||
unsigned long end);
|
||||
extern void initmem_init(unsigned long, unsigned long);
|
||||
extern void setup_bootmem_allocator(void);
|
||||
|
||||
|
||||
#ifdef CONFIG_X86_USE_3DNOW
|
||||
#include <asm/mmx.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,13 @@
|
|||
#define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT)
|
||||
#define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1))
|
||||
|
||||
#define __PAGE_OFFSET _AC(0xffff810000000000, UL)
|
||||
/*
|
||||
* Set __PAGE_OFFSET to the most negative possible address +
|
||||
* PGDIR_SIZE*16 (pgd slot 272). The gap is to allow a space for a
|
||||
* hypervisor to fit. Choosing 16 slots here is arbitrary, but it's
|
||||
* what Xen requires.
|
||||
*/
|
||||
#define __PAGE_OFFSET _AC(0xffff880000000000, UL)
|
||||
|
||||
#define __PHYSICAL_START CONFIG_PHYSICAL_START
|
||||
#define __KERNEL_ALIGN 0x200000
|
||||
|
|
@ -58,7 +64,8 @@
|
|||
void clear_page(void *page);
|
||||
void copy_page(void *to, void *from);
|
||||
|
||||
extern unsigned long end_pfn;
|
||||
/* duplicated to the one in bootmem.h */
|
||||
extern unsigned long max_pfn;
|
||||
extern unsigned long phys_base;
|
||||
|
||||
extern unsigned long __phys_addr(unsigned long);
|
||||
|
|
@ -83,10 +90,15 @@ typedef struct { pteval_t pte; } pte_t;
|
|||
extern unsigned long init_memory_mapping(unsigned long start,
|
||||
unsigned long end);
|
||||
|
||||
extern void initmem_init(unsigned long start_pfn, unsigned long end_pfn);
|
||||
|
||||
extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
|
||||
extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#ifdef CONFIG_FLATMEM
|
||||
#define pfn_valid(pfn) ((pfn) < end_pfn)
|
||||
#define pfn_valid(pfn) ((pfn) < max_pfn)
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ struct pv_time_ops {
|
|||
int (*set_wallclock)(unsigned long);
|
||||
|
||||
unsigned long long (*sched_clock)(void);
|
||||
unsigned long (*get_cpu_khz)(void);
|
||||
unsigned long (*get_tsc_khz)(void);
|
||||
};
|
||||
|
||||
struct pv_cpu_ops {
|
||||
|
|
@ -115,6 +115,9 @@ struct pv_cpu_ops {
|
|||
void (*set_ldt)(const void *desc, unsigned entries);
|
||||
unsigned long (*store_tr)(void);
|
||||
void (*load_tls)(struct thread_struct *t, unsigned int cpu);
|
||||
#ifdef CONFIG_X86_64
|
||||
void (*load_gs_index)(unsigned int idx);
|
||||
#endif
|
||||
void (*write_ldt_entry)(struct desc_struct *ldt, int entrynum,
|
||||
const void *desc);
|
||||
void (*write_gdt_entry)(struct desc_struct *,
|
||||
|
|
@ -141,8 +144,32 @@ struct pv_cpu_ops {
|
|||
u64 (*read_pmc)(int counter);
|
||||
unsigned long long (*read_tscp)(unsigned int *aux);
|
||||
|
||||
/* These two are jmp to, not actually called. */
|
||||
void (*irq_enable_syscall_ret)(void);
|
||||
/*
|
||||
* Atomically enable interrupts and return to userspace. This
|
||||
* is only ever used to return to 32-bit processes; in a
|
||||
* 64-bit kernel, it's used for 32-on-64 compat processes, but
|
||||
* never native 64-bit processes. (Jump, not call.)
|
||||
*/
|
||||
void (*irq_enable_sysexit)(void);
|
||||
|
||||
/*
|
||||
* Switch to usermode gs and return to 64-bit usermode using
|
||||
* sysret. Only used in 64-bit kernels to return to 64-bit
|
||||
* processes. Usermode register state, including %rsp, must
|
||||
* already be restored.
|
||||
*/
|
||||
void (*usergs_sysret64)(void);
|
||||
|
||||
/*
|
||||
* Switch to usermode gs and return to 32-bit usermode using
|
||||
* sysret. Used to return to 32-on-64 compat processes.
|
||||
* Other usermode register state, including %esp, must already
|
||||
* be restored.
|
||||
*/
|
||||
void (*usergs_sysret32)(void);
|
||||
|
||||
/* Normal iret. Jump to this with the standard iret stack
|
||||
frame set up. */
|
||||
void (*iret)(void);
|
||||
|
||||
void (*swapgs)(void);
|
||||
|
|
@ -165,6 +192,10 @@ struct pv_irq_ops {
|
|||
void (*irq_enable)(void);
|
||||
void (*safe_halt)(void);
|
||||
void (*halt)(void);
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
void (*adjust_exception_frame)(void);
|
||||
#endif
|
||||
};
|
||||
|
||||
struct pv_apic_ops {
|
||||
|
|
@ -219,7 +250,14 @@ struct pv_mmu_ops {
|
|||
void (*flush_tlb_others)(const cpumask_t *cpus, struct mm_struct *mm,
|
||||
unsigned long va);
|
||||
|
||||
/* Hooks for allocating/releasing pagetable pages */
|
||||
/* Hooks for allocating and freeing a pagetable top-level */
|
||||
int (*pgd_alloc)(struct mm_struct *mm);
|
||||
void (*pgd_free)(struct mm_struct *mm, pgd_t *pgd);
|
||||
|
||||
/*
|
||||
* Hooks for allocating/releasing pagetable pages when they're
|
||||
* attached to a pagetable
|
||||
*/
|
||||
void (*alloc_pte)(struct mm_struct *mm, u32 pfn);
|
||||
void (*alloc_pmd)(struct mm_struct *mm, u32 pfn);
|
||||
void (*alloc_pmd_clone)(u32 pfn, u32 clonepfn, u32 start, u32 count);
|
||||
|
|
@ -238,7 +276,13 @@ struct pv_mmu_ops {
|
|||
void (*pte_update_defer)(struct mm_struct *mm,
|
||||
unsigned long addr, pte_t *ptep);
|
||||
|
||||
pte_t (*ptep_modify_prot_start)(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep);
|
||||
void (*ptep_modify_prot_commit)(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pte);
|
||||
|
||||
pteval_t (*pte_val)(pte_t);
|
||||
pteval_t (*pte_flags)(pte_t);
|
||||
pte_t (*make_pte)(pteval_t pte);
|
||||
|
||||
pgdval_t (*pgd_val)(pgd_t);
|
||||
|
|
@ -273,6 +317,13 @@ struct pv_mmu_ops {
|
|||
#endif
|
||||
|
||||
struct pv_lazy_ops lazy_mode;
|
||||
|
||||
/* dom0 ops */
|
||||
|
||||
/* Sometimes the physical address is a pfn, and sometimes its
|
||||
an mfn. We can tell which is which from the index. */
|
||||
void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx,
|
||||
unsigned long phys, pgprot_t flags);
|
||||
};
|
||||
|
||||
/* This contains all the paravirt structures: we get a convenient
|
||||
|
|
@ -439,10 +490,17 @@ int paravirt_disable_iospace(void);
|
|||
#define VEXTRA_CLOBBERS , "rax", "r8", "r9", "r10", "r11"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PARAVIRT_DEBUG
|
||||
#define PVOP_TEST_NULL(op) BUG_ON(op == NULL)
|
||||
#else
|
||||
#define PVOP_TEST_NULL(op) ((void)op)
|
||||
#endif
|
||||
|
||||
#define __PVOP_CALL(rettype, op, pre, post, ...) \
|
||||
({ \
|
||||
rettype __ret; \
|
||||
PVOP_CALL_ARGS; \
|
||||
PVOP_TEST_NULL(op); \
|
||||
/* This is 32-bit specific, but is okay in 64-bit */ \
|
||||
/* since this condition will never hold */ \
|
||||
if (sizeof(rettype) > sizeof(unsigned long)) { \
|
||||
|
|
@ -471,6 +529,7 @@ int paravirt_disable_iospace(void);
|
|||
#define __PVOP_VCALL(op, pre, post, ...) \
|
||||
({ \
|
||||
PVOP_VCALL_ARGS; \
|
||||
PVOP_TEST_NULL(op); \
|
||||
asm volatile(pre \
|
||||
paravirt_alt(PARAVIRT_CALL) \
|
||||
post \
|
||||
|
|
@ -720,7 +779,7 @@ static inline unsigned long long paravirt_sched_clock(void)
|
|||
{
|
||||
return PVOP_CALL0(unsigned long long, pv_time_ops.sched_clock);
|
||||
}
|
||||
#define calculate_cpu_khz() (pv_time_ops.get_cpu_khz())
|
||||
#define calibrate_tsc() (pv_time_ops.get_tsc_khz())
|
||||
|
||||
static inline unsigned long long paravirt_read_pmc(int counter)
|
||||
{
|
||||
|
|
@ -789,6 +848,13 @@ static inline void load_TLS(struct thread_struct *t, unsigned cpu)
|
|||
PVOP_VCALL2(pv_cpu_ops.load_tls, t, cpu);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
static inline void load_gs_index(unsigned int gs)
|
||||
{
|
||||
PVOP_VCALL1(pv_cpu_ops.load_gs_index, gs);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void write_ldt_entry(struct desc_struct *dt, int entry,
|
||||
const void *desc)
|
||||
{
|
||||
|
|
@ -912,6 +978,16 @@ static inline void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
|
|||
PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, &cpumask, mm, va);
|
||||
}
|
||||
|
||||
static inline int paravirt_pgd_alloc(struct mm_struct *mm)
|
||||
{
|
||||
return PVOP_CALL1(int, pv_mmu_ops.pgd_alloc, mm);
|
||||
}
|
||||
|
||||
static inline void paravirt_pgd_free(struct mm_struct *mm, pgd_t *pgd)
|
||||
{
|
||||
PVOP_VCALL2(pv_mmu_ops.pgd_free, mm, pgd);
|
||||
}
|
||||
|
||||
static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned pfn)
|
||||
{
|
||||
PVOP_VCALL2(pv_mmu_ops.alloc_pte, mm, pfn);
|
||||
|
|
@ -996,6 +1072,20 @@ static inline pteval_t pte_val(pte_t pte)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static inline pteval_t pte_flags(pte_t pte)
|
||||
{
|
||||
pteval_t ret;
|
||||
|
||||
if (sizeof(pteval_t) > sizeof(long))
|
||||
ret = PVOP_CALL2(pteval_t, pv_mmu_ops.pte_flags,
|
||||
pte.pte, (u64)pte.pte >> 32);
|
||||
else
|
||||
ret = PVOP_CALL1(pteval_t, pv_mmu_ops.pte_flags,
|
||||
pte.pte);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline pgd_t __pgd(pgdval_t val)
|
||||
{
|
||||
pgdval_t ret;
|
||||
|
|
@ -1024,6 +1114,29 @@ static inline pgdval_t pgd_val(pgd_t pgd)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#define __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION
|
||||
static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep)
|
||||
{
|
||||
pteval_t ret;
|
||||
|
||||
ret = PVOP_CALL3(pteval_t, pv_mmu_ops.ptep_modify_prot_start,
|
||||
mm, addr, ptep);
|
||||
|
||||
return (pte_t) { .pte = ret };
|
||||
}
|
||||
|
||||
static inline void ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
if (sizeof(pteval_t) > sizeof(long))
|
||||
/* 5 arg words */
|
||||
pv_mmu_ops.ptep_modify_prot_commit(mm, addr, ptep, pte);
|
||||
else
|
||||
PVOP_VCALL4(pv_mmu_ops.ptep_modify_prot_commit,
|
||||
mm, addr, ptep, pte.pte);
|
||||
}
|
||||
|
||||
static inline void set_pte(pte_t *ptep, pte_t pte)
|
||||
{
|
||||
if (sizeof(pteval_t) > sizeof(long))
|
||||
|
|
@ -1252,6 +1365,12 @@ static inline void arch_flush_lazy_mmu_mode(void)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
|
||||
unsigned long phys, pgprot_t flags)
|
||||
{
|
||||
pv_mmu_ops.set_fixmap(idx, phys, flags);
|
||||
}
|
||||
|
||||
void _paravirt_nop(void);
|
||||
#define paravirt_nop ((void *)_paravirt_nop)
|
||||
|
||||
|
|
@ -1374,54 +1493,86 @@ static inline unsigned long __raw_local_irq_save(void)
|
|||
#define PV_RESTORE_REGS popq %rdx; popq %rcx; popq %rdi; popq %rax
|
||||
#define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 8)
|
||||
#define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .quad, 8)
|
||||
#define PARA_INDIRECT(addr) *addr(%rip)
|
||||
#else
|
||||
#define PV_SAVE_REGS pushl %eax; pushl %edi; pushl %ecx; pushl %edx
|
||||
#define PV_RESTORE_REGS popl %edx; popl %ecx; popl %edi; popl %eax
|
||||
#define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 4)
|
||||
#define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .long, 4)
|
||||
#define PARA_INDIRECT(addr) *%cs:addr
|
||||
#endif
|
||||
|
||||
#define INTERRUPT_RETURN \
|
||||
PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_iret), CLBR_NONE, \
|
||||
jmp *%cs:pv_cpu_ops+PV_CPU_iret)
|
||||
jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_iret))
|
||||
|
||||
#define DISABLE_INTERRUPTS(clobbers) \
|
||||
PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_disable), clobbers, \
|
||||
PV_SAVE_REGS; \
|
||||
call *%cs:pv_irq_ops+PV_IRQ_irq_disable; \
|
||||
PV_SAVE_REGS; \
|
||||
call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_disable); \
|
||||
PV_RESTORE_REGS;) \
|
||||
|
||||
#define ENABLE_INTERRUPTS(clobbers) \
|
||||
PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_enable), clobbers, \
|
||||
PV_SAVE_REGS; \
|
||||
call *%cs:pv_irq_ops+PV_IRQ_irq_enable; \
|
||||
PV_SAVE_REGS; \
|
||||
call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_enable); \
|
||||
PV_RESTORE_REGS;)
|
||||
|
||||
#define ENABLE_INTERRUPTS_SYSCALL_RET \
|
||||
PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_irq_enable_syscall_ret),\
|
||||
#define USERGS_SYSRET32 \
|
||||
PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_usergs_sysret32), \
|
||||
CLBR_NONE, \
|
||||
jmp *%cs:pv_cpu_ops+PV_CPU_irq_enable_syscall_ret)
|
||||
|
||||
jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_usergs_sysret32))
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#define GET_CR0_INTO_EAX \
|
||||
push %ecx; push %edx; \
|
||||
call *pv_cpu_ops+PV_CPU_read_cr0; \
|
||||
#define GET_CR0_INTO_EAX \
|
||||
push %ecx; push %edx; \
|
||||
call PARA_INDIRECT(pv_cpu_ops+PV_CPU_read_cr0); \
|
||||
pop %edx; pop %ecx
|
||||
#else
|
||||
|
||||
#define ENABLE_INTERRUPTS_SYSEXIT \
|
||||
PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_irq_enable_sysexit), \
|
||||
CLBR_NONE, \
|
||||
jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_irq_enable_sysexit))
|
||||
|
||||
|
||||
#else /* !CONFIG_X86_32 */
|
||||
|
||||
/*
|
||||
* If swapgs is used while the userspace stack is still current,
|
||||
* there's no way to call a pvop. The PV replacement *must* be
|
||||
* inlined, or the swapgs instruction must be trapped and emulated.
|
||||
*/
|
||||
#define SWAPGS_UNSAFE_STACK \
|
||||
PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_swapgs), CLBR_NONE, \
|
||||
swapgs)
|
||||
|
||||
#define SWAPGS \
|
||||
PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_swapgs), CLBR_NONE, \
|
||||
PV_SAVE_REGS; \
|
||||
call *pv_cpu_ops+PV_CPU_swapgs; \
|
||||
call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs); \
|
||||
PV_RESTORE_REGS \
|
||||
)
|
||||
|
||||
#define GET_CR2_INTO_RCX \
|
||||
call *pv_mmu_ops+PV_MMU_read_cr2; \
|
||||
movq %rax, %rcx; \
|
||||
#define GET_CR2_INTO_RCX \
|
||||
call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2); \
|
||||
movq %rax, %rcx; \
|
||||
xorq %rax, %rax;
|
||||
|
||||
#endif
|
||||
#define PARAVIRT_ADJUST_EXCEPTION_FRAME \
|
||||
PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_adjust_exception_frame), \
|
||||
CLBR_NONE, \
|
||||
call PARA_INDIRECT(pv_irq_ops+PV_IRQ_adjust_exception_frame))
|
||||
|
||||
#define USERGS_SYSRET64 \
|
||||
PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_usergs_sysret64), \
|
||||
CLBR_NONE, \
|
||||
jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_usergs_sysret64))
|
||||
|
||||
#define ENABLE_INTERRUPTS_SYSEXIT32 \
|
||||
PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_irq_enable_sysexit), \
|
||||
CLBR_NONE, \
|
||||
jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_irq_enable_sysexit))
|
||||
#endif /* CONFIG_X86_32 */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* CONFIG_PARAVIRT */
|
||||
|
|
|
|||
|
|
@ -1,14 +1,13 @@
|
|||
|
||||
#ifndef _ASM_PAT_H
|
||||
#define _ASM_PAT_H 1
|
||||
#define _ASM_PAT_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_X86_PAT
|
||||
extern int pat_wc_enabled;
|
||||
extern int pat_enabled;
|
||||
extern void validate_pat_support(struct cpuinfo_x86 *c);
|
||||
#else
|
||||
static const int pat_wc_enabled = 0;
|
||||
static const int pat_enabled;
|
||||
static inline void validate_pat_support(struct cpuinfo_x86 *c) { }
|
||||
#endif
|
||||
|
||||
|
|
@ -21,4 +20,3 @@ extern int free_memtype(u64 start, u64 end);
|
|||
extern void pat_disable(char *reason);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ struct pci_sysdata {
|
|||
#endif
|
||||
};
|
||||
|
||||
extern int pci_routeirq;
|
||||
|
||||
/* scan a bus after allocating a pci_sysdata for it */
|
||||
extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops,
|
||||
int node);
|
||||
|
|
|
|||
|
|
@ -18,12 +18,14 @@ struct pci_dev;
|
|||
#define PCI_DMA_BUS_IS_PHYS (1)
|
||||
|
||||
/* pci_unmap_{page,single} is a nop so... */
|
||||
#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
|
||||
#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
|
||||
#define pci_unmap_addr(PTR, ADDR_NAME) (0)
|
||||
#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0)
|
||||
#define pci_unmap_len(PTR, LEN_NAME) (0)
|
||||
#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0)
|
||||
#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME[0];
|
||||
#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) unsigned LEN_NAME[0];
|
||||
#define pci_unmap_addr(PTR, ADDR_NAME) sizeof((PTR)->ADDR_NAME)
|
||||
#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \
|
||||
do { break; } while (pci_unmap_addr(PTR, ADDR_NAME))
|
||||
#define pci_unmap_len(PTR, LEN_NAME) sizeof((PTR)->LEN_NAME)
|
||||
#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \
|
||||
do { break; } while (pci_unmap_len(PTR, LEN_NAME))
|
||||
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@ struct x8664_pda {
|
|||
offset 40!!! */
|
||||
#endif
|
||||
char *irqstackptr;
|
||||
short nodenumber; /* number of current node (32k max) */
|
||||
short in_bootmem; /* pda lives in bootmem */
|
||||
unsigned int __softirq_pending;
|
||||
unsigned int __nmi_count; /* number of NMI on this CPUs */
|
||||
short mmu_state;
|
||||
|
|
@ -37,8 +39,7 @@ struct x8664_pda {
|
|||
unsigned irq_spurious_count;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
extern struct x8664_pda *_cpu_pda[];
|
||||
extern struct x8664_pda boot_cpu_pda[];
|
||||
extern struct x8664_pda **_cpu_pda;
|
||||
extern void pda_init(int);
|
||||
|
||||
#define cpu_pda(i) (_cpu_pda[i])
|
||||
|
|
|
|||
|
|
@ -143,4 +143,50 @@ do { \
|
|||
#define x86_or_percpu(var, val) percpu_to_op("or", per_cpu__##var, val)
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* !CONFIG_X86_64 */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
/*
|
||||
* Define the "EARLY_PER_CPU" macros. These are used for some per_cpu
|
||||
* variables that are initialized and accessed before there are per_cpu
|
||||
* areas allocated.
|
||||
*/
|
||||
|
||||
#define DEFINE_EARLY_PER_CPU(_type, _name, _initvalue) \
|
||||
DEFINE_PER_CPU(_type, _name) = _initvalue; \
|
||||
__typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \
|
||||
{ [0 ... NR_CPUS-1] = _initvalue }; \
|
||||
__typeof__(_type) *_name##_early_ptr = _name##_early_map
|
||||
|
||||
#define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \
|
||||
EXPORT_PER_CPU_SYMBOL(_name)
|
||||
|
||||
#define DECLARE_EARLY_PER_CPU(_type, _name) \
|
||||
DECLARE_PER_CPU(_type, _name); \
|
||||
extern __typeof__(_type) *_name##_early_ptr; \
|
||||
extern __typeof__(_type) _name##_early_map[]
|
||||
|
||||
#define early_per_cpu_ptr(_name) (_name##_early_ptr)
|
||||
#define early_per_cpu_map(_name, _idx) (_name##_early_map[_idx])
|
||||
#define early_per_cpu(_name, _cpu) \
|
||||
(early_per_cpu_ptr(_name) ? \
|
||||
early_per_cpu_ptr(_name)[_cpu] : \
|
||||
per_cpu(_name, _cpu))
|
||||
|
||||
#else /* !CONFIG_SMP */
|
||||
#define DEFINE_EARLY_PER_CPU(_type, _name, _initvalue) \
|
||||
DEFINE_PER_CPU(_type, _name) = _initvalue
|
||||
|
||||
#define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \
|
||||
EXPORT_PER_CPU_SYMBOL(_name)
|
||||
|
||||
#define DECLARE_EARLY_PER_CPU(_type, _name) \
|
||||
DECLARE_PER_CPU(_type, _name)
|
||||
|
||||
#define early_per_cpu(_name, _cpu) per_cpu(_name, _cpu)
|
||||
#define early_per_cpu_ptr(_name) NULL
|
||||
/* no early_per_cpu_map() */
|
||||
|
||||
#endif /* !CONFIG_SMP */
|
||||
|
||||
#endif /* _ASM_X86_PERCPU_H_ */
|
||||
|
|
|
|||
|
|
@ -5,9 +5,13 @@
|
|||
#include <linux/mm.h> /* for struct page */
|
||||
#include <linux/pagemap.h>
|
||||
|
||||
static inline int __paravirt_pgd_alloc(struct mm_struct *mm) { return 0; }
|
||||
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
#include <asm/paravirt.h>
|
||||
#else
|
||||
#define paravirt_pgd_alloc(mm) __paravirt_pgd_alloc(mm)
|
||||
static inline void paravirt_pgd_free(struct mm_struct *mm, pgd_t *pgd) {}
|
||||
static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned long pfn) {}
|
||||
static inline void paravirt_alloc_pmd(struct mm_struct *mm, unsigned long pfn) {}
|
||||
static inline void paravirt_alloc_pmd_clone(unsigned long pfn, unsigned long clonepfn,
|
||||
|
|
|
|||
|
|
@ -20,30 +20,25 @@
|
|||
#define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */
|
||||
#define _PAGE_BIT_NX 63 /* No execute: only valid after cpuid check */
|
||||
|
||||
/*
|
||||
* Note: we use _AC(1, L) instead of _AC(1, UL) so that we get a
|
||||
* sign-extended value on 32-bit with all 1's in the upper word,
|
||||
* which preserves the upper pte values on 64-bit ptes:
|
||||
*/
|
||||
#define _PAGE_PRESENT (_AC(1, L)<<_PAGE_BIT_PRESENT)
|
||||
#define _PAGE_RW (_AC(1, L)<<_PAGE_BIT_RW)
|
||||
#define _PAGE_USER (_AC(1, L)<<_PAGE_BIT_USER)
|
||||
#define _PAGE_PWT (_AC(1, L)<<_PAGE_BIT_PWT)
|
||||
#define _PAGE_PCD (_AC(1, L)<<_PAGE_BIT_PCD)
|
||||
#define _PAGE_ACCESSED (_AC(1, L)<<_PAGE_BIT_ACCESSED)
|
||||
#define _PAGE_DIRTY (_AC(1, L)<<_PAGE_BIT_DIRTY)
|
||||
#define _PAGE_PSE (_AC(1, L)<<_PAGE_BIT_PSE) /* 2MB page */
|
||||
#define _PAGE_GLOBAL (_AC(1, L)<<_PAGE_BIT_GLOBAL) /* Global TLB entry */
|
||||
#define _PAGE_UNUSED1 (_AC(1, L)<<_PAGE_BIT_UNUSED1)
|
||||
#define _PAGE_UNUSED2 (_AC(1, L)<<_PAGE_BIT_UNUSED2)
|
||||
#define _PAGE_UNUSED3 (_AC(1, L)<<_PAGE_BIT_UNUSED3)
|
||||
#define _PAGE_PAT (_AC(1, L)<<_PAGE_BIT_PAT)
|
||||
#define _PAGE_PAT_LARGE (_AC(1, L)<<_PAGE_BIT_PAT_LARGE)
|
||||
#define _PAGE_PRESENT (_AT(pteval_t, 1) << _PAGE_BIT_PRESENT)
|
||||
#define _PAGE_RW (_AT(pteval_t, 1) << _PAGE_BIT_RW)
|
||||
#define _PAGE_USER (_AT(pteval_t, 1) << _PAGE_BIT_USER)
|
||||
#define _PAGE_PWT (_AT(pteval_t, 1) << _PAGE_BIT_PWT)
|
||||
#define _PAGE_PCD (_AT(pteval_t, 1) << _PAGE_BIT_PCD)
|
||||
#define _PAGE_ACCESSED (_AT(pteval_t, 1) << _PAGE_BIT_ACCESSED)
|
||||
#define _PAGE_DIRTY (_AT(pteval_t, 1) << _PAGE_BIT_DIRTY)
|
||||
#define _PAGE_PSE (_AT(pteval_t, 1) << _PAGE_BIT_PSE)
|
||||
#define _PAGE_GLOBAL (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL)
|
||||
#define _PAGE_UNUSED1 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED1)
|
||||
#define _PAGE_UNUSED2 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED2)
|
||||
#define _PAGE_UNUSED3 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED3)
|
||||
#define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT)
|
||||
#define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE)
|
||||
|
||||
#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
|
||||
#define _PAGE_NX (_AC(1, ULL) << _PAGE_BIT_NX)
|
||||
#define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX)
|
||||
#else
|
||||
#define _PAGE_NX 0
|
||||
#define _PAGE_NX (_AT(pteval_t, 0))
|
||||
#endif
|
||||
|
||||
/* If _PAGE_PRESENT is clear, we use these: */
|
||||
|
|
@ -83,19 +78,9 @@
|
|||
#define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \
|
||||
_PAGE_ACCESSED)
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
#define _PAGE_KERNEL_EXEC \
|
||||
(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
|
||||
#define _PAGE_KERNEL (_PAGE_KERNEL_EXEC | _PAGE_NX)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern pteval_t __PAGE_KERNEL, __PAGE_KERNEL_EXEC;
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#else
|
||||
#define __PAGE_KERNEL_EXEC \
|
||||
(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
|
||||
(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL)
|
||||
#define __PAGE_KERNEL (__PAGE_KERNEL_EXEC | _PAGE_NX)
|
||||
#endif
|
||||
|
||||
#define __PAGE_KERNEL_RO (__PAGE_KERNEL & ~_PAGE_RW)
|
||||
#define __PAGE_KERNEL_RX (__PAGE_KERNEL_EXEC & ~_PAGE_RW)
|
||||
|
|
@ -106,26 +91,22 @@ extern pteval_t __PAGE_KERNEL, __PAGE_KERNEL_EXEC;
|
|||
#define __PAGE_KERNEL_VSYSCALL (__PAGE_KERNEL_RX | _PAGE_USER)
|
||||
#define __PAGE_KERNEL_VSYSCALL_NOCACHE (__PAGE_KERNEL_VSYSCALL | _PAGE_PCD | _PAGE_PWT)
|
||||
#define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE)
|
||||
#define __PAGE_KERNEL_LARGE_NOCACHE (__PAGE_KERNEL | _PAGE_CACHE_UC | _PAGE_PSE)
|
||||
#define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE)
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# define MAKE_GLOBAL(x) __pgprot((x))
|
||||
#else
|
||||
# define MAKE_GLOBAL(x) __pgprot((x) | _PAGE_GLOBAL)
|
||||
#endif
|
||||
|
||||
#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL)
|
||||
#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO)
|
||||
#define PAGE_KERNEL_EXEC MAKE_GLOBAL(__PAGE_KERNEL_EXEC)
|
||||
#define PAGE_KERNEL_RX MAKE_GLOBAL(__PAGE_KERNEL_RX)
|
||||
#define PAGE_KERNEL_WC MAKE_GLOBAL(__PAGE_KERNEL_WC)
|
||||
#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)
|
||||
#define PAGE_KERNEL_UC_MINUS MAKE_GLOBAL(__PAGE_KERNEL_UC_MINUS)
|
||||
#define PAGE_KERNEL_EXEC_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_EXEC_NOCACHE)
|
||||
#define PAGE_KERNEL_LARGE MAKE_GLOBAL(__PAGE_KERNEL_LARGE)
|
||||
#define PAGE_KERNEL_LARGE_EXEC MAKE_GLOBAL(__PAGE_KERNEL_LARGE_EXEC)
|
||||
#define PAGE_KERNEL_VSYSCALL MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL)
|
||||
#define PAGE_KERNEL_VSYSCALL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL_NOCACHE)
|
||||
#define PAGE_KERNEL __pgprot(__PAGE_KERNEL)
|
||||
#define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO)
|
||||
#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC)
|
||||
#define PAGE_KERNEL_RX __pgprot(__PAGE_KERNEL_RX)
|
||||
#define PAGE_KERNEL_WC __pgprot(__PAGE_KERNEL_WC)
|
||||
#define PAGE_KERNEL_NOCACHE __pgprot(__PAGE_KERNEL_NOCACHE)
|
||||
#define PAGE_KERNEL_UC_MINUS __pgprot(__PAGE_KERNEL_UC_MINUS)
|
||||
#define PAGE_KERNEL_EXEC_NOCACHE __pgprot(__PAGE_KERNEL_EXEC_NOCACHE)
|
||||
#define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE)
|
||||
#define PAGE_KERNEL_LARGE_NOCACHE __pgprot(__PAGE_KERNEL_LARGE_NOCACHE)
|
||||
#define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC)
|
||||
#define PAGE_KERNEL_VSYSCALL __pgprot(__PAGE_KERNEL_VSYSCALL)
|
||||
#define PAGE_KERNEL_VSYSCALL_NOCACHE __pgprot(__PAGE_KERNEL_VSYSCALL_NOCACHE)
|
||||
|
||||
/* xwr */
|
||||
#define __P000 PAGE_NONE
|
||||
|
|
@ -164,37 +145,37 @@ extern struct list_head pgd_list;
|
|||
*/
|
||||
static inline int pte_dirty(pte_t pte)
|
||||
{
|
||||
return pte_val(pte) & _PAGE_DIRTY;
|
||||
return pte_flags(pte) & _PAGE_DIRTY;
|
||||
}
|
||||
|
||||
static inline int pte_young(pte_t pte)
|
||||
{
|
||||
return pte_val(pte) & _PAGE_ACCESSED;
|
||||
return pte_flags(pte) & _PAGE_ACCESSED;
|
||||
}
|
||||
|
||||
static inline int pte_write(pte_t pte)
|
||||
{
|
||||
return pte_val(pte) & _PAGE_RW;
|
||||
return pte_flags(pte) & _PAGE_RW;
|
||||
}
|
||||
|
||||
static inline int pte_file(pte_t pte)
|
||||
{
|
||||
return pte_val(pte) & _PAGE_FILE;
|
||||
return pte_flags(pte) & _PAGE_FILE;
|
||||
}
|
||||
|
||||
static inline int pte_huge(pte_t pte)
|
||||
{
|
||||
return pte_val(pte) & _PAGE_PSE;
|
||||
return pte_flags(pte) & _PAGE_PSE;
|
||||
}
|
||||
|
||||
static inline int pte_global(pte_t pte)
|
||||
{
|
||||
return pte_val(pte) & _PAGE_GLOBAL;
|
||||
return pte_flags(pte) & _PAGE_GLOBAL;
|
||||
}
|
||||
|
||||
static inline int pte_exec(pte_t pte)
|
||||
{
|
||||
return !(pte_val(pte) & _PAGE_NX);
|
||||
return !(pte_flags(pte) & _PAGE_NX);
|
||||
}
|
||||
|
||||
static inline int pte_special(pte_t pte)
|
||||
|
|
@ -210,22 +191,22 @@ static inline int pmd_large(pmd_t pte)
|
|||
|
||||
static inline pte_t pte_mkclean(pte_t pte)
|
||||
{
|
||||
return __pte(pte_val(pte) & ~(pteval_t)_PAGE_DIRTY);
|
||||
return __pte(pte_val(pte) & ~_PAGE_DIRTY);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkold(pte_t pte)
|
||||
{
|
||||
return __pte(pte_val(pte) & ~(pteval_t)_PAGE_ACCESSED);
|
||||
return __pte(pte_val(pte) & ~_PAGE_ACCESSED);
|
||||
}
|
||||
|
||||
static inline pte_t pte_wrprotect(pte_t pte)
|
||||
{
|
||||
return __pte(pte_val(pte) & ~(pteval_t)_PAGE_RW);
|
||||
return __pte(pte_val(pte) & ~_PAGE_RW);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkexec(pte_t pte)
|
||||
{
|
||||
return __pte(pte_val(pte) & ~(pteval_t)_PAGE_NX);
|
||||
return __pte(pte_val(pte) & ~_PAGE_NX);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkdirty(pte_t pte)
|
||||
|
|
@ -250,7 +231,7 @@ static inline pte_t pte_mkhuge(pte_t pte)
|
|||
|
||||
static inline pte_t pte_clrhuge(pte_t pte)
|
||||
{
|
||||
return __pte(pte_val(pte) & ~(pteval_t)_PAGE_PSE);
|
||||
return __pte(pte_val(pte) & ~_PAGE_PSE);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkglobal(pte_t pte)
|
||||
|
|
@ -260,7 +241,7 @@ static inline pte_t pte_mkglobal(pte_t pte)
|
|||
|
||||
static inline pte_t pte_clrglobal(pte_t pte)
|
||||
{
|
||||
return __pte(pte_val(pte) & ~(pteval_t)_PAGE_GLOBAL);
|
||||
return __pte(pte_val(pte) & ~_PAGE_GLOBAL);
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkspecial(pte_t pte)
|
||||
|
|
@ -305,7 +286,7 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
|
|||
return __pgprot(preservebits | addbits);
|
||||
}
|
||||
|
||||
#define pte_pgprot(x) __pgprot(pte_val(x) & ~PTE_MASK)
|
||||
#define pte_pgprot(x) __pgprot(pte_flags(x) & ~PTE_MASK)
|
||||
|
||||
#define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)
|
||||
|
||||
|
|
@ -318,6 +299,9 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
|
|||
unsigned long size, pgprot_t *vma_prot);
|
||||
#endif
|
||||
|
||||
/* Install a pte for a particular vaddr in kernel space. */
|
||||
void set_pte_vaddr(unsigned long vaddr, pte_t pte);
|
||||
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
#include <asm/paravirt.h>
|
||||
#else /* !CONFIG_PARAVIRT */
|
||||
|
|
@ -359,6 +343,26 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
|
|||
# include "pgtable_64.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
|
||||
*
|
||||
* this macro returns the index of the entry in the pgd page which would
|
||||
* control the given virtual address
|
||||
*/
|
||||
#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
|
||||
|
||||
/*
|
||||
* pgd_offset() returns a (pgd_t *)
|
||||
* pgd_index() is used get the offset into the pgd page's array of pgd_t's;
|
||||
*/
|
||||
#define pgd_offset(mm, address) ((mm)->pgd + pgd_index((address)))
|
||||
/*
|
||||
* a shortcut which implies the use of the kernel's pgd, instead
|
||||
* of a process's
|
||||
*/
|
||||
#define pgd_offset_k(address) pgd_offset(&init_mm, (address))
|
||||
|
||||
|
||||
#define KERNEL_PGD_BOUNDARY pgd_index(PAGE_OFFSET)
|
||||
#define KERNEL_PGD_PTRS (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY)
|
||||
|
||||
|
|
@ -369,8 +373,15 @@ enum {
|
|||
PG_LEVEL_4K,
|
||||
PG_LEVEL_2M,
|
||||
PG_LEVEL_1G,
|
||||
PG_LEVEL_NUM
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
extern void update_page_count(int level, unsigned long pages);
|
||||
#else
|
||||
static inline void update_page_count(int level, unsigned long pages) { }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Helper function that returns the kernel pagetable entry controlling
|
||||
* the virtual address 'address'. NULL means no pagetable entry present.
|
||||
|
|
@ -420,6 +431,8 @@ static inline void native_set_pte_at(struct mm_struct *mm, unsigned long addr,
|
|||
* race with other CPU's that might be updating the dirty
|
||||
* bit at the same time.
|
||||
*/
|
||||
struct vm_area_struct;
|
||||
|
||||
#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
|
||||
extern int ptep_set_access_flags(struct vm_area_struct *vma,
|
||||
unsigned long address, pte_t *ptep,
|
||||
|
|
|
|||
|
|
@ -113,26 +113,6 @@ extern unsigned long pg0[];
|
|||
*/
|
||||
#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
|
||||
|
||||
/*
|
||||
* the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
|
||||
*
|
||||
* this macro returns the index of the entry in the pgd page which would
|
||||
* control the given virtual address
|
||||
*/
|
||||
#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
|
||||
#define pgd_index_k(addr) pgd_index((addr))
|
||||
|
||||
/*
|
||||
* pgd_offset() returns a (pgd_t *)
|
||||
* pgd_index() is used get the offset into the pgd page's array of pgd_t's;
|
||||
*/
|
||||
#define pgd_offset(mm, address) ((mm)->pgd + pgd_index((address)))
|
||||
|
||||
/*
|
||||
* a shortcut which implies the use of the kernel's pgd, instead
|
||||
* of a process's
|
||||
*/
|
||||
#define pgd_offset_k(address) pgd_offset(&init_mm, (address))
|
||||
|
||||
static inline int pud_large(pud_t pud) { return 0; }
|
||||
|
||||
|
|
|
|||
|
|
@ -70,6 +70,9 @@ extern void paging_init(void);
|
|||
|
||||
struct mm_struct;
|
||||
|
||||
void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte);
|
||||
|
||||
|
||||
static inline void native_pte_clear(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep)
|
||||
{
|
||||
|
|
@ -190,12 +193,9 @@ static inline int pmd_bad(pmd_t pmd)
|
|||
#define pgd_page_vaddr(pgd) \
|
||||
((unsigned long)__va((unsigned long)pgd_val((pgd)) & PTE_MASK))
|
||||
#define pgd_page(pgd) (pfn_to_page(pgd_val((pgd)) >> PAGE_SHIFT))
|
||||
#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
|
||||
#define pgd_offset(mm, address) ((mm)->pgd + pgd_index((address)))
|
||||
#define pgd_offset_k(address) (init_level4_pgt + pgd_index((address)))
|
||||
#define pgd_present(pgd) (pgd_val(pgd) & _PAGE_PRESENT)
|
||||
static inline int pgd_large(pgd_t pgd) { return 0; }
|
||||
#define mk_kernel_pgd(address) ((pgd_t){ (address) | _KERNPG_TABLE })
|
||||
#define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE)
|
||||
|
||||
/* PUD - Level3 access */
|
||||
/* to find an entry in a page-table-directory. */
|
||||
|
|
|
|||
|
|
@ -88,4 +88,10 @@
|
|||
#define CX86_ARR_BASE 0xc4
|
||||
#define CX86_RCR_BASE 0xdc
|
||||
|
||||
#ifdef CONFIG_VM86
|
||||
#define X86_VM_MASK X86_EFLAGS_VM
|
||||
#else
|
||||
#define X86_VM_MASK 0 /* No VM86 support */
|
||||
#endif
|
||||
|
||||
#endif /* __ASM_I386_PROCESSOR_FLAGS_H */
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ static inline int hlt_works(int cpu)
|
|||
|
||||
extern void cpu_detect(struct cpuinfo_x86 *c);
|
||||
|
||||
extern void identify_cpu(struct cpuinfo_x86 *);
|
||||
extern void early_cpu_init(void);
|
||||
extern void identify_boot_cpu(void);
|
||||
extern void identify_secondary_cpu(struct cpuinfo_x86 *);
|
||||
extern void print_cpu_info(struct cpuinfo_x86 *);
|
||||
|
|
@ -262,16 +262,12 @@ struct tss_struct {
|
|||
unsigned long io_bitmap_max;
|
||||
struct thread_struct *io_bitmap_owner;
|
||||
|
||||
/*
|
||||
* Pad the TSS to be cacheline-aligned (size is 0x100):
|
||||
*/
|
||||
unsigned long __cacheline_filler[35];
|
||||
/*
|
||||
* .. and then another 0x100 bytes for the emergency kernel stack:
|
||||
*/
|
||||
unsigned long stack[64];
|
||||
|
||||
} __attribute__((packed));
|
||||
} ____cacheline_aligned;
|
||||
|
||||
DECLARE_PER_CPU(struct tss_struct, init_tss);
|
||||
|
||||
|
|
@ -535,7 +531,6 @@ static inline void load_sp0(struct tss_struct *tss,
|
|||
}
|
||||
|
||||
#define set_iopl_mask native_set_iopl_mask
|
||||
#define SWAPGS swapgs
|
||||
#endif /* CONFIG_PARAVIRT */
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -14,8 +14,6 @@ extern void ia32_syscall(void);
|
|||
extern void ia32_cstar_target(void);
|
||||
extern void ia32_sysenter_target(void);
|
||||
|
||||
extern void reserve_bootmem_generic(unsigned long phys, unsigned len);
|
||||
|
||||
extern void syscall32_cpu_init(void);
|
||||
|
||||
extern void check_efer(void);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,12 @@
|
|||
|
||||
#include <linux/compiler.h> /* For __user */
|
||||
#include <asm/ptrace-abi.h>
|
||||
#include <asm/processor-flags.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <asm/ds.h> /* the DS BTS struct is used for ptrace too */
|
||||
#include <asm/segment.h>
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
|
|
@ -55,9 +60,6 @@ struct pt_regs {
|
|||
unsigned long ss;
|
||||
};
|
||||
|
||||
#include <asm/vm86.h>
|
||||
#include <asm/segment.h>
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#else /* __i386__ */
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue