ia64/xen-unstable
view extras/mini-os/lock.c @ 19557:226ef307cd2e
AMD IOMMU: Fix ioapic interrupt remapping
A few ioapic redirection entries are initialized by hypervisor before
enabling iommu hardware. This patch copies those entries from ioapic
redirection table into interrupt remapping table after interrupt
remapping table has been allocated.
Signed-off-by: Wei Wang <wei.wang2@amd.com>
A few ioapic redirection entries are initialized by hypervisor before
enabling iommu hardware. This patch copies those entries from ioapic
redirection table into interrupt remapping table after interrupt
remapping table has been allocated.
Signed-off-by: Wei Wang <wei.wang2@amd.com>
author | Keir Fraser <keir.fraser@citrix.com> |
---|---|
date | Fri Apr 17 13:16:39 2009 +0100 (2009-04-17) |
parents | 433d1b26fd51 |
children |
line source
1 /*
2 * locks for newlib
3 *
4 * Samuel Thibault <Samuel.Thibault@eu.citrix.net>, July 20008
5 */
7 #ifdef HAVE_LIBC
9 #include <sys/lock.h>
10 #include <sched.h>
11 #include <wait.h>
13 int ___lock_init(_LOCK_T *lock)
14 {
15 lock->busy = 0;
16 init_waitqueue_head(&lock->wait);
17 return 0;
18 }
20 int ___lock_acquire(_LOCK_T *lock)
21 {
22 unsigned long flags;
23 while(1) {
24 wait_event(lock->wait, !lock->busy);
25 local_irq_save(flags);
26 if (!lock->busy)
27 break;
28 local_irq_restore(flags);
29 }
30 lock->busy = 1;
31 local_irq_restore(flags);
32 return 0;
33 }
35 int ___lock_try_acquire(_LOCK_T *lock)
36 {
37 unsigned long flags;
38 int ret = -1;
39 local_irq_save(flags);
40 if (!lock->busy) {
41 lock->busy = 1;
42 ret = 0;
43 }
44 local_irq_restore(flags);
45 return ret;
46 }
48 int ___lock_release(_LOCK_T *lock)
49 {
50 unsigned long flags;
51 local_irq_save(flags);
52 lock->busy = 0;
53 wake_up(&lock->wait);
54 local_irq_restore(flags);
55 return 0;
56 }
59 int ___lock_init_recursive(_LOCK_RECURSIVE_T *lock)
60 {
61 lock->owner = NULL;
62 init_waitqueue_head(&lock->wait);
63 return 0;
64 }
66 int ___lock_acquire_recursive(_LOCK_RECURSIVE_T *lock)
67 {
68 unsigned long flags;
69 if (lock->owner != get_current()) {
70 while (1) {
71 wait_event(lock->wait, lock->owner == NULL);
72 local_irq_save(flags);
73 if (lock->owner == NULL)
74 break;
75 local_irq_restore(flags);
76 }
77 lock->owner = get_current();
78 local_irq_restore(flags);
79 }
80 lock->count++;
81 return 0;
82 }
84 int ___lock_try_acquire_recursive(_LOCK_RECURSIVE_T *lock)
85 {
86 unsigned long flags;
87 int ret = -1;
88 local_irq_save(flags);
89 if (!lock->owner) {
90 ret = 0;
91 lock->owner = get_current();
92 lock->count++;
93 }
94 local_irq_restore(flags);
95 return ret;
96 }
98 int ___lock_release_recursive(_LOCK_RECURSIVE_T *lock)
99 {
100 unsigned long flags;
101 BUG_ON(lock->owner != get_current());
102 if (--lock->count)
103 return 0;
104 local_irq_save(flags);
105 lock->owner = NULL;
106 wake_up(&lock->wait);
107 local_irq_restore(flags);
108 return 0;
109 }
111 #endif