[XEN] Various cleanups to bitops usage.
authorkfraser@dhcp93.uk.xensource.com <kfraser@dhcp93.uk.xensource.com>
Tue, 27 Jun 2006 13:34:52 +0000 (14:34 +0100)
committerkfraser@dhcp93.uk.xensource.com <kfraser@dhcp93.uk.xensource.com>
Tue, 27 Jun 2006 13:34:52 +0000 (14:34 +0100)
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/hvm/vioapic.c
xen/arch/x86/hvm/vlapic.c
xen/arch/x86/smp.c
xen/include/asm-x86/bitops.h
xen/include/asm-x86/hvm/vlapic.h
xen/include/public/hvm/ioreq.h

index f3bde8d9ba5bebf83a339e10b3e811edbd54f6df..d868f3092d0e59f4fbbaa4d5157e583a45ad7a9d 100644 (file)
@@ -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;
index 89cd82afd70562732b07f8554ead78f8de78549a..af50550c5330131ec68a1ba70d104324bc50a295 100644 (file)
@@ -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;
 
index d56440d8e6f540d1e311d724fd3973ba39aab09e..27dc4daf87de7dc6976b1de1f82d6751b6b4c356 100644 (file)
@@ -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 ( ; ; )
index 605a091da80a9f58407798cb2c1873e6678fb25e..b2ee953361f1161a9b8a8f585d87e8705b66477b 100644 (file)
@@ -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;
 }
 
 /**
index 95ee810a8b5ed339c7dbb77b47d5052be58abdf8..d2b11f3d8e59ae20dea17c8f1e8fec50e3be6d45 100644 (file)
 #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;
index c21dfe1896b3aae07b1c0c4885e03e45d34b8f43..76e107045c180b8b1f7edc5f94f05801793077d6 100644 (file)
@@ -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;