aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/hvm/vioapic.c9
-rw-r--r--xen/arch/x86/hvm/vlapic.c10
-rw-r--r--xen/arch/x86/smp.c3
-rw-r--r--xen/include/asm-x86/bitops.h22
-rw-r--r--xen/include/asm-x86/hvm/vlapic.h62
-rw-r--r--xen/include/public/hvm/ioreq.h5
6 files changed, 30 insertions, 81 deletions
diff --git a/xen/arch/x86/hvm/vioapic.c b/xen/arch/x86/hvm/vioapic.c
index f3bde8d9ba..d868f3092d 100644
--- a/xen/arch/x86/hvm/vioapic.c
+++ b/xen/arch/x86/hvm/vioapic.c
@@ -450,15 +450,10 @@ static void ioapic_deliver(hvm_vioapic_t *s, int irqno)
static int ioapic_get_highest_irq(hvm_vioapic_t *s)
{
- uint32_t irqs;
-
- ASSERT(s);
-
- irqs = s->irr & ~s->isr & ~s->imr;
- return __fls(irqs);
+ uint32_t irqs = s->irr & ~s->isr & ~s->imr;
+ return fls(irqs) - 1;
}
-
static void service_ioapic(hvm_vioapic_t *s)
{
int irqno;
diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
index 89cd82afd7..af50550c53 100644
--- a/xen/arch/x86/hvm/vlapic.c
+++ b/xen/arch/x86/hvm/vlapic.c
@@ -50,7 +50,7 @@ int vlapic_find_highest_irr(struct vlapic *vlapic)
{
int result;
- result = find_highest_bit((uint32_t *)&vlapic->irr[0], INTR_LEN_32);
+ result = find_highest_bit(vlapic->irr, MAX_VECTOR);
if ( result != -1 && result < 16 )
{
@@ -79,14 +79,14 @@ int vlapic_find_highest_isr(struct vlapic *vlapic)
{
int result;
- result = find_highest_bit((uint32_t *)&vlapic->isr[0], INTR_LEN_32);
+ result = find_highest_bit(vlapic->isr, MAX_VECTOR);
if ( result != -1 && result < 16 )
{
int i = 0;
printk("VLAPIC: isr on reserved bits %d, isr is\n ", result);
- for ( i = 0; i < INTR_LEN_32; i += 2 )
- printk("%d: 0x%08x%08x\n", i, vlapic->isr[i], vlapic->isr[i+1]);
+ for ( i = 0; i < ARRAY_SIZE(vlapic->isr); i++ )
+ printk("%d: %p\n", i, (void *)vlapic->isr[i]);
return -1;
}
@@ -896,7 +896,7 @@ vlapic_check_direct_intr(struct vcpu *v, int * mode)
struct vlapic *vlapic = VLAPIC(v);
int type;
- type = __fls(vlapic->direct_intr.deliver_mode);
+ type = fls(vlapic->direct_intr.deliver_mode) - 1;
if ( type == -1 )
return -1;
diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c
index d56440d8e6..27dc4daf87 100644
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -302,8 +302,9 @@ int on_selected_cpus(
static void stop_this_cpu (void *dummy)
{
- clear_bit(smp_processor_id(), &cpu_online_map);
+ cpu_clear(smp_processor_id(), cpu_online_map);
+ local_irq_disable();
disable_local_APIC();
for ( ; ; )
diff --git a/xen/include/asm-x86/bitops.h b/xen/include/asm-x86/bitops.h
index 605a091da8..b2ee953361 100644
--- a/xen/include/asm-x86/bitops.h
+++ b/xen/include/asm-x86/bitops.h
@@ -335,8 +335,6 @@ static inline unsigned long ffz(unsigned long word)
return word;
}
-#define fls64(x) generic_fls64(x)
-
/**
* ffs - find first bit set
* @x: the word to search
@@ -345,15 +343,15 @@ static inline unsigned long ffz(unsigned long word)
* the libc and compiler builtin ffs routines, therefore
* differs in spirit from the above ffz (man ffs).
*/
-static inline int ffs(int x)
+static inline int ffs(unsigned long x)
{
- int r;
+ long r;
- __asm__("bsfl %1,%0\n\t"
+ __asm__("bsf %1,%0\n\t"
"jnz 1f\n\t"
- "movl $-1,%0\n"
+ "mov $-1,%0\n"
"1:" : "=r" (r) : "rm" (x));
- return r+1;
+ return (int)r+1;
}
/**
@@ -362,15 +360,15 @@ static inline int ffs(int x)
*
* This is defined the same way as ffs.
*/
-static inline int fls(int x)
+static inline int fls(unsigned long x)
{
- int r;
+ long r;
- __asm__("bsrl %1,%0\n\t"
+ __asm__("bsr %1,%0\n\t"
"jnz 1f\n\t"
- "movl $-1,%0\n"
+ "mov $-1,%0\n"
"1:" : "=r" (r) : "rm" (x));
- return r+1;
+ return (int)r+1;
}
/**
diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h
index 95ee810a8b..d2b11f3d8e 100644
--- a/xen/include/asm-x86/hvm/vlapic.h
+++ b/xen/include/asm-x86/hvm/vlapic.h
@@ -23,52 +23,12 @@
#include <asm/msr.h>
#include <public/hvm/ioreq.h>
-#if defined(__i386__) || defined(__x86_64__)
-static inline int __fls(uint32_t word)
+static __inline__ int find_highest_bit(unsigned long *data, int nr_bits)
{
- int bit;
-
- __asm__("bsrl %1,%0"
- :"=r" (bit)
- :"rm" (word));
- return word ? bit : -1;
-}
-#else
-#define __fls(x) generic_fls(x)
-static __inline__ int generic_fls(uint32_t x)
-{
- int r = 31;
-
- if (!x)
- return -1;
- if (!(x & 0xffff0000u)) {
- x <<= 16;
- r -= 16;
- }
- if (!(x & 0xff000000u)) {
- x <<= 8;
- r -= 8;
- }
- if (!(x & 0xf0000000u)) {
- x <<= 4;
- r -= 4;
- }
- if (!(x & 0xc0000000u)) {
- x <<= 2;
- r -= 2;
- }
- if (!(x & 0x80000000u)) {
- x <<= 1;
- r -= 1;
- }
- return r;
-}
-#endif
-
-static __inline__ int find_highest_bit(uint32_t *data, int length)
-{
- while(length && !data[--length]);
- return __fls(data[length]) + 32 * length;
+ int length = BITS_TO_LONGS(nr_bits);
+ while ( length && !data[--length] )
+ continue;
+ return (fls(data[length]) - 1) + (length * BITS_PER_LONG);
}
#define VLAPIC(v) (v->arch.hvm_vcpu.vlapic)
@@ -146,17 +106,17 @@ typedef struct direct_intr_info {
int source[6];
} direct_intr_info_t;
-struct vlapic
-{
- //FIXME check what would be 64 bit on EM64T
+#define MAX_VECTOR 256
+
+struct vlapic {
uint32_t version;
uint32_t status;
uint32_t id;
uint32_t vcpu_id;
unsigned long base_address;
- uint32_t isr[8];
- uint32_t irr[INTR_LEN_32];
- uint32_t tmr[INTR_LEN_32];
+ unsigned long isr[BITS_TO_LONGS(MAX_VECTOR)];
+ unsigned long irr[BITS_TO_LONGS(MAX_VECTOR)];
+ unsigned long tmr[BITS_TO_LONGS(MAX_VECTOR)];
uint32_t task_priority;
uint32_t processor_priority;
uint32_t logical_dest;
diff --git a/xen/include/public/hvm/ioreq.h b/xen/include/public/hvm/ioreq.h
index c21dfe1896..76e107045c 100644
--- a/xen/include/public/hvm/ioreq.h
+++ b/xen/include/public/hvm/ioreq.h
@@ -58,11 +58,6 @@ struct ioreq {
};
typedef struct ioreq ioreq_t;
-#define MAX_VECTOR 256
-#define BITS_PER_BYTE 8
-#define INTR_LEN (MAX_VECTOR/(BITS_PER_BYTE * sizeof(uint64_t)))
-#define INTR_LEN_32 (MAX_VECTOR/(BITS_PER_BYTE * sizeof(uint32_t)))
-
struct global_iodata {
uint16_t pic_elcr;
uint16_t pic_irr;