Tian, Kevin
2007-Feb-14  09:13 UTC
[Xen-devel] [PATCH 3/12] Provide basic Xen PM infrastructure
Add basic infrastructure for xen power management. Now
only S3 (suspend to ram) is supported.
Signed-off-by Ke Yu <ke.yu@intel.com>
Signed-off-by Kevin Tian <kevin.tian@intel.com>
diff -r 13e258a58044 xen/arch/x86/acpi/Makefile
--- a/xen/arch/x86/acpi/Makefile	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/acpi/Makefile	Wed Feb 14 11:13:40 2007 +0800
@@ -1,1 +1,2 @@ obj-y += boot.o
 obj-y += boot.o
+obj-y += power.o
diff -r 13e258a58044 xen/arch/x86/boot/x86_32.S
--- a/xen/arch/x86/boot/x86_32.S	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/boot/x86_32.S	Wed Feb 14 11:13:40 2007 +0800
@@ -146,6 +146,8 @@ start_paging:
         rdmsr
         bts     $_EFER_NX,%eax
         wrmsr
+        mov     $1,%eax
+        mov     %eax, nx_enabled-__PAGE_OFFSET
 no_execute_disable:
         pop     %ebx
 #endif
diff -r 13e258a58044 xen/arch/x86/smp.c
--- a/xen/arch/x86/smp.c	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/smp.c	Wed Feb 14 14:59:49 2007 +0800
@@ -276,8 +276,9 @@ int on_selected_cpus(
 {
     struct call_data_struct data;
     unsigned int nr_cpus = cpus_weight(selected);
-
-    ASSERT(local_irq_is_enabled());
+    unsigned int self = cpu_isset(smp_processor_id(), selected);
+
+    ASSERT(!self || local_irq_is_enabled());
 
     if ( nr_cpus == 0 )
         return 0;
diff -r 13e258a58044 xen/arch/x86/x86_32/Makefile
--- a/xen/arch/x86/x86_32/Makefile	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/x86_32/Makefile	Wed Feb 14 11:13:40 2007 +0800
@@ -6,3 +6,5 @@ obj-y += traps.o
 obj-y += traps.o
 
 obj-$(supervisor_mode_kernel) += supervisor_mode_kernel.o
+subdir-y += acpi
+subdir-y += power
diff -r 13e258a58044 xen/arch/x86/x86_32/acpi/sleep.c
--- a/xen/arch/x86/x86_32/acpi/sleep.c	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/x86_32/acpi/sleep.c	Wed Feb 14 11:13:40 2007 +0800
@@ -5,16 +5,29 @@
  *  Copyright (C) 2001-2003 Pavel Machek <pavel@suse.cz>
  */
 
+#ifndef __XEN__
 #include <linux/acpi.h>
 #include <linux/bootmem.h>
 #include <linux/dmi.h>
 #include <linux/cpumask.h>
 
 #include <asm/smp.h>
+#else
+#include <asm/config.h>
+#include <xen/string.h>
+#include <xen/domain_page.h>
+#include <asm/init.h>
+#include <asm/page.h>
+#include <asm/flushtlb.h>
+#include <xen/init.h>
+#endif
 
 /* address in low memory of the wakeup routine. */
 unsigned long acpi_wakeup_address = 0;
 unsigned long acpi_video_flags;
+#ifdef __XEN__
+unsigned long saved_videomode = 0;
+#endif
 extern char wakeup_start, wakeup_end;
 
 extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long));
@@ -29,6 +42,9 @@ int acpi_save_state_mem(void)
 {
 	if (!acpi_wakeup_address)
 		return 1;
+#ifdef __XEN__
+	init_low_mappings();
+#endif
 	memcpy((void *)acpi_wakeup_address, &wakeup_start,
 	       &wakeup_end - &wakeup_start);
 	acpi_copy_wakeup_routine(acpi_wakeup_address);
@@ -59,11 +75,20 @@ void __init acpi_reserve_bootmem(void)
 		return;
 	}
 
+#ifndef __XEN__
 	acpi_wakeup_address = (unsigned
long)alloc_bootmem_low(PAGE_SIZE);
+#else
+	/*  0~640K is not used by anyone, except 0x9000 is used by smp
+	 *  trampoline code, so choose 0x7000 for XEN acpi wake up code
+	 */
+
+	acpi_wakeup_address = (unsigned long)__va(0x7000);
+#endif
 	if (!acpi_wakeup_address)
 		printk(KERN_ERR "ACPI: Cannot allocate lowmem, S3
disabled.\n");
 }
 
+#ifndef __XEN__
 static int __init acpi_sleep_setup(char *str)
 {
 	while ((str != NULL) && (*str != ''\0'')) {
@@ -104,3 +129,4 @@ static int __init acpisleep_dmi_init(voi
 }
 
 core_initcall(acpisleep_dmi_init);
+#endif
diff -r 13e258a58044 xen/arch/x86/x86_32/acpi/wakeup.S
--- a/xen/arch/x86/x86_32/acpi/wakeup.S	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/x86_32/acpi/wakeup.S	Wed Feb 14 11:13:40 2007 +0800
@@ -1,6 +1,11 @@
 .text
+#ifndef __XEN__
 #include <linux/linkage.h>
 #include <asm/segment.h>
+#else
+#include <xen/config.h>
+#include <asm/asm_defns.h>
+#endif
 #include <asm/page.h>
 
 #
@@ -56,7 +61,11 @@ 1:
 1:
 
 	# set up page table
+#ifndef __XEN__
 	movl	$swsusp_pg_dir-__PAGE_OFFSET, %eax
+#else
+	movl    $idle_pg_table-__PAGE_OFFSET, %eax
+#endif
 	movl	%eax, %cr3
 
 	testl	$1, real_efer_save_restore - wakeup_code
@@ -88,7 +97,11 @@ 1:
 	cmpl	$0x12345678, %eax
 	jne	bogus_real_magic
 
+#ifndef __XEN__
 	ljmpl	$__KERNEL_CS,$wakeup_pmode_return
+#else
+	ljmpl   $(__HYPERVISOR_CS),$wakeup_pmode_return
+#endif
 
 real_save_gdt:	.word 0
 		.long 0
@@ -184,7 +197,11 @@ ENTRY(wakeup_end)
 .org	0x1000
 
 wakeup_pmode_return:
+#ifndef __XEN__
 	movw	$__KERNEL_DS, %ax
+#else
+	movw    $__HYPERVISOR_DS, %ax
+#endif
 	movw	%ax, %ss
 	movw	%ax, %ds
 	movw	%ax, %es
@@ -196,7 +213,11 @@ wakeup_pmode_return:
 	lgdt	saved_gdt
 	lidt	saved_idt
 	lldt	saved_ldt
+#ifndef __XEN__
 	ljmp	$(__KERNEL_CS),$1f
+#else
+	ljmp    $(__HYPERVISOR_CS),$1f
+#endif
 1:
 	movl	%cr3, %eax
 	movl	%eax, %cr3
diff -r 13e258a58044 xen/arch/x86/x86_32/mm.c
--- a/xen/arch/x86/x86_32/mm.c	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/x86_32/mm.c	Wed Feb 14 11:13:40 2007 +0800
@@ -34,6 +34,7 @@ unsigned int PAGE_HYPERVISOR_NOCACHE = _
 unsigned int PAGE_HYPERVISOR_NOCACHE = __PAGE_HYPERVISOR_NOCACHE;
 
 static unsigned long mpt_size;
+int nx_enabled = 0;
 
 struct page_info *alloc_xen_pagetable(void)
 {
@@ -132,7 +133,7 @@ void __init setup_idle_pagetable(void)
                                 __PAGE_HYPERVISOR));
 }
 
-void __init zap_low_mappings(l2_pgentry_t *base)
+void zap_low_mappings(l2_pgentry_t *base)
 {
     int i;
     u32 addr;
@@ -146,6 +147,15 @@ void __init zap_low_mappings(l2_pgentry_
             continue;
         l2e_write(&base[i], l2e_empty());
     }
+
+    flush_tlb_all_pge();
+}
+
+void init_low_mappings(void)
+{
+    memcpy(idle_pg_table_l2,
+           idle_pg_table_l2 + (DIRECTMAP_VIRT_START >>
L2_PAGETABLE_SHIFT),
+           (DIRECTMAP_MBYTES << 20) >> L2_PAGETABLE_SHIFT);
 
     flush_tlb_all_pge();
 }
diff -r 13e258a58044 xen/arch/x86/x86_32/power/cpu.c
--- a/xen/arch/x86/x86_32/power/cpu.c	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/x86_32/power/cpu.c	Wed Feb 14 14:59:56 2007 +0800
@@ -7,10 +7,91 @@
  * Copyright (c) 2001 Patrick Mochel <mochel@osdl.org>
  */
 
+#ifndef __XEN__
 #include <linux/module.h>
 #include <linux/suspend.h>
 #include <asm/mtrr.h>
 #include <asm/mce.h>
+#else
+#include <xen/config.h>
+#include <xen/acpi.h>
+#include <xen/smp.h>
+#include <asm/processor.h>
+#include <asm/msr.h>
+#include <asm/flushtlb.h>
+
+/* image of the saved processor state */
+struct saved_context {
+	u16 es, fs, gs, ss;
+	unsigned long cr0, cr2, cr3, cr4;
+	u16 gdt_pad;
+	u16 gdt_limit;
+	unsigned long gdt_base;
+	u16 idt_pad;
+	u16 idt_limit;
+	unsigned long idt_base;
+	u16 ldt;
+	u16 tss;
+	unsigned long tr;
+	unsigned long safety;
+	unsigned long return_address;
+} __attribute__((packed));
+
+#define load_TR_desc() __asm__ __volatile__("ltr %w0"::"q"
(GDT_ENTRY_TSS*8))
+#define load_LDT_desc() __asm__ __volatile__("lldt
%w0"::"q"
(GDT_ENTRY_LDT*8))
+
+#define load_gdt(dtr) __asm__ __volatile("lgdt %0"::"m"
(*dtr))
+#define load_idt(dtr) __asm__ __volatile("lidt %0"::"m"
(*dtr))
+#define load_tr(tr) __asm__ __volatile("ltr %0"::"mr" (tr))
+#define load_ldt(ldt) __asm__ __volatile("lldt %0"::"mr"
(ldt))
+
+#define store_gdt(dtr) __asm__ ("sgdt %0":"=m" (*dtr))
+#define store_idt(dtr) __asm__ ("sidt %0":"=m" (*dtr))
+#define store_tr(tr) __asm__ ("str %0":"=mr" (tr))
+#define store_ldt(ldt) __asm__ ("sldt %0":"=mr" (ldt))
+
+/*
+ * Load a segment. Fall back on loading the zero
+ * segment if something goes wrong..
+ */
+#define loadsegment(seg,value)          \
+    asm volatile("\n"           \
+        "1:\t"              \
+        "mov %0,%%" #seg "\n"       \
+        "2:\n"              \
+        ".section .fixup,\"ax\"\n"  \
+        "3:\t"              \
+        "pushl $0\n\t"          \
+        "popl %%" #seg "\n\t"       \
+        "jmp 2b\n"          \
+        ".previous\n"           \
+        ".section __ex_table,\"a\"\n\t" \
+        ".align 4\n\t"          \
+        ".long 1b,3b\n"         \
+        ".previous"         \
+        : :"rm" (value))
+
+/*
+ * Save a segment register away
+ */
+#define savesegment(seg, value) \
+	asm volatile("mov %%" #seg ",%0":"=rm" (value))
+
+#define set_debugreg(value, register)           \
+        __asm__("movl %0,%%db" #register        \
+            : /* no output */           \
+            :"r" (value))
+
+void kernel_fpu_begin(void)
+{
+	clts();
+}
+
+void kernel_fpu_end(void)
+{
+	stts();
+}
+#endif
 
 static struct saved_context saved_context;
 
@@ -34,8 +115,10 @@ void __save_processor_state(struct saved
 	 * segment registers
 	 */
  	savesegment(es, ctxt->es);
+#ifndef __XEN__
  	savesegment(fs, ctxt->fs);
  	savesegment(gs, ctxt->gs);
+#endif
  	savesegment(ss, ctxt->ss);
 
 	/*
@@ -60,6 +143,7 @@ static void do_fpu_end(void)
 	kernel_fpu_end();
 }
 
+#ifndef __XEN__
 static void fix_processor_context(void)
 {
 	int cpu = smp_processor_id();
@@ -84,6 +168,32 @@ static void fix_processor_context(void)
 	}
 
 }
+#else
+static void fix_processor_context(void)
+{
+	int cpu = smp_processor_id();
+	struct tss_struct * t = &init_tss[cpu];;
+
+	if ( supervisor_mode_kernel && cpu_has_sep )
+		wrmsr(MSR_IA32_SYSENTER_ESP, &t->esp1, 0);
+
+	set_tss_desc(cpu,t);	/* This just modifies memory; should not
be necessary. But... This is necessary, because 386 hardware has concept
of busy TSS or some similar stupidity. */
+
+	load_TR(cpu);          /* This does ltr */
+	__asm__ __volatile__ ( "lldt %%ax" : : "a" (0) );/* This
does
lldt */
+
+	/*
+	 * Now maybe reset the debug registers
+	 */
+	set_debugreg(0UL, 0);
+	set_debugreg(0UL, 1);
+	set_debugreg(0UL, 2);
+	set_debugreg(0UL, 3);
+	/* no 4 and 5 */
+	set_debugreg(0UL, 6);
+	set_debugreg(0UL, 7);
+}
+#endif
 
 void __restore_processor_state(struct saved_context *ctxt)
 {
@@ -106,15 +216,19 @@ void __restore_processor_state(struct sa
 	 * segment registers
 	 */
  	loadsegment(es, ctxt->es);
+#ifndef __XEN__
  	loadsegment(fs, ctxt->fs);
  	loadsegment(gs, ctxt->gs);
+#endif
  	loadsegment(ss, ctxt->ss);
 
+#ifndef __XEN__
 	/*
 	 * sysenter MSRs
 	 */
 	if (boot_cpu_has(X86_FEATURE_SEP))
 		enable_sep_cpu();
+#endif
 
 	fix_processor_context();
 	do_fpu_end();
@@ -127,6 +241,8 @@ void restore_processor_state(void)
 	__restore_processor_state(&saved_context);
 }
 
+#ifndef __XEN__
 /* Needed by apm.c */
 EXPORT_SYMBOL(save_processor_state);
 EXPORT_SYMBOL(restore_processor_state);
+#endif
diff -r 13e258a58044 xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/arch/x86/x86_64/mm.c	Wed Feb 14 11:13:40 2007 +0800
@@ -185,9 +185,16 @@ void __init setup_idle_pagetable(void)
                   __PAGE_HYPERVISOR));
 }
 
-void __init zap_low_mappings(void)
+void zap_low_mappings(void)
 {
     l4e_write(&idle_pg_table[0], l4e_empty());
+    flush_tlb_all_pge();
+}
+
+void init_low_mappings(void)
+{
+    l4e_write(&idle_pg_table[0],
+               l4e_from_paddr(__pa(idle_pg_table_l3),
__PAGE_HYPERVISOR));
     flush_tlb_all_pge();
 }
 
diff -r 13e258a58044 xen/include/asm-x86/config.h
--- a/xen/include/asm-x86/config.h	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/include/asm-x86/config.h	Wed Feb 14 14:59:48 2007 +0800
@@ -251,6 +251,7 @@
 #define CONFIG_DOMAIN_PAGE 1
 
 #define asmlinkage __attribute__((regparm(0)))
+#define FASTCALL(x) fastcall(x)
 
 /*
  * Memory layout (high to low):                          SIZE
PAE-SIZE
diff -r 13e258a58044 xen/include/asm-x86/processor.h
--- a/xen/include/asm-x86/processor.h	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/include/asm-x86/processor.h	Wed Feb 14 11:13:40 2007 +0800
@@ -295,6 +295,11 @@ static inline unsigned long read_cr2(voi
     unsigned long __cr2;
     __asm__("mov %%cr2,%0\n\t" :"=r" (__cr2));
     return __cr2;
+}
+
+static inline void write_cr2(unsigned long val)
+{
+       __asm__("mov %0,%%cr2": :"r" ((unsigned long)val));
 }
 
 static inline unsigned long read_cr4(void)
diff -r 13e258a58044 xen/include/asm-x86/smp.h
--- a/xen/include/asm-x86/smp.h	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/include/asm-x86/smp.h	Wed Feb 14 14:59:48 2007 +0800
@@ -45,6 +45,7 @@ extern void zap_low_mappings(l2_pgentry_
 extern void zap_low_mappings(l2_pgentry_t *base);
 #endif
 
+extern void init_low_mappings(void);
 #define MAX_APICID 256
 extern u8 x86_cpu_to_apicid[];
 
diff -r 13e258a58044 xen/include/asm-x86/page.h
--- a/xen/include/asm-x86/page.h	Wed Feb 14 11:13:40 2007 +0800
+++ b/xen/include/asm-x86/page.h	Wed Feb 14 15:00:49 2007 +0800
@@ -288,6 +288,9 @@ extern l2_pgentry_t   idle_pg_table_l2[R
 #else
 extern root_pgentry_t idle_pg_table[ROOT_PAGETABLE_ENTRIES];
 extern l2_pgentry_t   idle_pg_table_l2[ROOT_PAGETABLE_ENTRIES];
+#if CONFIG_PAGING_LEVELS == 4
+extern l3_pgentry_t   idle_pg_table_l3[L3_PAGETABLE_ENTRIES];
+#endif
 #ifdef CONFIG_COMPAT
 extern l2_pgentry_t  *compat_idle_pg_table_l2;
 extern unsigned int   m2p_compat_vstart;
diff -r 13e258a58044 xen/arch/x86/acpi/power.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/arch/x86/acpi/power.c	Wed Feb 14 14:59:58 2007 +0800
@@ -0,0 +1,149 @@
+/* drivers/acpi/sleep/power.c - PM core functionality for Xen
+ *
+ * Copyrights from Linux side:
+ * Copyright (c) 2000-2003 Patrick Mochel
+ * Copyright (c) 2003 Open Source Development Lab
+ * Copyright (c) 2004 David Shaohua Li <shaohua.li@intel.com>
+ * Copyright (c) 2005 Alexey Starikovskiy
<alexey.y.starikovskiy@intel.com>
+ *
+ * Slimmed with Xen specific support.
+ */
+
+#include <asm/io.h>
+#define CONFIG_ACPI_SLEEP
+#include <asm/acpi.h>
+#include <xen/acpi.h>
+#include <xen/errno.h>
+#include <xen/iocap.h>
+#include <xen/sched.h>
+#include <asm/acpi.h>
+#include <asm/irq.h>
+#include <asm/init.h>
+#include <xen/spinlock.h>
+#include <xen/sched.h>
+#include <xen/domain.h>
+#include <xen/console.h>
+
+u8 sleep_states[ACPI_S_STATE_COUNT];
+DEFINE_SPINLOCK(pm_lock);
+
+extern void do_suspend_lowlevel(void);
+
+static char *acpi_states[ACPI_S_STATE_COUNT] +{
+    [ACPI_STATE_S1] = "standby",
+    [ACPI_STATE_S3] = "mem",
+    [ACPI_STATE_S4] = "disk",
+};
+
+/* Add suspend failure recover later */
+static int device_power_down(void)
+{
+    console_suspend();
+
+    time_suspend();
+
+    i8259A_suspend();
+    
+    ioapic_suspend();
+    
+    lapic_suspend();
+
+    return 0;
+}
+
+static void device_power_up(void)
+{
+    lapic_resume();
+    
+    ioapic_resume();
+
+    i8259A_resume();
+    
+    time_resume();
+
+    console_resume();
+}
+
+int enter_state(u32 state)
+{
+    struct domain *d;
+    unsigned long flags;
+    int error;
+
+    if (state <= ACPI_STATE_S0 || state > ACPI_S_STATES_MAX)
+        return -EINVAL;
+
+    if (!spin_trylock(&pm_lock))
+        return -EBUSY;
+    
+    for_each_domain(d)
+       if (d->domain_id != 0)
+           domain_pause(d);
+
+    printk("PM: Preparing system for %s sleep\n",
acpi_states[state]);
+
+    local_irq_save(flags);
+
+    if ((error = device_power_down())) {
+        printk(KERN_ERR "Some devices failed to power down\n");
+        goto Done;
+    }
+
+    ACPI_FLUSH_CPU_CACHE();
+
+    /* Do arch specific saving of state. */
+    if (state > ACPI_STATE_S1) {
+        error = acpi_save_state_mem();
+        if (error)
+            goto Powerup;
+    }
+
+    switch (state) {
+        case ACPI_STATE_S3:
+            do_suspend_lowlevel();
+            break;
+        default:
+            error = -EINVAL;
+            goto Powerup;
+    }
+
+    printk("Back to C!\n");
+    if (state > ACPI_STATE_S1)
+        acpi_restore_state_mem();
+
+ Powerup:
+    device_power_up();
+
+    printk("PM: Finishing wakeup.\n");
+    for_each_domain(d)
+       if (d->domain_id!=0)
+           domain_unpause(d);
+
+ Done:
+    local_irq_restore(flags);
+    spin_unlock(&pm_lock);
+    return error;
+
+}
+
+static int __init acpi_sleep_init(void)
+{
+    int i = 0; 
+
+    printk("ACPI (supports");
+    for (i = 0; i < ACPI_S_STATE_COUNT; i++) {
+        if (i == ACPI_STATE_S3){
+            sleep_states[i] = 1;
+            printk(" S%d", i);
+        }
+        else{
+            sleep_states[i] = 0;
+        }
+    }
+    printk(")\n");
+
+    acpi_reserve_bootmem();
+    return 0;
+}
+__initcall(acpi_sleep_init);
diff -r 13e258a58044 xen/arch/x86/x86_32/acpi/Makefile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/arch/x86/x86_32/acpi/Makefile	Wed Feb 14 11:13:40 2007 +0800
@@ -0,0 +1,2 @@
+obj-y += wakeup.o
+obj-y += sleep.o
diff -r 13e258a58044 xen/arch/x86/x86_32/power/Makefile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/arch/x86/x86_32/power/Makefile	Wed Feb 14 11:13:40 2007
+0800
@@ -0,0 +1,1 @@
+obj-y += cpu.o
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Keir Fraser
2007-Jun-05  09:48 UTC
[Xen-devel] Re: [PATCH 3/12] Provide basic Xen PM infrastructure
A few comments are included below, but I should also add that I suspect the sleep/wakeup code is broken by the fact that x86/64 Xen is relocated in physical memory. The sleep/wakeup code should be potentially added to the trampoline at 0x90000? On 14/2/07 09:13, "Tian, Kevin" <kevin.tian@intel.com> wrote:> Add basic infrastructure for xen power management. Now > only S3 (suspend to ram) is supported. > > Signed-off-by Ke Yu <ke.yu@intel.com> > Signed-off-by Kevin Tian <kevin.tian@intel.com> > > --- a/xen/arch/x86/boot/x86_32.S Wed Feb 14 11:13:40 2007 +0800 > +++ b/xen/arch/x86/boot/x86_32.S Wed Feb 14 11:13:40 2007 +0800 > @@ -146,6 +146,8 @@ start_paging: > rdmsr > bts $_EFER_NX,%eax > wrmsr > + mov $1,%eax > + mov %eax, nx_enabled-__PAGE_OFFSET > no_execute_disable: > pop %ebx > #endifThe boot code has changed so this won''t apply. In any case you can use cpu_has_nx, or create a macro called nx_enabled. There''s no need for another global variable.> diff -r 13e258a58044 xen/arch/x86/smp.c > --- a/xen/arch/x86/smp.c Wed Feb 14 11:13:40 2007 +0800 > +++ b/xen/arch/x86/smp.c Wed Feb 14 14:59:49 2007 +0800 > @@ -276,8 +276,9 @@ int on_selected_cpus( > { > struct call_data_struct data; > unsigned int nr_cpus = cpus_weight(selected); > - > - ASSERT(local_irq_is_enabled()); > + unsigned int self = cpu_isset(smp_processor_id(), selected); > + > + ASSERT(!self || local_irq_is_enabled()); > > if ( nr_cpus == 0 ) > return 0;That''s rather bogus isn''t it? -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Tian, Kevin
2007-Jun-05  10:02 UTC
[Xen-devel] RE: [PATCH 3/12] Provide basic Xen PM infrastructure
>From: Keir Fraser [mailto:keir@xensource.com] >Sent: 2007年6月5日 17:49 > >A few comments are included below, but I should also add that I suspect >the >sleep/wakeup code is broken by the fact that x86/64 Xen is relocated in >physical memory. The sleep/wakeup code should be potentially added to >the >trampoline at 0x90000?Thanks for your comments, and yes the relocation may break this logic. But it should be easy to fix that, since only wakeup code is affected. So do you prefer to checking the basic code first, and then let me to catch up some fix to make it re-work, or asking me to resend all patches after a local rebase? BTW, you should look at the latest version at: http://lists.xensource.com/archives/html/xen-devel/2007-05/msg00536.html>> >> --- a/xen/arch/x86/boot/x86_32.S Wed Feb 14 11:13:40 2007 +0800 >> +++ b/xen/arch/x86/boot/x86_32.S Wed Feb 14 11:13:40 2007 +0800 >> @@ -146,6 +146,8 @@ start_paging: >> rdmsr >> bts $_EFER_NX,%eax >> wrmsr >> + mov $1,%eax >> + mov %eax, nx_enabled-__PAGE_OFFSET >> no_execute_disable: >> pop %ebx >> #endif > >The boot code has changed so this won''t apply. In any case you can use >cpu_has_nx, or create a macro called nx_enabled. There''s no need for >another >global variable.Sure.>> unsigned int nr_cpus = cpus_weight(selected); >> - >> - ASSERT(local_irq_is_enabled()); >> + unsigned int self = cpu_isset(smp_processor_id(), selected); >> + >> + ASSERT(!self || local_irq_is_enabled()); >> >> if ( nr_cpus == 0 ) >> return 0; > >That''s rather bogus isn''t it? >Yes bogus, and it was removed in latest version I sent out in May as link above.:-) Thanks, Kevin _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Tian, Kevin
2007-Jun-05  10:22 UTC
[Xen-devel] RE: [PATCH 3/12] Provide basic Xen PM infrastructure
>From: Keir Fraser [mailto:keir@xensource.com] >Sent: 2007年6月5日 17:49 > > >A few comments are included below, but I should also add that I suspect >the >sleep/wakeup code is broken by the fact that x86/64 Xen is relocated in >physical memory. The sleep/wakeup code should be potentially added to >the >trampoline at 0x90000? >How is the relocation address decided for x86-64 Xen? Since trampoline code still uses 0x90000 as the case before relocation change, I guess wakeup code can still work since it''s hard coded to 0x7000 by far. As long as 0-1M is still special owned by dom_io (not participate into heap allocation), I guess that wakeup code should still work. Thanks, Kevin _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Keir Fraser
2007-Jun-05  10:29 UTC
Re: [Xen-devel] RE: [PATCH 3/12] Provide basic Xen PM infrastructure
On 5/6/07 11:22, "Tian, Kevin" <kevin.tian@intel.com> wrote:> How is the relocation address decided for x86-64 Xen? Since trampoline > code still uses 0x90000 as the case before relocation change, I guess > wakeup code can still work since it''s hard coded to 0x7000 by far. As > long as 0-1M is still special owned by dom_io (not participate into heap > allocation), I guess that wakeup code should still work.Ah, okay. Fair enough. Also I was indeed looking at the wrong patchset. I''ll pull down the May patches and complain about those instead. :-) Yes, for small issues I''ll either fix them myself or apply and let you fix with follow-up patches. -- Keir _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel