diff options
| -rw-r--r-- | arch/ia64/include/asm/xen/patchlist.h | 38 | ||||
| -rw-r--r-- | arch/ia64/kernel/vmlinux.lds.S | 6 | ||||
| -rw-r--r-- | arch/ia64/xen/Makefile | 16 | ||||
| -rw-r--r-- | arch/ia64/xen/gate-data.S | 3 | ||||
| -rw-r--r-- | arch/ia64/xen/xen_pv_ops.c | 32 |
5 files changed, 94 insertions, 1 deletions
diff --git a/arch/ia64/include/asm/xen/patchlist.h b/arch/ia64/include/asm/xen/patchlist.h new file mode 100644 index 000000000000..eae944e88846 --- /dev/null +++ b/arch/ia64/include/asm/xen/patchlist.h | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * arch/ia64/include/asm/xen/patchlist.h | ||
| 3 | * | ||
| 4 | * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | ||
| 5 | * VA Linux Systems Japan K.K. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | * | ||
| 21 | */ | ||
| 22 | |||
| 23 | #define __paravirt_start_gate_fsyscall_patchlist \ | ||
| 24 | __xen_start_gate_fsyscall_patchlist | ||
| 25 | #define __paravirt_end_gate_fsyscall_patchlist \ | ||
| 26 | __xen_end_gate_fsyscall_patchlist | ||
| 27 | #define __paravirt_start_gate_brl_fsys_bubble_down_patchlist \ | ||
| 28 | __xen_start_gate_brl_fsys_bubble_down_patchlist | ||
| 29 | #define __paravirt_end_gate_brl_fsys_bubble_down_patchlist \ | ||
| 30 | __xen_end_gate_brl_fsys_bubble_down_patchlist | ||
| 31 | #define __paravirt_start_gate_vtop_patchlist \ | ||
| 32 | __xen_start_gate_vtop_patchlist | ||
| 33 | #define __paravirt_end_gate_vtop_patchlist \ | ||
| 34 | __xen_end_gate_vtop_patchlist | ||
| 35 | #define __paravirt_start_gate_mckinley_e9_patchlist \ | ||
| 36 | __xen_start_gate_mckinley_e9_patchlist | ||
| 37 | #define __paravirt_end_gate_mckinley_e9_patchlist \ | ||
| 38 | __xen_end_gate_mckinley_e9_patchlist | ||
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index 10a7d47e8510..92ae7e8f0142 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
| @@ -201,6 +201,12 @@ SECTIONS | |||
| 201 | __start_gate_section = .; | 201 | __start_gate_section = .; |
| 202 | *(.data.gate) | 202 | *(.data.gate) |
| 203 | __stop_gate_section = .; | 203 | __stop_gate_section = .; |
| 204 | #ifdef CONFIG_XEN | ||
| 205 | . = ALIGN(PAGE_SIZE); | ||
| 206 | __xen_start_gate_section = .; | ||
| 207 | *(.data.gate.xen) | ||
| 208 | __xen_stop_gate_section = .; | ||
| 209 | #endif | ||
| 204 | } | 210 | } |
| 205 | . = ALIGN(PAGE_SIZE); /* make sure the gate page doesn't expose | 211 | . = ALIGN(PAGE_SIZE); /* make sure the gate page doesn't expose |
| 206 | * kernel data | 212 | * kernel data |
diff --git a/arch/ia64/xen/Makefile b/arch/ia64/xen/Makefile index b4ca2e6c0ead..94f0d8e7d9de 100644 --- a/arch/ia64/xen/Makefile +++ b/arch/ia64/xen/Makefile | |||
| @@ -3,10 +3,24 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y := hypercall.o xenivt.o xensetup.o xen_pv_ops.o irq_xen.o \ | 5 | obj-y := hypercall.o xenivt.o xensetup.o xen_pv_ops.o irq_xen.o \ |
| 6 | hypervisor.o xencomm.o xcom_hcall.o grant-table.o time.o suspend.o | 6 | hypervisor.o xencomm.o xcom_hcall.o grant-table.o time.o suspend.o \ |
| 7 | gate-data.o | ||
| 7 | 8 | ||
| 8 | obj-$(CONFIG_IA64_GENERIC) += machvec.o | 9 | obj-$(CONFIG_IA64_GENERIC) += machvec.o |
| 9 | 10 | ||
| 11 | # The gate DSO image is built using a special linker script. | ||
| 12 | include $(srctree)/arch/ia64/kernel/Makefile.gate | ||
| 13 | |||
| 14 | # tell compiled for xen | ||
| 15 | CPPFLAGS_gate.lds += -D__IA64_GATE_PARAVIRTUALIZED_XEN | ||
| 16 | |||
| 17 | # use same file of native. | ||
| 18 | $(obj)/gate.o: $(src)/../kernel/gate.S FORCE | ||
| 19 | $(call if_changed_dep,as_o_S) | ||
| 20 | $(obj)/gate.lds: $(src)/../kernel/gate.lds.S FORCE | ||
| 21 | $(call if_changed_dep,cpp_lds_S) | ||
| 22 | |||
| 23 | |||
| 10 | AFLAGS_xenivt.o += -D__IA64_ASM_PARAVIRTUALIZED_XEN | 24 | AFLAGS_xenivt.o += -D__IA64_ASM_PARAVIRTUALIZED_XEN |
| 11 | 25 | ||
| 12 | # xen multi compile | 26 | # xen multi compile |
diff --git a/arch/ia64/xen/gate-data.S b/arch/ia64/xen/gate-data.S new file mode 100644 index 000000000000..7d4830afc91d --- /dev/null +++ b/arch/ia64/xen/gate-data.S | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | .section .data.gate.xen, "aw" | ||
| 2 | |||
| 3 | .incbin "arch/ia64/xen/gate.so" | ||
diff --git a/arch/ia64/xen/xen_pv_ops.c b/arch/ia64/xen/xen_pv_ops.c index d91336114344..bdf1acbce81c 100644 --- a/arch/ia64/xen/xen_pv_ops.c +++ b/arch/ia64/xen/xen_pv_ops.c | |||
| @@ -179,6 +179,37 @@ struct pv_fsys_data xen_fsys_data __initdata = { | |||
| 179 | }; | 179 | }; |
| 180 | 180 | ||
| 181 | /*************************************************************************** | 181 | /*************************************************************************** |
| 182 | * pv_patchdata | ||
| 183 | * patchdata addresses | ||
| 184 | */ | ||
| 185 | |||
| 186 | #define DECLARE(name) \ | ||
| 187 | extern unsigned long __xen_start_gate_##name##_patchlist[]; \ | ||
| 188 | extern unsigned long __xen_end_gate_##name##_patchlist[] | ||
| 189 | |||
| 190 | DECLARE(fsyscall); | ||
| 191 | DECLARE(brl_fsys_bubble_down); | ||
| 192 | DECLARE(vtop); | ||
| 193 | DECLARE(mckinley_e9); | ||
| 194 | |||
| 195 | extern unsigned long __xen_start_gate_section[]; | ||
| 196 | |||
| 197 | #define ASSIGN(name) \ | ||
| 198 | .start_##name##_patchlist = \ | ||
| 199 | (unsigned long)__xen_start_gate_##name##_patchlist, \ | ||
| 200 | .end_##name##_patchlist = \ | ||
| 201 | (unsigned long)__xen_end_gate_##name##_patchlist | ||
| 202 | |||
| 203 | static struct pv_patchdata xen_patchdata __initdata = { | ||
| 204 | ASSIGN(fsyscall), | ||
| 205 | ASSIGN(brl_fsys_bubble_down), | ||
| 206 | ASSIGN(vtop), | ||
| 207 | ASSIGN(mckinley_e9), | ||
| 208 | |||
| 209 | .gate_section = (void*)__xen_start_gate_section, | ||
| 210 | }; | ||
| 211 | |||
| 212 | /*************************************************************************** | ||
| 182 | * pv_cpu_ops | 213 | * pv_cpu_ops |
| 183 | * intrinsics hooks. | 214 | * intrinsics hooks. |
| 184 | */ | 215 | */ |
| @@ -447,6 +478,7 @@ xen_setup_pv_ops(void) | |||
| 447 | pv_info = xen_info; | 478 | pv_info = xen_info; |
| 448 | pv_init_ops = xen_init_ops; | 479 | pv_init_ops = xen_init_ops; |
| 449 | pv_fsys_data = xen_fsys_data; | 480 | pv_fsys_data = xen_fsys_data; |
| 481 | pv_patchdata = xen_patchdata; | ||
| 450 | pv_cpu_ops = xen_cpu_ops; | 482 | pv_cpu_ops = xen_cpu_ops; |
| 451 | pv_iosapic_ops = xen_iosapic_ops; | 483 | pv_iosapic_ops = xen_iosapic_ops; |
| 452 | pv_irq_ops = xen_irq_ops; | 484 | pv_irq_ops = xen_irq_ops; |
