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
|