Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86: add linux kernel support for YMM state x86: fix wrong section of pat_disable & make it static x86: Fix section mismatches in mpparse x86: fix set_fixmap to use phys_addr_t x86: Document get_user_pages_fast() x86, intr-remap: fix eoi for interrupt remapping without x2apic
This commit is contained in:
commit
b8256b45d1
|
@ -193,8 +193,10 @@ extern void __iomem *ioremap_wc(resource_size_t offset, unsigned long size);
|
|||
*/
|
||||
extern void early_ioremap_init(void);
|
||||
extern void early_ioremap_reset(void);
|
||||
extern void __iomem *early_ioremap(unsigned long offset, unsigned long size);
|
||||
extern void __iomem *early_memremap(unsigned long offset, unsigned long size);
|
||||
extern void __iomem *early_ioremap(resource_size_t phys_addr,
|
||||
unsigned long size);
|
||||
extern void __iomem *early_memremap(resource_size_t phys_addr,
|
||||
unsigned long size);
|
||||
extern void early_iounmap(void __iomem *addr, unsigned long size);
|
||||
|
||||
#define IO_SPACE_LIMIT 0xffff
|
||||
|
|
|
@ -352,6 +352,11 @@ struct i387_soft_struct {
|
|||
u32 entry_eip;
|
||||
};
|
||||
|
||||
struct ymmh_struct {
|
||||
/* 16 * 16 bytes for each YMMH-reg = 256 bytes */
|
||||
u32 ymmh_space[64];
|
||||
};
|
||||
|
||||
struct xsave_hdr_struct {
|
||||
u64 xstate_bv;
|
||||
u64 reserved1[2];
|
||||
|
@ -361,6 +366,7 @@ struct xsave_hdr_struct {
|
|||
struct xsave_struct {
|
||||
struct i387_fxsave_struct i387;
|
||||
struct xsave_hdr_struct xsave_hdr;
|
||||
struct ymmh_struct ymmh;
|
||||
/* new processor state extensions will go here */
|
||||
} __attribute__ ((packed, aligned (64)));
|
||||
|
||||
|
|
|
@ -269,6 +269,11 @@ struct _xsave_hdr {
|
|||
__u64 reserved2[5];
|
||||
};
|
||||
|
||||
struct _ymmh_state {
|
||||
/* 16 * 16 bytes for each YMMH-reg */
|
||||
__u32 ymmh_space[64];
|
||||
};
|
||||
|
||||
/*
|
||||
* Extended state pointed by the fpstate pointer in the sigcontext.
|
||||
* In addition to the fpstate, information encoded in the xstate_hdr
|
||||
|
@ -278,6 +283,7 @@ struct _xsave_hdr {
|
|||
struct _xstate {
|
||||
struct _fpstate fpstate;
|
||||
struct _xsave_hdr xstate_hdr;
|
||||
struct _ymmh_state ymmh;
|
||||
/* new processor state extensions go here */
|
||||
};
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#define XSTATE_FP 0x1
|
||||
#define XSTATE_SSE 0x2
|
||||
#define XSTATE_YMM 0x4
|
||||
|
||||
#define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE)
|
||||
|
||||
|
@ -15,7 +16,7 @@
|
|||
/*
|
||||
* These are the features that the OS can handle currently.
|
||||
*/
|
||||
#define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE)
|
||||
#define XCNTXT_MASK (XSTATE_FP | XSTATE_SSE | XSTATE_YMM)
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define REX_PREFIX "0x48, "
|
||||
|
|
|
@ -2524,7 +2524,6 @@ static void irq_complete_move(struct irq_desc **descp)
|
|||
static inline void irq_complete_move(struct irq_desc **descp) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_X2APIC
|
||||
static void __eoi_ioapic_irq(unsigned int irq, struct irq_cfg *cfg)
|
||||
{
|
||||
int apic, pin;
|
||||
|
@ -2558,6 +2557,7 @@ eoi_ioapic_irq(struct irq_desc *desc)
|
|||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_X2APIC
|
||||
static void ack_x2apic_level(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
|
@ -2634,6 +2634,9 @@ static void ack_apic_level(unsigned int irq)
|
|||
*/
|
||||
ack_APIC_irq();
|
||||
|
||||
if (irq_remapped(irq))
|
||||
eoi_ioapic_irq(desc);
|
||||
|
||||
/* Now we can move and renable the irq */
|
||||
if (unlikely(do_unmask_irq)) {
|
||||
/* Only migrate the irq if the ack has been received.
|
||||
|
|
|
@ -679,7 +679,7 @@ void __init get_smp_config(void)
|
|||
__get_smp_config(0);
|
||||
}
|
||||
|
||||
static void smp_reserve_bootmem(struct mpf_intel *mpf)
|
||||
static void __init smp_reserve_bootmem(struct mpf_intel *mpf)
|
||||
{
|
||||
unsigned long size = get_mpc_size(mpf->physptr);
|
||||
#ifdef CONFIG_X86_32
|
||||
|
@ -838,7 +838,7 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m)
|
|||
|
||||
static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM];
|
||||
|
||||
static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
|
||||
static void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -866,7 +866,8 @@ static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare)
|
|||
}
|
||||
}
|
||||
#else /* CONFIG_X86_IO_APIC */
|
||||
static inline void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {}
|
||||
static
|
||||
inline void __init check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) {}
|
||||
#endif /* CONFIG_X86_IO_APIC */
|
||||
|
||||
static int check_slot(unsigned long mpc_new_phys, unsigned long mpc_new_length,
|
||||
|
|
|
@ -324,7 +324,7 @@ void __ref xsave_cntxt_init(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* for now OS knows only about FP/SSE
|
||||
* Support only the state known to OS.
|
||||
*/
|
||||
pcntxt_mask = pcntxt_mask & XCNTXT_MASK;
|
||||
xsave_init();
|
||||
|
|
|
@ -219,6 +219,22 @@ static int gup_pud_range(pgd_t pgd, unsigned long addr, unsigned long end,
|
|||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_user_pages_fast() - pin user pages in memory
|
||||
* @start: starting user address
|
||||
* @nr_pages: number of pages from start to pin
|
||||
* @write: whether pages will be written to
|
||||
* @pages: array that receives pointers to the pages pinned.
|
||||
* Should be at least nr_pages long.
|
||||
*
|
||||
* Attempt to pin user pages in memory without taking mm->mmap_sem.
|
||||
* If not successful, it will fall back to taking the lock and
|
||||
* calling get_user_pages().
|
||||
*
|
||||
* Returns number of pages pinned. This may be fewer than the number
|
||||
* requested. If nr_pages is 0 or negative, returns 0. If no pages
|
||||
* were pinned, returns -errno.
|
||||
*/
|
||||
int get_user_pages_fast(unsigned long start, int nr_pages, int write,
|
||||
struct page **pages)
|
||||
{
|
||||
|
|
|
@ -547,7 +547,7 @@ void __init early_ioremap_reset(void)
|
|||
}
|
||||
|
||||
static void __init __early_set_fixmap(enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t flags)
|
||||
phys_addr_t phys, pgprot_t flags)
|
||||
{
|
||||
unsigned long addr = __fix_to_virt(idx);
|
||||
pte_t *pte;
|
||||
|
@ -566,7 +566,7 @@ static void __init __early_set_fixmap(enum fixed_addresses idx,
|
|||
}
|
||||
|
||||
static inline void __init early_set_fixmap(enum fixed_addresses idx,
|
||||
unsigned long phys, pgprot_t prot)
|
||||
phys_addr_t phys, pgprot_t prot)
|
||||
{
|
||||
if (after_paging_init)
|
||||
__set_fixmap(idx, phys, prot);
|
||||
|
@ -607,9 +607,10 @@ static int __init check_early_ioremap_leak(void)
|
|||
late_initcall(check_early_ioremap_leak);
|
||||
|
||||
static void __init __iomem *
|
||||
__early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot)
|
||||
__early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
|
||||
{
|
||||
unsigned long offset, last_addr;
|
||||
unsigned long offset;
|
||||
resource_size_t last_addr;
|
||||
unsigned int nrpages;
|
||||
enum fixed_addresses idx0, idx;
|
||||
int i, slot;
|
||||
|
@ -625,15 +626,15 @@ __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot)
|
|||
}
|
||||
|
||||
if (slot < 0) {
|
||||
printk(KERN_INFO "early_iomap(%08lx, %08lx) not found slot\n",
|
||||
phys_addr, size);
|
||||
printk(KERN_INFO "early_iomap(%08llx, %08lx) not found slot\n",
|
||||
(u64)phys_addr, size);
|
||||
WARN_ON(1);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (early_ioremap_debug) {
|
||||
printk(KERN_INFO "early_ioremap(%08lx, %08lx) [%d] => ",
|
||||
phys_addr, size, slot);
|
||||
printk(KERN_INFO "early_ioremap(%08llx, %08lx) [%d] => ",
|
||||
(u64)phys_addr, size, slot);
|
||||
dump_stack();
|
||||
}
|
||||
|
||||
|
@ -680,13 +681,15 @@ __early_ioremap(unsigned long phys_addr, unsigned long size, pgprot_t prot)
|
|||
}
|
||||
|
||||
/* Remap an IO device */
|
||||
void __init __iomem *early_ioremap(unsigned long phys_addr, unsigned long size)
|
||||
void __init __iomem *
|
||||
early_ioremap(resource_size_t phys_addr, unsigned long size)
|
||||
{
|
||||
return __early_ioremap(phys_addr, size, PAGE_KERNEL_IO);
|
||||
}
|
||||
|
||||
/* Remap memory */
|
||||
void __init __iomem *early_memremap(unsigned long phys_addr, unsigned long size)
|
||||
void __init __iomem *
|
||||
early_memremap(resource_size_t phys_addr, unsigned long size)
|
||||
{
|
||||
return __early_ioremap(phys_addr, size, PAGE_KERNEL);
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#ifdef CONFIG_X86_PAT
|
||||
int __read_mostly pat_enabled = 1;
|
||||
|
||||
void __cpuinit pat_disable(const char *reason)
|
||||
static inline void pat_disable(const char *reason)
|
||||
{
|
||||
pat_enabled = 0;
|
||||
printk(KERN_INFO "%s\n", reason);
|
||||
|
|
Loading…
Reference in New Issue