diff options
author | Isaku Yamahata <yamahata@valinux.co.jp> | 2008-05-19 09:13:33 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2008-05-27 17:39:54 -0400 |
commit | 3e0879deb700f322f6c81ab34f056fc72d15ec02 (patch) | |
tree | fadecbdca3170bfce52d9a954b594bc8e293e879 /arch/ia64/kernel/head.S | |
parent | 90aeb169c03a96e22674741f08054023c33d595b (diff) |
[IA64] pvops: add an early setup hook for pv_ops.
This patch adds a setup hook in the very early boot sequence
before start_kernel() to initialize paravirtualization stuff.
The hook will be set by each pv loader code or by using multi entry point.
Signed-off-by: Qing He <qing.he@intel.com>
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel/head.S')
-rw-r--r-- | arch/ia64/kernel/head.S | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index ddeab4e36fd..db540e58c78 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
@@ -26,11 +26,14 @@ | |||
26 | #include <asm/mmu_context.h> | 26 | #include <asm/mmu_context.h> |
27 | #include <asm/asm-offsets.h> | 27 | #include <asm/asm-offsets.h> |
28 | #include <asm/pal.h> | 28 | #include <asm/pal.h> |
29 | #include <asm/paravirt.h> | ||
29 | #include <asm/pgtable.h> | 30 | #include <asm/pgtable.h> |
30 | #include <asm/processor.h> | 31 | #include <asm/processor.h> |
31 | #include <asm/ptrace.h> | 32 | #include <asm/ptrace.h> |
32 | #include <asm/system.h> | 33 | #include <asm/system.h> |
33 | #include <asm/mca_asm.h> | 34 | #include <asm/mca_asm.h> |
35 | #include <linux/init.h> | ||
36 | #include <linux/linkage.h> | ||
34 | 37 | ||
35 | #ifdef CONFIG_HOTPLUG_CPU | 38 | #ifdef CONFIG_HOTPLUG_CPU |
36 | #define SAL_PSR_BITS_TO_SET \ | 39 | #define SAL_PSR_BITS_TO_SET \ |
@@ -367,6 +370,44 @@ start_ap: | |||
367 | ;; | 370 | ;; |
368 | (isBP) st8 [r2]=r28 // save the address of the boot param area passed by the bootloader | 371 | (isBP) st8 [r2]=r28 // save the address of the boot param area passed by the bootloader |
369 | 372 | ||
373 | #ifdef CONFIG_PARAVIRT | ||
374 | |||
375 | movl r14=hypervisor_setup_hooks | ||
376 | movl r15=hypervisor_type | ||
377 | mov r16=num_hypervisor_hooks | ||
378 | ;; | ||
379 | ld8 r2=[r15] | ||
380 | ;; | ||
381 | cmp.ltu p7,p0=r2,r16 // array size check | ||
382 | shladd r8=r2,3,r14 | ||
383 | ;; | ||
384 | (p7) ld8 r9=[r8] | ||
385 | ;; | ||
386 | (p7) mov b1=r9 | ||
387 | (p7) cmp.ne.unc p7,p0=r9,r0 // no actual branch to NULL | ||
388 | ;; | ||
389 | (p7) br.call.sptk.many rp=b1 | ||
390 | |||
391 | __INITDATA | ||
392 | |||
393 | default_setup_hook = 0 // Currently nothing needs to be done. | ||
394 | |||
395 | .weak xen_setup_hook | ||
396 | |||
397 | .global hypervisor_type | ||
398 | hypervisor_type: | ||
399 | data8 PARAVIRT_HYPERVISOR_TYPE_DEFAULT | ||
400 | |||
401 | // must have the same order with PARAVIRT_HYPERVISOR_TYPE_xxx | ||
402 | |||
403 | hypervisor_setup_hooks: | ||
404 | data8 default_setup_hook | ||
405 | data8 xen_setup_hook | ||
406 | num_hypervisor_hooks = (. - hypervisor_setup_hooks) / 8 | ||
407 | .previous | ||
408 | |||
409 | #endif | ||
410 | |||
370 | #ifdef CONFIG_SMP | 411 | #ifdef CONFIG_SMP |
371 | (isAP) br.call.sptk.many rp=start_secondary | 412 | (isAP) br.call.sptk.many rp=start_secondary |
372 | .ret0: | 413 | .ret0: |