diff options
Diffstat (limited to 'arch/x86/xen/irq.c')
-rw-r--r-- | arch/x86/xen/irq.c | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c index bb042608c602..cfd17799bd6d 100644 --- a/arch/x86/xen/irq.c +++ b/arch/x86/xen/irq.c | |||
@@ -19,27 +19,12 @@ void xen_force_evtchn_callback(void) | |||
19 | (void)HYPERVISOR_xen_version(0, NULL); | 19 | (void)HYPERVISOR_xen_version(0, NULL); |
20 | } | 20 | } |
21 | 21 | ||
22 | static void __init __xen_init_IRQ(void) | ||
23 | { | ||
24 | int i; | ||
25 | |||
26 | /* Create identity vector->irq map */ | ||
27 | for(i = 0; i < NR_VECTORS; i++) { | ||
28 | int cpu; | ||
29 | |||
30 | for_each_possible_cpu(cpu) | ||
31 | per_cpu(vector_irq, cpu)[i] = i; | ||
32 | } | ||
33 | |||
34 | xen_init_IRQ(); | ||
35 | } | ||
36 | |||
37 | static unsigned long xen_save_fl(void) | 22 | static unsigned long xen_save_fl(void) |
38 | { | 23 | { |
39 | struct vcpu_info *vcpu; | 24 | struct vcpu_info *vcpu; |
40 | unsigned long flags; | 25 | unsigned long flags; |
41 | 26 | ||
42 | vcpu = x86_read_percpu(xen_vcpu); | 27 | vcpu = percpu_read(xen_vcpu); |
43 | 28 | ||
44 | /* flag has opposite sense of mask */ | 29 | /* flag has opposite sense of mask */ |
45 | flags = !vcpu->evtchn_upcall_mask; | 30 | flags = !vcpu->evtchn_upcall_mask; |
@@ -50,6 +35,7 @@ static unsigned long xen_save_fl(void) | |||
50 | */ | 35 | */ |
51 | return (-flags) & X86_EFLAGS_IF; | 36 | return (-flags) & X86_EFLAGS_IF; |
52 | } | 37 | } |
38 | PV_CALLEE_SAVE_REGS_THUNK(xen_save_fl); | ||
53 | 39 | ||
54 | static void xen_restore_fl(unsigned long flags) | 40 | static void xen_restore_fl(unsigned long flags) |
55 | { | 41 | { |
@@ -62,7 +48,7 @@ static void xen_restore_fl(unsigned long flags) | |||
62 | make sure we're don't switch CPUs between getting the vcpu | 48 | make sure we're don't switch CPUs between getting the vcpu |
63 | pointer and updating the mask. */ | 49 | pointer and updating the mask. */ |
64 | preempt_disable(); | 50 | preempt_disable(); |
65 | vcpu = x86_read_percpu(xen_vcpu); | 51 | vcpu = percpu_read(xen_vcpu); |
66 | vcpu->evtchn_upcall_mask = flags; | 52 | vcpu->evtchn_upcall_mask = flags; |
67 | preempt_enable_no_resched(); | 53 | preempt_enable_no_resched(); |
68 | 54 | ||
@@ -76,6 +62,7 @@ static void xen_restore_fl(unsigned long flags) | |||
76 | xen_force_evtchn_callback(); | 62 | xen_force_evtchn_callback(); |
77 | } | 63 | } |
78 | } | 64 | } |
65 | PV_CALLEE_SAVE_REGS_THUNK(xen_restore_fl); | ||
79 | 66 | ||
80 | static void xen_irq_disable(void) | 67 | static void xen_irq_disable(void) |
81 | { | 68 | { |
@@ -83,9 +70,10 @@ static void xen_irq_disable(void) | |||
83 | make sure we're don't switch CPUs between getting the vcpu | 70 | make sure we're don't switch CPUs between getting the vcpu |
84 | pointer and updating the mask. */ | 71 | pointer and updating the mask. */ |
85 | preempt_disable(); | 72 | preempt_disable(); |
86 | x86_read_percpu(xen_vcpu)->evtchn_upcall_mask = 1; | 73 | percpu_read(xen_vcpu)->evtchn_upcall_mask = 1; |
87 | preempt_enable_no_resched(); | 74 | preempt_enable_no_resched(); |
88 | } | 75 | } |
76 | PV_CALLEE_SAVE_REGS_THUNK(xen_irq_disable); | ||
89 | 77 | ||
90 | static void xen_irq_enable(void) | 78 | static void xen_irq_enable(void) |
91 | { | 79 | { |
@@ -96,7 +84,7 @@ static void xen_irq_enable(void) | |||
96 | the caller is confused and is trying to re-enable interrupts | 84 | the caller is confused and is trying to re-enable interrupts |
97 | on an indeterminate processor. */ | 85 | on an indeterminate processor. */ |
98 | 86 | ||
99 | vcpu = x86_read_percpu(xen_vcpu); | 87 | vcpu = percpu_read(xen_vcpu); |
100 | vcpu->evtchn_upcall_mask = 0; | 88 | vcpu->evtchn_upcall_mask = 0; |
101 | 89 | ||
102 | /* Doesn't matter if we get preempted here, because any | 90 | /* Doesn't matter if we get preempted here, because any |
@@ -106,6 +94,7 @@ static void xen_irq_enable(void) | |||
106 | if (unlikely(vcpu->evtchn_upcall_pending)) | 94 | if (unlikely(vcpu->evtchn_upcall_pending)) |
107 | xen_force_evtchn_callback(); | 95 | xen_force_evtchn_callback(); |
108 | } | 96 | } |
97 | PV_CALLEE_SAVE_REGS_THUNK(xen_irq_enable); | ||
109 | 98 | ||
110 | static void xen_safe_halt(void) | 99 | static void xen_safe_halt(void) |
111 | { | 100 | { |
@@ -123,11 +112,13 @@ static void xen_halt(void) | |||
123 | } | 112 | } |
124 | 113 | ||
125 | static const struct pv_irq_ops xen_irq_ops __initdata = { | 114 | static const struct pv_irq_ops xen_irq_ops __initdata = { |
126 | .init_IRQ = __xen_init_IRQ, | 115 | .init_IRQ = xen_init_IRQ, |
127 | .save_fl = xen_save_fl, | 116 | |
128 | .restore_fl = xen_restore_fl, | 117 | .save_fl = PV_CALLEE_SAVE(xen_save_fl), |
129 | .irq_disable = xen_irq_disable, | 118 | .restore_fl = PV_CALLEE_SAVE(xen_restore_fl), |
130 | .irq_enable = xen_irq_enable, | 119 | .irq_disable = PV_CALLEE_SAVE(xen_irq_disable), |
120 | .irq_enable = PV_CALLEE_SAVE(xen_irq_enable), | ||
121 | |||
131 | .safe_halt = xen_safe_halt, | 122 | .safe_halt = xen_safe_halt, |
132 | .halt = xen_halt, | 123 | .halt = xen_halt, |
133 | #ifdef CONFIG_X86_64 | 124 | #ifdef CONFIG_X86_64 |