mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
[XEN] Various cleanups to bitops usage.
Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
1 parent
60d78dbe14
commit
64d2b4920b
6 files changed
+30
-81
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
+2
-1
@@ -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 ( ; ; )
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||