diff --git a/[refs] b/[refs] index 640e4402cbed..137b6c7a3d75 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c58603e81b3ed4f1c7352e091fe43fd0bd8d06cc +refs/heads/master: b40c757964bbad76ecfa88eda9eb0b4d76dd8b40 diff --git a/trunk/arch/x86/kernel/kprobes.c b/trunk/arch/x86/kernel/kprobes.c index 55b94614e348..4558dd3918cf 100644 --- a/trunk/arch/x86/kernel/kprobes.c +++ b/trunk/arch/x86/kernel/kprobes.c @@ -193,7 +193,7 @@ static int __kprobes can_boost(kprobe_opcode_t *opcodes) kprobe_opcode_t opcode; kprobe_opcode_t *orig_opcodes = opcodes; - if (search_exception_tables((unsigned long)opcodes)) + if (search_exception_tables(opcodes)) return 0; /* Page fault may occur on this address. */ retry: diff --git a/trunk/arch/x86/kernel/mpparse.c b/trunk/arch/x86/kernel/mpparse.c index 290cb57f4697..47673e02ae58 100644 --- a/trunk/arch/x86/kernel/mpparse.c +++ b/trunk/arch/x86/kernel/mpparse.c @@ -109,6 +109,9 @@ static void __init MP_bus_info(struct mpc_bus *m) } else printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str); } +#endif + +#ifdef CONFIG_X86_IO_APIC static int bad_ioapic(unsigned long address) { @@ -221,12 +224,8 @@ static void __init MP_intsrc_info(struct mpc_intsrc *m) if (++mp_irq_entries == MAX_IRQ_SOURCES) panic("Max # of irq sources exceeded!!\n"); } -#else /* CONFIG_X86_IO_APIC */ -static inline void __init MP_bus_info(struct mpc_bus *m) {} -static inline void __init MP_ioapic_info(struct mpc_ioapic *m) {} -static inline void __init MP_intsrc_info(struct mpc_intsrc *m) {} -#endif /* CONFIG_X86_IO_APIC */ +#endif static void __init MP_lintsrc_info(struct mpc_lintsrc *m) { @@ -276,12 +275,6 @@ static int __init smp_check_mpc(struct mpc_table *mpc, char *oem, char *str) return 1; } -static void skip_entry(unsigned char **ptr, int *count, int size) -{ - *ptr += size; - *count += size; -} - static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) { char str[16]; @@ -317,27 +310,55 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) while (count < mpc->length) { switch (*mpt) { case MP_PROCESSOR: - /* ACPI may have already provided this data */ - if (!acpi_lapic) - MP_processor_info((struct mpc_cpu *)mpt); - skip_entry(&mpt, &count, sizeof(struct mpc_cpu)); - break; + { + struct mpc_cpu *m = (struct mpc_cpu *)mpt; + /* ACPI may have already provided this data */ + if (!acpi_lapic) + MP_processor_info(m); + mpt += sizeof(*m); + count += sizeof(*m); + break; + } case MP_BUS: - MP_bus_info((struct mpc_bus *)mpt); - skip_entry(&mpt, &count, sizeof(struct mpc_bus)); - break; + { + struct mpc_bus *m = (struct mpc_bus *)mpt; +#ifdef CONFIG_X86_IO_APIC + MP_bus_info(m); +#endif + mpt += sizeof(*m); + count += sizeof(*m); + break; + } case MP_IOAPIC: - MP_ioapic_info((struct mpc_ioapic *)mpt); - skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); - break; + { +#ifdef CONFIG_X86_IO_APIC + struct mpc_ioapic *m = (struct mpc_ioapic *)mpt; + MP_ioapic_info(m); +#endif + mpt += sizeof(struct mpc_ioapic); + count += sizeof(struct mpc_ioapic); + break; + } case MP_INTSRC: - MP_intsrc_info((struct mpc_intsrc *)mpt); - skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); - break; + { +#ifdef CONFIG_X86_IO_APIC + struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; + + MP_intsrc_info(m); +#endif + mpt += sizeof(struct mpc_intsrc); + count += sizeof(struct mpc_intsrc); + break; + } case MP_LINTSRC: - MP_lintsrc_info((struct mpc_lintsrc *)mpt); - skip_entry(&mpt, &count, sizeof(struct mpc_lintsrc)); - break; + { + struct mpc_lintsrc *m = + (struct mpc_lintsrc *)mpt; + MP_lintsrc_info(m); + mpt += sizeof(*m); + count += sizeof(*m); + break; + } default: /* wrong mptable */ printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); @@ -668,31 +689,6 @@ void __init get_smp_config(void) __get_smp_config(0); } -static void smp_reserve_bootmem(struct mpf_intel *mpf) -{ - unsigned long size = get_mpc_size(mpf->physptr); -#ifdef CONFIG_X86_32 - /* - * We cannot access to MPC table to compute table size yet, - * as only few megabytes from the bottom is mapped now. - * PC-9800's MPC table places on the very last of physical - * memory; so that simply reserving PAGE_SIZE from mpf->physptr - * yields BUG() in reserve_bootmem. - * also need to make sure physptr is below than max_low_pfn - * we don't need reserve the area above max_low_pfn - */ - unsigned long end = max_low_pfn * PAGE_SIZE; - - if (mpf->physptr < end) { - if (mpf->physptr + size > end) - size = end - mpf->physptr; - reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT); - } -#else - reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT); -#endif -} - static int __init smp_scan_config(unsigned long base, unsigned long length, unsigned reserve) { @@ -721,9 +717,35 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, if (!reserve) return 1; reserve_bootmem_generic(virt_to_phys(mpf), sizeof(*mpf), + BOOTMEM_DEFAULT); + if (mpf->physptr) { + unsigned long size = get_mpc_size(mpf->physptr); +#ifdef CONFIG_X86_32 + /* + * We cannot access to MPC table to compute + * table size yet, as only few megabytes from + * the bottom is mapped now. + * PC-9800's MPC table places on the very last + * of physical memory; so that simply reserving + * PAGE_SIZE from mpf->physptr yields BUG() + * in reserve_bootmem. + * also need to make sure physptr is below than + * max_low_pfn + * we don't need reserve the area above max_low_pfn + */ + unsigned long end = max_low_pfn * PAGE_SIZE; + + if (mpf->physptr < end) { + if (mpf->physptr + size > end) + size = end - mpf->physptr; + reserve_bootmem_generic(mpf->physptr, size, + BOOTMEM_DEFAULT); + } +#else + reserve_bootmem_generic(mpf->physptr, size, BOOTMEM_DEFAULT); - if (mpf->physptr) - smp_reserve_bootmem(mpf); +#endif + } return 1; } @@ -826,57 +848,7 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m) #define SPARE_SLOT_NUM 20 static struct mpc_intsrc __initdata *m_spare[SPARE_SLOT_NUM]; - -static void check_irq_src(struct mpc_intsrc *m, int *nr_m_spare) -{ - int i; - - apic_printk(APIC_VERBOSE, "OLD "); - print_MP_intsrc_info(m); - - i = get_MP_intsrc_index(m); - if (i > 0) { - assign_to_mpc_intsrc(&mp_irqs[i], m); - apic_printk(APIC_VERBOSE, "NEW "); - print_mp_irq_info(&mp_irqs[i]); - return; - } - if (!i) { - /* legacy, do nothing */ - return; - } - if (*nr_m_spare < SPARE_SLOT_NUM) { - /* - * not found (-1), or duplicated (-2) are invalid entries, - * we need to use the slot later - */ - m_spare[*nr_m_spare] = m; - *nr_m_spare += 1; - } -} -#else /* CONFIG_X86_IO_APIC */ -static inline void 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, - int count) -{ - if (!mpc_new_phys) { - pr_info("No spare slots, try to append...take your risk, " - "new mpc_length %x\n", count); - } else { - if (count <= mpc_new_length) - pr_info("No spare slots, try to append..., " - "new mpc_length %x\n", count); - else { - pr_err("mpc_new_length %lx is too small\n", - mpc_new_length); - return -1; - } - } - - return 0; -} +#endif static int __init replace_intsrc_all(struct mpc_table *mpc, unsigned long mpc_new_phys, @@ -884,30 +856,71 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, { #ifdef CONFIG_X86_IO_APIC int i; + int nr_m_spare = 0; #endif + int count = sizeof(*mpc); - int nr_m_spare = 0; unsigned char *mpt = ((unsigned char *)mpc) + count; printk(KERN_INFO "mpc_length %x\n", mpc->length); while (count < mpc->length) { switch (*mpt) { case MP_PROCESSOR: - skip_entry(&mpt, &count, sizeof(struct mpc_cpu)); - break; + { + struct mpc_cpu *m = (struct mpc_cpu *)mpt; + mpt += sizeof(*m); + count += sizeof(*m); + break; + } case MP_BUS: - skip_entry(&mpt, &count, sizeof(struct mpc_bus)); - break; + { + struct mpc_bus *m = (struct mpc_bus *)mpt; + mpt += sizeof(*m); + count += sizeof(*m); + break; + } case MP_IOAPIC: - skip_entry(&mpt, &count, sizeof(struct mpc_ioapic)); - break; + { + mpt += sizeof(struct mpc_ioapic); + count += sizeof(struct mpc_ioapic); + break; + } case MP_INTSRC: - check_irq_src((struct mpc_intsrc *)mpt, &nr_m_spare); - skip_entry(&mpt, &count, sizeof(struct mpc_intsrc)); - break; + { +#ifdef CONFIG_X86_IO_APIC + struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; + + apic_printk(APIC_VERBOSE, "OLD "); + print_MP_intsrc_info(m); + i = get_MP_intsrc_index(m); + if (i > 0) { + assign_to_mpc_intsrc(&mp_irqs[i], m); + apic_printk(APIC_VERBOSE, "NEW "); + print_mp_irq_info(&mp_irqs[i]); + } else if (!i) { + /* legacy, do nothing */ + } else if (nr_m_spare < SPARE_SLOT_NUM) { + /* + * not found (-1), or duplicated (-2) + * are invalid entries, + * we need to use the slot later + */ + m_spare[nr_m_spare] = m; + nr_m_spare++; + } +#endif + mpt += sizeof(struct mpc_intsrc); + count += sizeof(struct mpc_intsrc); + break; + } case MP_LINTSRC: - skip_entry(&mpt, &count, sizeof(struct mpc_lintsrc)); - break; + { + struct mpc_lintsrc *m = + (struct mpc_lintsrc *)mpt; + mpt += sizeof(*m); + count += sizeof(*m); + break; + } default: /* wrong mptable */ printk(KERN_ERR "Your mptable is wrong, contact your HW vendor!\n"); @@ -937,8 +950,16 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, } else { struct mpc_intsrc *m = (struct mpc_intsrc *)mpt; count += sizeof(struct mpc_intsrc); - if (!check_slot(mpc_new_phys, mpc_new_length, count)) - goto out; + if (!mpc_new_phys) { + printk(KERN_INFO "No spare slots, try to append...take your risk, new mpc_length %x\n", count); + } else { + if (count <= mpc_new_length) + printk(KERN_INFO "No spare slots, try to append..., new mpc_length %x\n", count); + else { + printk(KERN_ERR "mpc_new_length %lx is too small\n", mpc_new_length); + goto out; + } + } assign_to_mpc_intsrc(&mp_irqs[i], m); mpc->length = count; mpt += sizeof(struct mpc_intsrc); diff --git a/trunk/arch/x86/mm/pgtable_32.c b/trunk/arch/x86/mm/pgtable_32.c index f2e477c91c1b..46c8834aedc0 100644 --- a/trunk/arch/x86/mm/pgtable_32.c +++ b/trunk/arch/x86/mm/pgtable_32.c @@ -50,7 +50,7 @@ void set_pte_vaddr(unsigned long vaddr, pte_t pteval) } pte = pte_offset_kernel(pmd, vaddr); if (pte_val(pteval)) - set_pte_present(&init_mm, vaddr, pte, pteval); + set_pte_at(&init_mm, vaddr, pte, pteval); else pte_clear(&init_mm, vaddr, pte);