diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-04-16 12:44:16 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-04-16 12:44:16 +0000 |
commit | dcc63e79155b1df7793b3fecccf1e395298c8ee7 (patch) | |
tree | ce727b6d106f393a41f58253575ac4799a6aa4bb /xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h | |
parent | 73f339d4f3aa7023b29e3c4d335b796fd20e2b26 (diff) | |
download | xen-dcc63e79155b1df7793b3fecccf1e395298c8ee7.tar.gz xen-dcc63e79155b1df7793b3fecccf1e395298c8ee7.tar.bz2 xen-dcc63e79155b1df7793b3fecccf1e395298c8ee7.zip |
bitkeeper revision 1.172 (3e9d5020hc5RUkx3ArM71EjZ_UUbgw)
Many files:
Fixed event masking so that events can be individually masked. Fixed Xenolinux config/build system.
Diffstat (limited to 'xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h')
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h index e318716a66..387ac0fdad 100644 --- a/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h +++ b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/system.h @@ -312,31 +312,47 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, #define set_mb(var, value) do { xchg(&var, value); } while (0) #define set_wmb(var, value) do { var = value; wmb(); } while (0) -/* interrupt control.. */ -#define __save_flags(x) ((x) = HYPERVISOR_shared_info->events_enable); barrier() -#define __restore_flags(x) \ -do { \ - shared_info_t *_shared = HYPERVISOR_shared_info; \ - _shared->events_enable = (x); \ - barrier(); \ - if ( unlikely(_shared->events) && (x) ) do_hypervisor_callback(NULL); \ + +#define __save_flags(x) \ +do { \ + (x) = test_bit(EVENTS_MASTER_ENABLE_BIT, \ + &HYPERVISOR_shared_info->events_mask); \ + barrier(); \ +} while (0) + +#define __restore_flags(x) \ +do { \ + shared_info_t *_shared = HYPERVISOR_shared_info; \ + if (x) set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask); \ + barrier(); \ + if ( unlikely(_shared->events) && (x) ) do_hypervisor_callback(NULL); \ +} while (0) + +#define __cli() \ +do { \ + clear_bit(EVENTS_MASTER_ENABLE_BIT, &HYPERVISOR_shared_info->events_mask);\ + barrier(); \ } while (0) -#define __cli() (HYPERVISOR_shared_info->events_enable = 0); barrier() -#define __sti() \ -do { \ - shared_info_t *_shared = HYPERVISOR_shared_info; \ - _shared->events_enable = 1; \ - barrier(); \ - if ( unlikely(_shared->events) ) do_hypervisor_callback(NULL); \ + +#define __sti() \ +do { \ + shared_info_t *_shared = HYPERVISOR_shared_info; \ + set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask); \ + barrier(); \ + if ( unlikely(_shared->events) ) do_hypervisor_callback(NULL); \ } while (0) + #define safe_halt() ((void)0) #define __save_and_cli(x) do { __save_flags(x); __cli(); } while(0); #define __save_and_sti(x) do { __save_flags(x); __sti(); } while(0); -/* For spinlocks etc */ -//XXX#define local_irq_set(x) __save_and_sti(x) -#define local_irq_save(x) ((x) = HYPERVISOR_shared_info->events_enable); (HYPERVISOR_shared_info->events_enable = 0); barrier() +#define local_irq_save(x) \ +do { \ + (x) = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT, \ + &HYPERVISOR_shared_info->events_mask); \ + barrier(); \ +} while (0) #define local_irq_restore(x) __restore_flags(x) #define local_irq_disable() __cli() #define local_irq_enable() __sti() |