Here is the SMP patch.
I was able to boot with #undef CONFIG_XEN_SMP.
Note: with SMP, Xen can freeze during boot.
I will work on this issue ASAP, but tomorrow I don't have the machine.
Integrate or not.
Tristan.
# HG changeset patch
# User tristan.gingold@xxxxxxxx
# Node ID b4d53809ce796e2081fe7968abf41b610db8409f
# Parent d962821aa0e7c024bf7f4a978504ef7f028703d2
SMP patch.
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/linux-xen/head.S
--- a/xen/arch/ia64/linux-xen/head.S Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/linux-xen/head.S Wed Oct 12 14:12:44 2005
@@ -324,6 +324,9 @@
mov r16=-1
(isBP) br.cond.dpnt .load_current // BP stack is on region 5 --- no need to
map it
+#ifndef XEN
+ // XEN: stack is allocated in xenheap, which is currently always
+ // mapped.
// load mapping for stack (virtaddr in r2, physaddr in r3)
rsm psr.ic
movl r17=PAGE_KERNEL
@@ -353,7 +356,8 @@
ssm psr.ic
srlz.d
;;
-
+#endif
+
.load_current:
// load the "current" pointer (r13) and ar.k6 with the current task
#if defined(XEN) && defined(VALIDATE_VT)
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/linux-xen/irq_ia64.c
--- a/xen/arch/ia64/linux-xen/irq_ia64.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/linux-xen/irq_ia64.c Wed Oct 12 14:12:44 2005
@@ -281,5 +281,8 @@
ipi_data = (delivery_mode << 8) | (vector & 0xff);
ipi_addr = ipi_base_addr + ((phys_cpu_id << 4) | ((redirect & 1) << 3));
+#ifdef XEN
+ printf ("send_ipi to %d (%x)\n", cpu, phys_cpu_id);
+#endif
writeq(ipi_data, ipi_addr);
}
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/linux-xen/mm_contig.c
--- a/xen/arch/ia64/linux-xen/mm_contig.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/linux-xen/mm_contig.c Wed Oct 12 14:12:44 2005
@@ -193,8 +193,8 @@
*/
if (smp_processor_id() == 0) {
#ifdef XEN
- cpu_data = alloc_xenheap_pages(PERCPU_PAGE_SHIFT -
- PAGE_SHIFT + get_order(NR_CPUS));
+ cpu_data = alloc_xenheap_pages(get_order(NR_CPUS
+ * PERCPU_PAGE_SIZE));
#else
cpu_data = __alloc_bootmem(PERCPU_PAGE_SIZE * NR_CPUS,
PERCPU_PAGE_SIZE,
__pa(MAX_DMA_ADDRESS));
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/linux-xen/setup.c
--- a/xen/arch/ia64/linux-xen/setup.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/linux-xen/setup.c Wed Oct 12 14:12:44 2005
@@ -366,6 +366,7 @@
}
#endif
+void __init
#ifdef XEN
early_setup_arch (char **cmdline_p)
#else
@@ -377,14 +378,12 @@
ia64_patch_vtop((u64) __start___vtop_patchlist, (u64)
__end___vtop_patchlist);
*cmdline_p = __va(ia64_boot_param->command_line);
-#ifdef XEN
- efi_init();
-#else
+#ifndef XEN
strlcpy(saved_command_line, *cmdline_p, COMMAND_LINE_SIZE);
+#endif
efi_init();
io_port_init();
-#endif
#ifdef CONFIG_IA64_GENERIC
{
@@ -414,11 +413,17 @@
#ifdef XEN
early_cmdline_parse(cmdline_p);
cmdline_parse(*cmdline_p);
-#undef CONFIG_ACPI_BOOT
#endif
if (early_console_setup(*cmdline_p) == 0)
mark_bsp_online();
+#ifdef XEN
+}
+
+void __init
+late_setup_arch (char **cmdline_p)
+{
+#endif
#ifdef CONFIG_ACPI_BOOT
/* Initialize the ACPI boot-time table parser */
acpi_table_init();
@@ -433,20 +438,16 @@
#ifndef XEN
find_memory();
-#else
- io_port_init();
-}
-
-void __init
-late_setup_arch (char **cmdline_p)
-{
-#undef CONFIG_ACPI_BOOT
- acpi_table_init();
-#endif
+#endif
+
/* process SAL system table: */
ia64_sal_init(efi.sal_systab);
#ifdef CONFIG_SMP
+#ifdef XEN
+ init_smp_config ();
+#endif
+
cpu_physical_id(0) = hard_smp_processor_id();
cpu_set(0, cpu_sibling_map[0]);
@@ -768,6 +769,11 @@
cpu_data = per_cpu_init();
+#ifdef XEN
+ printf ("cpu_init: current=%p, current->domain->arch.mm=%p\n",
+ current, current->domain->arch.mm);
+#endif
+
/*
* We set ar.k3 so that assembly code in MCA handler can compute
* physical addresses of per cpu variables with a simple:
@@ -887,6 +893,16 @@
#ifndef XEN
pm_idle = default_idle;
#endif
+
+#ifdef XEN
+ /* surrender usage of kernel registers to domain, use percpu area instead
*/
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_IO_BASE] =
ia64_get_kr(IA64_KR_IO_BASE);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_PER_CPU_DATA] =
ia64_get_kr(IA64_KR_PER_CPU_DATA);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT_STACK] =
ia64_get_kr(IA64_KR_CURRENT_STACK);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_FPU_OWNER] =
ia64_get_kr(IA64_KR_FPU_OWNER);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT] =
ia64_get_kr(IA64_KR_CURRENT);
+ __get_cpu_var(cpu_kr)._kr[IA64_KR_PT_BASE] =
ia64_get_kr(IA64_KR_PT_BASE);
+#endif
}
void
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/linux-xen/smp.c
--- a/xen/arch/ia64/linux-xen/smp.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/linux-xen/smp.c Wed Oct 12 14:12:44 2005
@@ -63,9 +63,18 @@
//Huh? This seems to be used on ia64 even if !CONFIG_SMP
void smp_send_event_check_mask(cpumask_t mask)
{
- printf("smp_send_event_check_mask called\n");
- //dummy();
- //send_IPI_mask(cpu_mask, EVENT_CHECK_VECTOR);
+ int cpu;
+
+ /* Not for me. */
+ cpu_clear(smp_processor_id(), mask);
+ if (cpus_empty(mask))
+ return;
+
+ printf("smp_send_event_check_mask called\n");
+
+ for (cpu = 0; cpu < NR_CPUS; ++cpu)
+ if (cpu_isset(cpu, mask))
+ platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0);
}
@@ -249,6 +258,7 @@
send_IPI_single(smp_processor_id(), op);
}
+#ifndef XEN
/*
* Called with preeemption disabled.
*/
@@ -257,6 +267,7 @@
{
platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0);
}
+#endif
void
smp_flush_tlb_all (void)
@@ -395,15 +406,14 @@
if (wait)
atomic_set(&data.finished, 0);
- printk("smp_call_function: about to spin_lock \n");
spin_lock(&call_lock);
- printk("smp_call_function: done with spin_lock \n");
+#if 0 //def XEN
+ printk("smp_call_function: %d lock\n", smp_processor_id ());
+#endif
call_data = &data;
mb(); /* ensure store to call_data precedes setting of IPI_CALL_FUNC
*/
- printk("smp_call_function: about to send_IPI \n");
send_IPI_allbutself(IPI_CALL_FUNC);
- printk("smp_call_function: done with send_IPI \n");
/* Wait for response */
while (atomic_read(&data.started) != cpus)
@@ -414,9 +424,10 @@
cpu_relax();
call_data = NULL;
- printk("smp_call_function: about to spin_unlock \n");
spin_unlock(&call_lock);
+#if 0 //def XEN
printk("smp_call_function: DONE WITH spin_unlock, returning \n");
+#endif
return 0;
}
EXPORT_SYMBOL(smp_call_function);
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/linux-xen/smpboot.c
--- a/xen/arch/ia64/linux-xen/smpboot.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/linux-xen/smpboot.c Wed Oct 12 14:12:44 2005
@@ -477,6 +477,22 @@
do_rest:
task_for_booting_cpu = c_idle.idle;
+#else
+ struct domain *idle;
+ struct vcpu *v;
+ void *stack;
+
+ if ( (idle = do_createdomain(IDLE_DOMAIN_ID, cpu)) == NULL )
+ panic("failed 'createdomain' for CPU %d", cpu);
+ set_bit(_DOMF_idle_domain, &idle->domain_flags);
+ v = idle->vcpu[0];
+
+ printf ("do_boot_cpu: cpu=%d, domain=%p, vcpu=%p\n", cpu, idle, v);
+
+ task_for_booting_cpu = v;
+
+ /* Set cpu number. */
+ get_thread_info(v)->cpu = cpu;
#endif
Dprintk("Sending wakeup vector %lu to AP 0x%x/0x%x.\n",
ap_wakeup_vector,
cpu, sapicid);
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/xen/acpi.c
--- a/xen/arch/ia64/xen/acpi.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/xen/acpi.c Wed Oct 12 14:12:44 2005
@@ -121,6 +121,7 @@
#ifdef CONFIG_ACPI_BOOT
#define ACPI_MAX_PLATFORM_INTERRUPTS 256
+#define NR_IOSAPICS 4
#if 0
/* Array to record platform interrupt vectors for generic interrupt routing.
*/
@@ -162,7 +163,6 @@
struct acpi_table_madt * acpi_madt __initdata;
static u8 has_8259;
-#if 0
static int __init
acpi_parse_lapic_addr_ovr (
acpi_table_entry_header *header, const unsigned long end)
@@ -247,11 +247,12 @@
acpi_table_print_madt_entry(header);
+#if 0
iosapic_init(iosapic->address, iosapic->global_irq_base);
-
- return 0;
-}
-
+#endif
+
+ return 0;
+}
static int __init
acpi_parse_plat_int_src (
@@ -267,6 +268,7 @@
acpi_table_print_madt_entry(header);
+#if 0
/*
* Get vector assignment for this interrupt, set attributes,
* and program the IOSAPIC routing table.
@@ -280,6 +282,7 @@
(plintsrc->flags.trigger == 1)
? IOSAPIC_EDGE : IOSAPIC_LEVEL);
platform_intr_list[plintsrc->type] = vector;
+#endif
return 0;
}
@@ -297,12 +300,13 @@
acpi_table_print_madt_entry(header);
+#if 0
iosapic_override_isa_irq(p->bus_irq, p->global_irq,
(p->flags.polarity == 1) ? IOSAPIC_POL_HIGH :
IOSAPIC_POL_LOW,
(p->flags.trigger == 1) ? IOSAPIC_EDGE :
IOSAPIC_LEVEL);
- return 0;
-}
-
+#endif
+ return 0;
+}
static int __init
acpi_parse_nmi_src (acpi_table_entry_header *header, const unsigned long end)
@@ -331,8 +335,10 @@
*/
sal_platform_features |= IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT;
+#if 0
/*Start cyclone clock*/
cyclone_setup(0);
+#endif
}
}
@@ -350,7 +356,9 @@
#else
has_8259 = acpi_madt->flags.pcat_compat;
#endif
+#if 0
iosapic_system_init(has_8259);
+#endif
/* Get base address of IPI Message Block */
@@ -364,7 +372,6 @@
return 0;
}
-#endif
#ifdef CONFIG_ACPI_NUMA
@@ -529,6 +536,7 @@
return acpi_register_irq(gsi, polarity, trigger);
}
EXPORT_SYMBOL(acpi_register_gsi);
+#endif
static int __init
acpi_parse_fadt (unsigned long phys_addr, unsigned long size)
{
@@ -550,10 +558,11 @@
if (fadt->iapc_boot_arch & BAF_LEGACY_DEVICES)
acpi_legacy_devices = 1;
+#if 0
acpi_register_gsi(fadt->sci_int, ACPI_ACTIVE_LOW, ACPI_LEVEL_SENSITIVE);
- return 0;
-}
-#endif
+#endif
+ return 0;
+}
unsigned long __init
acpi_find_rsdp (void)
@@ -567,7 +576,6 @@
return rsdp_phys;
}
-#if 0
int __init
acpi_boot_init (void)
{
@@ -646,6 +654,7 @@
printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus,
total_cpus);
return 0;
}
+#if 0
int
acpi_gsi_to_irq (u32 gsi, unsigned int *irq)
{
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/xen/domain.c Wed Oct 12 14:12:44 2005
@@ -23,6 +23,7 @@
#include <asm/io.h>
#include <asm/processor.h>
#include <asm/desc.h>
+#include <asm/hw_irq.h>
//#include <asm/mpspec.h>
#include <xen/irq.h>
#include <xen/event.h>
@@ -75,35 +76,21 @@
//free_page((unsigned long)d->mm.perdomain_pt);
}
-int hlt_counter;
-
-void disable_hlt(void)
-{
- hlt_counter++;
-}
-
-void enable_hlt(void)
-{
- hlt_counter--;
-}
-
static void default_idle(void)
{
- if ( hlt_counter == 0 )
- {
+ int cpu = smp_processor_id();
local_irq_disable();
- if ( !softirq_pending(smp_processor_id()) )
+ if ( !softirq_pending(cpu))
safe_halt();
- //else
- local_irq_enable();
- }
-}
-
-void continue_cpu_idle_loop(void)
+ local_irq_enable();
+}
+
+static void continue_cpu_idle_loop(void)
{
int cpu = smp_processor_id();
for ( ; ; )
{
+ printf ("idle%dD\n", cpu);
#ifdef IA64
// __IRQ_STAT(cpu, idle_timestamp) = jiffies
#else
@@ -111,23 +98,32 @@
#endif
while ( !softirq_pending(cpu) )
default_idle();
+ add_preempt_count(SOFTIRQ_OFFSET);
raise_softirq(SCHEDULE_SOFTIRQ);
do_softirq();
+ sub_preempt_count(SOFTIRQ_OFFSET);
}
}
void startup_cpu_idle_loop(void)
{
+ int cpu = smp_processor_id ();
/* Just some sanity to ensure that the scheduler is set up okay. */
ASSERT(current->domain == IDLE_DOMAIN_ID);
+ printf ("idle%dA\n", cpu);
raise_softirq(SCHEDULE_SOFTIRQ);
+#if 0 /* All this work is done within continue_cpu_idle_loop */
+ printf ("idle%dB\n", cpu);
+ asm volatile ("mov ar.k2=r0");
do_softirq();
+ printf ("idle%dC\n", cpu);
/*
* Declares CPU setup done to the boot processor.
* Therefore memory barrier to ensure state is visible.
*/
smp_mb();
+#endif
#if 0
//do we have to ensure the idle task has a shared page so that, for example,
//region registers can be loaded from it. Apparently not...
@@ -229,17 +225,21 @@
v->arch.breakimm = d->arch.breakimm;
d->arch.sys_pgnr = 0;
- d->arch.mm = xmalloc(struct mm_struct);
- if (unlikely(!d->arch.mm)) {
- printk("Can't allocate mm_struct for domain %d\n",d->domain_id);
- return -ENOMEM;
- }
- memset(d->arch.mm, 0, sizeof(*d->arch.mm));
- d->arch.mm->pgd = pgd_alloc(d->arch.mm);
- if (unlikely(!d->arch.mm->pgd)) {
- printk("Can't allocate pgd for domain %d\n",d->domain_id);
- return -ENOMEM;
- }
+ if (d->domain_id != IDLE_DOMAIN_ID) {
+ d->arch.mm = xmalloc(struct mm_struct);
+ if (unlikely(!d->arch.mm)) {
+ printk("Can't allocate mm_struct for domain
%d\n",d->domain_id);
+ return -ENOMEM;
+ }
+ memset(d->arch.mm, 0, sizeof(*d->arch.mm));
+ d->arch.mm->pgd = pgd_alloc(d->arch.mm);
+ if (unlikely(!d->arch.mm->pgd)) {
+ printk("Can't allocate pgd for domain
%d\n",d->domain_id);
+ return -ENOMEM;
+ }
+ } else
+ d->arch.mm = NULL;
+ printf ("arch_do_create_domain: domain=%p\n", d);
}
void arch_getdomaininfo_ctxt(struct vcpu *v, struct vcpu_guest_context *c)
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/xen/process.c Wed Oct 12 14:12:44 2005
@@ -62,11 +62,23 @@
return 0;
}
+#include <xen/sched-if.h>
+
+extern struct schedule_data schedule_data[NR_CPUS];
+
void schedule_tail(struct vcpu *next)
{
unsigned long rr7;
//printk("current=%lx,shared_info=%lx\n",current,current->vcpu_info);
//printk("next=%lx,shared_info=%lx\n",next,next->vcpu_info);
+
+ // TG: Real HACK FIXME.
+ // This is currently necessary because when a new domain is started,
+ // the context_switch function of
xen/common/schedule.c(__enter_scheduler)
+ // never returns. Therefore, the lock must be released.
+ // schedule_tail is only called when a domain is started.
+ spin_unlock_irq(&schedule_data[current->processor].schedule_lock);
+
/* rr7 will be postponed to last point when resuming back to guest */
if(VMX_DOMAIN(current)){
vmx_load_all_rr(current);
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/xen/xenirq.c
--- a/xen/arch/ia64/xen/xenirq.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/xen/xenirq.c Wed Oct 12 14:12:44 2005
@@ -35,7 +35,7 @@
int
xen_do_IRQ(ia64_vector vector)
{
- if (vector != 0xef) {
+ if (vector != IA64_TIMER_VECTOR && vector != IA64_IPI_VECTOR) {
extern void vcpu_pend_interrupt(void *, int);
#if 0
if (firsttime[vector]) {
@@ -57,22 +57,18 @@
return(0);
}
-/* From linux/kernel/softirq.c */
-#ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED
-# define invoke_softirq() __do_softirq()
-#else
-# define invoke_softirq() do_softirq()
-#endif
-
/*
* Exit an interrupt context. Process softirqs if needed and possible:
*/
void irq_exit(void)
{
//account_system_vtime(current);
- //sub_preempt_count(IRQ_EXIT_OFFSET);
- if (!in_interrupt() && local_softirq_pending())
- invoke_softirq();
+ sub_preempt_count(IRQ_EXIT_OFFSET);
+ if (!in_interrupt() && local_softirq_pending()) {
+ add_preempt_count(SOFTIRQ_OFFSET);
+ do_softirq();
+ sub_preempt_count(SOFTIRQ_OFFSET);
+ }
//preempt_enable_no_resched();
}
/* end from linux/kernel/softirq.c */
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/xen/xenmisc.c
--- a/xen/arch/ia64/xen/xenmisc.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/xen/xenmisc.c Wed Oct 12 14:12:44 2005
@@ -280,6 +280,8 @@
unsigned long context_switch_count = 0;
+#include <asm/vcpu.h>
+
void context_switch(struct vcpu *prev, struct vcpu *next)
{
//printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
@@ -287,7 +289,8 @@
//prev->domain->domain_id,(long)prev&0xffffff,next->domain->domain_id,(long)next&0xffffff);
//if (prev->domain->domain_id == 1 && next->domain->domain_id == 0)
cs10foo();
//if (prev->domain->domain_id == 0 && next->domain->domain_id == 1)
cs01foo();
-//printk("@@sw %d->%d\n",prev->domain->domain_id,next->domain->domain_id);
+printk("@@sw%d/%x %d->%d\n",smp_processor_id(), hard_smp_processor_id (),
+ prev->domain->domain_id,next->domain->domain_id);
if(VMX_DOMAIN(prev)){
vtm_domain_out(prev);
}
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/xen/xensetup.c
--- a/xen/arch/ia64/xen/xensetup.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/xen/xensetup.c Wed Oct 12 14:12:44 2005
@@ -253,11 +253,11 @@
printk("About to call scheduler_init()\n");
scheduler_init();
local_irq_disable();
+ init_IRQ ();
printk("About to call init_xen_time()\n");
init_xen_time(); /* initialise the time */
printk("About to call ac_timer_init()\n");
ac_timer_init();
-// init_xen_time(); ???
#ifdef CONFIG_SMP
if ( opt_nosmp )
@@ -275,6 +275,9 @@
cpu_set(i, cpu_present_map);
//BUG_ON(!local_irq_is_enabled());
+
+ /* Enable IRQ to receive IPI (needed for ITC sync). */
+ local_irq_enable();
printk("num_online_cpus=%d, max_cpus=%d\n",num_online_cpus(),max_cpus);
for_each_present_cpu ( i )
@@ -287,24 +290,16 @@
}
}
+ local_irq_disable();
+
printk("Brought up %ld CPUs\n", (long)num_online_cpus());
smp_cpus_done(max_cpus);
#endif
-
- // FIXME: Should the following be swapped and moved later?
- schedulers_start();
do_initcalls();
printk("About to call sort_main_extable()\n");
sort_main_extable();
- /* surrender usage of kernel registers to domain, use percpu area instead
*/
- __get_cpu_var(cpu_kr)._kr[IA64_KR_IO_BASE] =
ia64_get_kr(IA64_KR_IO_BASE);
- __get_cpu_var(cpu_kr)._kr[IA64_KR_PER_CPU_DATA] =
ia64_get_kr(IA64_KR_PER_CPU_DATA);
- __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT_STACK] =
ia64_get_kr(IA64_KR_CURRENT_STACK);
- __get_cpu_var(cpu_kr)._kr[IA64_KR_FPU_OWNER] =
ia64_get_kr(IA64_KR_FPU_OWNER);
- __get_cpu_var(cpu_kr)._kr[IA64_KR_CURRENT] =
ia64_get_kr(IA64_KR_CURRENT);
- __get_cpu_var(cpu_kr)._kr[IA64_KR_PT_BASE] =
ia64_get_kr(IA64_KR_PT_BASE);
/* Create initial domain 0. */
printk("About to call do_createdomain()\n");
@@ -342,6 +337,11 @@
0,
0) != 0)
panic("Could not set up DOM0 guest OS\n");
+
+ /* PIN domain0 on CPU 0. */
+ dom0->vcpu[0]->cpumap=1;
+ set_bit(_VCPUF_cpu_pinned, &dom0->vcpu[0]->vcpu_flags);
+
#ifdef CLONE_DOMAIN0
{
int i;
@@ -379,9 +379,16 @@
domain_unpause_by_systemcontroller(clones[i]);
}
#endif
+ domain0_ready = 1;
+
+ local_irq_enable();
+
+ printf("About to call schedulers_start dom0=%p, idle0_dom=%p\n",
+ dom0, &idle0_domain);
+ schedulers_start();
+
domain_unpause_by_systemcontroller(dom0);
- domain0_ready = 1;
- local_irq_enable();
+
printk("About to call startup_cpu_idle_loop()\n");
startup_cpu_idle_loop();
}
diff -r d962821aa0e7 -r b4d53809ce79 xen/arch/ia64/xen/xentime.c
--- a/xen/arch/ia64/xen/xentime.c Wed Oct 12 14:03:22 2005
+++ b/xen/arch/ia64/xen/xentime.c Wed Oct 12 14:12:44 2005
@@ -103,10 +103,10 @@
#ifdef HEARTBEAT_FREQ
static long count = 0;
if (!(++count & ((HEARTBEAT_FREQ*1024)-1))) {
- printf("Heartbeat... iip=%p,psr.i=%d,pend=%d\n",
- regs->cr_iip,
+ printf("Heartbeat... iip=%p\n", /*",psr.i=%d,pend=%d\n", */
+ regs->cr_iip /*,
VCPU(current,interrupt_delivery_enabled),
- VCPU(current,pending_interruption));
+ VCPU(current,pending_interruption) */);
count = 0;
}
#endif
diff -r d962821aa0e7 -r b4d53809ce79 xen/include/asm-ia64/config.h
--- a/xen/include/asm-ia64/config.h Wed Oct 12 14:03:22 2005
+++ b/xen/include/asm-ia64/config.h Wed Oct 12 14:12:44 2005
@@ -28,8 +28,8 @@
#ifdef CONFIG_XEN_SMP
#define CONFIG_SMP 1
-#define NR_CPUS 2
-#define CONFIG_NR_CPUS 2
+#define NR_CPUS 8
+#define CONFIG_NR_CPUS 8
#else
#undef CONFIG_SMP
#define NR_CPUS 1
@@ -123,8 +123,7 @@
#ifdef CONFIG_SMP
#warning "Lots of things to fix to enable CONFIG_SMP!"
#endif
-// FIXME SMP
-#define get_cpu() 0
+#define get_cpu() smp_processor_id()
#define put_cpu() do {} while(0)
// needed for common/dom0_ops.c until hyperthreading is supported
@@ -140,6 +139,7 @@
// function calls; see decl in xen/include/xen/sched.h
#undef free_task_struct
#undef alloc_task_struct
+#define get_thread_info(v) alloc_thread_info(v)
// initial task has a different name in Xen
//#define idle0_task init_task
@@ -299,7 +299,11 @@
#endif /* __XEN_IA64_CONFIG_H__ */
// needed for include/xen/smp.h
+#ifdef CONFIG_SMP
+#define __smp_processor_id() current_thread_info()->cpu
+#else
#define __smp_processor_id() 0
+#endif
// FOLLOWING ADDED FOR XEN POST-NGIO and/or LINUX 2.6.7
diff -r d962821aa0e7 -r b4d53809ce79
xen/include/asm-ia64/linux-xen/asm/spinlock.h
--- a/xen/include/asm-ia64/linux-xen/asm/spinlock.h Wed Oct 12 14:03:22 2005
+++ b/xen/include/asm-ia64/linux-xen/asm/spinlock.h Wed Oct 12 14:12:44 2005
@@ -17,10 +17,15 @@
#include <asm/intrinsics.h>
#include <asm/system.h>
+#define DEBUG_SPINLOCK
+
typedef struct {
volatile unsigned int lock;
#ifdef CONFIG_PREEMPT
unsigned int break_lock;
+#endif
+#ifdef DEBUG_SPINLOCK
+ void *locker;
#endif
#ifdef XEN
unsigned char recurse_cpu;
@@ -95,6 +100,10 @@
"(p14) brl.call.spnt.many b6=ia64_spinlock_contention;;"
: "=r"(ptr) : "r"(ptr), "r" (flags) :
IA64_SPINLOCK_CLOBBERS);
# endif /* CONFIG_MCKINLEY */
+#endif
+
+#ifdef DEBUG_SPINLOCK
+ asm volatile ("mov %0=ip" : "=r" (lock->locker));
#endif
}
#define _raw_spin_lock(lock) _raw_spin_lock_flags(lock, 0)
diff -r d962821aa0e7 -r b4d53809ce79
xen/include/asm-ia64/linux-xen/linux/hardirq.h
--- a/xen/include/asm-ia64/linux-xen/linux/hardirq.h Wed Oct 12 14:03:22 2005
+++ b/xen/include/asm-ia64/linux-xen/linux/hardirq.h Wed Oct 12 14:12:44 2005
@@ -67,11 +67,7 @@
*/
#define in_irq() (hardirq_count())
#define in_softirq() (softirq_count())
-#ifdef XEN
-#define in_interrupt() 0 // FIXME SMP LATER
-#else
#define in_interrupt() (irq_count())
-#endif
#if defined(CONFIG_PREEMPT) && !defined(CONFIG_PREEMPT_BKL)
# define in_atomic() ((preempt_count() & ~PREEMPT_ACTIVE) != kernel_locked())
diff -r d962821aa0e7 -r b4d53809ce79
xen/include/asm-ia64/linux-xen/linux/interrupt.h
--- a/xen/include/asm-ia64/linux-xen/linux/interrupt.h Wed Oct 12 14:03:22
2005
+++ b/xen/include/asm-ia64/linux-xen/linux/interrupt.h Wed Oct 12 14:12:44
2005
@@ -88,6 +88,7 @@
#define save_and_cli(x) save_and_cli(&x)
#endif /* CONFIG_SMP */
+#ifndef XEN
/* SoftIRQ primitives. */
#define local_bh_disable() \
do { add_preempt_count(SOFTIRQ_OFFSET); barrier(); } while (0)
@@ -95,6 +96,7 @@
do { barrier(); sub_preempt_count(SOFTIRQ_OFFSET); } while (0)
extern void local_bh_enable(void);
+#endif
/* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
frequency threaded job scheduling. For almost all the purposes
diff -r d962821aa0e7 -r b4d53809ce79 xen/include/asm-ia64/vhpt.h
--- a/xen/include/asm-ia64/vhpt.h Wed Oct 12 14:03:22 2005
+++ b/xen/include/asm-ia64/vhpt.h Wed Oct 12 14:12:44 2005
@@ -14,6 +14,13 @@
#define VHPT_CACHE_ENTRY_SIZE_LOG2 6
#define VHPT_SIZE_LOG2 26 //????
#define VHPT_PAGE_SHIFT 26 //????
+#elif 1
+#define VHPT_CACHE_ENTRY_SIZE 64
+#define VHPT_CACHE_NUM_ENTRIES 2048
+#define VHPT_NUM_ENTRIES 131072
+#define VHPT_CACHE_MASK 131071
+#define VHPT_SIZE_LOG2 22 //????
+#define VHPT_PAGE_SHIFT 22 //????
#else
//#define VHPT_CACHE_NUM_ENTRIES 2048
//#define VHPT_NUM_ENTRIES 131072
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|