virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "Eric W. Biederman" <ebiederm@xmission.com>,
	"H. Peter Anvin" <hpa@zytor.com>
Cc: lkml <linux-kernel@vger.kernel.org>,
	Vivek Goyal <vgoyal@in.ibm.com>,
	v12n <virtualization@lists.linux-foundation.org>
Subject: [PATCH RFC 7/7] i386: paravirt boot sequence
Date: Wed, 06 Jun 2007 15:58:44 -0700	[thread overview]
Message-ID: <20070606230922.549990391@goop.org> (raw)
In-Reply-To: 20070606225837.654272428@goop.org

[-- Attachment #1: i386-paravirt-bootup.patch --]
[-- Type: text/plain, Size: 4226 bytes --]

This patch uses the updated boot protocol to do paravirtualized boot.
If the boot version is >= 2.07, then it will do two things:

 1. Check the bootparams loadflags to see if we should reload the
    segment registers and clear interrupts.  This is appropriate
    for normal native boot and some paravirtualized environments, but
    inappropraite for others.

 2. Check the hardware architecture, and dispatch to the appropriate
    kernel entrypoint.  If the bootloader doesn't set this, then we
    simply do the normal boot sequence.

Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Vivek Goyal <vgoyal@in.ibm.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>

---
 arch/i386/boot/header.S |    9 ++++++++-
 arch/i386/kernel/head.S |   47 +++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 51 insertions(+), 5 deletions(-)

===================================================================
--- a/arch/i386/boot/header.S
+++ b/arch/i386/boot/header.S
@@ -119,7 +119,7 @@ 1:
 	# Part 2 of the header, from the old setup.S
 
 		.ascii	"HdrS"		# header signature
-		.word	0x0206		# header version number (>= 0x0105)
+		.word	0x0207		# header version number (>= 0x0105)
 					# or else old loadlin-1.5 will fail)
 		.globl realmode_swtch
 realmode_swtch:	.word	0, 0		# default_switch, SETUPSEG
@@ -209,6 +209,13 @@ cmdline_size:   .long   COMMAND_LINE_SIZ
                                                 #added with boot protocol
                                                 #version 2.06
 
+hardware_subarch:	.long 0			# subarchitecture, added with 2.07
+						# default to 0 for normal x86 PC
+
+hardware_subarch_data:	.quad 0
+
+kernel_payload:		.long blob_payload	# raw kernel data
+
 # End of setup header #####################################################
 
 	.section ".inittext", "ax"
===================================================================
--- a/arch/i386/kernel/head.S
+++ b/arch/i386/kernel/head.S
@@ -71,28 +71,37 @@ INIT_MAP_BEYOND_END = BOOTBITMAP_SIZE + 
  */
 .section .text.head,"ax",@progbits
 ENTRY(startup_32)
+	/* check to see if KEEP_SEGMENTS flag is meaningful */
+	cmpw $0x207, BP_version(%esi)
+	jb 1f
+
+	/* test KEEP_SEGMENTS flag to see if the bootloader is asking
+		us to not reload segments */
+	testb $(1<<6), BP_loadflags(%esi)
+	jnz 2f
 
 /*
  * Set segments to known values.
  */
-	cld
-	lgdt boot_gdt_descr - __PAGE_OFFSET
+1:	lgdt boot_gdt_descr - __PAGE_OFFSET
 	movl $(__BOOT_DS),%eax
 	movl %eax,%ds
 	movl %eax,%es
 	movl %eax,%fs
 	movl %eax,%gs
+2:
 
 /*
  * Clear BSS first so that there are no surprises...
- * No need to cld as DF is already clear from cld above...
- */
+ */
+	cld
 	xorl %eax,%eax
 	movl $__bss_start - __PAGE_OFFSET,%edi
 	movl $__bss_stop - __PAGE_OFFSET,%ecx
 	subl %edi,%ecx
 	shrl $2,%ecx
 	rep ; stosl
+
 /*
  * Copy bootup parameters out of the way.
  * Note: %esi still has the pointer to the real-mode data.
@@ -120,6 +129,35 @@ 2:
 	movsl
 1:
 
+#ifdef CONFIG_PARAVIRT
+	cmpw $0x207, (boot_params + BP_version - __PAGE_OFFSET)
+	jb default_entry
+
+	/* Paravirt-compatible boot parameters.  Look to see what architecture
+		we're booting under. */
+	movl (boot_params + BP_hardware_subarch - __PAGE_OFFSET), %eax
+	cmpl $num_subarch_entries, %eax
+	jae bad_subarch
+
+	movl subarch_entries - __PAGE_OFFSET(,%eax,4), %eax
+	subl $__PAGE_OFFSET, %eax
+	jmp *%eax
+
+bad_subarch:
+WEAK(lguest_entry)
+WEAK(xen_entry)
+	/* Unknown implementation; there's really
+	   nothing we can do at this point. */
+	ud2a
+.data
+subarch_entries:
+	.long default_entry		/* normal x86/PC */
+	.long lguest_entry		/* lguest hypervisor */
+	.long xen_entry			/* Xen hypervisor */
+num_subarch_entries = (. - subarch_entries) / 4
+.previous
+#endif /* CONFIG_PARAVIRT */
+
 /*
  * Initialize page tables.  This creates a PDE and a set of page
  * tables, which are located immediately beyond _end.  The variable
@@ -132,6 +170,7 @@ 1:
  */
 page_pde_offset = (__PAGE_OFFSET >> 20);
 
+default_entry:
 	movl $(pg0 - __PAGE_OFFSET), %edi
 	movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
 	movl $0x007, %eax			/* 0x007 = PRESENT+RW+USER */

-- 

      parent reply	other threads:[~2007-06-06 22:58 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-06-06 22:58 [PATCH RFC 0/7] proposed updates to boot protocol and paravirt booting Jeremy Fitzhardinge
2007-06-06 22:58 ` [PATCH RFC 1/7] update boot spec to 2.07 Jeremy Fitzhardinge
2007-06-06 22:58 ` [PATCH RFC 2/7] add WEAK() for creating weak asm labels Jeremy Fitzhardinge
2007-06-06 22:58 ` [PATCH RFC 3/7] allow linux/elf.h to be included in assembler Jeremy Fitzhardinge
2007-06-06 22:58 ` [PATCH RFC 4/7] define ELF notes for adding to a boot image Jeremy Fitzhardinge
2007-06-06 22:58 ` [PATCH RFC 5/7] i386: clean up bzImage generation Jeremy Fitzhardinge
2007-06-06 22:58 ` [PATCH RFC 6/7] i386: make the bzImage payload an ELF file Jeremy Fitzhardinge
2007-06-06 23:41   ` H. Peter Anvin
2007-06-06 23:56     ` Jeremy Fitzhardinge
     [not found]     ` <466749C8.2010700@goop.org>
2007-06-07  0:08       ` H. Peter Anvin
     [not found]       ` <46674C96.7090104@zytor.com>
2007-06-07  0:20         ` Jeremy Fitzhardinge
     [not found]         ` <46674F68.6030100@goop.org>
2007-06-07  0:42           ` H. Peter Anvin
     [not found]           ` <4667547B.8080502@zytor.com>
2007-06-07  1:01             ` Jeremy Fitzhardinge
2007-06-08  3:49             ` Vivek Goyal
     [not found]             ` <20070608034958.GA10728@in.ibm.com>
2007-06-08  4:01               ` H. Peter Anvin
2007-06-07  1:47     ` Rob Landley
     [not found]     ` <200706062147.21225.rob@landley.net>
2007-06-07  1:54       ` H. Peter Anvin
2007-06-07 16:08         ` Rob Landley
     [not found]         ` <200706071208.04777.rob@landley.net>
2007-06-07 16:14           ` H. Peter Anvin
2007-06-06 22:58 ` Jeremy Fitzhardinge [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070606230922.549990391@goop.org \
    --to=jeremy@goop.org \
    --cc=ebiederm@xmission.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=vgoyal@in.ibm.com \
    --cc=virtualization@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).