[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Fix assumption about size of irq_cpustat_t in assembly code.



ChangeSet 1.1338.1.1, 2005/04/20 14:00:18+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        Fix assumption about size of irq_cpustat_t in assembly code.
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>



 arch/x86/x86_32/asm-offsets.c |   10 ++++++++++
 arch/x86/x86_32/entry.S       |    4 ++--
 arch/x86/x86_64/asm-offsets.c |   10 ++++++++++
 arch/x86/x86_64/entry.S       |   15 ++++++---------
 include/asm-x86/config.h      |   10 +++-------
 5 files changed, 31 insertions(+), 18 deletions(-)


diff -Nru a/xen/arch/x86/x86_32/asm-offsets.c 
b/xen/arch/x86/x86_32/asm-offsets.c
--- a/xen/arch/x86/x86_32/asm-offsets.c 2005-04-20 10:03:50 -04:00
+++ b/xen/arch/x86/x86_32/asm-offsets.c 2005-04-20 10:03:50 -04:00
@@ -15,6 +15,13 @@
 #define OFFSET(_sym, _str, _mem) \
     DEFINE(_sym, offsetof(_str, _mem));
 
+/* base-2 logarithm */
+#define __L2(_x)  (((_x) & 0x00000002) ?   1 : 0)
+#define __L4(_x)  (((_x) & 0x0000000c) ? ( 2 + __L2( (_x)>> 2)) : __L2( _x))
+#define __L8(_x)  (((_x) & 0x000000f0) ? ( 4 + __L4( (_x)>> 4)) : __L4( _x))
+#define __L16(_x) (((_x) & 0x0000ff00) ? ( 8 + __L8( (_x)>> 8)) : __L8( _x))
+#define LOG_2(_x) (((_x) & 0xffff0000) ? (16 + __L16((_x)>>16)) : __L16(_x))
+
 void __dummy__(void)
 {
     OFFSET(XREGS_eax, struct xen_regs, eax);
@@ -78,4 +85,7 @@
     BLANK();
 
     DEFINE(FIXMAP_apic_base, fix_to_virt(FIX_APIC_BASE));
+    BLANK();
+
+    DEFINE(IRQSTAT_shift, LOG_2(sizeof(irq_cpustat_t)));
 }
diff -Nru a/xen/arch/x86/x86_32/entry.S b/xen/arch/x86/x86_32/entry.S
--- a/xen/arch/x86/x86_32/entry.S       2005-04-20 10:03:50 -04:00
+++ b/xen/arch/x86/x86_32/entry.S       2005-04-20 10:03:50 -04:00
@@ -140,7 +140,7 @@
         cli                             # tests must not race interrupts
 /*test_softirqs:*/  
         movl EDOMAIN_processor(%ebx),%eax
-        shl  $6,%eax                    # sizeof(irq_cpustat) == 64
+        shl  $IRQSTAT_shift,%eax
         test %ecx,SYMBOL_NAME(irq_stat)(%eax,1)
         jnz  vmx_process_softirqs
 
@@ -270,7 +270,7 @@
         cli                             # tests must not race interrupts
 /*test_softirqs:*/  
         movl EDOMAIN_processor(%ebx),%eax
-        shl  $6,%eax                    # sizeof(irq_cpustat) == 64
+        shl  $IRQSTAT_shift,%eax
         test %ecx,SYMBOL_NAME(irq_stat)(%eax,1)
         jnz  process_softirqs
 /*test_guest_events:*/
diff -Nru a/xen/arch/x86/x86_64/asm-offsets.c 
b/xen/arch/x86/x86_64/asm-offsets.c
--- a/xen/arch/x86/x86_64/asm-offsets.c 2005-04-20 10:03:50 -04:00
+++ b/xen/arch/x86/x86_64/asm-offsets.c 2005-04-20 10:03:50 -04:00
@@ -15,6 +15,13 @@
 #define OFFSET(_sym, _str, _mem) \
     DEFINE(_sym, offsetof(_str, _mem));
 
+/* base-2 logarithm */
+#define __L2(_x)  (((_x) & 0x00000002) ?   1 : 0)
+#define __L4(_x)  (((_x) & 0x0000000c) ? ( 2 + __L2( (_x)>> 2)) : __L2( _x))
+#define __L8(_x)  (((_x) & 0x000000f0) ? ( 4 + __L4( (_x)>> 4)) : __L4( _x))
+#define __L16(_x) (((_x) & 0x0000ff00) ? ( 8 + __L8( (_x)>> 8)) : __L8( _x))
+#define LOG_2(_x) (((_x) & 0xffff0000) ? (16 + __L16((_x)>>16)) : __L16(_x))
+
 void __dummy__(void)
 {
     OFFSET(XREGS_r15, struct xen_regs, r15);
@@ -77,4 +84,7 @@
     OFFSET(MULTICALL_arg3, multicall_entry_t, args[3]);
     OFFSET(MULTICALL_arg4, multicall_entry_t, args[4]);
     OFFSET(MULTICALL_result, multicall_entry_t, args[5]);
+    BLANK();
+
+    DEFINE(IRQSTAT_shift, LOG_2(sizeof(irq_cpustat_t)));
 }
diff -Nru a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S       2005-04-20 10:03:50 -04:00
+++ b/xen/arch/x86/x86_64/entry.S       2005-04-20 10:03:50 -04:00
@@ -130,7 +130,7 @@
         cli                             # tests must not race interrupts
 /*test_softirqs:*/  
         movl  EDOMAIN_processor(%rbx),%eax
-        shl   $6,%rax                    # sizeof(irq_cpustat) == 64
+        shl   $IRQSTAT_shift,%rax
         leaq  SYMBOL_NAME(irq_stat)(%rip),%rcx
         testl $~0,(%rcx,%rax,1)
         jnz   process_softirqs
@@ -237,16 +237,13 @@
 vmx_test_all_events:
         GET_CURRENT(%rbx)
 /* test_all_events: */
-        xorq %rcx,%rcx
-        notq %rcx
         cli                             # tests must not race interrupts
 /*test_softirqs:*/  
-        movq EDOMAIN_processor(%rbx),%rax
-#if 0
-        shl  $6,%rax                    # sizeof(irq_cpustat) == 64
-        test %rcx,SYMBOL_NAME(irq_stat)(%rax,1)
-#endif
-        jnz  vmx_process_softirqs
+        movl  EDOMAIN_processor(%rbx),%eax
+        shl   $IRQSTAT_shift,%rax
+        leaq  SYMBOL_NAME(irq_stat)(%rip), %rdx
+        testl $~0,(%rdx,%rax,1)
+        jnz   vmx_process_softirqs
 
 vmx_restore_all_guest:
         call SYMBOL_NAME(load_cr2)
diff -Nru a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h
--- a/xen/include/asm-x86/config.h      2005-04-20 10:03:50 -04:00
+++ b/xen/include/asm-x86/config.h      2005-04-20 10:03:50 -04:00
@@ -16,7 +16,9 @@
 #define CONFIG_X86_LOCAL_APIC 1
 #define CONFIG_X86_GOOD_APIC 1
 #define CONFIG_X86_IO_APIC 1
-#define CONFIG_X86_L1_CACHE_SHIFT 5
+
+/* Intel P4 currently has largest cache line (L2 line size is 128 bytes). */
+#define CONFIG_X86_L1_CACHE_SHIFT 7
 
 #define CONFIG_ACPI 1
 #define CONFIG_ACPI_BOOT 1
@@ -53,12 +55,6 @@
 
 #define OPT_CONSOLE_STR "com1,vga"
 
-/*
- * Just to keep compiler happy.
- * NB. DO NOT CHANGE SMP_CACHE_BYTES WITHOUT FIXING arch/i386/entry.S!!!
- * It depends on size of irq_cpustat_t, for example, being 64 bytes. :-)
- */
-#define SMP_CACHE_BYTES 64
 #define NR_CPUS 16
 
 /* Linkage for x86 */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.