select HAVE_FTRACE_MCOUNT_RECORD
select HAVE_DYNAMIC_FTRACE
select HAVE_FUNCTION_TRACER
+++ select HAVE_FUNCTION_GRAPH_TRACER
+++ select HAVE_FUNCTION_TRACE_MCOUNT_TEST
select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64)
select HAVE_ARCH_KGDB if !X86_VOYAGER
select HAVE_ARCH_TRACEHOOK
select HAVE_GENERIC_DMA_COHERENT if X86_32
select HAVE_EFFICIENT_UNALIGNED_ACCESS
+++ select USER_STACKTRACE_SUPPORT
config ARCH_DEFCONFIG
string
config X86_SMP
bool
depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64)
- select USE_GENERIC_SMP_HELPERS
default y
+config USE_GENERIC_SMP_HELPERS
+ def_bool y
+ depends on SMP
+
config X86_32_SMP
def_bool y
depends on X86_32 && SMP
def_bool y
depends on X86_VOYAGER
+ ++config SPARSE_IRQ
+ ++ bool "Support sparse irq numbering"
+ ++ depends on (PCI_MSI || HT_IRQ) && SMP
+ ++ default y
+ ++ help
+ ++ This enables support for sparse irq, esp for msi/msi-x. You may need
+ ++ if you have lots of cards supports msi-x installed.
+ ++
+ ++ If you don't know what to do here, say Y.
+ ++
config X86_FIND_SMP_CONFIG
def_bool y
depends on X86_MPPARSE || X86_VOYAGER
as R-8610-(G).
If you don't have one of these chips, you should say N here.
---config SCHED_NO_NO_OMIT_FRAME_POINTER
+++config SCHED_OMIT_FRAME_POINTER
def_bool y
prompt "Single-depth WCHAN output"
--- depends on X86_32
+++ depends on X86
help
Calculate simpler /proc/<PID>/wchan values. If this option
is disabled then wchan values will recurse back to the
def_bool y
depends on X86_GENERICARCH
-- -config ES7000_CLUSTERED_APIC
-- - def_bool y
-- - depends on SMP && X86_ES7000 && MPENTIUMIII
-- -
source "arch/x86/Kconfig.cpu"
config HPET_TIMER
many of the newer IBM Thinkpads. If you experience hangs when you
suspend, try setting this to Y. Otherwise, say N.
--- config APM_REAL_MODE_POWER_OFF
--- bool "Use real mode APM BIOS call to power off"
--- help
--- Use real mode APM BIOS calls to switch off the computer. This is
--- a work-around for a number of buggy BIOSes. Switch this option on if
--- your computer crashes instead of powering off properly.
---
endif # APM
source "arch/x86/kernel/cpu/cpufreq/Kconfig"
#include <linux/module.h>
#include <linux/pm.h>
#include <linux/clockchips.h>
+++#include <linux/ftrace.h>
#include <asm/system.h>
+++ #include <asm/apic.h>
unsigned long idle_halt;
EXPORT_SYMBOL(idle_halt);
void default_idle(void)
{
if (hlt_use_halt()) {
+++ struct power_trace it;
+++
+++ trace_power_start(&it, POWER_CSTATE, 1);
current_thread_info()->status &= ~TS_POLLING;
/*
* TS_POLLING-cleared state must be visible before we
else
local_irq_enable();
current_thread_info()->status |= TS_POLLING;
+++ trace_power_end(&it);
} else {
local_irq_enable();
/* loop is done by the caller */
EXPORT_SYMBOL(default_idle);
#endif
+++ void stop_this_cpu(void *dummy)
+++ {
+++ local_irq_disable();
+++ /*
+++ * Remove this CPU:
+++ */
+++ cpu_clear(smp_processor_id(), cpu_online_map);
+++ disable_local_APIC();
+++
+++ for (;;) {
+++ if (hlt_works(smp_processor_id()))
+++ halt();
+++ }
+++ }
+++
static void do_nothing(void *unused)
{
}
*/
void mwait_idle_with_hints(unsigned long ax, unsigned long cx)
{
+++ struct power_trace it;
+++
+++ trace_power_start(&it, POWER_CSTATE, (ax>>4)+1);
if (!need_resched()) {
__monitor((void *)¤t_thread_info()->flags, 0, 0);
smp_mb();
if (!need_resched())
__mwait(ax, cx);
}
+++ trace_power_end(&it);
}
/* Default MONITOR/MWAIT with no hints, used for default C1 state */
static void mwait_idle(void)
{
+++ struct power_trace it;
if (!need_resched()) {
+++ trace_power_start(&it, POWER_CSTATE, 1);
__monitor((void *)¤t_thread_info()->flags, 0, 0);
smp_mb();
if (!need_resched())
__sti_mwait(0, 0);
else
local_irq_enable();
+++ trace_power_end(&it);
} else
local_irq_enable();
}
*/
static void poll_idle(void)
{
+++ struct power_trace it;
+++
+++ trace_power_start(&it, POWER_CSTATE, 0);
local_irq_enable();
while (!need_resched())
cpu_relax();
+++ trace_power_end(&it);
}
/*
static int reboot_cpu = -1;
#endif
--- /* reboot=b[ios] | s[mp] | t[riple] | k[bd] | e[fi] [, [w]arm | [c]old]
+++ /* This is set by the PCI code if either type 1 or type 2 PCI is detected */
+++ bool port_cf9_safe = false;
+++
+++ /* reboot=b[ios] | s[mp] | t[riple] | k[bd] | e[fi] [, [w]arm | [c]old] | p[ci]
warm Don't set the cold reboot flag
cold Set the cold reboot flag
bios Reboot by jumping through the BIOS (only for X86_32)
kbd Use the keyboard controller. cold reset (default)
acpi Use the RESET_REG in the FADT
efi Use efi reset_system runtime service
+++ pci Use the so-called "PCI reset register", CF9
force Avoid anything that could hang.
*/
static int __init reboot_setup(char *str)
case 'k':
case 't':
case 'e':
+++ case 'p':
reboot_type = *str;
break;
DMI_MATCH(DMI_BOARD_NAME, "0KW626"),
},
},
+ { /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */
+ .callback = set_bios_reboot,
+ .ident = "Dell OptiPlex 330",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"),
+ DMI_MATCH(DMI_BOARD_NAME, "0KP561"),
+ },
+ },
{ /* Handle problems with rebooting on Dell 2400's */
.callback = set_bios_reboot,
.ident = "Dell PowerEdge 2400",
reboot_type = BOOT_KBD;
break;
---
case BOOT_EFI:
if (efi_enabled)
--- efi.reset_system(reboot_mode ? EFI_RESET_WARM : EFI_RESET_COLD,
+++ efi.reset_system(reboot_mode ?
+++ EFI_RESET_WARM :
+++ EFI_RESET_COLD,
EFI_SUCCESS, 0, NULL);
+++ reboot_type = BOOT_KBD;
+++ break;
+++
+++ case BOOT_CF9:
+++ port_cf9_safe = true;
+++ /* fall through */
+++ case BOOT_CF9_COND:
+++ if (port_cf9_safe) {
+++ u8 cf9 = inb(0xcf9) & ~6;
+++ outb(cf9|2, 0xcf9); /* Request hard reset */
+++ udelay(50);
+++ outb(cf9|6, 0xcf9); /* Actually do the reset */
+++ udelay(50);
+++ }
reboot_type = BOOT_KBD;
break;
}
static void native_machine_halt(void)
{
+++ /* stop other cpus and apics */
+++ machine_shutdown();
+++
+++ /* stop this cpu */
+++ stop_this_cpu(NULL);
}
static void native_machine_power_off(void)
early_param("elfcorehdr", setup_elfcorehdr);
#endif
-- -static struct x86_quirks default_x86_quirks __initdata;
++ +static int __init default_update_genapic(void)
++ +{
++ +#ifdef CONFIG_X86_SMP
++ +# if defined(CONFIG_X86_GENERICARCH) || defined(CONFIG_X86_64)
++ + genapic->wakeup_cpu = wakeup_secondary_cpu_via_init;
++ +# endif
++ +#endif
++ +
++ + return 0;
++ +}
++ +
++ +static struct x86_quirks default_x86_quirks __initdata = {
++ + .update_genapic = default_update_genapic,
++ +};
struct x86_quirks *x86_quirks __initdata = &default_x86_quirks;
.callback = dmi_low_memory_corruption,
.ident = "Phoenix BIOS",
.matches = {
- DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
+ DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
},
},
#endif
ioapic_init_mappings();
/* need to wait for io_apic is mapped */
- -- nr_irqs = probe_nr_irqs();
+ ++ probe_nr_irqs_gsi();
kvm_guest_init();
#include <linux/signal.h>
#include <linux/idr.h>
#include <linux/ftrace.h>
+++#include <trace/boot.h>
#include <asm/io.h>
#include <asm/bugs.h>
{
}
+ ++void __init __weak arch_early_irq_init(void)
+ ++{
+ ++}
+ ++
+ ++void __init __weak early_irq_init(void)
+ ++{
+ ++ arch_early_irq_init();
+ ++}
+ ++
asmlinkage void __init start_kernel(void)
{
char * command_line;
sort_main_extable();
trap_init();
rcu_init();
+ ++ /* init some links before init_ISA_irqs() */
+ ++ early_irq_init();
init_IRQ();
pidhash_init();
init_timers();
int do_one_initcall(initcall_t fn)
{
int count = preempt_count();
--- ktime_t delta;
+++ ktime_t calltime, delta, rettime;
char msgbuf[64];
--- struct boot_trace it;
+++ struct boot_trace_call call;
+++ struct boot_trace_ret ret;
if (initcall_debug) {
--- it.caller = task_pid_nr(current);
--- printk("calling %pF @ %i\n", fn, it.caller);
--- it.calltime = ktime_get();
+++ call.caller = task_pid_nr(current);
+++ printk("calling %pF @ %i\n", fn, call.caller);
+++ calltime = ktime_get();
+++ trace_boot_call(&call, fn);
+++ enable_boot_trace();
}
--- it.result = fn();
+++ ret.result = fn();
if (initcall_debug) {
--- it.rettime = ktime_get();
--- delta = ktime_sub(it.rettime, it.calltime);
--- it.duration = (unsigned long long) delta.tv64 >> 10;
+++ disable_boot_trace();
+++ rettime = ktime_get();
+++ delta = ktime_sub(rettime, calltime);
+++ ret.duration = (unsigned long long) ktime_to_ns(delta) >> 10;
+++ trace_boot_ret(&ret, fn);
printk("initcall %pF returned %d after %Ld usecs\n", fn,
--- it.result, it.duration);
--- trace_boot(&it, fn);
+++ ret.result, ret.duration);
}
msgbuf[0] = 0;
--- if (it.result && it.result != -ENODEV && initcall_debug)
--- sprintf(msgbuf, "error code %d ", it.result);
+++ if (ret.result && ret.result != -ENODEV && initcall_debug)
+++ sprintf(msgbuf, "error code %d ", ret.result);
if (preempt_count() != count) {
strlcat(msgbuf, "preemption imbalance ", sizeof(msgbuf));
printk("initcall %pF returned with %s\n", fn, msgbuf);
}
--- return it.result;
+++ return ret.result;
}
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
*/
--- stop_boot_trace();
+++
init_post();
return 0;
}