aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorGlauber Costa <gcosta@redhat.com>2008-02-11 14:16:04 -0500
committerIngo Molnar <mingo@elte.hu>2008-04-17 11:40:47 -0400
commit96597fd2be7070631ad0776cd8bced21415fd5e3 (patch)
treef592ab1b01a1b10d032a44f0c2137693ec73df04 /arch
parent2785c8d052278228cc3806233c09295088f83d42 (diff)
x86: introduce vsmp paravirt helpers
Signed-off-by: Glauber Costa <gcosta@redhat.com> Signed-off-by: Ravikiran Thirumalai <kiran@scalemp.com> Acked-by: Shai Fultheim <shai@scalemp.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/Kconfig3
-rw-r--r--arch/x86/kernel/vsmp_64.c56
2 files changed, 58 insertions, 1 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 6c70fed0f9a0..ed7f72b39113 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -328,7 +328,8 @@ config X86_RDC321X
328config X86_VSMP 328config X86_VSMP
329 bool "Support for ScaleMP vSMP" 329 bool "Support for ScaleMP vSMP"
330 depends on X86_64 && PCI 330 depends on X86_64 && PCI
331 help 331 select PARAVIRT
332 help
332 Support for ScaleMP vSMP systems. Say 'Y' here if this kernel is 333 Support for ScaleMP vSMP systems. Say 'Y' here if this kernel is
333 supposed to run on these EM64T-based machines. Only choose this option 334 supposed to run on these EM64T-based machines. Only choose this option
334 if you have one of these machines. 335 if you have one of these machines.
diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c
index fdf9fba6ba9c..b93ed66c754f 100644
--- a/arch/x86/kernel/vsmp_64.c
+++ b/arch/x86/kernel/vsmp_64.c
@@ -8,6 +8,8 @@
8 * 8 *
9 * Ravikiran Thirumalai <kiran@scalemp.com>, 9 * Ravikiran Thirumalai <kiran@scalemp.com>,
10 * Shai Fultheim <shai@scalemp.com> 10 * Shai Fultheim <shai@scalemp.com>
11 * Paravirt ops integration: Glauber de Oliveira Costa <gcosta@redhat.com>,
12 * Ravikiran Thirumalai <kiran@scalemp.com>
11 */ 13 */
12 14
13#include <linux/init.h> 15#include <linux/init.h>
@@ -15,6 +17,60 @@
15#include <linux/pci_regs.h> 17#include <linux/pci_regs.h>
16#include <asm/pci-direct.h> 18#include <asm/pci-direct.h>
17#include <asm/io.h> 19#include <asm/io.h>
20#include <asm/paravirt.h>
21
22/*
23 * Interrupt control on vSMPowered systems:
24 * ~AC is a shadow of IF. If IF is 'on' AC should be 'off'
25 * and vice versa.
26 */
27
28static unsigned long vsmp_save_fl(void)
29{
30 unsigned long flags = native_save_fl();
31
32 if (!(flags & X86_EFLAGS_IF) || (flags & X86_EFLAGS_AC))
33 flags &= ~X86_EFLAGS_IF;
34 return flags;
35}
36
37static void vsmp_restore_fl(unsigned long flags)
38{
39 if (flags & X86_EFLAGS_IF)
40 flags &= ~X86_EFLAGS_AC;
41 else
42 flags |= X86_EFLAGS_AC;
43 native_restore_fl(flags);
44}
45
46static void vsmp_irq_disable(void)
47{
48 unsigned long flags = native_save_fl();
49
50 native_restore_fl((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC);
51}
52
53static void vsmp_irq_enable(void)
54{
55 unsigned long flags = native_save_fl();
56
57 native_restore_fl((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC));
58}
59
60static unsigned __init vsmp_patch(u8 type, u16 clobbers, void *ibuf,
61 unsigned long addr, unsigned len)
62{
63 switch (type) {
64 case PARAVIRT_PATCH(pv_irq_ops.irq_enable):
65 case PARAVIRT_PATCH(pv_irq_ops.irq_disable):
66 case PARAVIRT_PATCH(pv_irq_ops.save_fl):
67 case PARAVIRT_PATCH(pv_irq_ops.restore_fl):
68 return paravirt_patch_default(type, clobbers, ibuf, addr, len);
69 default:
70 return native_patch(type, clobbers, ibuf, addr, len);
71 }
72
73}
18 74
19void __init vsmp_init(void) 75void __init vsmp_init(void)
20{ 76{