[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-ia64-devel] [PATCH] pv_ops/xen: elf note based xen startup


  • To: <xen-ia64-devel@xxxxxxxxxxxxxxxxxxx>
  • From: "He, Qing" <qing.he@xxxxxxxxx>
  • Date: Tue, 6 May 2008 16:37:11 +0800
  • Cc: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
  • Delivery-date: Tue, 06 May 2008 01:44:10 -0700
  • List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
  • Thread-index: AcivVGCYSM/ue+W1S06jgxgBLJ0Pug==
  • Thread-topic: [PATCH] pv_ops/xen: elf note based xen startup

This patch enables elf note based xen startup for IA-64, which gives the
kernel an early hint for running on xen instead of relying on psr.cpl.
It is also an extension for possible support of future hypervisors.

Signed-off-by: Qing He <qing.he@xxxxxxxxx>
--

diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S
index 2f8d770..aa257b2 100644
--- a/arch/ia64/kernel/head.S
+++ b/arch/ia64/kernel/head.S
@@ -31,6 +31,8 @@
 #include <asm/ptrace.h>
 #include <asm/system.h>
 #include <asm/mca_asm.h>
+#include <linux/init.h>
+#include <linux/linkage.h>
 
 #ifdef CONFIG_HOTPLUG_CPU
 #define SAL_PSR_BITS_TO_SET                            \
@@ -367,10 +369,40 @@ start_ap:
        ;;
 (isBP) st8 [r2]=r28            // save the address of the boot param
area passed by the bootloader
 
-#ifdef CONFIG_XEN
-       //  Note: isBP is used by the subprogram.
-       br.call.sptk.many rp=early_xen_setup
+#ifdef CONFIG_PARAVIRT
+
+       movl r14=hypervisor_setup_hooks
+       movl r15=hypervisor_type
+       mov r16=num_hypervisor_hooks
+       ;;
+       ld8 r2=[r15]
+       ;;
+       cmp.ltu p7,p0=r2,r16
+       shladd r8=r2,3,r14
+       ;;
+       cmp.ne.and p7,p0=r2,r0  // no actual branch to
default_setup_hook
+       ld8 r9=[r8]
+       ;;
+       mov b1=r9
        ;;
+(p7)   br.call.sptk.many rp=b1
+
+       .weak xen_setup_hook
+
+       __INITDATA
+
+       .global hypervisor_type
+hypervisor_type:
+       data8           0
+       
+       // must have the same order with PARAVIRT_HYPERVISOR_TYPE_xxx
+
+hypervisor_setup_hooks:
+       data8           0       //default_setup_hook
+       data8           xen_setup_hook
+num_hypervisor_hooks = (. - hypervisor_setup_hooks) / 8
+       .previous
+
 #endif
 
 #ifdef CONFIG_SMP
diff --git a/arch/ia64/xen/xensetup.S b/arch/ia64/xen/xensetup.S
index 43608b2..169bbf8 100644
--- a/arch/ia64/xen/xensetup.S
+++ b/arch/ia64/xen/xensetup.S
@@ -6,7 +6,15 @@
 
 #include <asm/processor.h>
 #include <asm/asmmacro.h>
+#include <asm/pgtable.h>
+#include <asm/system.h>
+#include <asm/paravirt.h>
 #include <asm/xen/privop.h>
+#include <linux/elfnote.h>
+#include <linux/init.h>
+#include <xen/interface/elfnote.h>
+
+#define LOAD_OFFSET (KERNEL_START - KERNEL_TR_PAGE_SIZE)
 
        .section .data.read_mostly
        .align 8
@@ -15,16 +23,35 @@ running_on_xen:
        data4 0
        .previous
 
+       __INIT
+ENTRY(startup_xen)
+       mov r10=PARAVIRT_HYPERVISOR_TYPE_XEN
+       movl r9=0-LOAD_OFFSET
+       movl r11=_start
+       ;;
+       add r11=r11,r9
+       movl r8=hypervisor_type
+       ;;
+       add r8=r8,r9
+       mov b0=r11
+       ;;
+       st8 [r8]=r10
+       br.cond.sptk.many b0
+       ;;
+END(startup_xen)
+
+       ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,      .asciz "linux")
+       ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz "2.6")
+       ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,   .asciz "xen-3.0")
+       ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,         data8.ua startup_xen -
LOAD_OFFSET)
+
 #define isBP   p3      // are we the Bootstrap Processor?
 
        .text
-GLOBAL_ENTRY(early_xen_setup)
-       mov r8=ar.rsc           // Initialized in head.S
-(isBP) movl r9=running_on_xen;;
-       extr.u r8=r8,2,2;;      // Extract pl fields
-       cmp.eq p7,p0=r8,r0      // p7: !running on xen
+
+GLOBAL_ENTRY(xen_setup_hook)
        mov r8=1                // booleanize.
-(p7)   br.ret.sptk.many rp;;
+(isBP) movl r9=running_on_xen;;
 (isBP) st4 [r9]=r8
        movl r10=xen_ivt;;
 
@@ -46,4 +73,4 @@ GLOBAL_ENTRY(early_xen_setup)
 
        br.ret.sptk.many rp
        ;;
-END(early_xen_setup)
+END(xen_setup_hook)
diff --git a/include/asm-ia64/paravirt.h b/include/asm-ia64/paravirt.h
index 44017c1..1b4df12 100644
--- a/include/asm-ia64/paravirt.h
+++ b/include/asm-ia64/paravirt.h
@@ -26,6 +26,9 @@
 
 #ifdef CONFIG_PARAVIRT_GUEST
 
+#define PARAVIRT_HYPERVISOR_TYPE_DEFAULT       0
+#define PARAVIRT_HYPERVISOR_TYPE_XEN           1
+
 #ifndef __ASSEMBLY__
 
 #include <asm/hw_irq.h>

Attachment: linux-xen-ia64-note-based-startup.patch
Description: linux-xen-ia64-note-based-startup.patch

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.