WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

[Xen-ia64-devel] SMP patch

To: "Magenheimer, Dan (HP Labs Fort Collins)" <dan.magenheimer@xxxxxx>
Subject: [Xen-ia64-devel] SMP patch
From: Tristan Gingold <Tristan.Gingold@xxxxxxxx>
Date: Wed, 12 Oct 2005 18:29:45 +0200
Cc: xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Wed, 12 Oct 2005 15:24:27 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: KMail/1.5
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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-ia64-devel] SMP patch, Tristan Gingold <=