diff options
| -rw-r--r-- | arch/ia64/kernel/paravirt.c | 7 | ||||
| -rw-r--r-- | arch/ia64/kernel/setup.c | 10 | ||||
| -rw-r--r-- | arch/ia64/kernel/smpboot.c | 2 | ||||
| -rw-r--r-- | include/asm-ia64/paravirt.h | 70 |
4 files changed, 89 insertions, 0 deletions
diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c index 7126ea8f7ecc..5daf659ff291 100644 --- a/arch/ia64/kernel/paravirt.c +++ b/arch/ia64/kernel/paravirt.c | |||
| @@ -42,6 +42,13 @@ struct pv_info pv_info = { | |||
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | /*************************************************************************** | 44 | /*************************************************************************** |
| 45 | * pv_init_ops | ||
| 46 | * initialization hooks. | ||
| 47 | */ | ||
| 48 | |||
| 49 | struct pv_init_ops pv_init_ops; | ||
| 50 | |||
| 51 | /*************************************************************************** | ||
| 45 | * pv_cpu_ops | 52 | * pv_cpu_ops |
| 46 | * intrinsics hooks. | 53 | * intrinsics hooks. |
| 47 | */ | 54 | */ |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index f48a809c686d..750749551e86 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <asm/mca.h> | 51 | #include <asm/mca.h> |
| 52 | #include <asm/meminit.h> | 52 | #include <asm/meminit.h> |
| 53 | #include <asm/page.h> | 53 | #include <asm/page.h> |
| 54 | #include <asm/paravirt.h> | ||
| 54 | #include <asm/patch.h> | 55 | #include <asm/patch.h> |
| 55 | #include <asm/pgtable.h> | 56 | #include <asm/pgtable.h> |
| 56 | #include <asm/processor.h> | 57 | #include <asm/processor.h> |
| @@ -341,6 +342,8 @@ reserve_memory (void) | |||
| 341 | rsvd_region[n].end = (unsigned long) ia64_imva(_end); | 342 | rsvd_region[n].end = (unsigned long) ia64_imva(_end); |
| 342 | n++; | 343 | n++; |
| 343 | 344 | ||
| 345 | n += paravirt_reserve_memory(&rsvd_region[n]); | ||
| 346 | |||
| 344 | #ifdef CONFIG_BLK_DEV_INITRD | 347 | #ifdef CONFIG_BLK_DEV_INITRD |
| 345 | if (ia64_boot_param->initrd_start) { | 348 | if (ia64_boot_param->initrd_start) { |
| 346 | rsvd_region[n].start = (unsigned long)__va(ia64_boot_param->initrd_start); | 349 | rsvd_region[n].start = (unsigned long)__va(ia64_boot_param->initrd_start); |
| @@ -519,6 +522,8 @@ setup_arch (char **cmdline_p) | |||
| 519 | { | 522 | { |
| 520 | unw_init(); | 523 | unw_init(); |
| 521 | 524 | ||
| 525 | paravirt_arch_setup_early(); | ||
| 526 | |||
| 522 | ia64_patch_vtop((u64) __start___vtop_patchlist, (u64) __end___vtop_patchlist); | 527 | ia64_patch_vtop((u64) __start___vtop_patchlist, (u64) __end___vtop_patchlist); |
| 523 | 528 | ||
| 524 | *cmdline_p = __va(ia64_boot_param->command_line); | 529 | *cmdline_p = __va(ia64_boot_param->command_line); |
| @@ -584,6 +589,9 @@ setup_arch (char **cmdline_p) | |||
| 584 | acpi_boot_init(); | 589 | acpi_boot_init(); |
| 585 | #endif | 590 | #endif |
| 586 | 591 | ||
| 592 | paravirt_banner(); | ||
| 593 | paravirt_arch_setup_console(cmdline_p); | ||
| 594 | |||
| 587 | #ifdef CONFIG_VT | 595 | #ifdef CONFIG_VT |
| 588 | if (!conswitchp) { | 596 | if (!conswitchp) { |
| 589 | # if defined(CONFIG_DUMMY_CONSOLE) | 597 | # if defined(CONFIG_DUMMY_CONSOLE) |
| @@ -603,6 +611,8 @@ setup_arch (char **cmdline_p) | |||
| 603 | #endif | 611 | #endif |
| 604 | 612 | ||
| 605 | /* enable IA-64 Machine Check Abort Handling unless disabled */ | 613 | /* enable IA-64 Machine Check Abort Handling unless disabled */ |
| 614 | if (paravirt_arch_setup_nomca()) | ||
| 615 | nomca = 1; | ||
| 606 | if (!nomca) | 616 | if (!nomca) |
| 607 | ia64_mca_init(); | 617 | ia64_mca_init(); |
| 608 | 618 | ||
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index d7ad42b77d41..933f38811528 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <asm/machvec.h> | 50 | #include <asm/machvec.h> |
| 51 | #include <asm/mca.h> | 51 | #include <asm/mca.h> |
| 52 | #include <asm/page.h> | 52 | #include <asm/page.h> |
| 53 | #include <asm/paravirt.h> | ||
| 53 | #include <asm/pgalloc.h> | 54 | #include <asm/pgalloc.h> |
| 54 | #include <asm/pgtable.h> | 55 | #include <asm/pgtable.h> |
| 55 | #include <asm/processor.h> | 56 | #include <asm/processor.h> |
| @@ -642,6 +643,7 @@ void __devinit smp_prepare_boot_cpu(void) | |||
| 642 | cpu_set(smp_processor_id(), cpu_online_map); | 643 | cpu_set(smp_processor_id(), cpu_online_map); |
| 643 | cpu_set(smp_processor_id(), cpu_callin_map); | 644 | cpu_set(smp_processor_id(), cpu_callin_map); |
| 644 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; | 645 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; |
| 646 | paravirt_post_smp_prepare_boot_cpu(); | ||
| 645 | } | 647 | } |
| 646 | 648 | ||
| 647 | #ifdef CONFIG_HOTPLUG_CPU | 649 | #ifdef CONFIG_HOTPLUG_CPU |
diff --git a/include/asm-ia64/paravirt.h b/include/asm-ia64/paravirt.h index 1032b216aea6..84d74c32eb98 100644 --- a/include/asm-ia64/paravirt.h +++ b/include/asm-ia64/paravirt.h | |||
| @@ -55,11 +55,81 @@ static inline unsigned int get_kernel_rpl(void) | |||
| 55 | return pv_info.kernel_rpl; | 55 | return pv_info.kernel_rpl; |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | /****************************************************************************** | ||
| 59 | * initialization hooks. | ||
| 60 | */ | ||
| 61 | struct rsvd_region; | ||
| 62 | |||
| 63 | struct pv_init_ops { | ||
| 64 | void (*banner)(void); | ||
| 65 | |||
| 66 | int (*reserve_memory)(struct rsvd_region *region); | ||
| 67 | |||
| 68 | void (*arch_setup_early)(void); | ||
| 69 | void (*arch_setup_console)(char **cmdline_p); | ||
| 70 | int (*arch_setup_nomca)(void); | ||
| 71 | |||
| 72 | void (*post_smp_prepare_boot_cpu)(void); | ||
| 73 | }; | ||
| 74 | |||
| 75 | extern struct pv_init_ops pv_init_ops; | ||
| 76 | |||
| 77 | static inline void paravirt_banner(void) | ||
| 78 | { | ||
| 79 | if (pv_init_ops.banner) | ||
| 80 | pv_init_ops.banner(); | ||
| 81 | } | ||
| 82 | |||
| 83 | static inline int paravirt_reserve_memory(struct rsvd_region *region) | ||
| 84 | { | ||
| 85 | if (pv_init_ops.reserve_memory) | ||
| 86 | return pv_init_ops.reserve_memory(region); | ||
| 87 | return 0; | ||
| 88 | } | ||
| 89 | |||
| 90 | static inline void paravirt_arch_setup_early(void) | ||
| 91 | { | ||
| 92 | if (pv_init_ops.arch_setup_early) | ||
| 93 | pv_init_ops.arch_setup_early(); | ||
| 94 | } | ||
| 95 | |||
| 96 | static inline void paravirt_arch_setup_console(char **cmdline_p) | ||
| 97 | { | ||
| 98 | if (pv_init_ops.arch_setup_console) | ||
| 99 | pv_init_ops.arch_setup_console(cmdline_p); | ||
| 100 | } | ||
| 101 | |||
| 102 | static inline int paravirt_arch_setup_nomca(void) | ||
| 103 | { | ||
| 104 | if (pv_init_ops.arch_setup_nomca) | ||
| 105 | return pv_init_ops.arch_setup_nomca(); | ||
| 106 | return 0; | ||
| 107 | } | ||
| 108 | |||
| 109 | static inline void paravirt_post_smp_prepare_boot_cpu(void) | ||
| 110 | { | ||
| 111 | if (pv_init_ops.post_smp_prepare_boot_cpu) | ||
| 112 | pv_init_ops.post_smp_prepare_boot_cpu(); | ||
| 113 | } | ||
| 114 | |||
| 58 | #endif /* !__ASSEMBLY__ */ | 115 | #endif /* !__ASSEMBLY__ */ |
| 59 | 116 | ||
| 60 | #else | 117 | #else |
| 61 | /* fallback for native case */ | 118 | /* fallback for native case */ |
| 62 | 119 | ||
| 120 | #ifndef __ASSEMBLY__ | ||
| 121 | |||
| 122 | #define paravirt_banner() do { } while (0) | ||
| 123 | #define paravirt_reserve_memory(region) 0 | ||
| 124 | |||
| 125 | #define paravirt_arch_setup_early() do { } while (0) | ||
| 126 | #define paravirt_arch_setup_console(cmdline_p) do { } while (0) | ||
| 127 | #define paravirt_arch_setup_nomca() 0 | ||
| 128 | #define paravirt_post_smp_prepare_boot_cpu() do { } while (0) | ||
| 129 | |||
| 130 | #endif /* __ASSEMBLY__ */ | ||
| 131 | |||
| 132 | |||
| 63 | #endif /* CONFIG_PARAVIRT_GUEST */ | 133 | #endif /* CONFIG_PARAVIRT_GUEST */ |
| 64 | 134 | ||
| 65 | #endif /* __ASM_PARAVIRT_H */ | 135 | #endif /* __ASM_PARAVIRT_H */ |
